aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ecore/src/lib')
-rw-r--r--libraries/ecore/src/lib/Makefile.am71
-rw-r--r--libraries/ecore/src/lib/Makefile.in820
-rw-r--r--libraries/ecore/src/lib/ecore/Ecore.h2346
-rw-r--r--libraries/ecore/src/lib/ecore/Ecore_Getopt.h419
-rw-r--r--libraries/ecore/src/lib/ecore/Makefile.am60
-rw-r--r--libraries/ecore/src/lib/ecore/Makefile.in853
-rw-r--r--libraries/ecore/src/lib/ecore/ecore.c731
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_anim.c479
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_app.c95
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_events.c790
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_exe.c1880
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_exe_ps3.c20
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_exe_win32.c1055
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_exe_wince.c21
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_getopt.c1908
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_glib.c338
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_idle_enterer.c207
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_idle_exiter.c176
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_idler.c158
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_job.c122
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_main.c2020
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_pipe.c682
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_poll.c440
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_private.h353
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_signal.c565
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_thread.c1666
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_throttle.c99
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_time.c184
-rw-r--r--libraries/ecore/src/lib/ecore/ecore_timer.c800
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa.h147
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h285
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/Makefile.am29
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/Makefile.in823
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa.m283
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_private.h11
-rw-r--r--libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_window.m163
-rw-r--r--libraries/ecore/src/lib/ecore_con/Ecore_Con.h1801
-rw-r--r--libraries/ecore/src/lib/ecore_con/Makefile.am45
-rw-r--r--libraries/ecore/src/lib/ecore_con/Makefile.in909
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con.c2600
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_alloc.c99
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_ares.c628
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_info.c450
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_local.c317
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_local_win32.c769
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_private.h321
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_ssl.c1777
-rw-r--r--libraries/ecore/src/lib/ecore_con/ecore_con_url.c1572
-rw-r--r--libraries/ecore/src/lib/ecore_config/Ecore_Config.h312
-rw-r--r--libraries/ecore/src/lib/ecore_config/Makefile.am62
-rw-r--r--libraries/ecore/src/lib/ecore_config/Makefile.in855
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config.c1870
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_db.c296
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_extra.c803
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_ipc.h50
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_ipc_ecore.c384
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_ipc_main.c275
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_private.h70
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_storage.c176
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_util.c129
-rw-r--r--libraries/ecore/src/lib/ecore_config/ecore_config_util.h14
-rw-r--r--libraries/ecore/src/lib/ecore_directfb/Ecore_DirectFB.h181
-rw-r--r--libraries/ecore/src/lib/ecore_directfb/Makefile.am31
-rw-r--r--libraries/ecore/src/lib/ecore_directfb/Makefile.in822
-rw-r--r--libraries/ecore/src/lib/ecore_directfb/ecore_directfb.c757
-rw-r--r--libraries/ecore/src/lib/ecore_directfb/ecore_directfb_keys.h184
-rw-r--r--libraries/ecore/src/lib/ecore_directfb/ecore_directfb_private.h52
-rw-r--r--libraries/ecore/src/lib/ecore_evas/Ecore_Evas.h1660
-rw-r--r--libraries/ecore/src/lib/ecore_evas/Makefile.am131
-rw-r--r--libraries/ecore/src/lib/ecore_evas/Makefile.in921
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas.c2588
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_buffer.c827
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c574
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_directfb.c596
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_ews.c1454
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_fb.c659
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_private.h433
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c476
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c542
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_util.c437
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_win32.c1451
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_wince.c985
-rw-r--r--libraries/ecore/src/lib/ecore_evas/ecore_evas_x.c4289
-rw-r--r--libraries/ecore/src/lib/ecore_fb/Ecore_Fb.h100
-rw-r--r--libraries/ecore/src/lib/ecore_fb/Makefile.am34
-rw-r--r--libraries/ecore/src/lib/ecore_fb/Makefile.in831
-rw-r--r--libraries/ecore/src/lib/ecore_fb/ecore_fb.c114
-rw-r--r--libraries/ecore/src/lib/ecore_fb/ecore_fb_keytable.h129
-rw-r--r--libraries/ecore/src/lib/ecore_fb/ecore_fb_li.c706
-rw-r--r--libraries/ecore/src/lib/ecore_fb/ecore_fb_private.h91
-rw-r--r--libraries/ecore/src/lib/ecore_fb/ecore_fb_ts.c355
-rw-r--r--libraries/ecore/src/lib/ecore_fb/ecore_fb_vt.c322
-rw-r--r--libraries/ecore/src/lib/ecore_file/Ecore_File.h190
-rw-r--r--libraries/ecore/src/lib/ecore_file/Makefile.am41
-rw-r--r--libraries/ecore/src/lib/ecore_file/Makefile.in837
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file.c1110
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_download.c440
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_monitor.c180
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_monitor_inotify.c369
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_monitor_poll.c339
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_monitor_win32.c310
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_path.c184
-rw-r--r--libraries/ecore/src/lib/ecore_file/ecore_file_private.h129
-rw-r--r--libraries/ecore/src/lib/ecore_imf/Ecore_IMF.h418
-rw-r--r--libraries/ecore/src/lib/ecore_imf/Makefile.am28
-rw-r--r--libraries/ecore/src/lib/ecore_imf/Makefile.in822
-rw-r--r--libraries/ecore/src/lib/ecore_imf/ecore_imf.c73
-rw-r--r--libraries/ecore/src/lib/ecore_imf/ecore_imf_context.c1237
-rw-r--r--libraries/ecore/src/lib/ecore_imf/ecore_imf_module.c212
-rw-r--r--libraries/ecore/src/lib/ecore_imf/ecore_imf_private.h72
-rw-r--r--libraries/ecore/src/lib/ecore_imf_evas/Ecore_IMF_Evas.h50
-rw-r--r--libraries/ecore/src/lib/ecore_imf_evas/Makefile.am22
-rw-r--r--libraries/ecore/src/lib/ecore_imf_evas/Makefile.in815
-rw-r--r--libraries/ecore/src/lib/ecore_imf_evas/ecore_imf_evas.c259
-rw-r--r--libraries/ecore/src/lib/ecore_input/Ecore_Input.h220
-rw-r--r--libraries/ecore/src/lib/ecore_input/Makefile.am24
-rw-r--r--libraries/ecore/src/lib/ecore_input/Makefile.in816
-rw-r--r--libraries/ecore/src/lib/ecore_input/ecore_input.c120
-rw-r--r--libraries/ecore/src/lib/ecore_input/ecore_input_private.h37
-rw-r--r--libraries/ecore/src/lib/ecore_input_evas/Ecore_Input_Evas.h64
-rw-r--r--libraries/ecore/src/lib/ecore_input_evas/Makefile.am29
-rw-r--r--libraries/ecore/src/lib/ecore_input_evas/Makefile.in822
-rw-r--r--libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas.c412
-rw-r--r--libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas_private.h37
-rw-r--r--libraries/ecore/src/lib/ecore_ipc/Ecore_Ipc.h325
-rw-r--r--libraries/ecore/src/lib/ecore_ipc/Makefile.am29
-rw-r--r--libraries/ecore/src/lib/ecore_ipc/Makefile.in822
-rw-r--r--libraries/ecore/src/lib/ecore_ipc/ecore_ipc.c1591
-rw-r--r--libraries/ecore/src/lib/ecore_ipc/ecore_ipc_private.h104
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght.h124
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h78
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/Makefile.am30
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/Makefile.in826
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght.c804
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght_private.h36
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/moveutil.c245
-rw-r--r--libraries/ecore/src/lib/ecore_psl1ght/spursutil.c62
-rw-r--r--libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl.h114
-rw-r--r--libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl_Keys.h266
-rw-r--r--libraries/ecore/src/lib/ecore_sdl/Makefile.am29
-rw-r--r--libraries/ecore/src/lib/ecore_sdl/Makefile.in822
-rw-r--r--libraries/ecore/src/lib/ecore_sdl/ecore_sdl.c335
-rw-r--r--libraries/ecore/src/lib/ecore_sdl/ecore_sdl_private.h36
-rw-r--r--libraries/ecore/src/lib/ecore_win32/Ecore_Win32.h529
-rw-r--r--libraries/ecore/src/lib/ecore_win32/Makefile.am42
-rw-r--r--libraries/ecore/src/lib/ecore_win32/Makefile.in887
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32.c788
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_cursor.c306
-rwxr-xr-xlibraries/ecore/src/lib/ecore_win32/ecore_win32_dnd.c221
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp209
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.h49
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp92
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.h36
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp232
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.h47
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp157
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h50
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_event.c1231
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_private.h169
-rw-r--r--libraries/ecore/src/lib/ecore_win32/ecore_win32_window.c1519
-rw-r--r--libraries/ecore/src/lib/ecore_wince/Ecore_WinCE.h310
-rw-r--r--libraries/ecore/src/lib/ecore_wince/Makefile.am35
-rw-r--r--libraries/ecore/src/lib/ecore_wince/Makefile.in829
-rw-r--r--libraries/ecore/src/lib/ecore_wince/ecore_wince.c400
-rw-r--r--libraries/ecore/src/lib/ecore_wince/ecore_wince_event.c1074
-rw-r--r--libraries/ecore/src/lib/ecore_wince/ecore_wince_private.h85
-rw-r--r--libraries/ecore/src/lib/ecore_wince/ecore_wince_window.c775
-rw-r--r--libraries/ecore/src/lib/ecore_x/Ecore_X.h3622
-rw-r--r--libraries/ecore/src/lib/ecore_x/Ecore_X_Atoms.h255
-rw-r--r--libraries/ecore/src/lib/ecore_x/Ecore_X_Cursor.h87
-rw-r--r--libraries/ecore/src/lib/ecore_x/Makefile.am30
-rw-r--r--libraries/ecore/src/lib/ecore_x/Makefile.in934
-rw-r--r--libraries/ecore/src/lib/ecore_x/ecore_x_atoms_decl.h281
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/Makefile.am99
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/Makefile.in891
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb.c1470
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_atoms.c408
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_composite.c289
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_cursor.c400
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_damage.c155
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dnd.c689
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dpms.c318
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_drawable.c123
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_e.c1071
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_error.c109
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c2805
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_extensions.c148
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c173
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gesture.c203
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_icccm.c1568
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_image.c740
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_input.c274
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_keymap.c482
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_mwm.c104
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_netwm.c1525
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_pixmap.c128
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h451
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_randr.c3474
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_region.c159
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_render.c225
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_screensaver.c338
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c1039
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_shape.c50
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c338
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_textlist.c509
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_vsync.c375
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window.c2233
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_prop.c720
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shadow.c408
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shape.c790
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c116
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xfixes.c750
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xinerama.c139
-rw-r--r--libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xtest.c215
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/Makefile.am94
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/Makefile.in874
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c2098
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_atoms.c352
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_composite.c176
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_cursor.c246
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_damage.c71
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dnd.c706
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dpms.c247
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c118
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_e.c1060
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_error.c111
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_events.c2486
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_fixes.c364
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c171
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gesture.c136
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_icccm.c1214
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_image.c598
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_mwm.c106
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_netwm.c2003
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_pixmap.c121
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_private.h385
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.c102
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.h7
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_11.c332
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c2199
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c457
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_13.c63
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_region.c158
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_screensaver.c173
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c1001
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_sync.c159
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_test.c155
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_vsync.c351
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window.c1723
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_prop.c750
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_shape.c658
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xi2.c283
-rw-r--r--libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xinerama.c91
253 files changed, 141992 insertions, 0 deletions
diff --git a/libraries/ecore/src/lib/Makefile.am b/libraries/ecore/src/lib/Makefile.am
new file mode 100644
index 0000000..b13bc18
--- /dev/null
+++ b/libraries/ecore/src/lib/Makefile.am
@@ -0,0 +1,71 @@
1## Process this file with automake to produce Makefile.in
2MAINTAINERCLEANFILES = Makefile.in
3SUBDIRS = ecore
4
5if BUILD_ECORE_INPUT
6SUBDIRS += ecore_input
7endif
8
9if BUILD_ECORE_INPUT_EVAS
10SUBDIRS += ecore_input_evas
11endif
12
13if BUILD_ECORE_FB
14SUBDIRS += ecore_fb
15endif
16
17if BUILD_ECORE_DIRECTFB
18SUBDIRS += ecore_directfb
19endif
20
21if BUILD_ECORE_CON
22SUBDIRS += ecore_con
23endif
24
25if BUILD_ECORE_X
26SUBDIRS += ecore_x
27endif
28
29if BUILD_ECORE_WIN32
30SUBDIRS += ecore_win32
31endif
32
33if BUILD_ECORE_WINCE
34SUBDIRS += ecore_wince
35endif
36
37if BUILD_ECORE_SDL
38SUBDIRS += ecore_sdl
39endif
40
41if BUILD_ECORE_PSL1GHT
42SUBDIRS += ecore_psl1ght
43endif
44
45if BUILD_ECORE_COCOA
46SUBDIRS += ecore_cocoa
47endif
48
49if BUILD_ECORE_IPC
50SUBDIRS += ecore_ipc
51endif
52
53if BUILD_ECORE_EVAS
54SUBDIRS += ecore_evas
55endif
56
57if BUILD_ECORE_CONFIG
58SUBDIRS += ecore_config
59endif
60
61if BUILD_ECORE_FILE
62SUBDIRS += ecore_file
63endif
64
65if BUILD_ECORE_IMF
66SUBDIRS += ecore_imf
67endif
68
69if BUILD_ECORE_IMF_EVAS
70SUBDIRS += ecore_imf_evas
71endif
diff --git a/libraries/ecore/src/lib/Makefile.in b/libraries/ecore/src/lib/Makefile.in
new file mode 100644
index 0000000..b351087
--- /dev/null
+++ b/libraries/ecore/src/lib/Makefile.in
@@ -0,0 +1,820 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17VPATH = @srcdir@
18pkgdatadir = $(datadir)/@PACKAGE@
19pkgincludedir = $(includedir)/@PACKAGE@
20pkglibdir = $(libdir)/@PACKAGE@
21pkglibexecdir = $(libexecdir)/@PACKAGE@
22am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
23install_sh_DATA = $(install_sh) -c -m 644
24install_sh_PROGRAM = $(install_sh) -c
25install_sh_SCRIPT = $(install_sh) -c
26INSTALL_HEADER = $(INSTALL_DATA)
27transform = $(program_transform_name)
28NORMAL_INSTALL = :
29PRE_INSTALL = :
30POST_INSTALL = :
31NORMAL_UNINSTALL = :
32PRE_UNINSTALL = :
33POST_UNINSTALL = :
34build_triplet = @build@
35host_triplet = @host@
36@BUILD_ECORE_INPUT_TRUE@am__append_1 = ecore_input
37@BUILD_ECORE_INPUT_EVAS_TRUE@am__append_2 = ecore_input_evas
38@BUILD_ECORE_FB_TRUE@am__append_3 = ecore_fb
39@BUILD_ECORE_DIRECTFB_TRUE@am__append_4 = ecore_directfb
40@BUILD_ECORE_CON_TRUE@am__append_5 = ecore_con
41@BUILD_ECORE_X_TRUE@am__append_6 = ecore_x
42@BUILD_ECORE_WIN32_TRUE@am__append_7 = ecore_win32
43@BUILD_ECORE_WINCE_TRUE@am__append_8 = ecore_wince
44@BUILD_ECORE_SDL_TRUE@am__append_9 = ecore_sdl
45@BUILD_ECORE_PSL1GHT_TRUE@am__append_10 = ecore_psl1ght
46@BUILD_ECORE_COCOA_TRUE@am__append_11 = ecore_cocoa
47@BUILD_ECORE_IPC_TRUE@am__append_12 = ecore_ipc
48@BUILD_ECORE_EVAS_TRUE@am__append_13 = ecore_evas
49@BUILD_ECORE_CONFIG_TRUE@am__append_14 = ecore_config
50@BUILD_ECORE_FILE_TRUE@am__append_15 = ecore_file
51@BUILD_ECORE_IMF_TRUE@am__append_16 = ecore_imf
52@BUILD_ECORE_IMF_EVAS_TRUE@am__append_17 = ecore_imf_evas
53subdir = src/lib
54DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
55ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
56am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
57 $(top_srcdir)/m4/ac_path_generic.m4 \
58 $(top_srcdir)/m4/check_x_extension.m4 \
59 $(top_srcdir)/m4/ecore_check_module.m4 \
60 $(top_srcdir)/m4/ecore_check_options.m4 \
61 $(top_srcdir)/m4/efl_compiler_flag.m4 \
62 $(top_srcdir)/m4/efl_doxygen.m4 \
63 $(top_srcdir)/m4/efl_examples.m4 \
64 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
65 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
66 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
67 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
68 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
69 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
70 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
71 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
72 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
73 $(top_srcdir)/configure.ac
74am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
75 $(ACLOCAL_M4)
76mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
77CONFIG_HEADER = $(top_builddir)/config.h
78CONFIG_CLEAN_FILES =
79CONFIG_CLEAN_VPATH_FILES =
80AM_V_GEN = $(am__v_GEN_$(V))
81am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
82am__v_GEN_0 = @echo " GEN " $@;
83AM_V_at = $(am__v_at_$(V))
84am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
85am__v_at_0 = @
86SOURCES =
87DIST_SOURCES =
88RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
89 html-recursive info-recursive install-data-recursive \
90 install-dvi-recursive install-exec-recursive \
91 install-html-recursive install-info-recursive \
92 install-pdf-recursive install-ps-recursive install-recursive \
93 installcheck-recursive installdirs-recursive pdf-recursive \
94 ps-recursive uninstall-recursive
95RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
96 distclean-recursive maintainer-clean-recursive
97AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
98 $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
99 distdir
100ETAGS = etags
101CTAGS = ctags
102DIST_SUBDIRS = ecore ecore_input ecore_input_evas ecore_fb \
103 ecore_directfb ecore_con ecore_x ecore_win32 ecore_wince \
104 ecore_sdl ecore_psl1ght ecore_cocoa ecore_ipc ecore_evas \
105 ecore_config ecore_file ecore_imf ecore_imf_evas
106DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
107am__relativize = \
108 dir0=`pwd`; \
109 sed_first='s,^\([^/]*\)/.*$$,\1,'; \
110 sed_rest='s,^[^/]*/*,,'; \
111 sed_last='s,^.*/\([^/]*\)$$,\1,'; \
112 sed_butlast='s,/*[^/]*$$,,'; \
113 while test -n "$$dir1"; do \
114 first=`echo "$$dir1" | sed -e "$$sed_first"`; \
115 if test "$$first" != "."; then \
116 if test "$$first" = ".."; then \
117 dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
118 dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
119 else \
120 first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
121 if test "$$first2" = "$$first"; then \
122 dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
123 else \
124 dir2="../$$dir2"; \
125 fi; \
126 dir0="$$dir0"/"$$first"; \
127 fi; \
128 fi; \
129 dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
130 done; \
131 reldir="$$dir2"
132ACLOCAL = @ACLOCAL@
133ALLOCA = @ALLOCA@
134AMTAR = @AMTAR@
135AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
136AR = @AR@
137AS = @AS@
138AUTOCONF = @AUTOCONF@
139AUTOHEADER = @AUTOHEADER@
140AUTOMAKE = @AUTOMAKE@
141AWK = @AWK@
142CARES_CFLAGS = @CARES_CFLAGS@
143CARES_LIBS = @CARES_LIBS@
144CC = @CC@
145CCDEPMODE = @CCDEPMODE@
146CFLAGS = @CFLAGS@
147CHECK_CFLAGS = @CHECK_CFLAGS@
148CHECK_LIBS = @CHECK_LIBS@
149CPP = @CPP@
150CPPFLAGS = @CPPFLAGS@
151CURL_CFLAGS = @CURL_CFLAGS@
152CURL_LIBS = @CURL_LIBS@
153CXX = @CXX@
154CXXCPP = @CXXCPP@
155CXXDEPMODE = @CXXDEPMODE@
156CXXFLAGS = @CXXFLAGS@
157CYGPATH_W = @CYGPATH_W@
158DEFS = @DEFS@
159DEPDIR = @DEPDIR@
160DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
161DIRECTFB_LIBS = @DIRECTFB_LIBS@
162DLLTOOL = @DLLTOOL@
163DSYMUTIL = @DSYMUTIL@
164DUMPBIN = @DUMPBIN@
165ECHO_C = @ECHO_C@
166ECHO_N = @ECHO_N@
167ECHO_T = @ECHO_T@
168ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
169ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
170EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
171EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
172EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
173EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
174EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
175EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
176EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
177EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
178EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
179EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
180EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
181EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
182EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
183EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
184EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
185EGREP = @EGREP@
186EINA_CFLAGS = @EINA_CFLAGS@
187EINA_LIBS = @EINA_LIBS@
188ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
189ESCAPE_LIBS = @ESCAPE_LIBS@
190EVAS_CFLAGS = @EVAS_CFLAGS@
191EVAS_LIBS = @EVAS_LIBS@
192EVIL_CFLAGS = @EVIL_CFLAGS@
193EVIL_LIBS = @EVIL_LIBS@
194EXEEXT = @EXEEXT@
195FGREP = @FGREP@
196GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
197GLIB_CFLAGS = @GLIB_CFLAGS@
198GLIB_LIBS = @GLIB_LIBS@
199GMSGFMT = @GMSGFMT@
200GMSGFMT_015 = @GMSGFMT_015@
201GREP = @GREP@
202INSTALL = @INSTALL@
203INSTALL_DATA = @INSTALL_DATA@
204INSTALL_PROGRAM = @INSTALL_PROGRAM@
205INSTALL_SCRIPT = @INSTALL_SCRIPT@
206INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
207INTLLIBS = @INTLLIBS@
208INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
209KEYSYMDEFS = @KEYSYMDEFS@
210LD = @LD@
211LDFLAGS = @LDFLAGS@
212LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
213LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
214LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
215LIBICONV = @LIBICONV@
216LIBINTL = @LIBINTL@
217LIBOBJS = @LIBOBJS@
218LIBS = @LIBS@
219LIBTOOL = @LIBTOOL@
220LIPO = @LIPO@
221LN_S = @LN_S@
222LTLIBICONV = @LTLIBICONV@
223LTLIBINTL = @LTLIBINTL@
224LTLIBOBJS = @LTLIBOBJS@
225MAKEINFO = @MAKEINFO@
226MKDIR_P = @MKDIR_P@
227MSGFMT = @MSGFMT@
228MSGFMT_015 = @MSGFMT_015@
229MSGMERGE = @MSGMERGE@
230NM = @NM@
231NMEDIT = @NMEDIT@
232OBJC = @OBJC@
233OBJCDEPMODE = @OBJCDEPMODE@
234OBJCFLAGS = @OBJCFLAGS@
235OBJDUMP = @OBJDUMP@
236OBJEXT = @OBJEXT@
237OTOOL = @OTOOL@
238OTOOL64 = @OTOOL64@
239PACKAGE = @PACKAGE@
240PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
241PACKAGE_NAME = @PACKAGE_NAME@
242PACKAGE_STRING = @PACKAGE_STRING@
243PACKAGE_TARNAME = @PACKAGE_TARNAME@
244PACKAGE_URL = @PACKAGE_URL@
245PACKAGE_VERSION = @PACKAGE_VERSION@
246PATH_SEPARATOR = @PATH_SEPARATOR@
247PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
248PIXMAN_LIBS = @PIXMAN_LIBS@
249PKG_CONFIG = @PKG_CONFIG@
250PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
251PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
252POSUB = @POSUB@
253RANLIB = @RANLIB@
254SDL_CFLAGS = @SDL_CFLAGS@
255SDL_CONFIG = @SDL_CONFIG@
256SDL_LIBS = @SDL_LIBS@
257SED = @SED@
258SET_MAKE = @SET_MAKE@
259SHELL = @SHELL@
260SSL_CFLAGS = @SSL_CFLAGS@
261SSL_LIBS = @SSL_LIBS@
262STRIP = @STRIP@
263TLS2_CFLAGS = @TLS2_CFLAGS@
264TLS2_LIBS = @TLS2_LIBS@
265TLS_CFLAGS = @TLS_CFLAGS@
266TLS_LIBS = @TLS_LIBS@
267TSLIB_CFLAGS = @TSLIB_CFLAGS@
268TSLIB_LIBS = @TSLIB_LIBS@
269USE_NLS = @USE_NLS@
270VERSION = @VERSION@
271VMAJ = @VMAJ@
272WIN32_CFLAGS = @WIN32_CFLAGS@
273WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
274WIN32_LIBS = @WIN32_LIBS@
275XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
276XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
277XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
278XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
279XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
280XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
281XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
282XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
283XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
284XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
285XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
286XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
287XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
288XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
289XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
290XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
291XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
292XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
293XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
294XCB_X11_LIBS = @XCB_X11_LIBS@
295XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
296XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
297XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
298XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
299XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
300XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
301XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
302XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
303XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
304XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
305XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
306XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
307XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
308XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
309XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
310XDAMAGE_LIBS = @XDAMAGE_LIBS@
311XDPMS_CFLAGS = @XDPMS_CFLAGS@
312XDPMS_LIBS = @XDPMS_LIBS@
313XFIXES_CFLAGS = @XFIXES_CFLAGS@
314XFIXES_LIBS = @XFIXES_LIBS@
315XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
316XGESTURE_LIBS = @XGESTURE_LIBS@
317XGETTEXT = @XGETTEXT@
318XGETTEXT_015 = @XGETTEXT_015@
319XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
320XI2_CFLAGS = @XI2_CFLAGS@
321XI2_LIBS = @XI2_LIBS@
322XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
323XINERAMA_LIBS = @XINERAMA_LIBS@
324XKB_CFLAGS = @XKB_CFLAGS@
325XKB_LIBS = @XKB_LIBS@
326XMKMF = @XMKMF@
327XPRINT_CFLAGS = @XPRINT_CFLAGS@
328XPRINT_LIBS = @XPRINT_LIBS@
329XRANDR_CFLAGS = @XRANDR_CFLAGS@
330XRANDR_LIBS = @XRANDR_LIBS@
331XRENDER_CFLAGS = @XRENDER_CFLAGS@
332XRENDER_LIBS = @XRENDER_LIBS@
333XSS_CFLAGS = @XSS_CFLAGS@
334XSS_LIBS = @XSS_LIBS@
335XTEST_CFLAGS = @XTEST_CFLAGS@
336XTEST_LIBS = @XTEST_LIBS@
337X_CFLAGS = @X_CFLAGS@
338X_EXTRA_LIBS = @X_EXTRA_LIBS@
339X_LIBS = @X_LIBS@
340X_PRE_LIBS = @X_PRE_LIBS@
341Xcursor_cflags = @Xcursor_cflags@
342Xcursor_libs = @Xcursor_libs@
343abs_builddir = @abs_builddir@
344abs_srcdir = @abs_srcdir@
345abs_top_builddir = @abs_top_builddir@
346abs_top_srcdir = @abs_top_srcdir@
347ac_ct_CC = @ac_ct_CC@
348ac_ct_CXX = @ac_ct_CXX@
349ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
350ac_ct_OBJC = @ac_ct_OBJC@
351am__include = @am__include@
352am__leading_dot = @am__leading_dot@
353am__quote = @am__quote@
354am__tar = @am__tar@
355am__untar = @am__untar@
356bindir = @bindir@
357build = @build@
358build_alias = @build_alias@
359build_cpu = @build_cpu@
360build_os = @build_os@
361build_vendor = @build_vendor@
362builddir = @builddir@
363cocoa_ldflags = @cocoa_ldflags@
364datadir = @datadir@
365datarootdir = @datarootdir@
366dlopen_libs = @dlopen_libs@
367docdir = @docdir@
368dvidir = @dvidir@
369ecore_cocoa_cflags = @ecore_cocoa_cflags@
370ecore_cocoa_libs = @ecore_cocoa_libs@
371ecore_con_cflags = @ecore_con_cflags@
372ecore_con_libs = @ecore_con_libs@
373ecore_directfb_cflags = @ecore_directfb_cflags@
374ecore_directfb_libs = @ecore_directfb_libs@
375ecore_evas_cflags = @ecore_evas_cflags@
376ecore_evas_libs = @ecore_evas_libs@
377ecore_fb_cflags = @ecore_fb_cflags@
378ecore_fb_libs = @ecore_fb_libs@
379ecore_file_cflags = @ecore_file_cflags@
380ecore_file_libs = @ecore_file_libs@
381ecore_imf_cflags = @ecore_imf_cflags@
382ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
383ecore_imf_evas_libs = @ecore_imf_evas_libs@
384ecore_imf_libs = @ecore_imf_libs@
385ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
386ecore_imf_xim_libs = @ecore_imf_xim_libs@
387ecore_input_cflags = @ecore_input_cflags@
388ecore_input_evas_cflags = @ecore_input_evas_cflags@
389ecore_input_evas_libs = @ecore_input_evas_libs@
390ecore_input_libs = @ecore_input_libs@
391ecore_ipc_cflags = @ecore_ipc_cflags@
392ecore_ipc_libs = @ecore_ipc_libs@
393ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
394ecore_psl1ght_libs = @ecore_psl1ght_libs@
395ecore_sdl_cflags = @ecore_sdl_cflags@
396ecore_sdl_libs = @ecore_sdl_libs@
397ecore_win32_cflags = @ecore_win32_cflags@
398ecore_win32_libs = @ecore_win32_libs@
399ecore_wince_cflags = @ecore_wince_cflags@
400ecore_wince_libs = @ecore_wince_libs@
401ecore_x_cflags = @ecore_x_cflags@
402ecore_x_libs = @ecore_x_libs@
403ecore_x_libs_private = @ecore_x_libs_private@
404efl_doxygen = @efl_doxygen@
405efl_have_doxygen = @efl_have_doxygen@
406exec_prefix = @exec_prefix@
407have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
408host = @host@
409host_alias = @host_alias@
410host_cpu = @host_cpu@
411host_os = @host_os@
412host_vendor = @host_vendor@
413htmldir = @htmldir@
414includedir = @includedir@
415infodir = @infodir@
416install_sh = @install_sh@
417libdir = @libdir@
418libexecdir = @libexecdir@
419localedir = @localedir@
420localstatedir = @localstatedir@
421lt_ECHO = @lt_ECHO@
422lt_enable_auto_import = @lt_enable_auto_import@
423mandir = @mandir@
424mkdir_p = @mkdir_p@
425oldincludedir = @oldincludedir@
426pdfdir = @pdfdir@
427pkgconfig_requires_private = @pkgconfig_requires_private@
428prefix = @prefix@
429program_transform_name = @program_transform_name@
430psdir = @psdir@
431release_info = @release_info@
432requirements_ecore = @requirements_ecore@
433requirements_ecore_cocoa = @requirements_ecore_cocoa@
434requirements_ecore_con = @requirements_ecore_con@
435requirements_ecore_directfb = @requirements_ecore_directfb@
436requirements_ecore_evas = @requirements_ecore_evas@
437requirements_ecore_fb = @requirements_ecore_fb@
438requirements_ecore_file = @requirements_ecore_file@
439requirements_ecore_imf = @requirements_ecore_imf@
440requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
441requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
442requirements_ecore_input = @requirements_ecore_input@
443requirements_ecore_input_evas = @requirements_ecore_input_evas@
444requirements_ecore_ipc = @requirements_ecore_ipc@
445requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
446requirements_ecore_sdl = @requirements_ecore_sdl@
447requirements_ecore_win32 = @requirements_ecore_win32@
448requirements_ecore_wince = @requirements_ecore_wince@
449requirements_ecore_x = @requirements_ecore_x@
450rt_libs = @rt_libs@
451sbindir = @sbindir@
452sharedstatedir = @sharedstatedir@
453srcdir = @srcdir@
454sysconfdir = @sysconfdir@
455target_alias = @target_alias@
456top_build_prefix = @top_build_prefix@
457top_builddir = @top_builddir@
458top_srcdir = @top_srcdir@
459version_info = @version_info@
460x_cflags = @x_cflags@
461x_includes = @x_includes@
462x_libs = @x_libs@
463MAINTAINERCLEANFILES = Makefile.in
464SUBDIRS = ecore $(am__append_1) $(am__append_2) $(am__append_3) \
465 $(am__append_4) $(am__append_5) $(am__append_6) \
466 $(am__append_7) $(am__append_8) $(am__append_9) \
467 $(am__append_10) $(am__append_11) $(am__append_12) \
468 $(am__append_13) $(am__append_14) $(am__append_15) \
469 $(am__append_16) $(am__append_17)
470all: all-recursive
471
472.SUFFIXES:
473$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
474 @for dep in $?; do \
475 case '$(am__configure_deps)' in \
476 *$$dep*) \
477 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
478 && { if test -f $@; then exit 0; else break; fi; }; \
479 exit 1;; \
480 esac; \
481 done; \
482 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/Makefile'; \
483 $(am__cd) $(top_srcdir) && \
484 $(AUTOMAKE) --gnu src/lib/Makefile
485.PRECIOUS: Makefile
486Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
487 @case '$?' in \
488 *config.status*) \
489 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
490 *) \
491 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
492 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
493 esac;
494
495$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
496 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
497
498$(top_srcdir)/configure: $(am__configure_deps)
499 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
500$(ACLOCAL_M4): $(am__aclocal_m4_deps)
501 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
502$(am__aclocal_m4_deps):
503
504mostlyclean-libtool:
505 -rm -f *.lo
506
507clean-libtool:
508 -rm -rf .libs _libs
509
510# This directory's subdirectories are mostly independent; you can cd
511# into them and run `make' without going through this Makefile.
512# To change the values of `make' variables: instead of editing Makefiles,
513# (1) if the variable is set in `config.status', edit `config.status'
514# (which will cause the Makefiles to be regenerated when you run `make');
515# (2) otherwise, pass the desired values on the `make' command line.
516$(RECURSIVE_TARGETS):
517 @fail= failcom='exit 1'; \
518 for f in x $$MAKEFLAGS; do \
519 case $$f in \
520 *=* | --[!k]*);; \
521 *k*) failcom='fail=yes';; \
522 esac; \
523 done; \
524 dot_seen=no; \
525 target=`echo $@ | sed s/-recursive//`; \
526 list='$(SUBDIRS)'; for subdir in $$list; do \
527 echo "Making $$target in $$subdir"; \
528 if test "$$subdir" = "."; then \
529 dot_seen=yes; \
530 local_target="$$target-am"; \
531 else \
532 local_target="$$target"; \
533 fi; \
534 ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
535 || eval $$failcom; \
536 done; \
537 if test "$$dot_seen" = "no"; then \
538 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
539 fi; test -z "$$fail"
540
541$(RECURSIVE_CLEAN_TARGETS):
542 @fail= failcom='exit 1'; \
543 for f in x $$MAKEFLAGS; do \
544 case $$f in \
545 *=* | --[!k]*);; \
546 *k*) failcom='fail=yes';; \
547 esac; \
548 done; \
549 dot_seen=no; \
550 case "$@" in \
551 distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
552 *) list='$(SUBDIRS)' ;; \
553 esac; \
554 rev=''; for subdir in $$list; do \
555 if test "$$subdir" = "."; then :; else \
556 rev="$$subdir $$rev"; \
557 fi; \
558 done; \
559 rev="$$rev ."; \
560 target=`echo $@ | sed s/-recursive//`; \
561 for subdir in $$rev; do \
562 echo "Making $$target in $$subdir"; \
563 if test "$$subdir" = "."; then \
564 local_target="$$target-am"; \
565 else \
566 local_target="$$target"; \
567 fi; \
568 ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
569 || eval $$failcom; \
570 done && test -z "$$fail"
571tags-recursive:
572 list='$(SUBDIRS)'; for subdir in $$list; do \
573 test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
574 done
575ctags-recursive:
576 list='$(SUBDIRS)'; for subdir in $$list; do \
577 test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
578 done
579
580ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
581 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
582 unique=`for i in $$list; do \
583 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
584 done | \
585 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
586 END { if (nonempty) { for (i in files) print i; }; }'`; \
587 mkid -fID $$unique
588tags: TAGS
589
590TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
591 $(TAGS_FILES) $(LISP)
592 set x; \
593 here=`pwd`; \
594 if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
595 include_option=--etags-include; \
596 empty_fix=.; \
597 else \
598 include_option=--include; \
599 empty_fix=; \
600 fi; \
601 list='$(SUBDIRS)'; for subdir in $$list; do \
602 if test "$$subdir" = .; then :; else \
603 test ! -f $$subdir/TAGS || \
604 set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
605 fi; \
606 done; \
607 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
608 unique=`for i in $$list; do \
609 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
610 done | \
611 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
612 END { if (nonempty) { for (i in files) print i; }; }'`; \
613 shift; \
614 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
615 test -n "$$unique" || unique=$$empty_fix; \
616 if test $$# -gt 0; then \
617 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
618 "$$@" $$unique; \
619 else \
620 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
621 $$unique; \
622 fi; \
623 fi
624ctags: CTAGS
625CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
626 $(TAGS_FILES) $(LISP)
627 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
628 unique=`for i in $$list; do \
629 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
630 done | \
631 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
632 END { if (nonempty) { for (i in files) print i; }; }'`; \
633 test -z "$(CTAGS_ARGS)$$unique" \
634 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
635 $$unique
636
637GTAGS:
638 here=`$(am__cd) $(top_builddir) && pwd` \
639 && $(am__cd) $(top_srcdir) \
640 && gtags -i $(GTAGS_ARGS) "$$here"
641
642distclean-tags:
643 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
644
645distdir: $(DISTFILES)
646 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
647 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
648 list='$(DISTFILES)'; \
649 dist_files=`for file in $$list; do echo $$file; done | \
650 sed -e "s|^$$srcdirstrip/||;t" \
651 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
652 case $$dist_files in \
653 */*) $(MKDIR_P) `echo "$$dist_files" | \
654 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
655 sort -u` ;; \
656 esac; \
657 for file in $$dist_files; do \
658 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
659 if test -d $$d/$$file; then \
660 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
661 if test -d "$(distdir)/$$file"; then \
662 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
663 fi; \
664 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
665 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
666 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
667 fi; \
668 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
669 else \
670 test -f "$(distdir)/$$file" \
671 || cp -p $$d/$$file "$(distdir)/$$file" \
672 || exit 1; \
673 fi; \
674 done
675 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
676 if test "$$subdir" = .; then :; else \
677 test -d "$(distdir)/$$subdir" \
678 || $(MKDIR_P) "$(distdir)/$$subdir" \
679 || exit 1; \
680 fi; \
681 done
682 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
683 if test "$$subdir" = .; then :; else \
684 dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
685 $(am__relativize); \
686 new_distdir=$$reldir; \
687 dir1=$$subdir; dir2="$(top_distdir)"; \
688 $(am__relativize); \
689 new_top_distdir=$$reldir; \
690 echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
691 echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
692 ($(am__cd) $$subdir && \
693 $(MAKE) $(AM_MAKEFLAGS) \
694 top_distdir="$$new_top_distdir" \
695 distdir="$$new_distdir" \
696 am__remove_distdir=: \
697 am__skip_length_check=: \
698 am__skip_mode_fix=: \
699 distdir) \
700 || exit 1; \
701 fi; \
702 done
703check-am: all-am
704check: check-recursive
705all-am: Makefile
706installdirs: installdirs-recursive
707installdirs-am:
708install: install-recursive
709install-exec: install-exec-recursive
710install-data: install-data-recursive
711uninstall: uninstall-recursive
712
713install-am: all-am
714 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
715
716installcheck: installcheck-recursive
717install-strip:
718 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
719 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
720 `test -z '$(STRIP)' || \
721 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
722mostlyclean-generic:
723
724clean-generic:
725
726distclean-generic:
727 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
728 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
729
730maintainer-clean-generic:
731 @echo "This command is intended for maintainers to use"
732 @echo "it deletes files that may require special tools to rebuild."
733 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
734clean: clean-recursive
735
736clean-am: clean-generic clean-libtool mostlyclean-am
737
738distclean: distclean-recursive
739 -rm -f Makefile
740distclean-am: clean-am distclean-generic distclean-tags
741
742dvi: dvi-recursive
743
744dvi-am:
745
746html: html-recursive
747
748html-am:
749
750info: info-recursive
751
752info-am:
753
754install-data-am:
755
756install-dvi: install-dvi-recursive
757
758install-dvi-am:
759
760install-exec-am:
761
762install-html: install-html-recursive
763
764install-html-am:
765
766install-info: install-info-recursive
767
768install-info-am:
769
770install-man:
771
772install-pdf: install-pdf-recursive
773
774install-pdf-am:
775
776install-ps: install-ps-recursive
777
778install-ps-am:
779
780installcheck-am:
781
782maintainer-clean: maintainer-clean-recursive
783 -rm -f Makefile
784maintainer-clean-am: distclean-am maintainer-clean-generic
785
786mostlyclean: mostlyclean-recursive
787
788mostlyclean-am: mostlyclean-generic mostlyclean-libtool
789
790pdf: pdf-recursive
791
792pdf-am:
793
794ps: ps-recursive
795
796ps-am:
797
798uninstall-am:
799
800.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
801 install-am install-strip tags-recursive
802
803.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
804 all all-am check check-am clean clean-generic clean-libtool \
805 ctags ctags-recursive distclean distclean-generic \
806 distclean-libtool distclean-tags distdir dvi dvi-am html \
807 html-am info info-am install install-am install-data \
808 install-data-am install-dvi install-dvi-am install-exec \
809 install-exec-am install-html install-html-am install-info \
810 install-info-am install-man install-pdf install-pdf-am \
811 install-ps install-ps-am install-strip installcheck \
812 installcheck-am installdirs installdirs-am maintainer-clean \
813 maintainer-clean-generic mostlyclean mostlyclean-generic \
814 mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
815 uninstall uninstall-am
816
817
818# Tell versions [3.59,3.63) of GNU make to not export all variables.
819# Otherwise a system limit (for SysV at least) may be exceeded.
820.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore/Ecore.h b/libraries/ecore/src/lib/ecore/Ecore.h
new file mode 100644
index 0000000..fe4e631
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/Ecore.h
@@ -0,0 +1,2346 @@
1/**
2 @brief Ecore Library Public API Calls
3
4 These routines are used for Ecore Library interaction
5 */
6
7/**
8
9 @mainpage Ecore
10
11 @version 1.1
12 @date 2000-2011
13
14 Please see the @ref authors page for contact details.
15
16 @section intro Introduction
17
18 Ecore is a library of convenience functions. A brief explanation of how to use
19 it can be found in @ref Ecore_Main_Loop_Page.
20
21 The Ecore library provides the following modules:
22 @li @ref Ecore_Main_Loop_Group
23 @li @ref Ecore_File_Group
24 @li @ref Ecore_Con_Group
25 @li @link Ecore_Evas.h Ecore_Evas - Evas convenience functions. @endlink
26 @li @ref Ecore_FB_Group
27 @li @link Ecore_Ipc.h Ecore_IPC - Inter Process Communication functions. @endlink
28 @li @link Ecore_X.h Ecore_X - X Windows System wrapper. @endlink
29 @li @ref Ecore_Win32_Group
30 @li @ref Ecore_WinCE_Group
31
32 For more info on Ecore usage, there are these @ref Examples.
33
34 @section compiling How to compile using Ecore?
35 pkgconfig (.pc) files are installed for every ecore module.
36 Thus, to compile using any of them, you can use something like the following:
37
38 @verbatim
39 gcc *.c $(pkg-config ecore ecore-$x ecore-$y [...] --cflags --libs)
40 @endverbatim
41
42 @section install How is it installed?
43
44 Suggested configure options for evas for a Linux desktop X display:
45
46 @verbatim
47 ./configure \
48 make
49 su -
50 ...
51 make install
52 @endverbatim
53
54 */
55
56/**
57 @page authors Authors
58 @author Carsten Haitzler <raster@rasterman.com>
59 @author Tom Gilbert <tom@linuxbrit.co.uk>
60 @author Burra <burra@colorado.edu>
61 @author Chris Ross <chris@darkrock.co.uk>
62 @author Term <term@twistedpath.org>
63 @author Tilman Sauerbeck <tilman@code-monkey.de>
64 @author Ibukun Olumuyiwa <ibukun@computer.org>
65 @author Yuri <da2001@hotmail.ru>
66 @author Nicholas Curran <quasar@bigblue.net.au>
67 @author Howell Tam <pigeon@pigeond.net>
68 @author Nathan Ingersoll <rbdpngn@users.sourceforge.net>
69 @author Andrew Elcock <andy@elcock.org>
70 @author Kim Woelders <kim@woelders.dk>
71 @author Sebastian Dransfeld <sebastid@tango.flipp.net>
72 @author Simon Poole <simon.armlinux@themalago.net>
73 @author Jorge Luis Zapata Muga <jorgeluis.zapata@gmail.com>
74 @author dan sinclair <zero@everburning.com>
75 @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
76 @author David 'onefang' Seikel <onefang@gmail.com>
77 @author Hisham 'CodeWarrior' Mardam Bey <hisham@hisham.cc>
78 @author Brian 'rephorm' Mattern <rephorm@rephorm.com>
79 @author Tim Horton <hortont424@gmail.com>
80 @author Arnaud de Turckheim 'quarium' <quarium@gmail.com>
81 @author Matt Barclay <mbarclay@gmail.com>
82 @author Peter Wehrfritz <peter.wehrfritz@web.de>
83 @author Albin "Lutin" Tonnerre <albin.tonnerre@gmail.com>
84 @author Vincent Torri <vincent.torri@gmail.com>
85 @author Lars Munch <lars@segv.dk>
86 @author Andre Dieb <andre.dieb@gmail.com>
87 @author Mathieu Taillefumier <mathieu.taillefumier@free.fr>
88 @author Rui Miguel Silva Seabra <rms@1407.org>
89 @author Samsung Electronics
90 @author Samsung SAIT
91 @author Nicolas Aguirre <aguirre.nicolas@gmail.com>
92 @author Brett Nash <nash@nash.id.au>
93 @author Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
94 @author Leif Middelschulte <leif.middelschulte@gmail.com>
95 @author Mike McCormack <mj.mccormack@samsung.com>
96 @author Sangho Park <gouache95@gmail.com>
97 @author Jihoon Kim <jihoon48.kim@samsung.com> <imfine98@gmail.com>
98 @author Daniel Juyung Seo <seojuyung2@gmail.com> <juyung.seo@samsung.com>
99
100 Please contact <enlightenment-devel@lists.sourceforge.net> to get in
101 contact with the developers and maintainers.
102 */
103
104/*
105 @page Ecore_Main_Loop_Page The Ecore Main Loop
106
107 @section intro What is Ecore?
108
109 Ecore is a clean and tiny event loop library with many modules to do lots of
110 convenient things for a programmer, to save time and effort.
111
112 It's small and lean, designed to work on embedded systems all the way to
113 large and powerful multi-cpu workstations. It serialises all system signals,
114 events etc. into a single event queue, that is easily processed without
115 needing to worry about concurrency. A properly written, event-driven program
116 using this kind of programming doesn't need threads, nor has to worry about
117 concurrency. It turns a program into a state machine, and makes it very
118 robust and easy to follow.
119
120 Ecore gives you other handy primitives, such as timers to tick over for you
121 and call specified functions at particular times so the programmer can use
122 this to do things, like animate, or time out on connections or tasks that take
123 too long etc.
124
125 Idle handlers are provided too, as well as calls on entering an idle state
126 (often a very good time to update the state of the program). All events that
127 enter the system are passed to specific callback functions that the program
128 sets up to handle those events. Handling them is simple and other Ecore
129 modules produce more events on the queue, coming from other sources such as
130 file descriptors etc.
131
132 Ecore also lets you have functions called when file descriptors become active
133 for reading or writing, allowing for streamlined, non-blocking IO.
134
135 Here is an example of a simple program and its basic event loop flow:
136
137 @image html prog_flow.png
138 @image latex prog_flow.eps width=\textwidth
139
140
141
142 @section work How does Ecore work?
143
144 Ecore is very easy to learn and use. All the function calls are designed to
145 be easy to remember, explicit in describing what they do, and heavily
146 name-spaced. Ecore programs can start and be very simple.
147
148 For example:
149
150 @code
151 #include <Ecore.h>
152
153 int
154 main(int argc, const char **argv)
155 {
156 ecore_init();
157 ecore_app_args_set(argc, argv);
158 ecore_main_loop_begin();
159 ecore_shutdown();
160 return 0;
161 }
162 @endcode
163
164 This program is very simple and doesn't check for errors, but it does start up
165 and begin a main loop waiting for events or timers to tick off. This program
166 doesn't set up any, but now we can expand on this simple program a little
167 more by adding some event handlers and timers.
168
169 @code
170 #include <Ecore.h>
171
172 Ecore_Timer *timer1 = NULL;
173 Ecore_Event_Handler *handler1 = NULL;
174 double start_time = 0.0;
175
176 int
177 timer_func(void *data)
178 {
179 printf("Tick timer. Sec: %3.2f\n", ecore_time_get() - start_time);
180 return 1;
181 }
182
183 int
184 exit_func(void *data, int ev_type, void *ev)
185 {
186 Ecore_Event_Signal_Exit *e;
187
188 e = (Ecore_Event_Signal_Exit *)ev;
189 if (e->interrupt) printf("Exit: interrupt\n");
190 else if (e->quit) printf("Exit: quit\n");
191 else if (e->terminate) printf("Exit: terminate\n");
192 ecore_main_loop_quit();
193 return 1;
194 }
195
196 int
197 main(int argc, const char **argv)
198 {
199 ecore_init();
200 ecore_app_args_set(argc, argv);
201 start_time = ecore_time_get();
202 handler1 = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, exit_func, NULL);
203 timer1 = ecore_timer_add(0.5, timer_func, NULL);
204 ecore_main_loop_begin();
205 ecore_shutdown();
206 return 0;
207 }
208 @endcode
209
210 In the previous example, we initialize our application and get the time at
211 which our program has started so we can calculate an offset. We set
212 up a timer to tick off in 0.5 seconds, and since it returns 1, will
213 keep ticking off every 0.5 seconds until it returns 0, or is deleted
214 by hand. An event handler is set up to call a function -
215 exit_func(),
216 whenever an event of type ECORE_EVENT_SIGNAL_EXIT is received (CTRL-C
217 on the command line will cause such an event to happen). If this event
218 occurs it tells you what kind of exit signal was received, and asks
219 the main loop to quit when it is finished by calling
220 ecore_main_loop_quit().
221
222 The handles returned by ecore_timer_add() and
223 ecore_event_handler_add() are
224 only stored here as an example. If you don't need to address the timer or
225 event handler again you don't need to store the result, so just call the
226 function, and don't assign the result to any variable.
227
228 This program looks slightly more complex than needed to do these simple
229 things, but in principle, programs don't get any more complex. You add more
230 event handlers, for more events, will have more timers and such, BUT it all
231 follows the same principles as shown in this example.
232
233 */
234
235/*
236 @page Ecore_Config_Page The Enlightened Property Library
237
238 The Enlightened Property Library (Ecore_Config) is an adbstraction
239 from the complexities of writing your own configuration. It provides
240 many features using the Enlightenment 17 development libraries.
241
242 To use the library, you:
243 @li Set the default values of your properties.
244 @li Load the configuration from a file. You must set the default values
245 first, so that the library knows the correct type of each argument.
246
247 The following examples show how to use the Enlightened Property Library:
248 @li @link config_basic_example.c config_basic_example.c @endlink
249 @li @link config_listener_example.c config_listener_example.c @endlink
250
251 */
252
253/**
254 @page X_Window_System_Page X Window System
255
256 The Ecore library includes a wrapper for handling the X window system.
257 This page briefly explains what the X window system is and various terms
258 that are used.
259 */
260
261#ifndef _ECORE_H
262#define _ECORE_H
263
264#ifdef _MSC_VER
265# include <Evil.h>
266#endif
267
268#include <Eina.h>
269
270#ifdef EAPI
271# undef EAPI
272#endif
273
274#ifdef _WIN32
275# ifdef EFL_ECORE_BUILD
276# ifdef DLL_EXPORT
277# define EAPI __declspec(dllexport)
278# else
279# define EAPI
280# endif /* ! DLL_EXPORT */
281# else
282# define EAPI __declspec(dllimport)
283# endif /* ! EFL_ECORE_BUILD */
284#else
285# ifdef __GNUC__
286# if __GNUC__ >= 4
287# define EAPI __attribute__ ((visibility("default")))
288# else
289# define EAPI
290# endif
291# else
292# define EAPI
293# endif
294#endif /* ! _WIN32 */
295
296#ifdef _WIN32
297# include <winsock2.h>
298#elif (defined (__FreeBSD__) && (__FreeBSD_version >= 420001)) || defined (__OpenBSD__)
299# include <sys/select.h>
300# include <signal.h>
301#else
302# include <sys/time.h>
303# include <signal.h>
304#endif
305
306#include <sys/types.h>
307
308#ifdef __cplusplus
309extern "C" {
310#endif
311
312/**
313 * @defgroup Ecore_Init_Group Ecore initialization and shutdown functions.
314 *
315 * @{
316 */
317
318EAPI int
319 ecore_init(void);
320EAPI int
321 ecore_shutdown(void);
322
323/**
324 * @}
325 */
326
327/**
328 *
329 * @defgroup Ecore_Main_Loop_Group Ecore main loop functions
330 *
331 * These are functions acting on Ecore's main loop itself or on
332 * events and infrastructure directly linked to it. This loop is
333 * designed to work on embedded systems all the way to large and
334 * powerful multi-cpu workstations.
335 *
336 * It serialises all system signals and events into a single event
337 * queue, that can be easily processed without needing to worry
338 * about concurrency. A properly written, event-driven program
339 * using this kind of programming does not need threads. It makes
340 * the program very robust and easy to follow.
341 *
342 * For example, for the main loop to be of any use, you need to be
343 * able to add @b events and event handlers on it. Events for file
344 * descriptor events are covered in @ref Ecore_FD_Handler_Group.
345 *
346 * Timer functions are covered in @ref Ecore_Time_Group.
347 *
348 * There is also provision for callbacks for when the loop enters or
349 * exits an @b idle state. See @ref Ecore_Idle_Group for more
350 * information on it.
351 *
352 * Functions are also provided for spawning child processes using
353 * @c fork(). See @ref Ecore_Exe_Group for more details on it.
354 *
355 * Here is an example of simple program and its basic event loop
356 * flow:
357 *
358 * @image html prog_flow.png
359 * @image latex prog_flow.eps width=\textwidth
360 *
361 * For examples of setting up and using a main loop, see
362 * @ref Ecore_Main_Loop_Page.
363 *
364 * @{
365 */
366
367#define ECORE_VERSION_MAJOR 1
368#define ECORE_VERSION_MINOR 0
369
370typedef struct _Ecore_Version
371{
372 int major;
373 int minor;
374 int micro;
375 int revision;
376} Ecore_Version;
377
378EAPI extern Ecore_Version *ecore_version;
379
380#define ECORE_CALLBACK_CANCEL EINA_FALSE /**< Return value to remove a callback */
381#define ECORE_CALLBACK_RENEW EINA_TRUE /**< Return value to keep a callback */
382
383#define ECORE_CALLBACK_PASS_ON EINA_TRUE /**< Return value to pass event to next handler */
384#define ECORE_CALLBACK_DONE EINA_FALSE /**< Return value to stop event handling */
385
386/**
387 * @typedef Ecore_Task_Cb Ecore_Task_Cb
388 * A callback run for a task (timer, idler, poller, animator, etc)
389 */
390typedef Eina_Bool (*Ecore_Task_Cb)(void *data);
391
392/**
393 * @typedef Ecore_Eselect_Function Ecore_Eselect_Function
394 * A function which can be used to replace select() in the main loop
395 */
396typedef int (*Ecore_Select_Function)(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
397
398EAPI void
399ecore_main_loop_iterate(void);
400
401EAPI void
402 ecore_main_loop_select_func_set(Ecore_Select_Function func);
403EAPI Ecore_Select_Function
404 ecore_main_loop_select_func_get(void);
405
406EAPI Eina_Bool
407 ecore_main_loop_glib_integrate(void);
408EAPI void
409 ecore_main_loop_glib_always_integrate_disable(void);
410
411EAPI void
412 ecore_main_loop_begin(void);
413EAPI void
414 ecore_main_loop_quit(void);
415
416/**
417 * @typedef Ecore_Cb Ecore_Cb
418 * A generic callback called as a hook when a certain point in
419 * execution is reached.
420 */
421typedef void (*Ecore_Cb)(void *data);
422
423/**
424 * @typedef Ecore_Data_Cb Ecore_Data_Cb
425 * A callback which is used to return data to the main function
426 */
427typedef void *(*Ecore_Data_Cb)(void *data);
428
429/**
430 * @brief Call callback asynchronously in the main loop.
431 * @since 1.1.0
432 *
433 * @param callback The callback to call in the main loop
434 * @param data The data to give to that call back
435 *
436 * For all calls that need to happen in the main loop (most EFL functions do),
437 * this helper function provides the infrastructure needed to do it safely
438 * by avoiding dead lock, race condition and properly wake up the main loop.
439 *
440 * Remember after that function call, you should never touch again the @p data
441 * in the thread, it is owned by the main loop and your callback should take
442 * care of freeing it if necessary.
443 */
444EAPI void
445ecore_main_loop_thread_safe_call_async(Ecore_Cb callback,
446 void *data);
447
448/**
449 * @brief Call callback synchronously in the main loop.
450 * @since 1.1.0
451 *
452 * @param callback The callback to call in the main loop
453 * @param data The data to give to that call back
454 * @return the value returned by the callback in the main loop
455 *
456 * For all calls that need to happen in the main loop (most EFL functions do),
457 * this helper function provides the infrastructure needed to do it safely
458 * by avoiding dead lock, race condition and properly wake up the main loop.
459 *
460 * Remember this function will block until the callback is executed in the
461 * main loop. It can take time and you have no guaranty about the timeline.
462 */
463EAPI void *
464ecore_main_loop_thread_safe_call_sync(Ecore_Data_Cb callback,
465 void *data);
466
467/**
468 * @brief This function suspend the main loop in a know state
469 * @since 1.1.0
470 *
471 * @result the number of time ecore_thread_main_loop_begin() has been called
472 * in this thread, if the main loop was suspended correctly. If not, it return @c -1.
473 *
474 * This function suspend the main loop in a know state, this let you
475 * use any EFL call you want after it return. Be carefull, the main loop
476 * is blocked until you call ecore_thread_main_loop_end(). This is
477 * the only sane way to achieve pseudo thread safety.
478 *
479 * Notice that until the main loop is blocked, the thread is blocked
480 * and their is noway around that.
481 *
482 * We still advise you, when possible, to use ecore_main_loop_thread_safe_call_async()
483 * as it will not block the thread nor the main loop.
484 */
485EAPI int
486ecore_thread_main_loop_begin(void);
487
488/**
489 * @brief Unlock the main loop.
490 * @since 1.1.0
491 *
492 * @result the number of time ecore_thread_main_loop_end() need to be called before
493 * the main loop is unlocked again. @c -1 will be returned if you are trying to unlock
494 * when there wasn't enough call to ecore_thread_main_loop_begin().
495 *
496 * After a call to ecore_thread_main_loop_begin(), you need to absolutly
497 * call ecore_thread_main_loop_end(), or you application will stay frozen.
498 */
499EAPI int
500ecore_thread_main_loop_end(void);
501
502/**
503 * @}
504 */
505
506/**
507 * @defgroup Ecore_Event_Group Ecore Event functions
508 *
509 * Ecore events are used to wake up the Ecore main loop to warn
510 * about state changes, tasks completed, data available for reading
511 * or writing, etc. They are the base of the event oriented
512 * programming.
513 *
514 * The idea is to write many functions (callbacks) that will be
515 * registered to specific events, and called when these events
516 * happen. This way, when the system state changes (a mouse click is
517 * detected, a key is pressed, or the content of a file changes, for
518 * example), the respective callbacks will be called with some
519 * information about that event. Usually the function/callback will
520 * have a data pointer to the event info (the position in the screen
521 * where the mouse was clicked, the name of the key that was
522 * pressed, or the name of the file that has changed).
523 *
524 * The basic usage, when one needs to watch for an existing event,
525 * is to register a callback to it using ecore_event_add(). Of
526 * course it's necessary to know beforehand what are the types of
527 * events that the system/library will emmit. This should be
528 * available with the documentation from that system/library.
529 *
530 * When writing a library or group of functions that need to inform
531 * about something, and you already are running on top of a main
532 * loop, it is usually a good approach to use events. This way you
533 * allow others to register as many callbacks as necessary to this
534 * event, and don't have to care about who is registering to it. The
535 * functions ecore_event_type_new() and ecore_event_add() are
536 * available for this purpose.
537 *
538 * Example that deals with events:
539 *
540 * @li @ref ecore_event_example_c
541 *
542 * @ingroup Ecore_Main_Loop_Group
543 *
544 * @{
545 */
546
547#define ECORE_EVENT_NONE 0
548#define ECORE_EVENT_SIGNAL_USER 1 /**< User signal event */
549#define ECORE_EVENT_SIGNAL_HUP 2 /**< Hup signal event */
550#define ECORE_EVENT_SIGNAL_EXIT 3 /**< Exit signal event */
551#define ECORE_EVENT_SIGNAL_POWER 4 /**< Power signal event */
552#define ECORE_EVENT_SIGNAL_REALTIME 5 /**< Realtime signal event */
553#define ECORE_EVENT_COUNT 6
554
555typedef struct _Ecore_Win32_Handler Ecore_Win32_Handler; /**< A handle for HANDLE handlers on Windows */
556typedef struct _Ecore_Event_Handler Ecore_Event_Handler; /**< A handle for an event handler */
557typedef struct _Ecore_Event_Filter Ecore_Event_Filter; /**< A handle for an event filter */
558typedef struct _Ecore_Event Ecore_Event; /**< A handle for an event */
559typedef struct _Ecore_Event_Signal_User Ecore_Event_Signal_User; /**< User signal event */
560typedef struct _Ecore_Event_Signal_Hup Ecore_Event_Signal_Hup; /**< Hup signal event */
561typedef struct _Ecore_Event_Signal_Exit Ecore_Event_Signal_Exit; /**< Exit signal event */
562typedef struct _Ecore_Event_Signal_Power Ecore_Event_Signal_Power; /**< Power signal event */
563typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime; /**< Realtime signal event */
564
565/**
566 * @typedef Ecore_Filter_Cb
567 * A callback used for filtering events from the main loop.
568 */
569typedef Eina_Bool (*Ecore_Filter_Cb)(void *data, void *loop_data, int type, void *event);
570
571/**
572 * @typedef Ecore_End_Cb Ecore_End_Cb
573 * This is the callback which is called at the end of a function,
574 * usually for cleanup purposes.
575 */
576typedef void (*Ecore_End_Cb)(void *user_data, void *func_data);
577
578/**
579 * @typedef Ecore_Event_Handler_Cb Ecore_Event_Handler_Cb
580 * A callback used by the main loop to handle events of a specified
581 * type.
582 */
583typedef Eina_Bool (*Ecore_Event_Handler_Cb)(void *data, int type, void *event);
584
585struct _Ecore_Event_Signal_User /** User signal event */
586{
587 int number; /**< The signal number. Either 1 or 2 */
588 void *ext_data; /**< Extension data - not used */
589
590#if !defined (_WIN32) && !defined (__lv2ppu__)
591 siginfo_t data; /**< Signal info */
592#endif
593};
594
595struct _Ecore_Event_Signal_Hup /** Hup signal event */
596{
597 void *ext_data; /**< Extension data - not used */
598
599#if !defined (_WIN32) && !defined (__lv2ppu__)
600 siginfo_t data; /**< Signal info */
601#endif
602};
603
604struct _Ecore_Event_Signal_Exit /** Exit request event */
605{
606 Eina_Bool interrupt : 1; /**< Set if the exit request was an interrupt signal*/
607 Eina_Bool quit : 1; /**< set if the exit request was a quit signal */
608 Eina_Bool terminate : 1; /**< Set if the exit request was a terminate singal */
609 void *ext_data; /**< Extension data - not used */
610
611#if !defined (_WIN32) && !defined (__lv2ppu__)
612 siginfo_t data; /**< Signal info */
613#endif
614};
615
616struct _Ecore_Event_Signal_Power /** Power event */
617{
618 void *ext_data; /**< Extension data - not used */
619
620#if !defined (_WIN32) && !defined (__lv2ppu__)
621 siginfo_t data; /**< Signal info */
622#endif
623};
624
625struct _Ecore_Event_Signal_Realtime /** Realtime event */
626{
627 int num; /**< The realtime signal's number */
628
629#if !defined (_WIN32) && !defined (__lv2ppu__)
630 siginfo_t data; /**< Signal info */
631#endif
632};
633
634EAPI Ecore_Event_Handler *
635ecore_event_handler_add(int type,
636 Ecore_Event_Handler_Cb func,
637 const void *data);
638EAPI void *
639 ecore_event_handler_del(Ecore_Event_Handler *event_handler);
640EAPI Ecore_Event *
641 ecore_event_add(int type,
642 void *ev,
643 Ecore_End_Cb func_free,
644 void *data);
645EAPI void *
646 ecore_event_del(Ecore_Event *event);
647EAPI void *
648 ecore_event_handler_data_get(Ecore_Event_Handler *eh);
649EAPI void *
650 ecore_event_handler_data_set(Ecore_Event_Handler *eh,
651 const void *data);
652EAPI int
653 ecore_event_type_new(void);
654EAPI Ecore_Event_Filter *
655 ecore_event_filter_add(Ecore_Data_Cb func_start,
656 Ecore_Filter_Cb func_filter,
657 Ecore_End_Cb func_end,
658 const void *data);
659EAPI void *
660 ecore_event_filter_del(Ecore_Event_Filter *ef);
661EAPI int
662 ecore_event_current_type_get(void);
663EAPI void *
664 ecore_event_current_event_get(void);
665
666/**
667 * @}
668 */
669
670/**
671 * @defgroup Ecore_Exe_Group Process Spawning Functions
672 *
673 * Functions that deal with and send signals to spawned processes.
674 *
675 * @ingroup Ecore_Main_Loop_Group
676 *
677 * @{
678 */
679
680 #define ECORE_EXE_PRIORITY_INHERIT 9999
681
682EAPI extern int ECORE_EXE_EVENT_ADD; /**< A child process has been added */
683EAPI extern int ECORE_EXE_EVENT_DEL; /**< A child process has been deleted (it exited, naming consistent with the rest of ecore). */
684EAPI extern int ECORE_EXE_EVENT_DATA; /**< Data from a child process. */
685EAPI extern int ECORE_EXE_EVENT_ERROR; /**< Errors from a child process. */
686
687enum _Ecore_Exe_Flags /* flags for executing a child with its stdin and/or stdout piped back */
688{
689 ECORE_EXE_NONE = 0, /**< No exe flags at all */
690 ECORE_EXE_PIPE_READ = 1, /**< Exe Pipe Read mask */
691 ECORE_EXE_PIPE_WRITE = 2, /**< Exe Pipe Write mask */
692 ECORE_EXE_PIPE_ERROR = 4, /**< Exe Pipe error mask */
693 ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and split 1 line per Ecore_Exe_Event_Data_Line */
694 ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and split 1 line per Ecore_Exe_Event_Data_Line */
695 ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */
696 ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */
697 ECORE_EXE_USE_SH = 128, /**< Use /bin/sh to run the command. */
698 ECORE_EXE_NOT_LEADER = 256, /**< Do not use setsid() to have the executed process be its own session leader */
699 ECORE_EXE_TERM_WITH_PARENT = 512 /**< Makes child receive SIGTERM when parent dies. */
700};
701typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
702
703enum _Ecore_Exe_Win32_Priority
704{
705 ECORE_EXE_WIN32_PRIORITY_IDLE, /**< Idle priority, for monitoring the system */
706 ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL, /**< Below default priority */
707 ECORE_EXE_WIN32_PRIORITY_NORMAL, /**< Default priority */
708 ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL, /**< Above default priority */
709 ECORE_EXE_WIN32_PRIORITY_HIGH, /**< High priority, use with care as other threads in the system will not get processor time */
710 ECORE_EXE_WIN32_PRIORITY_REALTIME /**< Realtime priority, should be almost never used as it can interrupt system threads that manage mouse input, keyboard input, and background disk flushing */
711};
712typedef enum _Ecore_Exe_Win32_Priority Ecore_Exe_Win32_Priority;
713
714typedef struct _Ecore_Exe Ecore_Exe; /**< A handle for spawned processes */
715
716/**
717 * @typedef Ecore_Exe_Cb Ecore_Exe_Cb
718 * A callback to run with the associated @ref Ecore_Exe, usually
719 * for cleanup purposes.
720 */
721typedef void (*Ecore_Exe_Cb)(void *data, const Ecore_Exe *exe);
722
723typedef struct _Ecore_Exe_Event_Add Ecore_Exe_Event_Add; /**< Spawned Exe add event */
724typedef struct _Ecore_Exe_Event_Del Ecore_Exe_Event_Del; /**< Spawned Exe exit event */
725typedef struct _Ecore_Exe_Event_Data_Line Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
726typedef struct _Ecore_Exe_Event_Data Ecore_Exe_Event_Data; /**< Data from a child process */
727
728struct _Ecore_Exe_Event_Add /** Process add event */
729{
730 Ecore_Exe *exe; /**< The handle to the added process */
731 void *ext_data; /**< Extension data - not used */
732};
733
734struct _Ecore_Exe_Event_Del /** Process exit event */
735{
736 pid_t pid; /**< The process ID of the process that exited */
737 int exit_code; /**< The exit code of the process */
738 Ecore_Exe *exe; /**< The handle to the exited process, or NULL if not found */
739 int exit_signal; /** < The signal that caused the process to exit */
740 Eina_Bool exited : 1; /** < set to 1 if the process exited of its own accord */
741 Eina_Bool signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
742 void *ext_data; /**< Extension data - not used */
743#if !defined (_WIN32) && !defined (__lv2ppu__)
744 siginfo_t data; /**< Signal info */
745#endif
746};
747
748struct _Ecore_Exe_Event_Data_Line /**< Lines from a child process */
749{
750 char *line;
751 int size;
752};
753
754struct _Ecore_Exe_Event_Data /** Data from a child process event */
755{
756 Ecore_Exe *exe; /**< The handle to the process */
757 void *data; /**< the raw binary data from the child process that was received */
758 int size; /**< the size of this data in bytes */
759 Ecore_Exe_Event_Data_Line *lines; /**< an array of line data if line buffered, the last one has it's line member set to NULL */
760};
761
762EAPI void
763 ecore_exe_run_priority_set(int pri);
764EAPI int
765 ecore_exe_run_priority_get(void);
766EAPI Ecore_Exe *
767 ecore_exe_run(const char *exe_cmd,
768 const void *data);
769EAPI Ecore_Exe *
770ecore_exe_pipe_run(const char *exe_cmd,
771 Ecore_Exe_Flags flags,
772 const void *data);
773EAPI void
774ecore_exe_callback_pre_free_set(Ecore_Exe *exe,
775 Ecore_Exe_Cb func);
776EAPI Eina_Bool
777ecore_exe_send(Ecore_Exe *exe,
778 const void *data,
779 int size);
780EAPI void
781 ecore_exe_close_stdin(Ecore_Exe *exe);
782EAPI void
783 ecore_exe_auto_limits_set(Ecore_Exe *exe,
784 int start_bytes,
785 int end_bytes,
786 int start_lines,
787 int end_lines);
788EAPI Ecore_Exe_Event_Data *
789ecore_exe_event_data_get(Ecore_Exe *exe,
790 Ecore_Exe_Flags flags);
791EAPI void
792 ecore_exe_event_data_free(Ecore_Exe_Event_Data *data);
793EAPI void *
794 ecore_exe_free(Ecore_Exe *exe);
795EAPI pid_t
796 ecore_exe_pid_get(const Ecore_Exe *exe);
797EAPI void
798 ecore_exe_tag_set(Ecore_Exe *exe,
799 const char *tag);
800EAPI const char *
801 ecore_exe_tag_get(const Ecore_Exe *exe);
802EAPI const char *
803 ecore_exe_cmd_get(const Ecore_Exe *exe);
804EAPI void *
805 ecore_exe_data_get(const Ecore_Exe *exe);
806EAPI void *
807 ecore_exe_data_set(Ecore_Exe *exe,
808 void *data);
809EAPI Ecore_Exe_Flags
810 ecore_exe_flags_get(const Ecore_Exe *exe);
811EAPI void
812 ecore_exe_pause(Ecore_Exe *exe);
813EAPI void
814 ecore_exe_continue(Ecore_Exe *exe);
815EAPI void
816 ecore_exe_interrupt(Ecore_Exe *exe);
817EAPI void
818 ecore_exe_quit(Ecore_Exe *exe);
819EAPI void
820 ecore_exe_terminate(Ecore_Exe *exe);
821EAPI void
822 ecore_exe_kill(Ecore_Exe *exe);
823EAPI void
824 ecore_exe_signal(Ecore_Exe *exe,
825 int num);
826EAPI void
827ecore_exe_hup(Ecore_Exe *exe);
828
829/**
830 * @}
831 */
832
833/**
834 * @defgroup Ecore_FD_Handler_Group File Event Handling Functions
835 *
836 * Functions that deal with file descriptor handlers.
837 *
838 * The @ref Ecore_Fd_Handler can be used to watch a file descriptor
839 * for data available for reading, for the availability to write
840 * without blocking, and for errors on the file descriptor.
841 *
842 * ecore_main_fd_handler_add() is used to setup a handler for a
843 * given file descriptor. This file descriptor can be the standard
844 * input, a network socket, a stream received through some driver
845 * of a hardware decoder, etc. Thus it can contain errors, like a
846 * disconnection, a broken pipe, and so, and that's why it's
847 * possible to check for these errors with the @ref ECORE_FD_ERROR
848 * flag.
849 *
850 * An @ref Ecore_Fd_Handler can be used to watch on a file
851 * descriptor without blocking, still being able to receive events,
852 * expire timers, and other watch for other things that happen in
853 * the Ecore main loop.
854 *
855 * Example of use of a file descriptor handler:
856 * @li @ref ecore_fd_handler_example_c
857 *
858 * @ingroup Ecore_Main_Loop_Group
859 *
860 * @{
861 */
862
863typedef struct _Ecore_Fd_Handler Ecore_Fd_Handler; /**< A handle for Fd handlers */
864
865enum _Ecore_Fd_Handler_Flags
866{
867 ECORE_FD_READ = 1, /**< Fd Read mask */
868 ECORE_FD_WRITE = 2, /**< Fd Write mask */
869 ECORE_FD_ERROR = 4 /**< Fd Error mask */
870};
871typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
872
873/**
874 * @typedef Ecore_Fd_Cb Ecore_Fd_Cb
875 * A callback used by an @ref Ecore_Fd_Handler.
876 */
877typedef Eina_Bool (*Ecore_Fd_Cb)(void *data, Ecore_Fd_Handler *fd_handler);
878
879/**
880 * @typedef Ecore_Fd_Prep_Cb Ecore_Fd_Prep_Cb
881 * A callback used by an @ref Ecore_Fd_Handler.
882 */
883typedef void (*Ecore_Fd_Prep_Cb)(void *data, Ecore_Fd_Handler *fd_handler);
884
885/**
886 * @typedef Ecore_Win32_Handle_Cb Ecore_Win32_Handle_Cb
887 * A callback used by an @ref Ecore_Win32_Handler.
888 */
889typedef Eina_Bool (*Ecore_Win32_Handle_Cb)(void *data, Ecore_Win32_Handler *wh);
890
891EAPI Ecore_Fd_Handler *
892ecore_main_fd_handler_add(int fd,
893 Ecore_Fd_Handler_Flags flags,
894 Ecore_Fd_Cb func,
895 const void *data,
896 Ecore_Fd_Cb buf_func,
897 const void *buf_data);
898EAPI void
899ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler,
900 Ecore_Fd_Prep_Cb func,
901 const void *data);
902EAPI void *
903 ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
904EAPI int
905 ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler);
906EAPI Eina_Bool
907 ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler,
908 Ecore_Fd_Handler_Flags flags);
909EAPI void
910ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler,
911 Ecore_Fd_Handler_Flags flags);
912
913EAPI Ecore_Win32_Handler *
914ecore_main_win32_handler_add(void *h,
915 Ecore_Win32_Handle_Cb func,
916 const void *data);
917EAPI void *
918ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler);
919
920/**
921 * @}
922 */
923
924/**
925 * @defgroup Ecore_Poller_Group Ecore Poll functions
926 *
927 * These functions are for the need to poll information, but provide
928 * a shared abstracted API to pool such polling to minimise wakeup
929 * and ensure all the polling happens in as few spots as possible
930 * areound a core poll interval. For now only 1 core poller type is
931 * supprted: ECORE_POLLER_CORE
932 *
933 * Example of @ref Ecore_Poller:
934 * @li @ref ecore_poller_example_c
935 *
936 * @ingroup Ecore_Main_Loop_Group
937 *
938 * @{
939 */
940
941enum _Ecore_Poller_Type /* Poller types */
942{
943 ECORE_POLLER_CORE = 0 /**< The core poller interval */
944};
945typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
946
947typedef struct _Ecore_Poller Ecore_Poller; /**< A handle for pollers */
948
949EAPI void
950ecore_poller_poll_interval_set(Ecore_Poller_Type type,
951 double poll_time);
952EAPI double
953 ecore_poller_poll_interval_get(Ecore_Poller_Type type);
954EAPI Eina_Bool
955 ecore_poller_poller_interval_set(Ecore_Poller *poller,
956 int interval);
957EAPI int
958 ecore_poller_poller_interval_get(Ecore_Poller *poller);
959EAPI Ecore_Poller *
960 ecore_poller_add(Ecore_Poller_Type type,
961 int interval,
962 Ecore_Task_Cb func,
963 const void *data);
964EAPI void *ecore_poller_del(Ecore_Poller *poller);
965
966/**
967 * @}
968 */
969
970/**
971 * @defgroup Ecore_Animator_Group Ecore Animator functions
972 *
973 * @brief Ecore animators are a helper to simplify creating
974 * animations.
975 *
976 * Creating an animation is as simple as saying for how long it
977 * should be run and having a callback that does the animation,
978 * something like this:
979 * @code
980 * static Eina_Bool
981 * _do_animation(void *data, double pos)
982 * {
983 * evas_object_move(data, 100 * pos, 100 * pos);
984 * ... do some more animating ...
985 * }
986 * ...
987 * ecore_animator_timeline_add(2, _do_animation, my_evas_object);
988 * @endcode
989 * In the sample above we create an animation to move
990 * @c my_evas_object from position (0,0) to (100,100) in 2 seconds.
991 *
992 * If your animation will run for an unspecified amount of time you
993 * can use ecore_animator_add(), which is like using
994 * ecore_timer_add() with the interval being the
995 * @ref ecore_animator_frametime_set "framerate". Note that this has
996 * tangible benefits to creating a timer for each animation in terms
997 * of performance.
998 *
999 * For a more detailed example that show several animation see
1000 * @ref tutorial_ecore_animator.
1001 *
1002 * @ingroup Ecore_Main_Loop_Group
1003 *
1004 * @{
1005 */
1006
1007typedef struct _Ecore_Animator Ecore_Animator; /**< A handle for animators */
1008
1009enum _Ecore_Pos_Map /* Position mappings */
1010{
1011 ECORE_POS_MAP_LINEAR, /**< Linear 0.0 -> 1.0 */
1012 ECORE_POS_MAP_ACCELERATE, /**< Start slow then speed up */
1013 ECORE_POS_MAP_DECELERATE, /**< Start fast then slow down */
1014 ECORE_POS_MAP_SINUSOIDAL, /**< Start slow, speed up then slow down at end */
1015 ECORE_POS_MAP_ACCELERATE_FACTOR, /**< Start slow then speed up, v1 being a power factor, 0.0 being linear, 1.0 being normal accelerate, 2.0 being much more pronounced accelerate (squared), 3.0 being cubed, etc. */
1016 ECORE_POS_MAP_DECELERATE_FACTOR, /**< Start fast then slow down, v1 being a power factor, 0.0 being linear, 1.0 being normal decelerate, 2.0 being much more pronounced decelerate (squared), 3.0 being cubed, etc. */
1017 ECORE_POS_MAP_SINUSOIDAL_FACTOR, /**< Start slow, speed up then slow down at end, v1 being a power factor, 0.0 being linear, 1.0 being normal sinusoidal, 2.0 being much more pronounced sinusoidal (squared), 3.0 being cubed, etc. */
1018 ECORE_POS_MAP_DIVISOR_INTERP, /**< Start at gradient * v1, interpolated via power of v2 curve */
1019 ECORE_POS_MAP_BOUNCE, /**< Start at 0.0 then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with decay factor of v1 */
1020 ECORE_POS_MAP_SPRING /**< Start at 0.0 then "wobble" like a spring rest position 1.0, and wobble v2 times, with decay factor of v1 */
1021};
1022typedef enum _Ecore_Pos_Map Ecore_Pos_Map;
1023
1024enum _Ecore_Animator_Source /* Timing sources for animators */
1025{
1026 ECORE_ANIMATOR_SOURCE_TIMER, /**< The default system clock/timer based animator that ticks every "frametime" seconds */
1027 ECORE_ANIMATOR_SOURCE_CUSTOM /**< A custom animator trigger that you need to call ecore_animator_trigger() to make it tick */
1028};
1029typedef enum _Ecore_Animator_Source Ecore_Animator_Source;
1030
1031/**
1032 * @typedef Ecore_Timeline_Cb Ecore_Timeline_Cb
1033 * A callback run for a task (animators with runtimes)
1034 */
1035typedef Eina_Bool (*Ecore_Timeline_Cb)(void *data, double pos);
1036
1037/**
1038 * @brief Add an animator to call @p func at every animaton tick during main
1039 * loop execution.
1040 *
1041 * @param func The function to call when it ticks off
1042 * @param data The data to pass to the function
1043 * @return A handle to the new animator
1044 *
1045 * This function adds a animator and returns its handle on success and NULL on
1046 * failure. The function @p func will be called every N seconds where N is the
1047 * @p frametime interval set by ecore_animator_frametime_set(). The function
1048 * will be passed the @p data pointer as its parameter.
1049 *
1050 * When the animator @p func is called, it must return a value of either 1 or
1051 * 0. If it returns 1 (or ECORE_CALLBACK_RENEW), it will be called again at
1052 * the next tick, or if it returns 0 (or ECORE_CALLBACK_CANCEL) it will be
1053 * deleted automatically making any references/handles for it invalid.
1054 *
1055 * @note The default @p frametime value is 1/30th of a second.
1056 *
1057 * @see ecore_animator_timeline_add()
1058 * @see ecore_animator_frametime_set()
1059 */
1060EAPI Ecore_Animator *ecore_animator_add(Ecore_Task_Cb func,
1061 const void *data);
1062/**
1063 * @brief Add a animator that runs for a limited time
1064 *
1065 * @param runtime The time to run in seconds
1066 * @param func The function to call when it ticks off
1067 * @param data The data to pass to the function
1068 * @return A handle to the new animator
1069 *
1070 * This function is just like ecore_animator_add() except the animator only
1071 * runs for a limited time specified in seconds by @p runtime. Once the
1072 * runtime the animator has elapsed (animator finished) it will automatically
1073 * be deleted. The callback function @p func can return ECORE_CALLBACK_RENEW
1074 * to keep the animator running or ECORE_CALLBACK_CANCEL ro stop it and have
1075 * it be deleted automatically at any time.
1076 *
1077 * The @p func will ALSO be passed a position parameter that will be in value
1078 * from 0.0 to 1.0 to indicate where along the timeline (0.0 start, 1.0 end)
1079 * the animator run is at. If the callback wishes not to have a linear
1080 * transition it can "map" this value to one of several curves and mappings
1081 * via ecore_animator_pos_map().
1082 *
1083 * @note The default @p frametime value is 1/30th of a second.
1084 *
1085 * @see ecore_animator_add()
1086 * @see ecore_animator_pos_map()
1087 * @since 1.1.0
1088 */
1089EAPI Ecore_Animator *
1090ecore_animator_timeline_add(double runtime,
1091 Ecore_Timeline_Cb func,
1092 const void *data);
1093/**
1094 * @brief Delete the specified animator from the animator list.
1095 *
1096 * @param animator The animator to delete
1097 * @return The data pointer set for the animator on add
1098 *
1099 * Delete the specified @p animator from the set of animators that are
1100 * executed during main loop execution. This function returns the data
1101 * parameter that was being passed to the callback on success, or NULL on
1102 * failure. After this call returns the specified animator object @p animator
1103 * is invalid and should not be used again. It will not get called again after
1104 * deletion.
1105 */
1106EAPI void *
1107ecore_animator_del(Ecore_Animator *animator);
1108/**
1109 * @brief Suspend the specified animator.
1110 *
1111 * @param animator The animator to delete
1112 *
1113 * The specified @p animator will be temporarly removed from the set of
1114 * animators that are executed during main loop.
1115 *
1116 * @warning Freezing an animator doesn't freeze accounting of how long that
1117 * animator has been running. Therefore if the animator was created with
1118 * ecore_animator_timeline_add() the @p pos argument given to the callback
1119 * will increase as if the animator hadn't been frozen and the animator may
1120 * have it's execution halted if @p runtime elapsed.
1121 */
1122EAPI void
1123ecore_animator_freeze(Ecore_Animator *animator);
1124/**
1125 * @brief Restore execution of the specified animator.
1126 *
1127 * @param animator The animator to delete
1128 *
1129 * The specified @p animator will be put back in the set of animators that are
1130 * executed during main loop.
1131 */
1132EAPI void
1133ecore_animator_thaw(Ecore_Animator *animator);
1134/**
1135 * @brief Set the animator call interval in seconds.
1136 *
1137 * @param frametime The time in seconds in between animator ticks.
1138 *
1139 * This function sets the time interval (in seconds) between animator ticks.
1140 * At every tick the callback of every existing animator will be called.
1141 *
1142 * @warning Too small a value may cause performance issues and too high a
1143 * value may cause your animation to seem "jerky".
1144 *
1145 * @note The default @p frametime value is 1/30th of a second.
1146 */
1147EAPI void
1148ecore_animator_frametime_set(double frametime);
1149/**
1150 * @brief Get the animator call interval in seconds.
1151 *
1152 * @return The time in second in between animator ticks.
1153 *
1154 * This function retrieves the time in seconds between animator ticks.
1155 *
1156 * @see ecore_animator_frametime_set()
1157 */
1158EAPI double
1159ecore_animator_frametime_get(void);
1160/**
1161 * @brief Maps an input position from 0.0 to 1.0 along a timeline to a
1162 * position in a different curve.
1163 *
1164 * @param pos The input position to map
1165 * @param map The mapping to use
1166 * @param v1 A parameter use by the mapping (pass 0.0 if not used)
1167 * @param v2 A parameter use by the mapping (pass 0.0 if not used)
1168 * @return The mapped value
1169 *
1170 * Takes an input position (0.0 to 1.0) and maps to a new position (normally
1171 * between 0.0 and 1.0, but it may go above/below 0.0 or 1.0 to show that it
1172 * has "overshot" the mark) using some interpolation (mapping) algorithm.
1173 *
1174 * This function useful to create non-linear animations. It offers a variety
1175 * of possible animaton curves to be used:
1176 * @li ECORE_POS_MAP_LINEAR - Linear, returns @p pos
1177 * @li ECORE_POS_MAP_ACCELERATE - Start slow then speed up
1178 * @li ECORE_POS_MAP_DECELERATE - Start fast then slow down
1179 * @li ECORE_POS_MAP_SINUSOIDAL - Start slow, speed up then slow down at end
1180 * @li ECORE_POS_MAP_ACCELERATE_FACTOR - Start slow then speed up, v1 being a
1181 * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_ACCELERATE, 2.0
1182 * being much more pronounced accelerate (squared), 3.0 being cubed, etc.
1183 * @li ECORE_POS_MAP_DECELERATE_FACTOR - Start fast then slow down, v1 being a
1184 * power factor, 0.0 being linear, 1.0 being ECORE_POS_MAP_DECELERATE, 2.0
1185 * being much more pronounced decelerate (squared), 3.0 being cubed, etc.
1186 * @li ECORE_POS_MAP_SINUSOIDAL_FACTOR - Start slow, speed up then slow down
1187 * at end, v1 being a power factor, 0.0 being linear, 1.0 being
1188 * ECORE_POS_MAP_SINUSOIDAL, 2.0 being much more pronounced sinusoidal
1189 * (squared), 3.0 being cubed, etc.
1190 * @li ECORE_POS_MAP_DIVISOR_INTERP - Start at gradient * v1, interpolated via
1191 * power of v2 curve
1192 * @li ECORE_POS_MAP_BOUNCE - Start at 0.0 then "drop" like a ball bouncing to
1193 * the ground at 1.0, and bounce v2 times, with decay factor of v1
1194 * @li ECORE_POS_MAP_SPRING - Start at 0.0 then "wobble" like a spring rest
1195 * position 1.0, and wobble v2 times, with decay factor of v1
1196 * @note When not listed v1 and v2 have no effect.
1197 *
1198 * @image html ecore-pos-map.png
1199 * @image latex ecore-pos-map.eps width=\textwidth
1200 *
1201 * One way to use this would be:
1202 * @code
1203 * double pos; // input position in a timeline from 0.0 to 1.0
1204 * double out; // output position after mapping
1205 * int x1, y1, x2, y2; // x1 & y1 are start position, x2 & y2 are end position
1206 * int x, y; // x & y are the calculated position
1207 *
1208 * out = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.8, 7);
1209 * x = (x1 * out) + (x2 * (1.0 - out));
1210 * y = (y1 * out) + (y2 * (1.0 - out));
1211 * move_my_object_to(myobject, x, y);
1212 * @endcode
1213 * This will make an animaton that bounces 7 each times diminishing by a
1214 * factor of 1.8.
1215 *
1216 * @see _Ecore_Pos_Map
1217 *
1218 * @since 1.1.0
1219 */
1220EAPI double
1221ecore_animator_pos_map(double pos,
1222 Ecore_Pos_Map map,
1223 double v1,
1224 double v2);
1225/**
1226 * @brief Set the source of animator ticks for the mainloop
1227 *
1228 * @param source The source of animator ticks to use
1229 *
1230 * This sets the source of animator ticks. When an animator is active the
1231 * mainloop will "tick" over frame by frame calling all animators that are
1232 * registered until none are. The mainloop will tick at a given rate based
1233 * on the animator source. The default source is the system clock timer
1234 * source - ECORE_ANIMATOR_SOURCE_TIMER. This source uses the system clock
1235 * to tick over every N seconds (specified by ecore_animator_frametime_set(),
1236 * with the default being 1/30th of a second unless set otherwise). You can
1237 * set a custom tick source by setting the source to
1238 * ECORE_ANIMATOR_SOURCE_CUSTOM and then drive it yourself based on some input
1239 * tick source (like another application via ipc, some vertical blanking
1240 * interrupt interrupt etc.) using
1241 * ecore_animator_custom_source_tick_begin_callback_set() and
1242 * ecore_animator_custom_source_tick_end_callback_set() to set the functions
1243 * that will be called to start and stop the ticking source, which when it
1244 * gets a "tick" should call ecore_animator_custom_tick() to make the "tick" over 1
1245 * frame.
1246 */
1247EAPI void
1248ecore_animator_source_set(Ecore_Animator_Source source);
1249/**
1250 * @brief Get the animator source currently set.
1251 *
1252 * @return The current animator source
1253 *
1254 * This gets the current animator source.
1255 *
1256 * @see ecore_animator_source_set()
1257 */
1258EAPI Ecore_Animator_Source
1259ecore_animator_source_get(void);
1260/**
1261 * @brief Set the function that begins a custom animator tick source
1262 *
1263 * @param func The function to call when ticking is to begin
1264 * @param data The data passed to the tick begin function as its parameter
1265 *
1266 * The Ecore Animator infrastructure handles tracking if animators are needed
1267 * or not and which ones need to be called and when, but when the tick source
1268 * is custom, you have to provide a tick source by calling
1269 * ecore_animator_custom_tick() to indicate a frame tick happened. In order
1270 * to allow the source of ticks to be dynamically enabled or disabled as
1271 * needed, the @p func when set is called to enable the tick source to
1272 * produce tick events that call ecore_animator_custom_tick(). If @p func
1273 * is NULL then no function is called to begin custom ticking.
1274 *
1275 * @see ecore_animator_source_set()
1276 * @see ecore_animator_custom_source_tick_end_callback_set()
1277 * @see ecore_animator_custom_tick()
1278 */
1279EAPI void
1280ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func,
1281 const void *data);
1282/**
1283 * @brief Set the function that ends a custom animator tick source
1284 *
1285 * @param func The function to call when ticking is to end
1286 * @param data The data passed to the tick end function as its parameter
1287 *
1288 * This function is a matching pair to the function set by
1289 * ecore_animator_custom_source_tick_begin_callback_set() and is called
1290 * when ticking is to stop. If @p func is NULL then no function will be
1291 * called to stop ticking. For more information please see
1292 * ecore_animator_custom_source_tick_begin_callback_set().
1293 *
1294 * @see ecore_animator_source_set()
1295 * @see ecore_animator_custom_source_tick_begin_callback_set()
1296 * @see ecore_animator_custom_tick()
1297 */
1298EAPI void
1299ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func,
1300 const void *data);
1301/**
1302 * @brief Trigger a custom animator tick
1303 *
1304 * When animator source is set to ECORE_ANIMATOR_SOURCE_CUSTOM, then calling
1305 * this function triggers a run of all animators currently registered with
1306 * Ecore as this indicates a "frame tick" happened. This will do nothing if
1307 * the animator source(set by ecore_animator_source_set()) is not set to
1308 * ECORE_ANIMATOR_SOURCE_CUSTOM.
1309 *
1310 * @see ecore_animator_source_set()
1311 * @see ecore_animator_custom_source_tick_begin_callback_set
1312 * @see ecore_animator_custom_source_tick_end_callback_set()()
1313 */
1314EAPI void
1315ecore_animator_custom_tick(void);
1316
1317/**
1318 * @}
1319 */
1320
1321/**
1322 * @defgroup Ecore_Time_Group Ecore Time functions
1323 *
1324 * Functions that deal with time. These functions include those
1325 * that simply retrieve it in a given format, and those that create
1326 * events based on it.
1327 *
1328 * The timer allows callbacks to be called at specific intervals.
1329 *
1330 * Examples with functions that deal with time:
1331 * @li @ref ecore_time_functions_example_c
1332 * @li @ref ecore_timer_example_c
1333 *
1334 * @ingroup Ecore_Main_Loop_Group
1335 *
1336 * @{
1337 */
1338
1339typedef struct _Ecore_Timer Ecore_Timer; /**< A handle for timers */
1340
1341EAPI double
1342 ecore_time_get(void);
1343EAPI double
1344 ecore_time_unix_get(void);
1345EAPI double
1346 ecore_loop_time_get(void);
1347
1348EAPI Ecore_Timer *
1349ecore_timer_add(double in,
1350 Ecore_Task_Cb func,
1351 const void *data);
1352EAPI Ecore_Timer *
1353ecore_timer_loop_add(double in,
1354 Ecore_Task_Cb func,
1355 const void *data);
1356EAPI void *
1357 ecore_timer_del(Ecore_Timer *timer);
1358EAPI void
1359 ecore_timer_interval_set(Ecore_Timer *timer,
1360 double in);
1361EAPI double
1362 ecore_timer_interval_get(Ecore_Timer *timer);
1363EAPI void
1364 ecore_timer_freeze(Ecore_Timer *timer);
1365EAPI void
1366 ecore_timer_thaw(Ecore_Timer *timer);
1367EAPI void
1368 ecore_timer_delay(Ecore_Timer *timer,
1369 double add);
1370EAPI double
1371 ecore_timer_pending_get(Ecore_Timer *timer);
1372EAPI double
1373 ecore_timer_precision_get(void);
1374EAPI void
1375 ecore_timer_precision_set(double precision);
1376EAPI char *
1377 ecore_timer_dump(void);
1378
1379/**
1380 * @}
1381 */
1382
1383/**
1384 * @defgroup Ecore_Idle_Group Ecore Idle functions
1385 *
1386 * Callbacks that are called when the program enters or exits an
1387 * idle state.
1388 *
1389 * The ecore main loop enters an idle state when it is waiting for
1390 * timers to time out, data to come in on a file descriptor or any
1391 * other event to occur. You can set callbacks to be called when
1392 * the main loop enters an idle state, during an idle state or just
1393 * after the program wakes up.
1394 *
1395 * Enterer callbacks are good for updating your program's state, if
1396 * it has a state engine. Once all of the enterer handlers are
1397 * called, the program will enter a "sleeping" state.
1398 *
1399 * Idler callbacks are called when the main loop has called all
1400 * enterer handlers. They are useful for interfaces that require
1401 * polling and timers would be too slow to use.
1402 *
1403 * If no idler callbacks are specified, then the process literally
1404 * goes to sleep. Otherwise, the idler callbacks are called
1405 * continuously while the loop is "idle", using as much CPU as is
1406 * available to the process.
1407 *
1408 * Exiter callbacks are called when the main loop wakes up from an
1409 * idle state.
1410 *
1411 * @note Idle state doesn't mean that the @b program is idle, but
1412 * that the <b>main loop</b> is idle. It doesn't have any timers,
1413 * events, fd handlers or anything else to process (which in most
1414 * <em>event driven</em> programs also means that the @b program is
1415 * idle too, but it's not a rule). The program itself may be doing
1416 * a lot of processing in the idler, or in another thread, for
1417 * example.
1418 *
1419 * Example with functions that deal with idle state:
1420 *
1421 * @li @ref ecore_idler_example_c
1422 *
1423 * @ingroup Ecore_Main_Loop_Group
1424 *
1425 * @{
1426 */
1427
1428typedef struct _Ecore_Idler Ecore_Idler; /**< A handle for idlers */
1429typedef struct _Ecore_Idle_Enterer Ecore_Idle_Enterer; /**< A handle for idle enterers */
1430typedef struct _Ecore_Idle_Exiter Ecore_Idle_Exiter; /**< A handle for idle exiters */
1431
1432/**
1433 * Add an idler handler.
1434 * @param func The function to call when idling.
1435 * @param data The data to be passed to this @p func call.
1436 * @return A idler handle if successfully added. NULL otherwise.
1437 *
1438 * Add an idler handle to the event loop, returning a handle on
1439 * success and NULL otherwise. The function @p func will be called
1440 * repeatedly while no other events are ready to be processed, as
1441 * long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
1442 * (or ECORE_CALLBACK_CANCEL) deletes the idler.
1443 *
1444 * Idlers are useful for progressively prossessing data without blocking.
1445 */
1446EAPI Ecore_Idler *
1447ecore_idler_add(Ecore_Task_Cb func,
1448 const void *data);
1449
1450/**
1451 * Delete an idler callback from the list to be executed.
1452 * @param idler The handle of the idler callback to delete
1453 * @return The data pointer passed to the idler callback on success. NULL
1454 * otherwise.
1455 */
1456EAPI void *
1457ecore_idler_del(Ecore_Idler *idler);
1458
1459EAPI Ecore_Idle_Enterer *
1460ecore_idle_enterer_add(Ecore_Task_Cb func,
1461 const void *data);
1462EAPI Ecore_Idle_Enterer *
1463ecore_idle_enterer_before_add(Ecore_Task_Cb func,
1464 const void *data);
1465EAPI void *
1466ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
1467
1468EAPI Ecore_Idle_Exiter *
1469ecore_idle_exiter_add(Ecore_Task_Cb func,
1470 const void *data);
1471EAPI void *
1472ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
1473
1474/**
1475 * @}
1476 */
1477
1478/**
1479 * @defgroup Ecore_Thread_Group Ecore Thread functions
1480 *
1481 * Facilities to run heavy tasks in different threads to avoid blocking
1482 * the main loop.
1483 *
1484 * The EFL is, for the most part, not thread safe. This means that if you
1485 * have some task running in another thread and you have, for example, an
1486 * Evas object to show the status progress of this task, you cannot update
1487 * the object from within the thread. This can only be done from the main
1488 * thread, the one running the main loop. This problem can be solved
1489 * by running a thread that sends messages to the main one using an
1490 * @ref Ecore_Pipe_Group "Ecore_Pipe", but when you need to handle other
1491 * things like cancelling the thread, your code grows in coplexity and gets
1492 * much harder to maintain.
1493 *
1494 * Ecore Thread is here to solve that problem. It is @b not a simple wrapper
1495 * around standard POSIX threads (or the equivalent in other systems) and
1496 * it's not meant to be used to run parallel tasks throughout the entire
1497 * duration of the program, especially when these tasks are performance
1498 * critical, as Ecore manages these tasks using a pool of threads based on
1499 * system configuration.
1500 *
1501 * What Ecore Thread does, is make it a lot easier to dispatch a worker
1502 * function to perform some heavy task and then get the result once it
1503 * completes, without blocking the application's UI. In addition, cancelling
1504 * and rescheduling comes practically for free and the developer needs not
1505 * worry about how many threads are launched, since Ecore will schedule
1506 * them according to the number of processors the system has and maximum
1507 * amount of concurrent threads set for the application.
1508 *
1509 * At the system level, Ecore will start a new thread on an as-needed basis
1510 * until the maximum set is reached. When no more threads can be launched,
1511 * new worker functions will be queued in a waiting list until a thread
1512 * becomes available. This way, system threads will be shared throughout
1513 * different worker functions, but running only one at a time. At the same
1514 * time, a worker function that is rescheduled may be run on a different
1515 * thread the next time.
1516 *
1517 * The ::Ecore_Thread handler has two meanings, depending on what context
1518 * it is on. The one returned when starting a worker with any of the
1519 * functions ecore_thread_run() or ecore_thread_feedback_run() is an
1520 * identifier of that specific instance of the function and can be used from
1521 * the main loop with the ecore_thread_cancel() and ecore_thread_check()
1522 * functions. This handler must not be shared with the worker function
1523 * function running in the thread. This same handler will be the one received
1524 * on the @c end, @c cancel and @c feedback callbacks.
1525 *
1526 * The worker function, that's the one running in the thread, also receives
1527 * an ::Ecore_Thread handler that can be used with ecore_thread_cancel() and
1528 * ecore_thread_check(), sharing the flag with the main loop. But this
1529 * handler is also associated with the thread where the function is running.
1530 * This has strong implications when working with thread local data.
1531 *
1532 * There are two kinds of worker threads Ecore handles: simple, or short,
1533 * workers and feedback workers.
1534 *
1535 * The first kind is for simple functions that perform a
1536 * usually small but time consuming task. Ecore will run this function in
1537 * a thread as soon as one becomes available and notify the calling user of
1538 * its completion once the task is done.
1539 *
1540 * The following image shows the flow of a program running four tasks on
1541 * a pool of two threads.
1542 *
1543 * @image html ecore_thread.png
1544 * @image rtf ecore_thread.png
1545 * @image latex ecore_thread.eps width=\textwidth
1546 *
1547 * For larger tasks that may require continuous communication with the main
1548 * program, the feedback workers provide the same functionality plus a way
1549 * for the function running in the thread to send messages to the main
1550 * thread.
1551 *
1552 * The next diagram omits some details shown in the previous one regarding
1553 * how threads are spawned and tasks are queued, but illustrates how feedback
1554 * jobs communicate with the main loop and the special case of threads
1555 * running out of pool.
1556 *
1557 * @image html ecore_thread_feedback.png
1558 * @image rtf ecore_thread_feedback.png
1559 * @image latex ecore_thread_feedback.eps width=\textwidth
1560 *
1561 * See an overview example in @ref ecore_thread_example_c.
1562 *
1563 * @ingroup Ecore_Main_Loop_Group
1564 *
1565 * @{
1566 */
1567
1568typedef struct _Ecore_Thread Ecore_Thread; /**< A handle for threaded jobs */
1569
1570/**
1571 * @typedef Ecore_Thread_Cb Ecore_Thread_Cb
1572 * A callback used by Ecore_Thread helper.
1573 */
1574typedef void (*Ecore_Thread_Cb)(void *data, Ecore_Thread *thread);
1575/**
1576 * @typedef Ecore_Thread_Notify_Cb Ecore_Thread_Notify_Cb
1577 * A callback used by the main loop to receive data sent by an
1578 * @ref Ecore_Thread_Group.
1579 */
1580typedef void (*Ecore_Thread_Notify_Cb)(void *data, Ecore_Thread *thread, void *msg_data);
1581
1582/**
1583 * Schedule a task to run in a parallel thread to avoid locking the main loop
1584 *
1585 * @param func_blocking The function that should run in another thread.
1586 * @param func_end Function to call from main loop when @p func_blocking
1587 * completes its task successfully (may be NULL)
1588 * @param func_cancel Function to call from main loop if the thread running
1589 * @p func_blocking is cancelled or fails to start (may be NULL)
1590 * @param data User context data to pass to all callbacks.
1591 * @return A new thread handler, or NULL on failure
1592 *
1593 * This function will try to create a new thread to run @p func_blocking in,
1594 * or if the maximum number of concurrent threads has been reached, will
1595 * add it to the pending list, where it will wait until a thread becomes
1596 * available. The return value will be an ::Ecore_Thread handle that can
1597 * be used to cancel the thread before its completion.
1598 *
1599 * @note This function should always return immediately, but in the rare
1600 * case that Ecore is built with no thread support, @p func_blocking will
1601 * be called here, actually blocking the main loop.
1602 *
1603 * Once a thread becomes available, @p func_blocking will be run in it until
1604 * it finishes, then @p func_end is called from the thread containing the
1605 * main loop to inform the user of its completion. While in @p func_blocking,
1606 * no functions from the EFL can be used, except for those from Eina that are
1607 * marked to be thread-safe. Even for the latter, caution needs to be taken
1608 * if the data is shared across several threads.
1609 *
1610 * @p func_end will be called from the main thread when @p func_blocking ends,
1611 * so here it's safe to use anything from the EFL freely.
1612 *
1613 * The thread can also be cancelled before its completion calling
1614 * ecore_thread_cancel(), either from the main thread or @p func_blocking.
1615 * In this case, @p func_cancel will be called, also from the main thread
1616 * to inform of this happening. If the thread could not be created, this
1617 * function will be called and it's @c thread parameter will be NULL. It's
1618 * also safe to call any EFL function here, as it will be running in the
1619 * main thread.
1620 *
1621 * Inside @p func_blocking, it's possible to call ecore_thread_reschedule()
1622 * to tell Ecore that this function should be called again.
1623 *
1624 * Be aware that no assumptions can be made about the order in which the
1625 * @p func_end callbacks for each task will be called. Once the function is
1626 * running in a different thread, it's the OS that will handle its running
1627 * schedule, and different functions may take longer to finish than others.
1628 * Also remember that just starting several tasks together doesn't mean they
1629 * will be running at the same time. Ecore will schedule them based on the
1630 * number of threads available for the particular system it's running in,
1631 * so some of the jobs started may be waiting until another one finishes
1632 * before it can execute its own @p func_blocking.
1633 *
1634 * @see ecore_thread_feedback_run()
1635 * @see ecore_thread_cancel()
1636 * @see ecore_thread_reschedule()
1637 * @see ecore_thread_max_set()
1638 */
1639EAPI Ecore_Thread *
1640ecore_thread_run(Ecore_Thread_Cb func_blocking,
1641 Ecore_Thread_Cb func_end,
1642 Ecore_Thread_Cb func_cancel,
1643 const void *data);
1644/**
1645 * Launch a thread to run a task than can talk back to the main thread
1646 *
1647 * @param func_heavy The function that should run in another thread.
1648 * @param func_notify Function that receives the data sent from the thread
1649 * @param func_end Function to call from main loop when @p func_heavy
1650 * completes its task successfully
1651 * @param func_cancel Function to call from main loop if the thread running
1652 * @p func_heavy is cancelled or fails to start
1653 * @param data User context data to pass to all callback.
1654 * @param try_no_queue If you want to run outside of the thread pool.
1655 * @return A new thread handler, or NULL on failure
1656 *
1657 * See ecore_thread_run() for a general description of this function.
1658 *
1659 * The difference with the above is that ecore_thread_run() is meant for
1660 * tasks that don't need to communicate anything until they finish, while
1661 * this function is provided with a new callback, @p func_notify, that will
1662 * be called from the main thread for every message sent from @p func_heavy
1663 * with ecore_thread_feedback().
1664 *
1665 * Like with ecore_thread_run(), a new thread will be launched to run
1666 * @p func_heavy unless the maximum number of simultaneous threadas has been
1667 * reached, in which case the function will be scheduled to run whenever a
1668 * running task ends and a thread becomes free. But if @p try_no_queue is
1669 * set, Ecore will first try to launch a thread outside of the pool to run
1670 * the task. If it fails, it will revert to the normal behaviour of using a
1671 * thread from the pool as if @p try_no_queue had not been set.
1672 *
1673 * Keep in mind that Ecore handles the thread pool based on the number of
1674 * CPUs available, but running a thread outside of the pool doesn't count for
1675 * this, so having too many of them may have drastic effects over the
1676 * program's performance.
1677 *
1678 * @see ecore_thread_feedback()
1679 * @see ecore_thread_run()
1680 * @see ecore_thread_cancel()
1681 * @see ecore_thread_reschedule()
1682 * @see ecore_thread_max_set()
1683 */
1684EAPI Ecore_Thread *
1685ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy,
1686 Ecore_Thread_Notify_Cb func_notify,
1687 Ecore_Thread_Cb func_end,
1688 Ecore_Thread_Cb func_cancel,
1689 const void *data,
1690 Eina_Bool try_no_queue);
1691/**
1692 * Cancel a running thread.
1693 *
1694 * @param thread The thread to cancel.
1695 * @return Will return EINA_TRUE if the thread has been cancelled,
1696 * EINA_FALSE if it is pending.
1697 *
1698 * This function can be called both in the main loop or in the running thread.
1699 *
1700 * This function cancels a running thread. If @p thread can be immediately
1701 * cancelled (it's still pending execution after creation or rescheduling),
1702 * then the @c cancel callback will be called, @p thread will be freed and
1703 * the function will return EINA_TRUE.
1704 *
1705 * If the thread is already running, then this function returns EINA_FALSE
1706 * after marking the @p thread as pending cancellation. For the thread to
1707 * actually be terminated, it needs to return from the user function back
1708 * into Ecore control. This can happen in several ways:
1709 * @li The function ends and returns normally. If it hadn't been cancelled,
1710 * @c func_end would be called here, but instead @c func_cancel will happen.
1711 * @li The function returns after requesting to be rescheduled with
1712 * ecore_thread_reschedule().
1713 * @li The function is prepared to leave early by checking if
1714 * ecore_thread_check() returns EINA_TRUE.
1715 *
1716 * The user function can cancel itself by calling ecore_thread_cancel(), but
1717 * it should always use the ::Ecore_Thread handle passed to it and never
1718 * share it with the main loop thread by means of shared user data or any
1719 * other way.
1720 *
1721 * @p thread will be freed and should not be used again if this function
1722 * returns EINA_TRUE or after the @c func_cancel callback returns.
1723 *
1724 * @see ecore_thread_check()
1725 */
1726EAPI Eina_Bool
1727ecore_thread_cancel(Ecore_Thread *thread);
1728/**
1729 * Checks if a thread is pending cancellation
1730 *
1731 * @param thread The thread to test.
1732 * @return EINA_TRUE if the thread is pending cancellation,
1733 * EINA_FALSE if it is not.
1734 *
1735 * This function can be called both in the main loop or in the running thread.
1736 *
1737 * When ecore_thread_cancel() is called on an already running task, the
1738 * thread is marked as pending cancellation. This function returns EINA_TRUE
1739 * if this mark is set for the given @p thread and can be used from the
1740 * main loop thread to check if a still active thread has been cancelled,
1741 * or from the user function running in the thread to check if it should
1742 * stop doing what it's doing and return early, effectively cancelling the
1743 * task.
1744 *
1745 * @see ecore_thread_cancel()
1746 */
1747EAPI Eina_Bool
1748ecore_thread_check(Ecore_Thread *thread);
1749/**
1750 * Sends data from the worker thread to the main loop
1751 *
1752 * @param thread The current ::Ecore_Thread context to send data from
1753 * @param msg_data Data to be transmitted to the main loop
1754 * @return EINA_TRUE if @p msg_data was successfully sent to main loop,
1755 * EINA_FALSE if anything goes wrong.
1756 *
1757 * You should use this function only in the @c func_heavy call.
1758 *
1759 * Only the address to @p msg_data will be sent and once this function
1760 * returns EINA_TRUE, the job running in the thread should never touch the
1761 * contents of it again. The data sent should be malloc()'ed or something
1762 * similar, as long as it's not memory local to the thread that risks being
1763 * overwritten or deleted once it goes out of scope or the thread finishes.
1764 *
1765 * Care must be taken that @p msg_data is properly freed in the @c func_notify
1766 * callback set when creating the thread.
1767 *
1768 * @see ecore_thread_feedback_run()
1769 */
1770EAPI Eina_Bool
1771ecore_thread_feedback(Ecore_Thread *thread,
1772 const void *msg_data);
1773/**
1774 * Asks for the function in the thread to be called again at a later time
1775 *
1776 * @param thread The current ::Ecore_Thread context to rescheduled
1777 * @return EINA_TRUE if the task was successfully rescheduled,
1778 * EINA_FALSE if anything goes wrong.
1779 *
1780 * This function should be called only from the same function represented
1781 * by @pthread.
1782 *
1783 * Calling this function will mark the thread for a reschedule, so as soon
1784 * as it returns, it will be added to the end of the list of pending tasks.
1785 * If no other tasks are waiting or there are sufficient threads available,
1786 * the rescheduled task will be launched again immediately.
1787 *
1788 * This should never return EINA_FALSE, unless it was called from the wrong
1789 * thread or with the wrong arguments.
1790 *
1791 * The @c func_end callback set when the thread is created will not be
1792 * called until the function in the thread returns without being rescheduled.
1793 * Similarly, if the @p thread is cancelled, the reschedule will not take
1794 * effect.
1795 */
1796EAPI Eina_Bool
1797ecore_thread_reschedule(Ecore_Thread *thread);
1798/**
1799 * Gets the number of active threads running jobs
1800 *
1801 * @return Number of active threads running jobs
1802 *
1803 * This returns the number of threads currently running jobs of any type
1804 * through the Ecore_Thread API.
1805 *
1806 * @note Jobs started through the ecore_thread_feedback_run() function with
1807 * the @c try_no_queue parameter set to EINA_TRUE will not be accounted for
1808 * in the return of this function unless the thread creation fails and it
1809 * falls back to using one from the pool.
1810 */
1811EAPI int
1812ecore_thread_active_get(void);
1813/**
1814 * Gets the number of short jobs waiting for a thread to run
1815 *
1816 * @return Number of pending threads running "short" jobs
1817 *
1818 * This returns the number of tasks started with ecore_thread_run() that are
1819 * pending, waiting for a thread to become available to run them.
1820 */
1821EAPI int
1822ecore_thread_pending_get(void);
1823/**
1824 * Gets the number of feedback jobs waiting for a thread to run
1825 *
1826 * @return Number of pending threads running "feedback" jobs
1827 *
1828 * This returns the number of tasks started with ecore_thread_feedback_run()
1829 * that are pending, waiting for a thread to become available to run them.
1830 */
1831EAPI int
1832ecore_thread_pending_feedback_get(void);
1833/**
1834 * Gets the total number of pending jobs
1835 *
1836 * @return Number of pending threads running jobs
1837 *
1838 * Same as the sum of ecore_thread_pending_get() and
1839 * ecore_thread_pending_feedback_get().
1840 */
1841EAPI int
1842ecore_thread_pending_total_get(void);
1843/**
1844 * Gets the maximum number of threads that can run simultaneously
1845 *
1846 * @return Max possible number of Ecore_Thread's running concurrently
1847 *
1848 * This returns the maximum number of Ecore_Thread's that may be running at
1849 * the same time. If this number is reached, new jobs started by either
1850 * ecore_thread_run() or ecore_thread_feedback_run() will be added to the
1851 * respective pending queue until one of the running threads finishes its
1852 * task and becomes available to run a new one.
1853 *
1854 * By default, this will be the number of available CPUs for the
1855 * running program (as returned by eina_cpu_count()), or 1 if this value
1856 * could not be fetched.
1857 *
1858 * @see ecore_thread_max_set()
1859 * @see ecore_thread_max_reset()
1860 */
1861EAPI int
1862ecore_thread_max_get(void);
1863/**
1864 * Sets the maximum number of threads allowed to run simultaneously
1865 *
1866 * @param num The new maximum
1867 *
1868 * This sets a new value for the maximum number of concurrently running
1869 * Ecore_Thread's. It @b must an integer between 1 and (2 * @c x), where @c x
1870 * is the number for CPUs available.
1871 *
1872 * @see ecore_thread_max_get()
1873 * @see ecore_thread_max_reset()
1874 */
1875EAPI void
1876ecore_thread_max_set(int num);
1877/**
1878 * Resets the maximum number of concurrently running threads to the default
1879 *
1880 * This resets the value returned by ecore_thread_max_get() back to its
1881 * default.
1882 *
1883 * @see ecore_thread_max_get()
1884 * @see ecore_thread_max_set()
1885 */
1886EAPI void
1887ecore_thread_max_reset(void);
1888/**
1889 * Gets the number of threads available for running tasks
1890 *
1891 * @return The number of available threads
1892 *
1893 * Same as doing ecore_thread_max_get() - ecore_thread_active_get().
1894 *
1895 * This function may return a negative number only in the case the user
1896 * changed the maximum number of running threads while other tasks are
1897 * running.
1898 */
1899EAPI int
1900ecore_thread_available_get(void);
1901/**
1902 * Adds some data to a hash local to the thread
1903 *
1904 * @param thread The thread context the data belongs to
1905 * @param key The name under which the data will be stored
1906 * @param value The data to add
1907 * @param cb Function to free the data when removed from the hash
1908 * @param direct If true, this will not copy the key string (like
1909 * eina_hash_direct_add())
1910 * @return EINA_TRUE on success, EINA_FALSE on failure
1911 *
1912 * Ecore Thread has a mechanism to share data across several worker functions
1913 * that run on the same system thread. That is, the data is stored per
1914 * thread and for a worker function to have access to it, it must be run
1915 * by the same thread that stored the data.
1916 *
1917 * When there are no more workers pending, the thread will be destroyed
1918 * along with the internal hash and any data left in it will be freed with
1919 * the @p cb function given.
1920 *
1921 * This set of functions is useful to share things around several instances
1922 * of a function when that thing is costly to create and can be reused, but
1923 * may only be used by one function at a time.
1924 *
1925 * For example, if you have a program doing requisitions to a database,
1926 * these requisitions can be done in threads so that waiting for the
1927 * database to respond doesn't block the UI. Each of these threads will
1928 * run a function, and each function will be dependent on a connection to
1929 * the database, which may not be able to handle more than one request at
1930 * a time so for each running function you will need one connection handle.
1931 * The options then are:
1932 * @li Each function opens a connection when it's called, does the work and
1933 * closes the connection when it finishes. This may be costly, wasting a lot
1934 * of time on resolving hostnames, negotiating permissions and allocating
1935 * memory.
1936 * @li Open the connections in the main loop and pass it to the threads
1937 * using the data pointer. Even worse, it's just as costly as before and now
1938 * it may even be kept with connections open doing nothing until a thread
1939 * becomes available to run the function.
1940 * @li Have a way to share connection handles, so that each instance of the
1941 * function can check if an available connection exists, and if it doesn't,
1942 * create one and add it to the pool. When no more connections are needed,
1943 * they are all closed.
1944 *
1945 * The last option is the most efficient, but it requires a lot of work to
1946 * implement properly. Using thread local data helps to achieve the same
1947 * result while avoiding doing all the tracking work on your code. The way
1948 * to use it would be, at the worker function, to ask for the connection
1949 * with ecore_thread_local_data_find() and if it doesn't exist, then open
1950 * a new one and save it with ecore_thread_local_data_add(). Do the work and
1951 * forget about the connection handle, when everything is done the function
1952 * just ends. The next worker to run on that thread will check if a
1953 * connection exists and find that it does, so the process of opening a
1954 * new one has been spared. When no more workers exist, the thread is
1955 * destroyed and the callback used when saving the connection will be called
1956 * to close it.
1957 *
1958 * This function adds the data @p value to the thread data under the given
1959 * @p key.
1960 * No other value in the hash may have the same @p key. If you need to
1961 * change the value under a @p key, or you don't know if one exists already,
1962 * you can use ecore_thread_local_data_set().
1963 *
1964 * Neither @p key nor @p value may be NULL and @p key will be copied in the
1965 * hash, unless @p direct is set, in which case the string used should not
1966 * be freed until the data is removed from the hash.
1967 *
1968 * The @p cb function will be called when the data in the hash needs to be
1969 * freed, be it because it got deleted with ecore_thread_local_data_del() or
1970 * because @p thread was terminated and the hash destroyed. This parameter
1971 * may be NULL, in which case @p value needs to be manually freed after
1972 * removing it from the hash with either ecore_thread_local_data_del() or
1973 * ecore_thread_local_data_set(), but it's very unlikely that this is what
1974 * you want.
1975 *
1976 * This function, and all of the others in the @c ecore_thread_local_data
1977 * family of functions, can only be called within the worker function running
1978 * in the thread. Do not call them from the main loop or from a thread
1979 * other than the one represented by @p thread.
1980 *
1981 * @see ecore_thread_local_data_set()
1982 * @see ecore_thread_local_data_find()
1983 * @see ecore_thread_local_data_del()
1984 */
1985EAPI Eina_Bool
1986ecore_thread_local_data_add(Ecore_Thread *thread,
1987 const char *key,
1988 void *value,
1989 Eina_Free_Cb cb,
1990 Eina_Bool direct);
1991/**
1992 * Sets some data in the hash local to the given thread
1993 *
1994 * @param thread The thread context the data belongs to
1995 * @param key The name under which the data will be stored
1996 * @param value The data to add
1997 * @param cb Function to free the data when removed from the hash
1998 *
1999 * If no data exists in the hash under the @p key, this function adds
2000 * @p value in the hash under the given @p key and returns NULL.
2001 * The key itself is copied.
2002 *
2003 * If the hash already contains something under @p key, the data will be
2004 * replaced by @p value and the old value will be returned.
2005 *
2006 * NULL will also be returned if either @p key or @p value are NULL, or if
2007 * an error occurred.
2008 *
2009 * This function, and all of the others in the @c ecore_thread_local_data
2010 * family of functions, can only be called within the worker function running
2011 * in the thread. Do not call them from the main loop or from a thread
2012 * other than the one represented by @p thread.
2013 *
2014 * @see ecore_thread_local_data_add()
2015 * @see ecore_thread_local_data_del()
2016 * @see ecore_thread_local_data_find()
2017 */
2018EAPI void *
2019ecore_thread_local_data_set(Ecore_Thread *thread,
2020 const char *key,
2021 void *value,
2022 Eina_Free_Cb cb);
2023/**
2024 * Gets data stored in the hash local to the given thread
2025 *
2026 * @param thread The thread context the data belongs to
2027 * @param key The name under which the data is stored
2028 * @return The value under the given key, or NULL on error
2029 *
2030 * Finds and return the data stored in the shared hash under the key @p key.
2031 *
2032 * This function, and all of the others in the @c ecore_thread_local_data
2033 * family of functions, can only be called within the worker function running
2034 * in the thread. Do not call them from the main loop or from a thread
2035 * other than the one represented by @p thread.
2036 *
2037 * @see ecore_thread_local_data_add()
2038 * @see ecore_thread_local_data_wait()
2039 */
2040EAPI void *
2041ecore_thread_local_data_find(Ecore_Thread *thread,
2042 const char *key);
2043/**
2044 * Deletes from the thread's hash the data corresponding to the given key
2045 *
2046 * @param thread The thread context the data belongs to
2047 * @param key The name under which the data is stored
2048 * @return EINA_TRUE on success, EINA_FALSE on failure
2049 *
2050 * If there's any data stored associated with @p key in the global hash,
2051 * this function will remove it from it and return EINA_TRUE. If no data
2052 * exists or an error occurs, it returns EINA_FALSE.
2053 *
2054 * If the data was added to the hash with a free function, then it will
2055 * also be freed after removing it from the hash, otherwise it requires
2056 * to be manually freed by the user, which means that if no other reference
2057 * to it exists before calling this function, it will result in a memory
2058 * leak.
2059 *
2060 * This function, and all of the others in the @c ecore_thread_local_data
2061 * family of functions, can only be called within the worker function running
2062 * in the thread. Do not call them from the main loop or from a thread
2063 * other than the one represented by @p thread.
2064 *
2065 * @see ecore_thread_local_data_add()
2066 */
2067EAPI Eina_Bool
2068ecore_thread_local_data_del(Ecore_Thread *thread,
2069 const char *key);
2070
2071/**
2072 * Adds some data to a hash shared by all threads
2073 *
2074 * @param key The name under which the data will be stored
2075 * @param value The data to add
2076 * @param cb Function to free the data when removed from the hash
2077 * @param direct If true, this will not copy the key string (like
2078 * eina_hash_direct_add())
2079 * @return EINA_TRUE on success, EINA_FALSE on failure
2080 *
2081 * Ecore Thread keeps a hash that can be used to share data across several
2082 * threads, including the main loop one, without having to manually handle
2083 * mutexes to do so safely.
2084 *
2085 * This function adds the data @p value to this hash under the given @p key.
2086 * No other value in the hash may have the same @p key. If you need to
2087 * change the value under a @p key, or you don't know if one exists already,
2088 * you can use ecore_thread_global_data_set().
2089 *
2090 * Neither @p key nor @p value may be NULL and @p key will be copied in the
2091 * hash, unless @p direct is set, in which case the string used should not
2092 * be freed until the data is removed from the hash.
2093 *
2094 * The @p cb function will be called when the data in the hash needs to be
2095 * freed, be it because it got deleted with ecore_thread_global_data_del() or
2096 * because Ecore Thread was shut down and the hash destroyed. This parameter
2097 * may be NULL, in which case @p value needs to be manually freed after
2098 * removing it from the hash with either ecore_thread_global_data_del() or
2099 * ecore_thread_global_data_set().
2100 *
2101 * Manually freeing any data that was added to the hash with a @p cb function
2102 * is likely to produce a segmentation fault, or any other strange
2103 * happenings, later on in the program.
2104 *
2105 * @see ecore_thread_global_data_del()
2106 * @see ecore_thread_global_data_set()
2107 * @see ecore_thread_global_data_find()
2108 */
2109EAPI Eina_Bool
2110ecore_thread_global_data_add(const char *key,
2111 void *value,
2112 Eina_Free_Cb cb,
2113 Eina_Bool direct);
2114/**
2115 * Sets some data in the hash shared by all threads
2116 *
2117 * @param key The name under which the data will be stored
2118 * @param value The data to add
2119 * @param cb Function to free the data when removed from the hash
2120 *
2121 * If no data exists in the hash under the @p key, this function adds
2122 * @p value in the hash under the given @p key and returns NULL.
2123 * The key itself is copied.
2124 *
2125 * If the hash already contains something under @p key, the data will be
2126 * replaced by @p value and the old value will be returned.
2127 *
2128 * NULL will also be returned if either @p key or @p value are NULL, or if
2129 * an error occurred.
2130 *
2131 * @see ecore_thread_global_data_add()
2132 * @see ecore_thread_global_data_del()
2133 * @see ecore_thread_global_data_find()
2134 */
2135EAPI void *
2136ecore_thread_global_data_set(const char *key,
2137 void *value,
2138 Eina_Free_Cb cb);
2139/**
2140 * Gets data stored in the hash shared by all threads
2141 *
2142 * @param key The name under which the data is stored
2143 * @return The value under the given key, or NULL on error
2144 *
2145 * Finds and return the data stored in the shared hash under the key @p key.
2146 *
2147 * Keep in mind that the data returned may be used by more than one thread
2148 * at the same time and no reference counting is done on it by Ecore.
2149 * Freeing the data or modifying its contents may require additional
2150 * precautions to be considered, depending on the application's design.
2151 *
2152 * @see ecore_thread_global_data_add()
2153 * @see ecore_thread_global_data_wait()
2154 */
2155EAPI void *
2156ecore_thread_global_data_find(const char *key);
2157/**
2158 * Deletes from the shared hash the data corresponding to the given key
2159 *
2160 * @param key The name under which the data is stored
2161 * @return EINA_TRUE on success, EINA_FALSE on failure
2162 *
2163 * If there's any data stored associated with @p key in the global hash,
2164 * this function will remove it from it and return EINA_TRUE. If no data
2165 * exists or an error occurs, it returns EINA_FALSE.
2166 *
2167 * If the data was added to the hash with a free function, then it will
2168 * also be freed after removing it from the hash, otherwise it requires
2169 * to be manually freed by the user, which means that if no other reference
2170 * to it exists before calling this function, it will result in a memory
2171 * leak.
2172 *
2173 * Note, also, that freeing data that other threads may be using will result
2174 * in a crash, so appropriate care must be taken by the application when
2175 * that possibility exists.
2176 *
2177 * @see ecore_thread_global_data_add()
2178 */
2179EAPI Eina_Bool
2180ecore_thread_global_data_del(const char *key);
2181/**
2182 * Gets data stored in the shared hash, or wait for it if it doesn't exist
2183 *
2184 * @param key The name under which the data is stored
2185 * @param seconds The amount of time in seconds to wait for the data.
2186 * @return The value under the given key, or NULL on error
2187 *
2188 * Finds and return the data stored in the shared hash under the key @p key.
2189 *
2190 * If there's nothing in the hash under the given @p key, the function
2191 * will block and wait up to @p seconds seconds for some other thread to
2192 * add it with either ecore_thread_global_data_add() or
2193 * ecore_thread_global_data_set(). If after waiting there's still no data
2194 * to get, NULL will be returned.
2195 *
2196 * If @p seconds is 0, then no waiting will happen and this function works
2197 * like ecore_thread_global_data_find(). If @p seconds is less than 0, then
2198 * the function will wait indefinitely.
2199 *
2200 * Keep in mind that the data returned may be used by more than one thread
2201 * at the same time and no reference counting is done on it by Ecore.
2202 * Freeing the data or modifying its contents may require additional
2203 * precautions to be considered, depending on the application's design.
2204 *
2205 * @see ecore_thread_global_data_add()
2206 * @see ecore_thread_global_data_find()
2207 */
2208EAPI void *
2209ecore_thread_global_data_wait(const char *key,
2210 double seconds);
2211
2212/**
2213 * @}
2214 */
2215
2216/**
2217 * @defgroup Ecore_Pipe_Group Pipe wrapper
2218 *
2219 * These functions wrap the pipe / write / read functions to easily
2220 * integrate its use into ecore's main loop.
2221 *
2222 * The ecore_pipe_add() function creates file descriptors (sockets
2223 * on Windows) and attach a handle to the ecore main loop. That
2224 * handle is called when data is read in the pipe. To write data in
2225 * the pipe, just call ecore_pipe_write(). When you are done, just
2226 * call ecore_pipe_del().
2227 *
2228 * For examples see here:
2229 * @li @ref tutorial_ecore_pipe_gstreamer_example
2230 * @li @ref tutorial_ecore_pipe_simple_example
2231 *
2232 * @ingroup Ecore_Main_Loop_Group
2233 *
2234 * @{
2235 */
2236
2237typedef struct _Ecore_Pipe Ecore_Pipe; /**< A handle for pipes */
2238
2239/**
2240 * @typedef Ecore_Pipe_Cb Ecore_Pipe_Cb
2241 * The callback that data written to the pipe is sent to.
2242 */
2243typedef void (*Ecore_Pipe_Cb)(void *data, void *buffer, unsigned int nbyte);
2244
2245EAPI Ecore_Pipe *
2246ecore_pipe_add(Ecore_Pipe_Cb handler,
2247 const void *data);
2248EAPI void *
2249 ecore_pipe_del(Ecore_Pipe *p);
2250EAPI Eina_Bool
2251 ecore_pipe_write(Ecore_Pipe *p,
2252 const void *buffer,
2253 unsigned int nbytes);
2254EAPI void
2255 ecore_pipe_write_close(Ecore_Pipe *p);
2256EAPI void
2257 ecore_pipe_read_close(Ecore_Pipe *p);
2258EAPI void
2259 ecore_pipe_thaw(Ecore_Pipe *p);
2260EAPI void
2261 ecore_pipe_freeze(Ecore_Pipe *p);
2262EAPI int
2263 ecore_pipe_wait(Ecore_Pipe *p,
2264 int message_count,
2265 double wait);
2266
2267/**
2268 * @}
2269 */
2270
2271/**
2272 * @defgroup Ecore_Job_Group Ecore Job functions
2273 *
2274 * You can queue jobs that are to be done by the main loop when the
2275 * current event is dealt with.
2276 *
2277 * Jobs are processed by the main loop similarly to events. They
2278 * also will be executed in the order in which they were added.
2279 *
2280 * A good use for them is when you don't want to execute an action
2281 * immeditately, but want to give the control back to the main loop
2282 * so that it will call your job callback when jobs start being
2283 * processed (and if there are other jobs added before yours, they
2284 * will be processed first). This also gives the chance to other
2285 * actions in your program to cancel the job before it is started.
2286 *
2287 * Examples of using @ref Ecore_Job:
2288 * @li @ref ecore_job_example_c
2289 *
2290 * @ingroup Ecore_Main_Loop_Group
2291 *
2292 * @{
2293 */
2294
2295typedef struct _Ecore_Job Ecore_Job; /**< A job handle */
2296
2297EAPI Ecore_Job *
2298ecore_job_add(Ecore_Cb func,
2299 const void *data);
2300EAPI void *
2301ecore_job_del(Ecore_Job *job);
2302
2303/**
2304 * @}
2305 */
2306
2307/**
2308 * @defgroup Ecore_Application_Group Ecore Application functions
2309 *
2310 * @{
2311 */
2312
2313EAPI void
2314ecore_app_args_set(int argc,
2315 const char **argv);
2316EAPI void
2317ecore_app_args_get(int *argc,
2318 char ***argv);
2319EAPI void
2320ecore_app_restart(void);
2321
2322/**
2323 * @}
2324 */
2325
2326/**
2327 * @defgroup Ecore_Throttle_Group Ecore Throttle functions
2328 *
2329 * @ingroup Ecore_Main_Loop_Group
2330 *
2331 * @{
2332 */
2333
2334EAPI void
2335 ecore_throttle_adjust(double amount);
2336EAPI double
2337 ecore_throttle_get(void);
2338
2339/**
2340 * @}
2341 */
2342
2343#ifdef __cplusplus
2344}
2345#endif
2346#endif
diff --git a/libraries/ecore/src/lib/ecore/Ecore_Getopt.h b/libraries/ecore/src/lib/ecore/Ecore_Getopt.h
new file mode 100644
index 0000000..0a11787
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/Ecore_Getopt.h
@@ -0,0 +1,419 @@
1#ifndef _ECORE_GETOPT_H
2#define _ECORE_GETOPT_H
3
4#include <stdio.h>
5#include <Eina.h>
6
7#ifdef EAPI
8# undef EAPI
9#endif
10
11#ifdef _WIN32
12# ifdef EFL_ECORE_BUILD
13# ifdef DLL_EXPORT
14# define EAPI __declspec(dllexport)
15# else
16# define EAPI
17# endif /* ! DLL_EXPORT */
18# else
19# define EAPI __declspec(dllimport)
20# endif /* ! EFL_ECORE_BUILD */
21#else
22# ifdef __GNUC__
23# if __GNUC__ >= 4
24# define EAPI __attribute__ ((visibility("default")))
25# else
26# define EAPI
27# endif
28# else
29# define EAPI
30# endif
31#endif /* ! _WIN32 */
32
33/**
34 * @file Ecore_Getopt.h
35 * @brief Contains powerful getopt replacement.
36 *
37 * This replacement handles both short (-X) or long options (--ABC)
38 * options, with various actions supported, like storing one value and
39 * already converting to required type, counting number of
40 * occurrences, setting true or false values, show help, license,
41 * copyright and even support user-defined callbacks.
42 *
43 * It is provided a set of C Pre Processor macros so definition is
44 * straightforward.
45 *
46 * Values will be stored elsewhere indicated by an array of pointers
47 * to values, it is given in separate to parser description so you can
48 * use multiple values with the same parser.
49 */
50
51#ifdef __cplusplus
52extern "C" {
53#endif
54
55typedef enum {
56 ECORE_GETOPT_ACTION_STORE,
57 ECORE_GETOPT_ACTION_STORE_CONST,
58 ECORE_GETOPT_ACTION_STORE_TRUE,
59 ECORE_GETOPT_ACTION_STORE_FALSE,
60 ECORE_GETOPT_ACTION_CHOICE,
61 ECORE_GETOPT_ACTION_APPEND,
62 ECORE_GETOPT_ACTION_COUNT,
63 ECORE_GETOPT_ACTION_CALLBACK,
64 ECORE_GETOPT_ACTION_HELP,
65 ECORE_GETOPT_ACTION_VERSION,
66 ECORE_GETOPT_ACTION_COPYRIGHT,
67 ECORE_GETOPT_ACTION_LICENSE
68} Ecore_Getopt_Action;
69
70typedef enum {
71 ECORE_GETOPT_TYPE_STR,
72 ECORE_GETOPT_TYPE_BOOL,
73 ECORE_GETOPT_TYPE_SHORT,
74 ECORE_GETOPT_TYPE_INT,
75 ECORE_GETOPT_TYPE_LONG,
76 ECORE_GETOPT_TYPE_USHORT,
77 ECORE_GETOPT_TYPE_UINT,
78 ECORE_GETOPT_TYPE_ULONG,
79 ECORE_GETOPT_TYPE_DOUBLE
80} Ecore_Getopt_Type;
81
82typedef enum {
83 ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO = 0,
84 ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES = 1,
85 ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL = 3
86} Ecore_Getopt_Desc_Arg_Requirement;
87
88typedef union _Ecore_Getopt_Value Ecore_Getopt_Value;
89
90typedef struct _Ecore_Getopt_Desc_Store Ecore_Getopt_Desc_Store;
91typedef struct _Ecore_Getopt_Desc_Callback Ecore_Getopt_Desc_Callback;
92typedef struct _Ecore_Getopt_Desc Ecore_Getopt_Desc;
93typedef struct _Ecore_Getopt Ecore_Getopt;
94
95union _Ecore_Getopt_Value
96{
97 char **strp;
98 unsigned char *boolp;
99 short *shortp;
100 int *intp;
101 long *longp;
102 unsigned short *ushortp;
103 unsigned int *uintp;
104 unsigned long *ulongp;
105 double *doublep;
106 Eina_List **listp;
107 void **ptrp;
108};
109
110struct _Ecore_Getopt_Desc_Store
111{
112 Ecore_Getopt_Type type; /**< type of data being handled */
113 Ecore_Getopt_Desc_Arg_Requirement arg_req;
114 union
115 {
116 const char *strv;
117 Eina_Bool boolv;
118 short shortv;
119 int intv;
120 long longv;
121 unsigned short ushortv;
122 unsigned int uintv;
123 unsigned long ulongv;
124 double doublev;
125 } def;
126};
127
128struct _Ecore_Getopt_Desc_Callback
129{
130 Eina_Bool (*func)(const Ecore_Getopt *parser,
131 const Ecore_Getopt_Desc *desc,
132 const char *str,
133 void *data,
134 Ecore_Getopt_Value *storage);
135 const void *data;
136 Ecore_Getopt_Desc_Arg_Requirement arg_req;
137 const char *def;
138};
139
140struct _Ecore_Getopt_Desc
141{
142 char shortname; /**< used with a single dash */
143 const char *longname; /**< used with double dashes */
144 const char *help; /**< used by --help/ecore_getopt_help() */
145 const char *metavar; /**< used by ecore_getopt_help() with nargs > 0 */
146
147 Ecore_Getopt_Action action; /**< define how to handle it */
148 union
149 {
150 const Ecore_Getopt_Desc_Store store;
151 const void *store_const;
152 const char *const *choices; /* NULL terminated. */
153 const Ecore_Getopt_Type append_type;
154 const Ecore_Getopt_Desc_Callback callback;
155 const void *dummy;
156 } action_param;
157};
158
159struct _Ecore_Getopt
160{
161 const char *prog; /**< to be used when ecore_app_args_get() fails */
162 const char *usage; /**< usage example, %prog is replaced */
163 const char *version; /**< if exists, --version will work */
164 const char *copyright; /**< if exists, --copyright will work */
165 const char *license; /**< if exists, --license will work */
166 const char *description; /**< long description, possible multiline */
167 Eina_Bool strict : 1; /**< fail on errors */
168 const Ecore_Getopt_Desc descs[]; /* NULL terminated. */
169};
170
171#define ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, type, arg_requirement, default_value) \
172 {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_STORE, \
173 {.store = {type, arg_requirement, default_value}}}
174
175#define ECORE_GETOPT_STORE(shortname, longname, help, type) \
176 ECORE_GETOPT_STORE_FULL(shortname, longname, help, NULL, type, \
177 ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES, {})
178
179#define ECORE_GETOPT_STORE_STR(shortname, longname, help) \
180 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_STR)
181#define ECORE_GETOPT_STORE_BOOL(shortname, longname, help) \
182 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_BOOL)
183#define ECORE_GETOPT_STORE_SHORT(shortname, longname, help) \
184 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_SHORT)
185#define ECORE_GETOPT_STORE_INT(shortname, longname, help) \
186 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_INT)
187#define ECORE_GETOPT_STORE_LONG(shortname, longname, help) \
188 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_LONG)
189#define ECORE_GETOPT_STORE_USHORT(shortname, longname, help) \
190 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_USHORT)
191#define ECORE_GETOPT_STORE_UINT(shortname, longname, help) \
192 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_UINT)
193#define ECORE_GETOPT_STORE_ULONG(shortname, longname, help) \
194 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_ULONG)
195#define ECORE_GETOPT_STORE_DOUBLE(shortname, longname, help) \
196 ECORE_GETOPT_STORE(shortname, longname, help, ECORE_GETOPT_TYPE_DOUBLE)
197
198#define ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, type) \
199 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, type, \
200 ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES, {})
201
202#define ECORE_GETOPT_STORE_METAVAR_STR(shortname, longname, help, metavar) \
203 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_STR)
204#define ECORE_GETOPT_STORE_METAVAR_BOOL(shortname, longname, help, metavar) \
205 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_BOOL)
206#define ECORE_GETOPT_STORE_METAVAR_SHORT(shortname, longname, help, metavar) \
207 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_SHORT)
208#define ECORE_GETOPT_STORE_METAVAR_INT(shortname, longname, help, metavar) \
209 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_INT)
210#define ECORE_GETOPT_STORE_METAVAR_LONG(shortname, longname, help, metavar) \
211 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_LONG)
212#define ECORE_GETOPT_STORE_METAVAR_USHORT(shortname, longname, help, metavar) \
213 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_USHORT)
214#define ECORE_GETOPT_STORE_METAVAR_UINT(shortname, longname, help, metavar) \
215 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_UINT)
216#define ECORE_GETOPT_STORE_METAVAR_ULONG(shortname, longname, help, metavar) \
217 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_ULONG)
218#define ECORE_GETOPT_STORE_METAVAR_DOUBLE(shortname, longname, help, metavar) \
219 ECORE_GETOPT_STORE_METAVAR(shortname, longname, help, metavar, ECORE_GETOPT_TYPE_DOUBLE)
220
221#define ECORE_GETOPT_STORE_DEF(shortname, longname, help, type, default_value) \
222 ECORE_GETOPT_STORE_FULL(shortname, longname, help, NULL, type, \
223 ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL, \
224 default_value)
225
226#define ECORE_GETOPT_STORE_DEF_STR(shortname, longname, help, default_value) \
227 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
228 ECORE_GETOPT_TYPE_STR, \
229 {.strv = default_value})
230#define ECORE_GETOPT_STORE_DEF_BOOL(shortname, longname, help, default_value) \
231 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
232 ECORE_GETOPT_TYPE_BOOL, \
233 {.boolv = default_value})
234#define ECORE_GETOPT_STORE_DEF_SHORT(shortname, longname, help, default_value) \
235 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
236 ECORE_GETOPT_TYPE_SHORT, \
237 {.shortv = default_value})
238#define ECORE_GETOPT_STORE_DEF_INT(shortname, longname, help, default_value) \
239 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
240 ECORE_GETOPT_TYPE_INT, \
241 {.intv = default_value})
242#define ECORE_GETOPT_STORE_DEF_LONG(shortname, longname, help, default_value) \
243 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
244 ECORE_GETOPT_TYPE_LONG, \
245 {.longv = default_value})
246#define ECORE_GETOPT_STORE_DEF_USHORT(shortname, longname, help, default_value) \
247 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
248 ECORE_GETOPT_TYPE_USHORT, \
249 {.ushortv = default_value})
250#define ECORE_GETOPT_STORE_DEF_UINT(shortname, longname, help, default_value) \
251 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
252 ECORE_GETOPT_TYPE_UINT, \
253 {.uintv = default_value})
254#define ECORE_GETOPT_STORE_DEF_ULONG(shortname, longname, help, default_value) \
255 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
256 ECORE_GETOPT_TYPE_ULONG, \
257 {.ulongv = default_value})
258#define ECORE_GETOPT_STORE_DEF_DOUBLE(shortname, longname, help, default_value) \
259 ECORE_GETOPT_STORE_DEF(shortname, longname, help, \
260 ECORE_GETOPT_TYPE_DOUBLE, \
261 {.doublev = default_value})
262
263#define ECORE_GETOPT_STORE_FULL_STR(shortname, longname, help, metavar, arg_requirement, default_value) \
264 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
265 ECORE_GETOPT_TYPE_STR, \
266 arg_requirement, \
267 {.strv = default_value})
268#define ECORE_GETOPT_STORE_FULL_BOOL(shortname, longname, help, metavar, arg_requirement, default_value) \
269 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
270 ECORE_GETOPT_TYPE_BOOL, \
271 arg_requirement, \
272 {.boolv = default_value})
273#define ECORE_GETOPT_STORE_FULL_SHORT(shortname, longname, help, metavar, arg_requirement, default_value) \
274 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
275 ECORE_GETOPT_TYPE_SHORT, \
276 arg_requirement, \
277 {.shortv = default_value})
278#define ECORE_GETOPT_STORE_FULL_INT(shortname, longname, help, metavar, arg_requirement, default_value) \
279 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
280 ECORE_GETOPT_TYPE_INT, \
281 arg_requirement, \
282 {.intv = default_value})
283#define ECORE_GETOPT_STORE_FULL_LONG(shortname, longname, help, metavar, arg_requirement, default_value) \
284 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
285 ECORE_GETOPT_TYPE_LONG, \
286 arg_requirement, \
287 {.longv = default_value})
288#define ECORE_GETOPT_STORE_FULL_USHORT(shortname, longname, help, metavar, arg_requirement, default_value) \
289 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
290 ECORE_GETOPT_TYPE_USHORT, \
291 arg_requirement, \
292 {.ushortv = default_value})
293#define ECORE_GETOPT_STORE_FULL_UINT(shortname, longname, help, metavar, arg_requirement, default_value) \
294 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
295 ECORE_GETOPT_TYPE_UINT, \
296 arg_requirement, \
297 {.uintv = default_value})
298#define ECORE_GETOPT_STORE_FULL_ULONG(shortname, longname, help, metavar, arg_requirement, default_value) \
299 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
300 ECORE_GETOPT_TYPE_ULONG, \
301 arg_requirement, \
302 {.ulongv = default_value})
303#define ECORE_GETOPT_STORE_FULL_DOUBLE(shortname, longname, help, metavar, arg_requirement, default_value) \
304 ECORE_GETOPT_STORE_FULL(shortname, longname, help, metavar, \
305 ECORE_GETOPT_TYPE_DOUBLE, \
306 arg_requirement, \
307 {.doublev = default_value})
308
309#define ECORE_GETOPT_STORE_CONST(shortname, longname, help, value) \
310 {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_CONST, \
311 {.store_const = value}}
312#define ECORE_GETOPT_STORE_TRUE(shortname, longname, help) \
313 {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_TRUE, \
314 {.dummy = NULL}}
315#define ECORE_GETOPT_STORE_FALSE(shortname, longname, help) \
316 {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_STORE_FALSE, \
317 {.dummy = NULL}}
318
319#define ECORE_GETOPT_CHOICE(shortname, longname, help, choices_array) \
320 {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_CHOICE, \
321 {.choices = choices_array}}
322#define ECORE_GETOPT_CHOICE_METAVAR(shortname, longname, help, metavar, choices_array) \
323 {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_CHOICE, \
324 {.choices = choices_array}}
325
326#define ECORE_GETOPT_APPEND(shortname, longname, help, sub_type) \
327 {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_APPEND, \
328 {.append_type = sub_type}}
329#define ECORE_GETOPT_APPEND_METAVAR(shortname, longname, help, metavar, type) \
330 {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_APPEND, \
331 {.append_type = type}}
332
333#define ECORE_GETOPT_COUNT(shortname, longname, help) \
334 {shortname, longname, help, NULL, ECORE_GETOPT_ACTION_COUNT, \
335 {.dummy = NULL}}
336
337#define ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, metavar, callback_func, callback_data, argument_requirement, default_value) \
338 {shortname, longname, help, metavar, ECORE_GETOPT_ACTION_CALLBACK, \
339 {.callback = {callback_func, callback_data, \
340 argument_requirement, default_value}}}
341#define ECORE_GETOPT_CALLBACK_NOARGS(shortname, longname, help, callback_func, callback_data) \
342 ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, NULL, \
343 callback_func, callback_data, \
344 ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO, \
345 NULL)
346#define ECORE_GETOPT_CALLBACK_ARGS(shortname, longname, help, metavar, callback_func, callback_data) \
347 ECORE_GETOPT_CALLBACK_FULL(shortname, longname, help, metavar, \
348 callback_func, callback_data, \
349 ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES, \
350 NULL)
351
352#define ECORE_GETOPT_HELP(shortname, longname) \
353 {shortname, longname, "show this message.", NULL, \
354 ECORE_GETOPT_ACTION_HELP, \
355 {.dummy = NULL}}
356
357#define ECORE_GETOPT_VERSION(shortname, longname) \
358 {shortname, longname, "show program version.", NULL, \
359 ECORE_GETOPT_ACTION_VERSION, \
360 {.dummy = NULL}}
361
362#define ECORE_GETOPT_COPYRIGHT(shortname, longname) \
363 {shortname, longname, "show copyright.", NULL, \
364 ECORE_GETOPT_ACTION_COPYRIGHT, \
365 {.dummy = NULL}}
366
367#define ECORE_GETOPT_LICENSE(shortname, longname) \
368 {shortname, longname, "show license.", NULL, \
369 ECORE_GETOPT_ACTION_LICENSE, \
370 {.dummy = NULL}}
371
372#define ECORE_GETOPT_SENTINEL {0, NULL, NULL, NULL, 0, {.dummy = NULL}}
373
374#define ECORE_GETOPT_VALUE_STR(val) {.strp = &(val)}
375#define ECORE_GETOPT_VALUE_BOOL(val) {.boolp = &(val)}
376#define ECORE_GETOPT_VALUE_SHORT(val) {.shortp = &(val)}
377#define ECORE_GETOPT_VALUE_INT(val) {.intp = &(val)}
378#define ECORE_GETOPT_VALUE_LONG(val) {.longp = &(val)}
379#define ECORE_GETOPT_VALUE_USHORT(val) {.ushortp = &(val)}
380#define ECORE_GETOPT_VALUE_UINT(val) {.uintp = &(val)}
381#define ECORE_GETOPT_VALUE_ULONG(val) {.ulongp = &(val)}
382#define ECORE_GETOPT_VALUE_DOUBLE(val) {.doublep = &(val)}
383#define ECORE_GETOPT_VALUE_PTR(val) {.ptrp = &(val)}
384#define ECORE_GETOPT_VALUE_PTR_CAST(val) {.ptrp = (void **)&(val)}
385#define ECORE_GETOPT_VALUE_LIST(val) {.listp = &(val)}
386#define ECORE_GETOPT_VALUE_NONE {.ptrp = NULL}
387
388EAPI void
389ecore_getopt_help(FILE *fp,
390 const Ecore_Getopt *info);
391
392EAPI Eina_Bool
393 ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser);
394EAPI int
395 ecore_getopt_parse(const Ecore_Getopt *parser,
396 Ecore_Getopt_Value *values,
397 int argc,
398 char **argv);
399
400EAPI Eina_List *ecore_getopt_list_free(Eina_List *list);
401
402/* helper functions to be used with ECORE_GETOPT_CALLBACK_*() */
403EAPI Eina_Bool
404ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser,
405 const Ecore_Getopt_Desc *desc,
406 const char *str,
407 void *data,
408 Ecore_Getopt_Value *storage);
409EAPI Eina_Bool
410ecore_getopt_callback_size_parse(const Ecore_Getopt *parser,
411 const Ecore_Getopt_Desc *desc,
412 const char *str,
413 void *data,
414 Ecore_Getopt_Value *storage);
415
416#ifdef __cplusplus
417}
418#endif
419#endif /* _ECORE_GETOPT_H */
diff --git a/libraries/ecore/src/lib/ecore/Makefile.am b/libraries/ecore/src/lib/ecore/Makefile.am
new file mode 100644
index 0000000..2fb6a0a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/Makefile.am
@@ -0,0 +1,60 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = @GLIB_CFLAGS@ @EVIL_CFLAGS@ @EINA_CFLAGS@ @WIN32_CPPFLAGS@ @EFL_ECORE_BUILD@
4AM_CFLAGS = @WIN32_CFLAGS@ @EFL_PTHREAD_CFLAGS@
5
6lib_LTLIBRARIES = libecore.la
7includes_HEADERS = \
8Ecore.h \
9Ecore_Getopt.h
10includesdir = $(includedir)/ecore-@VMAJ@
11
12libecore_la_SOURCES = \
13ecore.c \
14ecore_anim.c \
15ecore_app.c \
16ecore_events.c \
17ecore_getopt.c \
18ecore_idle_enterer.c \
19ecore_idle_exiter.c \
20ecore_idler.c \
21ecore_job.c \
22ecore_main.c \
23ecore_pipe.c \
24ecore_poll.c \
25ecore_time.c \
26ecore_timer.c \
27ecore_thread.c \
28ecore_glib.c \
29ecore_throttle.c
30
31if ECORE_HAVE_WIN32
32
33libecore_la_SOURCES += ecore_exe_win32.c
34
35else
36
37if ECORE_HAVE_WINCE
38
39libecore_la_SOURCES += ecore_exe_wince.c
40
41else
42
43if ECORE_HAVE_PS3
44
45libecore_la_SOURCES += ecore_exe_ps3.c
46
47else
48
49libecore_la_SOURCES += ecore_signal.c ecore_exe.c
50
51endif
52
53endif
54
55endif
56
57libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @GLIB_LIBS@ @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ @rt_libs@ -lm
58libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ @EFL_PTHREAD_LIBS@
59
60EXTRA_DIST = ecore_private.h
diff --git a/libraries/ecore/src/lib/ecore/Makefile.in b/libraries/ecore/src/lib/ecore/Makefile.in
new file mode 100644
index 0000000..e19bfde
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/Makefile.in
@@ -0,0 +1,853 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38@ECORE_HAVE_WIN32_TRUE@am__append_1 = ecore_exe_win32.c
39@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_TRUE@am__append_2 = ecore_exe_wince.c
40@ECORE_HAVE_PS3_TRUE@@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_FALSE@am__append_3 = ecore_exe_ps3.c
41@ECORE_HAVE_PS3_FALSE@@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_FALSE@am__append_4 = ecore_signal.c ecore_exe.c
42subdir = src/lib/ecore
43DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
44 $(srcdir)/Makefile.in
45ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
46am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
47 $(top_srcdir)/m4/ac_path_generic.m4 \
48 $(top_srcdir)/m4/check_x_extension.m4 \
49 $(top_srcdir)/m4/ecore_check_module.m4 \
50 $(top_srcdir)/m4/ecore_check_options.m4 \
51 $(top_srcdir)/m4/efl_compiler_flag.m4 \
52 $(top_srcdir)/m4/efl_doxygen.m4 \
53 $(top_srcdir)/m4/efl_examples.m4 \
54 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
55 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
56 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
57 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
58 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
59 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
60 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
61 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
62 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
63 $(top_srcdir)/configure.ac
64am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
65 $(ACLOCAL_M4)
66mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
67CONFIG_HEADER = $(top_builddir)/config.h
68CONFIG_CLEAN_FILES =
69CONFIG_CLEAN_VPATH_FILES =
70am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
71am__vpath_adj = case $$p in \
72 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
73 *) f=$$p;; \
74 esac;
75am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
76am__install_max = 40
77am__nobase_strip_setup = \
78 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
79am__nobase_strip = \
80 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
81am__nobase_list = $(am__nobase_strip_setup); \
82 for p in $$list; do echo "$$p $$p"; done | \
83 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
84 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
85 if (++n[$$2] == $(am__install_max)) \
86 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
87 END { for (dir in files) print dir, files[dir] }'
88am__base_list = \
89 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
90 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
91am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
92LTLIBRARIES = $(lib_LTLIBRARIES)
93libecore_la_DEPENDENCIES =
94am__libecore_la_SOURCES_DIST = ecore.c ecore_anim.c ecore_app.c \
95 ecore_events.c ecore_getopt.c ecore_idle_enterer.c \
96 ecore_idle_exiter.c ecore_idler.c ecore_job.c ecore_main.c \
97 ecore_pipe.c ecore_poll.c ecore_time.c ecore_timer.c \
98 ecore_thread.c ecore_glib.c ecore_throttle.c ecore_exe_win32.c \
99 ecore_exe_wince.c ecore_exe_ps3.c ecore_signal.c ecore_exe.c
100@ECORE_HAVE_WIN32_TRUE@am__objects_1 = ecore_exe_win32.lo
101@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_TRUE@am__objects_2 = ecore_exe_wince.lo
102@ECORE_HAVE_PS3_TRUE@@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_FALSE@am__objects_3 = ecore_exe_ps3.lo
103@ECORE_HAVE_PS3_FALSE@@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_FALSE@am__objects_4 = ecore_signal.lo \
104@ECORE_HAVE_PS3_FALSE@@ECORE_HAVE_WIN32_FALSE@@ECORE_HAVE_WINCE_FALSE@ ecore_exe.lo
105am_libecore_la_OBJECTS = ecore.lo ecore_anim.lo ecore_app.lo \
106 ecore_events.lo ecore_getopt.lo ecore_idle_enterer.lo \
107 ecore_idle_exiter.lo ecore_idler.lo ecore_job.lo ecore_main.lo \
108 ecore_pipe.lo ecore_poll.lo ecore_time.lo ecore_timer.lo \
109 ecore_thread.lo ecore_glib.lo ecore_throttle.lo \
110 $(am__objects_1) $(am__objects_2) $(am__objects_3) \
111 $(am__objects_4)
112libecore_la_OBJECTS = $(am_libecore_la_OBJECTS)
113AM_V_lt = $(am__v_lt_$(V))
114am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
115am__v_lt_0 = --silent
116libecore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
117 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
118 $(libecore_la_LDFLAGS) $(LDFLAGS) -o $@
119DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
120depcomp = $(SHELL) $(top_srcdir)/depcomp
121am__depfiles_maybe = depfiles
122am__mv = mv -f
123COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
124 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
125LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
126 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
127 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
128 $(AM_CFLAGS) $(CFLAGS)
129AM_V_CC = $(am__v_CC_$(V))
130am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
131am__v_CC_0 = @echo " CC " $@;
132AM_V_at = $(am__v_at_$(V))
133am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
134am__v_at_0 = @
135CCLD = $(CC)
136LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
137 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
138 $(AM_LDFLAGS) $(LDFLAGS) -o $@
139AM_V_CCLD = $(am__v_CCLD_$(V))
140am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
141am__v_CCLD_0 = @echo " CCLD " $@;
142AM_V_GEN = $(am__v_GEN_$(V))
143am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
144am__v_GEN_0 = @echo " GEN " $@;
145SOURCES = $(libecore_la_SOURCES)
146DIST_SOURCES = $(am__libecore_la_SOURCES_DIST)
147HEADERS = $(includes_HEADERS)
148ETAGS = etags
149CTAGS = ctags
150DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
151ACLOCAL = @ACLOCAL@
152ALLOCA = @ALLOCA@
153AMTAR = @AMTAR@
154AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
155AR = @AR@
156AS = @AS@
157AUTOCONF = @AUTOCONF@
158AUTOHEADER = @AUTOHEADER@
159AUTOMAKE = @AUTOMAKE@
160AWK = @AWK@
161CARES_CFLAGS = @CARES_CFLAGS@
162CARES_LIBS = @CARES_LIBS@
163CC = @CC@
164CCDEPMODE = @CCDEPMODE@
165CFLAGS = @CFLAGS@
166CHECK_CFLAGS = @CHECK_CFLAGS@
167CHECK_LIBS = @CHECK_LIBS@
168CPP = @CPP@
169CPPFLAGS = @CPPFLAGS@
170CURL_CFLAGS = @CURL_CFLAGS@
171CURL_LIBS = @CURL_LIBS@
172CXX = @CXX@
173CXXCPP = @CXXCPP@
174CXXDEPMODE = @CXXDEPMODE@
175CXXFLAGS = @CXXFLAGS@
176CYGPATH_W = @CYGPATH_W@
177DEFS = @DEFS@
178DEPDIR = @DEPDIR@
179DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
180DIRECTFB_LIBS = @DIRECTFB_LIBS@
181DLLTOOL = @DLLTOOL@
182DSYMUTIL = @DSYMUTIL@
183DUMPBIN = @DUMPBIN@
184ECHO_C = @ECHO_C@
185ECHO_N = @ECHO_N@
186ECHO_T = @ECHO_T@
187ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
188ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
189EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
190EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
191EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
192EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
193EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
194EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
195EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
196EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
197EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
198EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
199EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
200EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
201EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
202EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
203EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
204EGREP = @EGREP@
205EINA_CFLAGS = @EINA_CFLAGS@
206EINA_LIBS = @EINA_LIBS@
207ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
208ESCAPE_LIBS = @ESCAPE_LIBS@
209EVAS_CFLAGS = @EVAS_CFLAGS@
210EVAS_LIBS = @EVAS_LIBS@
211EVIL_CFLAGS = @EVIL_CFLAGS@
212EVIL_LIBS = @EVIL_LIBS@
213EXEEXT = @EXEEXT@
214FGREP = @FGREP@
215GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
216GLIB_CFLAGS = @GLIB_CFLAGS@
217GLIB_LIBS = @GLIB_LIBS@
218GMSGFMT = @GMSGFMT@
219GMSGFMT_015 = @GMSGFMT_015@
220GREP = @GREP@
221INSTALL = @INSTALL@
222INSTALL_DATA = @INSTALL_DATA@
223INSTALL_PROGRAM = @INSTALL_PROGRAM@
224INSTALL_SCRIPT = @INSTALL_SCRIPT@
225INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
226INTLLIBS = @INTLLIBS@
227INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
228KEYSYMDEFS = @KEYSYMDEFS@
229LD = @LD@
230LDFLAGS = @LDFLAGS@
231LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
232LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
233LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
234LIBICONV = @LIBICONV@
235LIBINTL = @LIBINTL@
236LIBOBJS = @LIBOBJS@
237LIBS = @LIBS@
238LIBTOOL = @LIBTOOL@
239LIPO = @LIPO@
240LN_S = @LN_S@
241LTLIBICONV = @LTLIBICONV@
242LTLIBINTL = @LTLIBINTL@
243LTLIBOBJS = @LTLIBOBJS@
244MAKEINFO = @MAKEINFO@
245MKDIR_P = @MKDIR_P@
246MSGFMT = @MSGFMT@
247MSGFMT_015 = @MSGFMT_015@
248MSGMERGE = @MSGMERGE@
249NM = @NM@
250NMEDIT = @NMEDIT@
251OBJC = @OBJC@
252OBJCDEPMODE = @OBJCDEPMODE@
253OBJCFLAGS = @OBJCFLAGS@
254OBJDUMP = @OBJDUMP@
255OBJEXT = @OBJEXT@
256OTOOL = @OTOOL@
257OTOOL64 = @OTOOL64@
258PACKAGE = @PACKAGE@
259PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
260PACKAGE_NAME = @PACKAGE_NAME@
261PACKAGE_STRING = @PACKAGE_STRING@
262PACKAGE_TARNAME = @PACKAGE_TARNAME@
263PACKAGE_URL = @PACKAGE_URL@
264PACKAGE_VERSION = @PACKAGE_VERSION@
265PATH_SEPARATOR = @PATH_SEPARATOR@
266PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
267PIXMAN_LIBS = @PIXMAN_LIBS@
268PKG_CONFIG = @PKG_CONFIG@
269PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
270PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
271POSUB = @POSUB@
272RANLIB = @RANLIB@
273SDL_CFLAGS = @SDL_CFLAGS@
274SDL_CONFIG = @SDL_CONFIG@
275SDL_LIBS = @SDL_LIBS@
276SED = @SED@
277SET_MAKE = @SET_MAKE@
278SHELL = @SHELL@
279SSL_CFLAGS = @SSL_CFLAGS@
280SSL_LIBS = @SSL_LIBS@
281STRIP = @STRIP@
282TLS2_CFLAGS = @TLS2_CFLAGS@
283TLS2_LIBS = @TLS2_LIBS@
284TLS_CFLAGS = @TLS_CFLAGS@
285TLS_LIBS = @TLS_LIBS@
286TSLIB_CFLAGS = @TSLIB_CFLAGS@
287TSLIB_LIBS = @TSLIB_LIBS@
288USE_NLS = @USE_NLS@
289VERSION = @VERSION@
290VMAJ = @VMAJ@
291WIN32_CFLAGS = @WIN32_CFLAGS@
292WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
293WIN32_LIBS = @WIN32_LIBS@
294XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
295XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
296XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
297XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
298XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
299XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
300XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
301XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
302XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
303XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
304XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
305XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
306XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
307XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
308XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
309XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
310XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
311XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
312XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
313XCB_X11_LIBS = @XCB_X11_LIBS@
314XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
315XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
316XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
317XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
318XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
319XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
320XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
321XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
322XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
323XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
324XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
325XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
326XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
327XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
328XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
329XDAMAGE_LIBS = @XDAMAGE_LIBS@
330XDPMS_CFLAGS = @XDPMS_CFLAGS@
331XDPMS_LIBS = @XDPMS_LIBS@
332XFIXES_CFLAGS = @XFIXES_CFLAGS@
333XFIXES_LIBS = @XFIXES_LIBS@
334XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
335XGESTURE_LIBS = @XGESTURE_LIBS@
336XGETTEXT = @XGETTEXT@
337XGETTEXT_015 = @XGETTEXT_015@
338XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
339XI2_CFLAGS = @XI2_CFLAGS@
340XI2_LIBS = @XI2_LIBS@
341XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
342XINERAMA_LIBS = @XINERAMA_LIBS@
343XKB_CFLAGS = @XKB_CFLAGS@
344XKB_LIBS = @XKB_LIBS@
345XMKMF = @XMKMF@
346XPRINT_CFLAGS = @XPRINT_CFLAGS@
347XPRINT_LIBS = @XPRINT_LIBS@
348XRANDR_CFLAGS = @XRANDR_CFLAGS@
349XRANDR_LIBS = @XRANDR_LIBS@
350XRENDER_CFLAGS = @XRENDER_CFLAGS@
351XRENDER_LIBS = @XRENDER_LIBS@
352XSS_CFLAGS = @XSS_CFLAGS@
353XSS_LIBS = @XSS_LIBS@
354XTEST_CFLAGS = @XTEST_CFLAGS@
355XTEST_LIBS = @XTEST_LIBS@
356X_CFLAGS = @X_CFLAGS@
357X_EXTRA_LIBS = @X_EXTRA_LIBS@
358X_LIBS = @X_LIBS@
359X_PRE_LIBS = @X_PRE_LIBS@
360Xcursor_cflags = @Xcursor_cflags@
361Xcursor_libs = @Xcursor_libs@
362abs_builddir = @abs_builddir@
363abs_srcdir = @abs_srcdir@
364abs_top_builddir = @abs_top_builddir@
365abs_top_srcdir = @abs_top_srcdir@
366ac_ct_CC = @ac_ct_CC@
367ac_ct_CXX = @ac_ct_CXX@
368ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
369ac_ct_OBJC = @ac_ct_OBJC@
370am__include = @am__include@
371am__leading_dot = @am__leading_dot@
372am__quote = @am__quote@
373am__tar = @am__tar@
374am__untar = @am__untar@
375bindir = @bindir@
376build = @build@
377build_alias = @build_alias@
378build_cpu = @build_cpu@
379build_os = @build_os@
380build_vendor = @build_vendor@
381builddir = @builddir@
382cocoa_ldflags = @cocoa_ldflags@
383datadir = @datadir@
384datarootdir = @datarootdir@
385dlopen_libs = @dlopen_libs@
386docdir = @docdir@
387dvidir = @dvidir@
388ecore_cocoa_cflags = @ecore_cocoa_cflags@
389ecore_cocoa_libs = @ecore_cocoa_libs@
390ecore_con_cflags = @ecore_con_cflags@
391ecore_con_libs = @ecore_con_libs@
392ecore_directfb_cflags = @ecore_directfb_cflags@
393ecore_directfb_libs = @ecore_directfb_libs@
394ecore_evas_cflags = @ecore_evas_cflags@
395ecore_evas_libs = @ecore_evas_libs@
396ecore_fb_cflags = @ecore_fb_cflags@
397ecore_fb_libs = @ecore_fb_libs@
398ecore_file_cflags = @ecore_file_cflags@
399ecore_file_libs = @ecore_file_libs@
400ecore_imf_cflags = @ecore_imf_cflags@
401ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
402ecore_imf_evas_libs = @ecore_imf_evas_libs@
403ecore_imf_libs = @ecore_imf_libs@
404ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
405ecore_imf_xim_libs = @ecore_imf_xim_libs@
406ecore_input_cflags = @ecore_input_cflags@
407ecore_input_evas_cflags = @ecore_input_evas_cflags@
408ecore_input_evas_libs = @ecore_input_evas_libs@
409ecore_input_libs = @ecore_input_libs@
410ecore_ipc_cflags = @ecore_ipc_cflags@
411ecore_ipc_libs = @ecore_ipc_libs@
412ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
413ecore_psl1ght_libs = @ecore_psl1ght_libs@
414ecore_sdl_cflags = @ecore_sdl_cflags@
415ecore_sdl_libs = @ecore_sdl_libs@
416ecore_win32_cflags = @ecore_win32_cflags@
417ecore_win32_libs = @ecore_win32_libs@
418ecore_wince_cflags = @ecore_wince_cflags@
419ecore_wince_libs = @ecore_wince_libs@
420ecore_x_cflags = @ecore_x_cflags@
421ecore_x_libs = @ecore_x_libs@
422ecore_x_libs_private = @ecore_x_libs_private@
423efl_doxygen = @efl_doxygen@
424efl_have_doxygen = @efl_have_doxygen@
425exec_prefix = @exec_prefix@
426have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
427host = @host@
428host_alias = @host_alias@
429host_cpu = @host_cpu@
430host_os = @host_os@
431host_vendor = @host_vendor@
432htmldir = @htmldir@
433includedir = @includedir@
434infodir = @infodir@
435install_sh = @install_sh@
436libdir = @libdir@
437libexecdir = @libexecdir@
438localedir = @localedir@
439localstatedir = @localstatedir@
440lt_ECHO = @lt_ECHO@
441lt_enable_auto_import = @lt_enable_auto_import@
442mandir = @mandir@
443mkdir_p = @mkdir_p@
444oldincludedir = @oldincludedir@
445pdfdir = @pdfdir@
446pkgconfig_requires_private = @pkgconfig_requires_private@
447prefix = @prefix@
448program_transform_name = @program_transform_name@
449psdir = @psdir@
450release_info = @release_info@
451requirements_ecore = @requirements_ecore@
452requirements_ecore_cocoa = @requirements_ecore_cocoa@
453requirements_ecore_con = @requirements_ecore_con@
454requirements_ecore_directfb = @requirements_ecore_directfb@
455requirements_ecore_evas = @requirements_ecore_evas@
456requirements_ecore_fb = @requirements_ecore_fb@
457requirements_ecore_file = @requirements_ecore_file@
458requirements_ecore_imf = @requirements_ecore_imf@
459requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
460requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
461requirements_ecore_input = @requirements_ecore_input@
462requirements_ecore_input_evas = @requirements_ecore_input_evas@
463requirements_ecore_ipc = @requirements_ecore_ipc@
464requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
465requirements_ecore_sdl = @requirements_ecore_sdl@
466requirements_ecore_win32 = @requirements_ecore_win32@
467requirements_ecore_wince = @requirements_ecore_wince@
468requirements_ecore_x = @requirements_ecore_x@
469rt_libs = @rt_libs@
470sbindir = @sbindir@
471sharedstatedir = @sharedstatedir@
472srcdir = @srcdir@
473sysconfdir = @sysconfdir@
474target_alias = @target_alias@
475top_build_prefix = @top_build_prefix@
476top_builddir = @top_builddir@
477top_srcdir = @top_srcdir@
478version_info = @version_info@
479x_cflags = @x_cflags@
480x_includes = @x_includes@
481x_libs = @x_libs@
482MAINTAINERCLEANFILES = Makefile.in
483AM_CPPFLAGS = @GLIB_CFLAGS@ @EVIL_CFLAGS@ @EINA_CFLAGS@ @WIN32_CPPFLAGS@ @EFL_ECORE_BUILD@
484AM_CFLAGS = @WIN32_CFLAGS@ @EFL_PTHREAD_CFLAGS@
485lib_LTLIBRARIES = libecore.la
486includes_HEADERS = \
487Ecore.h \
488Ecore_Getopt.h
489
490includesdir = $(includedir)/ecore-@VMAJ@
491libecore_la_SOURCES = ecore.c ecore_anim.c ecore_app.c ecore_events.c \
492 ecore_getopt.c ecore_idle_enterer.c ecore_idle_exiter.c \
493 ecore_idler.c ecore_job.c ecore_main.c ecore_pipe.c \
494 ecore_poll.c ecore_time.c ecore_timer.c ecore_thread.c \
495 ecore_glib.c ecore_throttle.c $(am__append_1) $(am__append_2) \
496 $(am__append_3) $(am__append_4)
497libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @GLIB_LIBS@ @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ @rt_libs@ -lm
498libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ @EFL_PTHREAD_LIBS@
499EXTRA_DIST = ecore_private.h
500all: all-am
501
502.SUFFIXES:
503.SUFFIXES: .c .lo .o .obj
504$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
505 @for dep in $?; do \
506 case '$(am__configure_deps)' in \
507 *$$dep*) \
508 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
509 && { if test -f $@; then exit 0; else break; fi; }; \
510 exit 1;; \
511 esac; \
512 done; \
513 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore/Makefile'; \
514 $(am__cd) $(top_srcdir) && \
515 $(AUTOMAKE) --gnu src/lib/ecore/Makefile
516.PRECIOUS: Makefile
517Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
518 @case '$?' in \
519 *config.status*) \
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
521 *) \
522 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
523 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
524 esac;
525
526$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
527 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
528
529$(top_srcdir)/configure: $(am__configure_deps)
530 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
531$(ACLOCAL_M4): $(am__aclocal_m4_deps)
532 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
533$(am__aclocal_m4_deps):
534install-libLTLIBRARIES: $(lib_LTLIBRARIES)
535 @$(NORMAL_INSTALL)
536 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
537 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
538 list2=; for p in $$list; do \
539 if test -f $$p; then \
540 list2="$$list2 $$p"; \
541 else :; fi; \
542 done; \
543 test -z "$$list2" || { \
544 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
545 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
546 }
547
548uninstall-libLTLIBRARIES:
549 @$(NORMAL_UNINSTALL)
550 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
551 for p in $$list; do \
552 $(am__strip_dir) \
553 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
554 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
555 done
556
557clean-libLTLIBRARIES:
558 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
559 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
560 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
561 test "$$dir" != "$$p" || dir=.; \
562 echo "rm -f \"$${dir}/so_locations\""; \
563 rm -f "$${dir}/so_locations"; \
564 done
565libecore.la: $(libecore_la_OBJECTS) $(libecore_la_DEPENDENCIES)
566 $(AM_V_CCLD)$(libecore_la_LINK) -rpath $(libdir) $(libecore_la_OBJECTS) $(libecore_la_LIBADD) $(LIBS)
567
568mostlyclean-compile:
569 -rm -f *.$(OBJEXT)
570
571distclean-compile:
572 -rm -f *.tab.c
573
574@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore.Plo@am__quote@
575@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_anim.Plo@am__quote@
576@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_app.Plo@am__quote@
577@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_events.Plo@am__quote@
578@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_exe.Plo@am__quote@
579@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_exe_ps3.Plo@am__quote@
580@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_exe_win32.Plo@am__quote@
581@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_exe_wince.Plo@am__quote@
582@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_getopt.Plo@am__quote@
583@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_glib.Plo@am__quote@
584@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_idle_enterer.Plo@am__quote@
585@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_idle_exiter.Plo@am__quote@
586@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_idler.Plo@am__quote@
587@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_job.Plo@am__quote@
588@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_main.Plo@am__quote@
589@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_pipe.Plo@am__quote@
590@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_poll.Plo@am__quote@
591@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_signal.Plo@am__quote@
592@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_thread.Plo@am__quote@
593@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_throttle.Plo@am__quote@
594@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_time.Plo@am__quote@
595@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_timer.Plo@am__quote@
596
597.c.o:
598@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
599@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
600@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
601@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
602@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
603@am__fastdepCC_FALSE@ $(COMPILE) -c $<
604
605.c.obj:
606@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
607@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
608@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
609@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
610@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
611@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
612
613.c.lo:
614@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
615@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
616@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
617@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
618@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
619@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
620
621mostlyclean-libtool:
622 -rm -f *.lo
623
624clean-libtool:
625 -rm -rf .libs _libs
626install-includesHEADERS: $(includes_HEADERS)
627 @$(NORMAL_INSTALL)
628 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
629 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
630 for p in $$list; do \
631 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
632 echo "$$d$$p"; \
633 done | $(am__base_list) | \
634 while read files; do \
635 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
636 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
637 done
638
639uninstall-includesHEADERS:
640 @$(NORMAL_UNINSTALL)
641 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
642 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
643 test -n "$$files" || exit 0; \
644 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
645 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
646
647ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
648 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
649 unique=`for i in $$list; do \
650 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
651 done | \
652 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
653 END { if (nonempty) { for (i in files) print i; }; }'`; \
654 mkid -fID $$unique
655tags: TAGS
656
657TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
658 $(TAGS_FILES) $(LISP)
659 set x; \
660 here=`pwd`; \
661 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
662 unique=`for i in $$list; do \
663 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
664 done | \
665 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
666 END { if (nonempty) { for (i in files) print i; }; }'`; \
667 shift; \
668 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
669 test -n "$$unique" || unique=$$empty_fix; \
670 if test $$# -gt 0; then \
671 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
672 "$$@" $$unique; \
673 else \
674 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
675 $$unique; \
676 fi; \
677 fi
678ctags: CTAGS
679CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
680 $(TAGS_FILES) $(LISP)
681 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
682 unique=`for i in $$list; do \
683 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
684 done | \
685 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
686 END { if (nonempty) { for (i in files) print i; }; }'`; \
687 test -z "$(CTAGS_ARGS)$$unique" \
688 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
689 $$unique
690
691GTAGS:
692 here=`$(am__cd) $(top_builddir) && pwd` \
693 && $(am__cd) $(top_srcdir) \
694 && gtags -i $(GTAGS_ARGS) "$$here"
695
696distclean-tags:
697 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
698
699distdir: $(DISTFILES)
700 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
701 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
702 list='$(DISTFILES)'; \
703 dist_files=`for file in $$list; do echo $$file; done | \
704 sed -e "s|^$$srcdirstrip/||;t" \
705 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
706 case $$dist_files in \
707 */*) $(MKDIR_P) `echo "$$dist_files" | \
708 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
709 sort -u` ;; \
710 esac; \
711 for file in $$dist_files; do \
712 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
713 if test -d $$d/$$file; then \
714 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
715 if test -d "$(distdir)/$$file"; then \
716 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
717 fi; \
718 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
719 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
720 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
721 fi; \
722 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
723 else \
724 test -f "$(distdir)/$$file" \
725 || cp -p $$d/$$file "$(distdir)/$$file" \
726 || exit 1; \
727 fi; \
728 done
729check-am: all-am
730check: check-am
731all-am: Makefile $(LTLIBRARIES) $(HEADERS)
732installdirs:
733 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
734 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
735 done
736install: install-am
737install-exec: install-exec-am
738install-data: install-data-am
739uninstall: uninstall-am
740
741install-am: all-am
742 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
743
744installcheck: installcheck-am
745install-strip:
746 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
747 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
748 `test -z '$(STRIP)' || \
749 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
750mostlyclean-generic:
751
752clean-generic:
753
754distclean-generic:
755 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
756 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
757
758maintainer-clean-generic:
759 @echo "This command is intended for maintainers to use"
760 @echo "it deletes files that may require special tools to rebuild."
761 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
762clean: clean-am
763
764clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
765 mostlyclean-am
766
767distclean: distclean-am
768 -rm -rf ./$(DEPDIR)
769 -rm -f Makefile
770distclean-am: clean-am distclean-compile distclean-generic \
771 distclean-tags
772
773dvi: dvi-am
774
775dvi-am:
776
777html: html-am
778
779html-am:
780
781info: info-am
782
783info-am:
784
785install-data-am: install-includesHEADERS
786
787install-dvi: install-dvi-am
788
789install-dvi-am:
790
791install-exec-am: install-libLTLIBRARIES
792
793install-html: install-html-am
794
795install-html-am:
796
797install-info: install-info-am
798
799install-info-am:
800
801install-man:
802
803install-pdf: install-pdf-am
804
805install-pdf-am:
806
807install-ps: install-ps-am
808
809install-ps-am:
810
811installcheck-am:
812
813maintainer-clean: maintainer-clean-am
814 -rm -rf ./$(DEPDIR)
815 -rm -f Makefile
816maintainer-clean-am: distclean-am maintainer-clean-generic
817
818mostlyclean: mostlyclean-am
819
820mostlyclean-am: mostlyclean-compile mostlyclean-generic \
821 mostlyclean-libtool
822
823pdf: pdf-am
824
825pdf-am:
826
827ps: ps-am
828
829ps-am:
830
831uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
832
833.MAKE: install-am install-strip
834
835.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
836 clean-libLTLIBRARIES clean-libtool ctags distclean \
837 distclean-compile distclean-generic distclean-libtool \
838 distclean-tags distdir dvi dvi-am html html-am info info-am \
839 install install-am install-data install-data-am install-dvi \
840 install-dvi-am install-exec install-exec-am install-html \
841 install-html-am install-includesHEADERS install-info \
842 install-info-am install-libLTLIBRARIES install-man install-pdf \
843 install-pdf-am install-ps install-ps-am install-strip \
844 installcheck installcheck-am installdirs maintainer-clean \
845 maintainer-clean-generic mostlyclean mostlyclean-compile \
846 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
847 tags uninstall uninstall-am uninstall-includesHEADERS \
848 uninstall-libLTLIBRARIES
849
850
851# Tell versions [3.59,3.63) of GNU make to not export all variables.
852# Otherwise a system limit (for SysV at least) may be exceeded.
853.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore/ecore.c b/libraries/ecore/src/lib/ecore/ecore.c
new file mode 100644
index 0000000..99d79c1
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore.c
@@ -0,0 +1,731 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <sys/types.h>
7#include <sys/stat.h>
8#include <fcntl.h>
9#include <errno.h>
10
11#ifndef _MSC_VER
12# include <unistd.h>
13#endif
14
15#ifdef HAVE_LOCALE_H
16# include <locale.h>
17#endif
18
19#ifdef HAVE_LANGINFO_H
20# include <langinfo.h>
21#endif
22
23#ifdef HAVE_SYS_MMAN_H
24# include <sys/mman.h>
25#endif
26
27#ifdef HAVE_EVIL
28# include <Evil.h>
29#endif
30#include <Eina.h>
31
32#include "Ecore.h"
33#include "ecore_private.h"
34
35#if HAVE_MALLINFO
36#include <malloc.h>
37
38static Ecore_Version _version = { VERS_MAJ, VERS_MIN, VERS_MIC, VERS_REV };
39EAPI Ecore_Version *ecore_version = &_version;
40
41#define KEEP_MAX(Global, Local) \
42 if (Global < (Local)) \
43 Global = Local;
44
45static Eina_Bool _ecore_memory_statistic(void *data);
46static int _ecore_memory_max_total = 0;
47static int _ecore_memory_max_free = 0;
48static pid_t _ecore_memory_pid = 0;
49#endif
50
51static const char *_ecore_magic_string_get(Ecore_Magic m);
52static int _ecore_init_count = 0;
53int _ecore_log_dom = -1;
54int _ecore_fps_debug = 0;
55
56typedef struct _Ecore_Safe_Call Ecore_Safe_Call;
57struct _Ecore_Safe_Call
58{
59 union {
60 Ecore_Cb async;
61 Ecore_Data_Cb sync;
62 } cb;
63 void *data;
64
65 Eina_Lock m;
66 Eina_Condition c;
67
68 int current_id;
69
70 Eina_Bool sync : 1;
71 Eina_Bool suspend : 1;
72};
73
74static void _ecore_main_loop_thread_safe_call(Ecore_Safe_Call *order);
75static void _thread_safe_cleanup(void *data);
76static void _thread_callback(void *data,
77 void *buffer,
78 unsigned int nbyte);
79static Eina_List *_thread_cb = NULL;
80static Ecore_Pipe *_thread_call = NULL;
81static Eina_Lock _thread_safety;
82
83static int _thread_loop = 0;
84static Eina_Lock _thread_mutex;
85static Eina_Condition _thread_cond;
86static Eina_Lock _thread_feedback_mutex;
87static Eina_Condition _thread_feedback_cond;
88
89static Eina_Lock _thread_id_lock;
90static int _thread_id = -1;
91static int _thread_id_max = 0;
92static int _thread_id_update = 0;
93
94Eina_Lock _ecore_main_loop_lock;
95int _ecore_main_lock_count;
96
97/** OpenBSD does not define CODESET
98 * FIXME ??
99 */
100
101#ifndef CODESET
102# define CODESET "INVALID"
103#endif
104
105/**
106 * @addtogroup Ecore_Init_Group
107 *
108 * @{
109 */
110
111/**
112 * Set up connections, signal handlers, sockets etc.
113 * @return 1 or greater on success, 0 otherwise
114 *
115 * This function sets up all singal handlers and the basic event loop. If it
116 * succeeds, 1 will be returned, otherwise 0 will be returned.
117 *
118 * @code
119 * #include <Ecore.h>
120 *
121 * int main(int argc, char **argv)
122 * {
123 * if (!ecore_init())
124 * {
125 * printf("ERROR: Cannot init Ecore!\n");
126 * return -1;
127 * }
128 * ecore_main_loop_begin();
129 * ecore_shutdown();
130 * }
131 * @endcode
132 */
133EAPI int
134ecore_init(void)
135{
136 if (++_ecore_init_count != 1)
137 return _ecore_init_count;
138
139#ifdef HAVE_LOCALE_H
140 setlocale(LC_CTYPE, "");
141#endif
142 /*
143 if (strcmp(nl_langinfo(CODESET), "UTF-8"))
144 {
145 WRN("Not a utf8 locale!");
146 }
147 */
148#ifdef HAVE_EVIL
149 if (!evil_init())
150 return --_ecore_init_count;
151#endif
152 if (!eina_init())
153 goto shutdown_evil;
154 _ecore_log_dom = eina_log_domain_register("ecore", ECORE_DEFAULT_LOG_COLOR);
155 if (_ecore_log_dom < 0)
156 {
157 EINA_LOG_ERR("Ecore was unable to create a log domain.");
158 goto shutdown_log_dom;
159 }
160 if (getenv("ECORE_FPS_DEBUG")) _ecore_fps_debug = 1;
161 if (_ecore_fps_debug) _ecore_fps_debug_init();
162 _ecore_main_loop_init();
163 _ecore_signal_init();
164 _ecore_thread_init();
165 _ecore_exe_init();
166 _ecore_glib_init();
167 _ecore_job_init();
168 _ecore_time_init();
169
170 eina_lock_new(&_thread_safety);
171 eina_lock_new(&_thread_mutex);
172 eina_condition_new(&_thread_cond, &_thread_mutex);
173 eina_lock_new(&_thread_feedback_mutex);
174 eina_condition_new(&_thread_feedback_cond, &_thread_feedback_mutex);
175 _thread_call = ecore_pipe_add(_thread_callback, NULL);
176 eina_lock_new(&_thread_id_lock);
177
178 eina_lock_new(&_ecore_main_loop_lock);
179
180#if HAVE_MALLINFO
181 if (getenv("ECORE_MEM_STAT"))
182 {
183 _ecore_memory_pid = getpid();
184 ecore_animator_add(_ecore_memory_statistic, NULL);
185 }
186#endif
187
188#if defined(GLIB_INTEGRATION_ALWAYS)
189 if (_ecore_glib_always_integrate) ecore_main_loop_glib_integrate();
190#endif
191
192 return _ecore_init_count;
193
194shutdown_log_dom:
195 eina_shutdown();
196shutdown_evil:
197#ifdef HAVE_EVIL
198 evil_shutdown();
199#endif
200 return --_ecore_init_count;
201}
202
203/**
204 * Shut down connections, signal handlers sockets etc.
205 *
206 * This function shuts down all things set up in ecore_init() and cleans up all
207 * event queues, handlers, filters, timers, idlers, idle enterers/exiters
208 * etc. set up after ecore_init() was called.
209 *
210 * Do not call this function from any callback that may be called from the main
211 * loop, as the main loop will then fall over and not function properly.
212 */
213EAPI int
214ecore_shutdown(void)
215{
216 /*
217 * take a lock here because _ecore_event_shutdown() does callbacks
218 */
219 _ecore_lock();
220 if (--_ecore_init_count != 0)
221 goto unlock;
222
223 ecore_pipe_del(_thread_call);
224 eina_lock_free(&_thread_safety);
225 eina_condition_free(&_thread_cond);
226 eina_lock_free(&_thread_mutex);
227 eina_condition_free(&_thread_feedback_cond);
228 eina_lock_free(&_thread_feedback_mutex);
229 eina_lock_free(&_thread_id_lock);
230
231 if (_ecore_fps_debug) _ecore_fps_debug_shutdown();
232 _ecore_poller_shutdown();
233 _ecore_animator_shutdown();
234 _ecore_glib_shutdown();
235 _ecore_job_shutdown();
236 _ecore_thread_shutdown();
237 _ecore_exe_shutdown();
238 _ecore_idle_enterer_shutdown();
239 _ecore_idle_exiter_shutdown();
240 _ecore_idler_shutdown();
241 _ecore_timer_shutdown();
242 _ecore_event_shutdown();
243 _ecore_main_shutdown();
244 _ecore_signal_shutdown();
245 _ecore_main_loop_shutdown();
246
247#if HAVE_MALLINFO
248 if (getenv("ECORE_MEM_STAT"))
249 {
250 _ecore_memory_statistic(NULL);
251
252 ERR("[%i] Memory MAX total: %i, free: %i",
253 _ecore_memory_pid,
254 _ecore_memory_max_total,
255 _ecore_memory_max_free);
256 }
257#endif
258
259 eina_log_domain_unregister(_ecore_log_dom);
260 _ecore_log_dom = -1;
261 eina_shutdown();
262#ifdef HAVE_EVIL
263 evil_shutdown();
264#endif
265unlock:
266 _ecore_unlock();
267
268 return _ecore_init_count;
269}
270
271/**
272 * @}
273 */
274
275static int wakeup = 42;
276
277EAPI void
278ecore_main_loop_thread_safe_call_async(Ecore_Cb callback,
279 void *data)
280{
281 Ecore_Safe_Call *order;
282
283 if (!callback) return;
284
285 if (eina_main_loop_is())
286 {
287 callback(data);
288 return;
289 }
290
291 order = malloc(sizeof (Ecore_Safe_Call));
292 if (!order) return;
293
294 order->cb.async = callback;
295 order->data = data;
296 order->sync = EINA_FALSE;
297 order->suspend = EINA_FALSE;
298
299 _ecore_main_loop_thread_safe_call(order);
300}
301
302EAPI void *
303ecore_main_loop_thread_safe_call_sync(Ecore_Data_Cb callback,
304 void *data)
305{
306 Ecore_Safe_Call *order;
307 void *ret;
308
309 if (!callback) return NULL;
310
311 if (eina_main_loop_is())
312 {
313 return callback(data);
314 }
315
316 order = malloc(sizeof (Ecore_Safe_Call));
317 if (!order) return NULL;
318
319 order->cb.sync = callback;
320 order->data = data;
321 eina_lock_new(&order->m);
322 eina_condition_new(&order->c, &order->m);
323 order->sync = EINA_TRUE;
324 order->suspend = EINA_FALSE;
325
326 _ecore_main_loop_thread_safe_call(order);
327
328 eina_lock_take(&order->m);
329 eina_condition_wait(&order->c);
330 eina_lock_release(&order->m);
331
332 ret = order->data;
333
334 order->sync = EINA_FALSE;
335 order->cb.async = _thread_safe_cleanup;
336 order->data = order;
337
338 _ecore_main_loop_thread_safe_call(order);
339
340 return ret;
341}
342
343EAPI int
344ecore_thread_main_loop_begin(void)
345{
346 Ecore_Safe_Call *order;
347
348 if (eina_main_loop_is())
349 {
350 return ++_thread_loop;
351 }
352
353 order = malloc(sizeof (Ecore_Safe_Call));
354 if (!order) return -1;
355
356 eina_lock_take(&_thread_id_lock);
357 order->current_id = ++_thread_id_max;
358 if (order->current_id < 0)
359 {
360 _thread_id_max = 0;
361 order->current_id = ++_thread_id_max;
362 }
363 eina_lock_release(&_thread_id_lock);
364
365 eina_lock_new(&order->m);
366 eina_condition_new(&order->c, &order->m);
367 order->suspend = EINA_TRUE;
368
369 _ecore_main_loop_thread_safe_call(order);
370
371 eina_lock_take(&order->m);
372 while (order->current_id != _thread_id)
373 eina_condition_wait(&order->c);
374 eina_lock_release(&order->m);
375
376 eina_main_loop_define();
377
378 _thread_loop = 1;
379
380 return EINA_TRUE;
381}
382
383EAPI int
384ecore_thread_main_loop_end(void)
385{
386 int current_id;
387
388 if (_thread_loop == 0)
389 {
390 ERR("the main loop is not locked ! No matching call to ecore_thread_main_loop_begin().");
391 return -1;
392 }
393
394 /* until we unlock the main loop, this thread has the main loop id */
395 if (!eina_main_loop_is())
396 {
397 ERR("Not in a locked thread !");
398 return -1;
399 }
400
401 _thread_loop--;
402 if (_thread_loop > 0)
403 return _thread_loop;
404
405 current_id = _thread_id;
406
407 eina_lock_take(&_thread_mutex);
408 _thread_id_update = _thread_id;
409 eina_condition_broadcast(&_thread_cond);
410 eina_lock_release(&_thread_mutex);
411
412 eina_lock_take(&_thread_feedback_mutex);
413 while (current_id == _thread_id && _thread_id != -1)
414 eina_condition_wait(&_thread_feedback_cond);
415 eina_lock_release(&_thread_feedback_mutex);
416
417 return 0;
418}
419
420EAPI void
421ecore_print_warning(const char *function,
422 const char *sparam)
423{
424 WRN("***** Developer Warning ***** :\n"
425 "\tThis program is calling:\n\n"
426 "\t%s();\n\n"
427 "\tWith the parameter:\n\n"
428 "\t%s\n\n"
429 "\tbeing NULL. Please fix your program.", function, sparam);
430 if (getenv("ECORE_ERROR_ABORT")) abort();
431}
432
433EAPI void
434_ecore_magic_fail(const void *d,
435 Ecore_Magic m,
436 Ecore_Magic req_m,
437 const char *fname)
438{
439 ERR("\n"
440 "*** ECORE ERROR: Ecore Magic Check Failed!!!\n"
441 "*** IN FUNCTION: %s()", fname);
442 if (!d)
443 ERR(" Input handle pointer is NULL!");
444 else if (m == ECORE_MAGIC_NONE)
445 ERR(" Input handle has already been freed!");
446 else if (m != req_m)
447 ERR(" Input handle is wrong type\n"
448 " Expected: %08x - %s\n"
449 " Supplied: %08x - %s",
450 (unsigned int)req_m, _ecore_magic_string_get(req_m),
451 (unsigned int)m, _ecore_magic_string_get(m));
452 ERR("*** NAUGHTY PROGRAMMER!!!\n"
453 "*** SPANK SPANK SPANK!!!\n"
454 "*** Now go fix your code. Tut tut tut!");
455 if (getenv("ECORE_ERROR_ABORT")) abort();
456}
457
458static const char *
459_ecore_magic_string_get(Ecore_Magic m)
460{
461 switch (m)
462 {
463 case ECORE_MAGIC_NONE:
464 return "None (Freed Object)";
465 break;
466
467 case ECORE_MAGIC_EXE:
468 return "Ecore_Exe (Executable)";
469 break;
470
471 case ECORE_MAGIC_TIMER:
472 return "Ecore_Timer (Timer)";
473 break;
474
475 case ECORE_MAGIC_IDLER:
476 return "Ecore_Idler (Idler)";
477 break;
478
479 case ECORE_MAGIC_IDLE_ENTERER:
480 return "Ecore_Idle_Enterer (Idler Enterer)";
481 break;
482
483 case ECORE_MAGIC_IDLE_EXITER:
484 return "Ecore_Idle_Exiter (Idler Exiter)";
485 break;
486
487 case ECORE_MAGIC_FD_HANDLER:
488 return "Ecore_Fd_Handler (Fd Handler)";
489 break;
490
491 case ECORE_MAGIC_WIN32_HANDLER:
492 return "Ecore_Win32_Handler (Win32 Handler)";
493 break;
494
495 case ECORE_MAGIC_EVENT_HANDLER:
496 return "Ecore_Event_Handler (Event Handler)";
497 break;
498
499 case ECORE_MAGIC_EVENT:
500 return "Ecore_Event (Event)";
501 break;
502
503 default:
504 return "<UNKNOWN>";
505 }
506}
507
508/* fps debug calls - for debugging how much time your app actually spends */
509/* "running" (and the inverse being time spent running)... this does not */
510/* account for other apps and multitasking... */
511
512static int _ecore_fps_debug_init_count = 0;
513static int _ecore_fps_debug_fd = -1;
514unsigned int *_ecore_fps_runtime_mmap = NULL;
515
516void
517_ecore_fps_debug_init(void)
518{
519 char buf[PATH_MAX];
520 const char *tmp;
521 int pid;
522
523 _ecore_fps_debug_init_count++;
524 if (_ecore_fps_debug_init_count > 1) return;
525
526#ifndef HAVE_EVIL
527 tmp = "/tmp";
528#else
529 tmp = evil_tmpdir_get ();
530#endif /* HAVE_EVIL */
531 pid = (int)getpid();
532 snprintf(buf, sizeof(buf), "%s/.ecore_fps_debug-%i", tmp, pid);
533 _ecore_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
534 if (_ecore_fps_debug_fd < 0)
535 {
536 unlink(buf);
537 _ecore_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
538 }
539 if (_ecore_fps_debug_fd >= 0)
540 {
541 unsigned int zero = 0;
542 char *buf2 = (char *)&zero;
543 ssize_t todo = sizeof(unsigned int);
544
545 while (todo > 0)
546 {
547 ssize_t r = write(_ecore_fps_debug_fd, buf2, todo);
548 if (r > 0)
549 {
550 todo -= r;
551 buf2 += r;
552 }
553 else if ((r < 0) && (errno == EINTR))
554 continue;
555 else
556 {
557 ERR("could not write to file '%s' fd %d: %s",
558 tmp, _ecore_fps_debug_fd, strerror(errno));
559 close(_ecore_fps_debug_fd);
560 _ecore_fps_debug_fd = -1;
561 return;
562 }
563 }
564 _ecore_fps_runtime_mmap = mmap(NULL, sizeof(unsigned int),
565 PROT_READ | PROT_WRITE,
566 MAP_SHARED,
567 _ecore_fps_debug_fd, 0);
568 if (_ecore_fps_runtime_mmap == MAP_FAILED)
569 _ecore_fps_runtime_mmap = NULL;
570 }
571}
572
573void
574_ecore_fps_debug_shutdown(void)
575{
576 _ecore_fps_debug_init_count--;
577 if (_ecore_fps_debug_init_count > 0) return;
578 if (_ecore_fps_debug_fd >= 0)
579 {
580 char buf[4096];
581 const char *tmp;
582 int pid;
583
584#ifndef HAVE_EVIL
585 tmp = "/tmp";
586#else
587 tmp = (char *)evil_tmpdir_get ();
588#endif /* HAVE_EVIL */
589 pid = (int)getpid();
590 snprintf(buf, sizeof(buf), "%s/.ecore_fps_debug-%i", tmp, pid);
591 unlink(buf);
592 if (_ecore_fps_runtime_mmap)
593 {
594 munmap(_ecore_fps_runtime_mmap, sizeof(int));
595 _ecore_fps_runtime_mmap = NULL;
596 }
597 close(_ecore_fps_debug_fd);
598 _ecore_fps_debug_fd = -1;
599 }
600}
601
602void
603_ecore_fps_debug_runtime_add(double t)
604{
605 if ((_ecore_fps_debug_fd >= 0) &&
606 (_ecore_fps_runtime_mmap))
607 {
608 unsigned int tm;
609
610 tm = (unsigned int)(t * 1000000.0);
611 /* i know its not 100% theoretically guaranteed, but i'd say a write */
612 /* of an int could be considered atomic for all practical purposes */
613 /* oh and since this is cumulative, 1 second = 1,000,000 ticks, so */
614 /* this can run for about 4294 seconds becore looping. if you are */
615 /* doing performance testing in one run for over an hour... well */
616 /* time to restart or handle a loop condition :) */
617 *(_ecore_fps_runtime_mmap) += tm;
618 }
619}
620
621#if HAVE_MALLINFO
622static Eina_Bool
623_ecore_memory_statistic(__UNUSED__ void *data)
624{
625 struct mallinfo mi;
626 static int uordblks = 0;
627 static int fordblks = 0;
628 Eina_Bool changed = EINA_FALSE;
629
630 mi = mallinfo();
631
632#define HAS_CHANGED(Global, Local) \
633 if (Global != Local) \
634 { \
635 Global = Local; \
636 changed = EINA_TRUE; \
637 }
638
639 HAS_CHANGED(uordblks, mi.uordblks);
640 HAS_CHANGED(fordblks, mi.fordblks);
641
642 if (changed)
643 ERR("[%i] Memory total: %i, free: %i",
644 _ecore_memory_pid,
645 mi.uordblks,
646 mi.fordblks);
647
648 KEEP_MAX(_ecore_memory_max_total, mi.uordblks);
649 KEEP_MAX(_ecore_memory_max_free, mi.fordblks);
650
651 return ECORE_CALLBACK_RENEW;
652}
653
654#endif
655
656static void
657_ecore_main_loop_thread_safe_call(Ecore_Safe_Call *order)
658{
659 Eina_Bool count;
660
661 eina_lock_take(&_thread_safety);
662
663 count = _thread_cb ? 0 : 1;
664 _thread_cb = eina_list_append(_thread_cb, order);
665 if (count) ecore_pipe_write(_thread_call, &wakeup, sizeof (int));
666
667 eina_lock_release(&_thread_safety);
668}
669
670static void
671_thread_safe_cleanup(void *data)
672{
673 Ecore_Safe_Call *call = data;
674
675 eina_condition_free(&call->c);
676 eina_lock_free(&call->m);
677}
678
679static void
680_thread_callback(void *data __UNUSED__,
681 void *buffer __UNUSED__,
682 unsigned int nbyte __UNUSED__)
683{
684 Ecore_Safe_Call *call;
685 Eina_List *callback;
686
687 eina_lock_take(&_thread_safety);
688 callback = _thread_cb;
689 _thread_cb = NULL;
690 eina_lock_release(&_thread_safety);
691
692 EINA_LIST_FREE(callback, call)
693 {
694 if (call->suspend)
695 {
696 eina_lock_take(&_thread_mutex);
697
698 eina_lock_take(&call->m);
699 _thread_id = call->current_id;
700 eina_condition_broadcast(&call->c);
701 eina_lock_release(&call->m);
702
703 while (_thread_id_update != _thread_id)
704 eina_condition_wait(&_thread_cond);
705 eina_lock_release(&_thread_mutex);
706
707 eina_main_loop_define();
708
709 eina_lock_take(&_thread_feedback_mutex);
710
711 _thread_id = -1;
712
713 eina_condition_broadcast(&_thread_feedback_cond);
714 eina_lock_release(&_thread_feedback_mutex);
715
716 _thread_safe_cleanup(call);
717 free(call);
718 }
719 else if (call->sync)
720 {
721 call->data = call->cb.sync(call->data);
722 eina_condition_broadcast(&call->c);
723 }
724 else
725 {
726 call->cb.async(call->data);
727 free(call);
728 }
729 }
730}
731
diff --git a/libraries/ecore/src/lib/ecore/ecore_anim.c b/libraries/ecore/src/lib/ecore/ecore_anim.c
new file mode 100644
index 0000000..9adaa77
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_anim.c
@@ -0,0 +1,479 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <math.h>
7
8#include "Ecore.h"
9#include "ecore_private.h"
10
11struct _Ecore_Animator
12{
13 EINA_INLIST;
14 ECORE_MAGIC;
15
16 Ecore_Task_Cb func;
17 void *data;
18
19 double start, run;
20 Ecore_Timeline_Cb run_func;
21 void *run_data;
22
23 Eina_Bool delete_me : 1;
24 Eina_Bool suspended : 1;
25};
26
27static Eina_Bool _ecore_animator_run(void *data);
28static Eina_Bool _ecore_animator(void *data);
29
30static int animators_delete_me = 0;
31static Ecore_Animator *animators = NULL;
32static double animators_frametime = 1.0 / 30.0;
33
34static Ecore_Animator_Source src = ECORE_ANIMATOR_SOURCE_TIMER;
35static Ecore_Timer *timer = NULL;
36static int ticking = 0;
37static Ecore_Cb begin_tick_cb = NULL;
38static const void *begin_tick_data = NULL;
39static Ecore_Cb end_tick_cb = NULL;
40static const void *end_tick_data = NULL;
41
42static void
43_begin_tick(void)
44{
45 if (ticking) return;
46 ticking = 1;
47 switch (src)
48 {
49 case ECORE_ANIMATOR_SOURCE_TIMER:
50 if (!timer)
51 {
52 double t_loop = ecore_loop_time_get();
53 double sync_0 = 0.0;
54 double d = -fmod(t_loop - sync_0, animators_frametime);
55
56 timer = _ecore_timer_loop_add(animators_frametime,
57 _ecore_animator, NULL);
58 _ecore_timer_delay(timer, d);
59 }
60 break;
61
62 case ECORE_ANIMATOR_SOURCE_CUSTOM:
63 if (begin_tick_cb) begin_tick_cb((void *)begin_tick_data);
64 break;
65
66 default:
67 break;
68 }
69}
70
71static void
72_end_tick(void)
73{
74 if (!ticking) return;
75 ticking = 0;
76 switch (src)
77 {
78 case ECORE_ANIMATOR_SOURCE_TIMER:
79 if (timer)
80 {
81 _ecore_timer_del(timer);
82 timer = NULL;
83 }
84 break;
85
86 case ECORE_ANIMATOR_SOURCE_CUSTOM:
87 if (end_tick_cb) end_tick_cb((void *)end_tick_data);
88 break;
89
90 default:
91 break;
92 }
93}
94
95static Eina_Bool
96_do_tick(void)
97{
98 Ecore_Animator *animator;
99
100 EINA_INLIST_FOREACH(animators, animator)
101 {
102 if (!animator->delete_me && !animator->suspended)
103 {
104 if (!_ecore_call_task_cb(animator->func, animator->data))
105 {
106 animator->delete_me = EINA_TRUE;
107 animators_delete_me++;
108 }
109 }
110 }
111 if (animators_delete_me)
112 {
113 Ecore_Animator *l;
114 for (l = animators; l; )
115 {
116 animator = l;
117 l = (Ecore_Animator *)EINA_INLIST_GET(l)->next;
118 if (animator->delete_me)
119 {
120 animators = (Ecore_Animator *)
121 eina_inlist_remove(EINA_INLIST_GET(animators),
122 EINA_INLIST_GET(animator));
123 ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE);
124 free(animator);
125 animators_delete_me--;
126 if (animators_delete_me == 0) break;
127 }
128 }
129 }
130 if (!animators)
131 {
132 _end_tick();
133 return ECORE_CALLBACK_CANCEL;
134 }
135 return ECORE_CALLBACK_RENEW;
136}
137
138static Ecore_Animator *
139_ecore_animator_add(Ecore_Task_Cb func,
140 const void *data)
141{
142 Ecore_Animator *animator = NULL;
143
144 if (!func) return animator;
145 animator = calloc(1, sizeof(Ecore_Animator));
146 if (!animator) return animator;
147 ECORE_MAGIC_SET(animator, ECORE_MAGIC_ANIMATOR);
148 animator->func = func;
149 animator->data = (void *)data;
150 animators = (Ecore_Animator *)eina_inlist_append(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator));
151 _begin_tick();
152 return animator;
153}
154
155EAPI Ecore_Animator *
156ecore_animator_add(Ecore_Task_Cb func,
157 const void *data)
158{
159 Ecore_Animator *animator;
160
161 _ecore_lock();
162 animator = _ecore_animator_add(func, data);
163 _ecore_unlock();
164
165 return animator;
166}
167
168EAPI Ecore_Animator *
169ecore_animator_timeline_add(double runtime,
170 Ecore_Timeline_Cb func,
171 const void *data)
172{
173 Ecore_Animator *animator;
174
175 _ecore_lock();
176 if (runtime <= 0.0) runtime = 0.0;
177 animator = _ecore_animator_add(_ecore_animator_run, NULL);
178 animator->data = animator;
179 animator->run_func = func;
180 animator->run_data = (void *)data;
181 animator->start = ecore_loop_time_get();
182 animator->run = runtime;
183 _ecore_unlock();
184 return animator;
185}
186
187static double
188_pos_map_sin(double in)
189{
190 return eina_f32p32_double_to(eina_f32p32_sin(eina_f32p32_double_from(in)));
191}
192
193static double
194_pos_map_cos(double in)
195{
196 return eina_f32p32_double_to(eina_f32p32_cos(eina_f32p32_double_from(in)));
197}
198
199static double
200_pos_map_accel_factor(double pos,
201 double v1)
202{
203 int i, fact = (int)v1;
204 double p, o1 = pos, o2 = pos, v;
205 p = 1.0 - _pos_map_sin((M_PI / 2.0) + ((pos * M_PI) / 2.0));
206 o2 = p;
207 for (i = 0; i < fact; i++)
208 {
209 o1 = o2;
210 o2 = o2 * p;
211 }
212 v = v1 - (double)fact;
213 pos = (v * o2) + ((1.0 - v) * o1);
214 return pos;
215}
216
217static double
218_pos_map_pow(double pos,
219 double divis,
220 int p)
221{
222 double v = 1.0;
223 int i;
224 for (i = 0; i < p; i++) v *= pos;
225 return ((pos * divis) * (1.0 - v)) + (pos * v);
226}
227
228static double
229_pos_map_spring(double pos,
230 int bounces,
231 double decfac)
232{
233 int segnum, segpos, b1, b2;
234 double len, decay, decpos, p2;
235 if (bounces < 0) bounces = 0;
236 p2 = _pos_map_pow(pos, 0.5, 3);
237 len = (M_PI / 2.0) + ((double)bounces * M_PI);
238 segnum = (bounces * 2) + 1;
239 segpos = 2 * (((int)(p2 * segnum) + 1) / 2);
240 b1 = segpos;
241 b2 = segnum + 1;
242 if (b1 < 0) b1 = 0;
243 decpos = (double)b1 / (double)b2;
244 decay = _pos_map_accel_factor(1.0 - decpos, decfac);
245 return _pos_map_sin((M_PI / 2.0) + (p2 * len)) * decay;
246}
247
248EAPI double
249ecore_animator_pos_map(double pos,
250 Ecore_Pos_Map map,
251 double v1,
252 double v2)
253{
254 /* purely functional - locking not required */
255 if (pos > 1.0) pos = 1.0;
256 else if (pos < 0.0)
257 pos = 0.0;
258 switch (map)
259 {
260 case ECORE_POS_MAP_LINEAR:
261 return pos;
262
263 case ECORE_POS_MAP_ACCELERATE:
264 pos = 1.0 - _pos_map_sin((M_PI / 2.0) + ((pos * M_PI) / 2.0));
265 return pos;
266
267 case ECORE_POS_MAP_DECELERATE:
268 pos = _pos_map_sin((pos * M_PI) / 2.0);
269 return pos;
270
271 case ECORE_POS_MAP_SINUSOIDAL:
272 pos = (1.0 - _pos_map_cos(pos * M_PI)) / 2.0;
273 return pos;
274
275 case ECORE_POS_MAP_ACCELERATE_FACTOR:
276 pos = _pos_map_accel_factor(pos, v1);
277 return pos;
278
279 case ECORE_POS_MAP_DECELERATE_FACTOR:
280 pos = 1.0 - _pos_map_accel_factor(1.0 - pos, v1);
281 return pos;
282
283 case ECORE_POS_MAP_SINUSOIDAL_FACTOR:
284 if (pos < 0.5) pos = _pos_map_accel_factor(pos * 2.0, v1) / 2.0;
285 else pos = 1.0 - (_pos_map_accel_factor((1.0 - pos) * 2.0, v1) / 2.0);
286 return pos;
287
288 case ECORE_POS_MAP_DIVISOR_INTERP:
289 pos = _pos_map_pow(pos, v1, (int)v2);
290 return pos;
291
292 case ECORE_POS_MAP_BOUNCE:
293 pos = _pos_map_spring(pos, (int)v2, v1);
294 if (pos < 0.0) pos = -pos;
295 pos = 1.0 - pos;
296 return pos;
297
298 case ECORE_POS_MAP_SPRING:
299 pos = 1.0 - _pos_map_spring(pos, (int)v2, v1);
300 return pos;
301
302 default:
303 return pos;
304 }
305 return pos;
306}
307
308EAPI void *
309ecore_animator_del(Ecore_Animator *animator)
310{
311 void *data = NULL;
312
313 _ecore_lock();
314 if (!ECORE_MAGIC_CHECK(animator, ECORE_MAGIC_ANIMATOR))
315 {
316 ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
317 "ecore_animator_del");
318 goto unlock;
319 }
320 if (animator->delete_me)
321 {
322 data = animator->data;
323 goto unlock;
324 }
325 animator->delete_me = EINA_TRUE;
326 animators_delete_me++;
327 if (animator->run_func)
328 data = animator->run_data;
329 else
330 data = animator->data;
331unlock:
332 _ecore_unlock();
333 return data;
334}
335
336EAPI void
337ecore_animator_frametime_set(double frametime)
338{
339 _ecore_lock();
340 if (frametime < 0.0) frametime = 0.0;
341 if (animators_frametime == frametime) goto unlock;
342 animators_frametime = frametime;
343 _end_tick();
344 if (animators) _begin_tick();
345unlock:
346 _ecore_unlock();
347}
348
349EAPI double
350ecore_animator_frametime_get(void)
351{
352 return animators_frametime;
353}
354
355EAPI void
356ecore_animator_freeze(Ecore_Animator *animator)
357{
358 _ecore_lock();
359 if (!ECORE_MAGIC_CHECK(animator, ECORE_MAGIC_ANIMATOR))
360 {
361 ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
362 "ecore_animator_del");
363 goto unlock;
364 }
365 if (animator->delete_me) goto unlock;
366 animator->suspended = EINA_TRUE;
367unlock:
368 _ecore_unlock();
369}
370
371EAPI void
372ecore_animator_thaw(Ecore_Animator *animator)
373{
374 _ecore_lock();
375 if (!ECORE_MAGIC_CHECK(animator, ECORE_MAGIC_ANIMATOR))
376 {
377 ECORE_MAGIC_FAIL(animator, ECORE_MAGIC_ANIMATOR,
378 "ecore_animator_del");
379 goto unlock;
380 }
381 if (animator->delete_me) goto unlock;
382 animator->suspended = EINA_FALSE;
383unlock:
384 _ecore_unlock();
385}
386
387EAPI void
388ecore_animator_source_set(Ecore_Animator_Source source)
389{
390 _ecore_lock();
391 src = source;
392 _end_tick();
393 if (animators) _begin_tick();
394 _ecore_unlock();
395}
396
397EAPI Ecore_Animator_Source
398ecore_animator_source_get(void)
399{
400 return src;
401}
402
403EAPI void
404ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func,
405 const void *data)
406{
407 _ecore_lock();
408 begin_tick_cb = func;
409 begin_tick_data = data;
410 _end_tick();
411 if (animators) _begin_tick();
412 _ecore_unlock();
413}
414
415EAPI void
416ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func,
417 const void *data)
418{
419 _ecore_lock();
420 end_tick_cb = func;
421 end_tick_data = data;
422 _end_tick();
423 if (animators) _begin_tick();
424 _ecore_unlock();
425}
426
427EAPI void
428ecore_animator_custom_tick(void)
429{
430 _ecore_lock();
431 if (src == ECORE_ANIMATOR_SOURCE_CUSTOM) _do_tick();
432 _ecore_unlock();
433}
434
435void
436_ecore_animator_shutdown(void)
437{
438 _end_tick();
439 while (animators)
440 {
441 Ecore_Animator *animator;
442
443 animator = animators;
444 animators = (Ecore_Animator *)eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animators));
445 ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE);
446 free(animator);
447 }
448}
449
450static Eina_Bool
451_ecore_animator_run(void *data)
452{
453 Ecore_Animator *animator = data;
454 double pos = 0.0, t;
455 Eina_Bool run_ret;
456
457 t = ecore_loop_time_get();
458 if (animator->run > 0.0)
459 {
460 pos = (t - animator->start) / animator->run;
461 if (pos > 1.0) pos = 1.0;
462 else if (pos < 0.0)
463 pos = 0.0;
464 }
465 run_ret = animator->run_func(animator->run_data, pos);
466 if (t >= (animator->start + animator->run)) run_ret = EINA_FALSE;
467 return run_ret;
468}
469
470static Eina_Bool
471_ecore_animator(void *data __UNUSED__)
472{
473 Eina_Bool r;
474 _ecore_lock();
475 r = _do_tick();
476 _ecore_unlock();
477 return r;
478}
479
diff --git a/libraries/ecore/src/lib/ecore/ecore_app.c b/libraries/ecore/src/lib/ecore/ecore_app.c
new file mode 100644
index 0000000..5e4bf02
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_app.c
@@ -0,0 +1,95 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#ifndef _MSC_VER
8# include <unistd.h>
9#else
10# include <process.h>
11#endif
12
13#ifdef HAVE_EVIL
14# include <Evil.h>
15#endif
16
17#include "Ecore.h"
18#include "ecore_private.h"
19
20static int app_argc = 0;
21static char **app_argv = NULL;
22
23/**
24 * @addtogroup Ecore_Application_Group
25 *
26 * @{
27 */
28
29/**
30 * Set up the programs command-line arguments.
31 * @param argc The same as passed as argc to the programs main() function
32 * @param argv The same as passed as argv to the programs main() function
33 *
34 * A call to this function will store the programs command-line arguments
35 * for later use by ecore_app_restart() or ecore_app_args_get().
36 */
37EAPI void
38ecore_app_args_set(int argc,
39 const char **argv)
40{
41 EINA_MAIN_LOOP_CHECK_RETURN;
42
43 if ((argc < 1) ||
44 (!argv)) return;
45 app_argc = argc;
46 app_argv = (char **)argv;
47}
48
49/**
50 * Return the programs stored command-line arguments.
51 * @param argc A pointer to the return value to hold argc
52 * @param argv A pointer to the return value to hold argv
53 *
54 * When called, this funciton returns the arguments for the program stored by
55 * ecore_app_args_set(). The integer pointed to by @p argc will be filled, if
56 * the pointer is not NULL, and the string array pointer @p argv will be filled
57 * also if the pointer is not NULL. The values they are filled with will be the
58 * same set by ecore_app_args_set().
59 */
60EAPI void
61ecore_app_args_get(int *argc,
62 char ***argv)
63{
64 EINA_MAIN_LOOP_CHECK_RETURN;
65
66 if (argc) *argc = app_argc;
67 if (argv) *argv = app_argv;
68}
69
70/**
71 * Restart the program executable with the command-line arguments stored.
72 *
73 * This function will restart & re-execute this program in place of itself
74 * using the command-line arguments stored by ecore_app_args_set(). This is
75 * an easy way for a program to restart itself for cleanup purposes,
76 * configuration reasons or in the event of a crash.
77 */
78EAPI void
79ecore_app_restart(void)
80{
81#ifdef HAVE_EXECVP
82 char *args[4096];
83 int i;
84
85 if ((app_argc < 1) || (!app_argv)) return;
86 if (app_argc >= 4096) return;
87 for (i = 0; i < app_argc; i++) args[i] = app_argv[i];
88 args[i] = NULL;
89 execvp(app_argv[0], args);
90#endif
91}
92
93/**
94 * @}
95 */
diff --git a/libraries/ecore/src/lib/ecore/ecore_events.c b/libraries/ecore/src/lib/ecore/ecore_events.c
new file mode 100644
index 0000000..f31baf8
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_events.c
@@ -0,0 +1,790 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10static int inpurge = 0;
11
12struct _Ecore_Event_Handler
13{
14 EINA_INLIST;
15 ECORE_MAGIC;
16 int type;
17 Ecore_Event_Handler_Cb func;
18 void *data;
19 int references;
20 Eina_Bool delete_me : 1;
21};
22
23struct _Ecore_Event_Filter
24{
25 EINA_INLIST;
26 ECORE_MAGIC;
27 Ecore_Data_Cb func_start;
28 Ecore_Filter_Cb func_filter;
29 Ecore_End_Cb func_end;
30 void *loop_data;
31 void *data;
32 int references;
33 Eina_Bool delete_me : 1;
34};
35
36struct _Ecore_Event
37{
38 EINA_INLIST;
39 ECORE_MAGIC;
40 int type;
41 void *event;
42 Ecore_End_Cb func_free;
43 void *data;
44 int references;
45 Eina_Bool delete_me : 1;
46};
47
48static int events_num = 0;
49static Ecore_Event *events = NULL;
50static Ecore_Event *event_current = NULL;
51static Ecore_Event *purge_events = NULL;
52
53static Ecore_Event_Handler **event_handlers = NULL;
54static Ecore_Event_Handler *event_handler_current = NULL;
55static int event_handlers_num = 0;
56static int event_handlers_alloc_num = 0;
57static Eina_List *event_handlers_delete_list = NULL;
58
59static Ecore_Event_Handler *event_handlers_add_list = NULL;
60
61static Ecore_Event_Filter *event_filters = NULL;
62static Ecore_Event_Filter *event_filter_current = NULL;
63static Ecore_Event *event_filter_event_current = NULL;
64static int event_filters_delete_me = 0;
65static int event_id_max = ECORE_EVENT_COUNT;
66static int ecore_raw_event_type = ECORE_EVENT_NONE;
67static void *ecore_raw_event_event = NULL;
68
69static void _ecore_event_purge_deleted(void);
70static void *_ecore_event_del(Ecore_Event *event);
71
72/**
73 * @addtogroup Ecore_Event_Group
74 *
75 * @{
76 */
77
78/**
79 * Add an event handler.
80 * @param type The type of the event this handler will get called for
81 * @param func The function to call when the event is found in the queue
82 * @param data A data pointer to pass to the called function @p func
83 * @return A new Event handler, or NULL on failure
84 *
85 * Add an event handler to the list of handlers. This will, on success, return
86 * a handle to the event handler object that was created, that can be used
87 * later to remove the handler using ecore_event_handler_del(). The @p type
88 * parameter is the integer of the event type that will trigger this callback
89 * to be called. The callback @p func is called when this event is processed
90 * and will be passed the event type, a pointer to the private event
91 * structure that is specific to that event type, and a data pointer that is
92 * provided in this call as the @p data parameter.
93 *
94 * When the callback @p func is called, it must return 1 or 0. If it returns
95 * 1 (or ECORE_CALLBACK_PASS_ON), It will keep being called as per normal, for
96 * each handler set up for that event type. If it returns 0 (or
97 * ECORE_CALLBACK_DONE), it will cease processing handlers for that particular
98 * event, so all handler set to handle that event type that have not already
99 * been called, will not be.
100 */
101EAPI Ecore_Event_Handler *
102ecore_event_handler_add(int type,
103 Ecore_Event_Handler_Cb func,
104 const void *data)
105{
106 Ecore_Event_Handler *eh = NULL;
107
108 _ecore_lock();
109
110 if (!func) goto unlock;
111 if ((type <= ECORE_EVENT_NONE) || (type >= event_id_max)) goto unlock;
112 eh = calloc(1, sizeof(Ecore_Event_Handler));
113 if (!eh) goto unlock;
114 ECORE_MAGIC_SET(eh, ECORE_MAGIC_EVENT_HANDLER);
115 eh->type = type;
116 eh->func = func;
117 eh->data = (void *)data;
118 if (type >= (event_handlers_num - 1))
119 {
120 int p_alloc_num;
121
122 p_alloc_num = event_handlers_alloc_num;
123 event_handlers_num = type + 1;
124 if (event_handlers_num > event_handlers_alloc_num)
125 {
126 Ecore_Event_Handler **new_handlers;
127 int i;
128
129 event_handlers_alloc_num = ((event_handlers_num + 16) / 16) * 16;
130 new_handlers = realloc(event_handlers, event_handlers_alloc_num * sizeof(Ecore_Event_Handler *));
131 if (!new_handlers)
132 {
133 free(eh);
134 goto unlock;
135 }
136 event_handlers = new_handlers;
137 for (i = p_alloc_num; i < event_handlers_alloc_num; i++)
138 event_handlers[i] = NULL;
139 }
140 }
141 if (ecore_raw_event_type == type)
142 event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh));
143 else if (type < event_handlers_alloc_num)
144 event_handlers[type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[type]), EINA_INLIST_GET(eh));
145
146unlock:
147 _ecore_unlock();
148 return eh;
149}
150
151/**
152 * Delete an event handler.
153 * @param event_handler Event handler handle to delete
154 * @return Data passed to handler
155 *
156 * Delete a specified event handler from the handler list. On success this will
157 * delete the event handler and return the pointer passed as @p data when the
158 * handler was added by ecore_event_handler_add(). On failure NULL will be
159 * returned. Once a handler is deleted it will no longer be called.
160 */
161EAPI void *
162ecore_event_handler_del(Ecore_Event_Handler *event_handler)
163{
164 void *data = NULL;
165
166 _ecore_lock();
167 if (!ECORE_MAGIC_CHECK(event_handler, ECORE_MAGIC_EVENT_HANDLER))
168 {
169 ECORE_MAGIC_FAIL(event_handler, ECORE_MAGIC_EVENT_HANDLER,
170 "ecore_event_handler_del");
171 goto unlock;
172 }
173 data = _ecore_event_handler_del(event_handler);
174unlock:
175 _ecore_unlock();
176
177 return data;
178}
179
180/**
181 * @brief Get the data associated with an #Ecore_Event_Handler
182 * @param eh The event handler
183 * @return The data
184 *
185 * This function returns the data previously associated with @p eh by
186 * ecore_event_handler_add().
187 */
188EAPI void *
189ecore_event_handler_data_get(Ecore_Event_Handler *eh)
190{
191 void *data = NULL;
192
193 _ecore_lock();
194 if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER))
195 {
196 ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_get");
197 goto unlock;
198 }
199 data = eh->data;
200unlock:
201 _ecore_unlock();
202 return data;
203}
204
205/**
206 * @brief Set the data associated with an #Ecore_Event_Handler
207 * @param eh The event handler
208 * @param data The data to associate
209 * @return The previous data
210 *
211 * This function sets @p data to @p eh and returns the old data pointer
212 * which was previously associated with @p eh by ecore_event_handler_add().
213 */
214EAPI void *
215ecore_event_handler_data_set(Ecore_Event_Handler *eh,
216 const void *data)
217{
218 void *old = NULL;
219
220 _ecore_lock();
221 if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER))
222 {
223 ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_set");
224 goto unlock;
225 }
226 old = eh->data;
227 eh->data = (void *)data;
228unlock:
229 _ecore_unlock();
230
231 return old;
232}
233
234static void
235_ecore_event_generic_free(void *data __UNUSED__,
236 void *event)
237{
238 free (event);
239}
240
241/**
242 * Add an event to the event queue.
243 * @param type The event type to add to the end of the event queue
244 * @param ev The private data structure for this event type
245 * @param func_free The function to be called to free this private structure
246 * @param data The data pointer to be passed to the free function
247 * @return A Handle for that event
248 *
249 * On success this function returns a handle to an event on the event queue, or
250 * NULL if it fails. If it succeeds, an event of type @p type will be added
251 * to the queue for processing by event handlers added by
252 * ecore_event_handler_add(). The @p ev parameter will be a pointer to the event
253 * private data that is specific to that event type. When the event is no
254 * longer needed, @p func_free will be called and passed the private structure
255 * pointer for cleaning up. If @p func_free is NULL, free() will be called
256 * with the private structure pointer.
257 * func_free is passed @p data as its data parameter.
258 */
259EAPI Ecore_Event *
260ecore_event_add(int type,
261 void *ev,
262 Ecore_End_Cb func_free,
263 void *data)
264{
265 Ecore_Event *event = NULL;
266
267 _ecore_lock();
268
269/* if (!ev) goto unlock; */
270 if (type <= ECORE_EVENT_NONE) goto unlock;
271 if (type >= event_id_max) goto unlock;
272 if ((ev) && (!func_free)) func_free = _ecore_event_generic_free;
273 event = _ecore_event_add(type, ev, func_free, data);
274unlock:
275 _ecore_unlock();
276 return event;
277}
278
279/**
280 * Delete an event from the queue.
281 * @param event The event handle to delete
282 * @return The data pointer originally set for the event free function
283 *
284 * This deletes the event @p event from the event queue, and returns the
285 * @p data parameer originally set when adding it with ecore_event_add(). This
286 * does not immediately call the free function, and it may be called later on
287 * cleanup, and so if the free function depends on the data pointer to work,
288 * you should defer cleaning of this till the free function is called later.
289 */
290EAPI void *
291ecore_event_del(Ecore_Event *event)
292{
293 void *data = NULL;
294
295 _ecore_lock();
296 if (!ECORE_MAGIC_CHECK(event, ECORE_MAGIC_EVENT))
297 {
298 ECORE_MAGIC_FAIL(event, ECORE_MAGIC_EVENT, "ecore_event_del");
299 goto unlock;
300 }
301 EINA_SAFETY_ON_TRUE_GOTO(event->delete_me, unlock);
302 event->delete_me = 1;
303 data = event->data;
304unlock:
305 _ecore_unlock();
306 return data;
307}
308
309/**
310 * Allocate a new event type id sensibly and return the new id.
311 * @return A new event type id.
312 *
313 * This function allocates a new event type id and returns it. Once an event
314 * type has been allocated it can never be de-allocated during the life of
315 * the program. There is no guarantee of the contents of this event ID, or how
316 * it is calculated, except that the ID will be unique to the current instance
317 * of the process.
318 */
319EAPI int
320ecore_event_type_new(void)
321{
322 int id;
323
324 _ecore_lock();
325 id = event_id_max++;
326 _ecore_unlock();
327
328 return id;
329}
330
331/**
332 * Add a filter the current event queue.
333 * @param func_start Function to call just before filtering and return data
334 * @param func_filter Function to call on each event
335 * @param func_end Function to call after the queu has been filtered
336 * @param data Data to pass to the filter functions
337 * @return A filter handle
338 *
339 * This adds a filter to call callbacks to loop through the event queue and
340 * filter events out of the queue. On failure NULL is returned. On success a
341 * Filter handle is returned. Filters are called on the queue just before
342 * Event handler processing to try and remove redundant events. Just as
343 * processing starts @p func_start is called and passed the @p data pointer.
344 * This function returns a pointer that is used as loop_data that is now passed to
345 * @p func_filter as loop_data. @p func_filter is also passed @p data and the
346 * event type and private event structure. If this callback returns 0, the
347 * event is removed from the queue. If it returns 1, the event is kept. When
348 * processing is finished @p func_end is called and is passed the loop_data
349 * and @p data pointer to clean up.
350 */
351EAPI Ecore_Event_Filter *
352ecore_event_filter_add(Ecore_Data_Cb func_start,
353 Ecore_Filter_Cb func_filter,
354 Ecore_End_Cb func_end,
355 const void *data)
356{
357 Ecore_Event_Filter *ef = NULL;
358
359 _ecore_lock();
360 if (!func_filter) goto unlock;
361 ef = calloc(1, sizeof(Ecore_Event_Filter));
362 if (!ef) goto unlock;
363 ECORE_MAGIC_SET(ef, ECORE_MAGIC_EVENT_FILTER);
364 ef->func_start = func_start;
365 ef->func_filter = func_filter;
366 ef->func_end = func_end;
367 ef->data = (void *)data;
368 event_filters = (Ecore_Event_Filter *)eina_inlist_append(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef));
369unlock:
370 _ecore_unlock();
371 return ef;
372}
373
374/**
375 * Delete an event filter.
376 * @param ef The event filter handle
377 * @return The data set for the filter
378 *
379 * Delete a filter that has been added by its @p ef handle. On success this
380 * will return the data pointer set when this filter was added. On failure
381 * NULL is returned.
382 */
383EAPI void *
384ecore_event_filter_del(Ecore_Event_Filter *ef)
385{
386 void *data = NULL;
387
388 _ecore_lock();
389 if (!ECORE_MAGIC_CHECK(ef, ECORE_MAGIC_EVENT_FILTER))
390 {
391 ECORE_MAGIC_FAIL(ef, ECORE_MAGIC_EVENT_FILTER, "ecore_event_filter_del");
392 goto unlock;
393 }
394 EINA_SAFETY_ON_TRUE_GOTO(ef->delete_me, unlock);
395 ef->delete_me = 1;
396 event_filters_delete_me = 1;
397 data = ef->data;
398unlock:
399 _ecore_unlock();
400
401 return data;
402}
403
404/**
405 * Return the current event type being handled.
406 * @return The current event type being handled if inside a handler callback
407 *
408 * If the program is currently inside an Ecore event handler callback this
409 * will return the type of the current event being processed. If Ecore is
410 * not inside an event handler, ECORE_EVENT_NONE is returned.
411 *
412 * This is useful when certain Ecore modules such as Ecore_Evas "swallow"
413 * events and not all the original information is passed on. In special cases
414 * this extra information may be useful or needed and using this call can let
415 * the program know if the event type being handled is one it wants to get more
416 * information about.
417 */
418EAPI int
419ecore_event_current_type_get(void)
420{
421 return ecore_raw_event_type;
422}
423
424/**
425 * Return the current event type pointer handled.
426 * @return The current event pointer being handled if inside a handler callback
427 *
428 * If the program is currently inside an Ecore event handler callback this
429 * will return the pointer of the current event being processed. If Ecore is
430 * not inside an event handler, NULL will be returned.
431 *
432 * This is useful when certain Ecore modules such as Ecore_Evas "swallow"
433 * events and not all the original information is passed on. In special cases
434 * this extra information may be useful or needed and using this call can let
435 * the program access the event data if the type of the event is handled by
436 * the program.
437 */
438EAPI void *
439ecore_event_current_event_get(void)
440{
441 return ecore_raw_event_event;
442}
443
444/**
445 * @}
446 */
447
448EAPI void *
449_ecore_event_handler_del(Ecore_Event_Handler *event_handler)
450{
451 EINA_SAFETY_ON_TRUE_RETURN_VAL(event_handler->delete_me, NULL);
452 event_handler->delete_me = 1;
453 event_handlers_delete_list = eina_list_append(event_handlers_delete_list, event_handler);
454 return event_handler->data;
455}
456
457void
458_ecore_event_shutdown(void)
459{
460 int i;
461 Ecore_Event_Handler *eh;
462 Ecore_Event_Filter *ef;
463
464 while (events) _ecore_event_del(events);
465 event_current = NULL;
466 for (i = 0; i < event_handlers_num; i++)
467 {
468 while ((eh = event_handlers[i]))
469 {
470 event_handlers[i] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[i]), EINA_INLIST_GET(event_handlers[i]));
471 ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
472 if (!eh->delete_me) free(eh);
473 }
474 }
475 EINA_LIST_FREE(event_handlers_delete_list, eh)
476 free(eh);
477 if (event_handlers) free(event_handlers);
478 event_handlers = NULL;
479 event_handlers_num = 0;
480 event_handlers_alloc_num = 0;
481 while ((ef = event_filters))
482 {
483 event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(event_filters));
484 ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
485 free(ef);
486 }
487 event_filters_delete_me = 0;
488 event_filter_current = NULL;
489 event_filter_event_current = NULL;
490}
491
492int
493_ecore_event_exist(void)
494{
495 Ecore_Event *e;
496 EINA_INLIST_FOREACH(events, e)
497 if (!e->delete_me) return 1;
498 return 0;
499}
500
501Ecore_Event *
502_ecore_event_add(int type,
503 void *ev,
504 Ecore_End_Cb func_free,
505 void *data)
506{
507 Ecore_Event *e;
508
509 e = calloc(1, sizeof(Ecore_Event));
510 if (!e) return NULL;
511 ECORE_MAGIC_SET(e, ECORE_MAGIC_EVENT);
512 e->type = type;
513 e->event = ev;
514 e->func_free = func_free;
515 e->data = data;
516 if (inpurge > 0)
517 {
518 purge_events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(e));
519 events_num++;
520 }
521 else
522 {
523 events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
524 events_num++;
525 }
526 return e;
527}
528
529void *
530_ecore_event_del(Ecore_Event *event)
531{
532 void *data;
533
534 data = event->data;
535 if (event->func_free) _ecore_call_end_cb(event->func_free, event->data, event->event);
536 events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(events), EINA_INLIST_GET(event));
537 ECORE_MAGIC_SET(event, ECORE_MAGIC_NONE);
538 free(event);
539 events_num--;
540 return data;
541}
542
543static void
544_ecore_event_purge_deleted(void)
545{
546 Ecore_Event *itr = events;
547
548 inpurge++;
549 while (itr)
550 {
551 Ecore_Event *next = (Ecore_Event *)EINA_INLIST_GET(itr)->next;
552 if ((!itr->references) && (itr->delete_me))
553 _ecore_event_del(itr);
554 itr = next;
555 }
556 inpurge--;
557 while (purge_events)
558 {
559 Ecore_Event *e = purge_events;
560 purge_events = (Ecore_Event *)eina_inlist_remove(EINA_INLIST_GET(purge_events), EINA_INLIST_GET(purge_events));
561 events = (Ecore_Event *)eina_inlist_append(EINA_INLIST_GET(events), EINA_INLIST_GET(e));
562 }
563}
564
565static inline void
566_ecore_event_filters_apply()
567{
568 if (!event_filter_current)
569 {
570 /* regular main loop, start from head */
571 event_filter_current = event_filters;
572 }
573 else
574 {
575 /* recursive main loop, continue from where we were */
576 event_filter_current = (Ecore_Event_Filter *)EINA_INLIST_GET(event_filter_current)->next;
577 }
578
579 while (event_filter_current)
580 {
581 Ecore_Event_Filter *ef = event_filter_current;
582
583 if (!ef->delete_me)
584 {
585 ef->references++;
586
587 if (ef->func_start)
588 ef->loop_data = _ecore_call_data_cb(ef->func_start, ef->data);
589
590 if (!event_filter_event_current)
591 {
592 /* regular main loop, start from head */
593 event_filter_event_current = events;
594 }
595 else
596 {
597 /* recursive main loop, continue from where we were */
598 event_filter_event_current = (Ecore_Event *)EINA_INLIST_GET(event_filter_event_current)->next;
599 }
600
601 while (event_filter_event_current)
602 {
603 Ecore_Event *e = event_filter_event_current;
604
605 if (!_ecore_call_filter_cb(ef->func_filter, ef->data,
606 ef->loop_data, e->type, e->event))
607 {
608 ecore_event_del(e);
609 }
610
611 if (event_filter_event_current) /* may have changed in recursive main loops */
612 event_filter_event_current = (Ecore_Event *)EINA_INLIST_GET(event_filter_event_current)->next;
613 }
614 if (ef->func_end)
615 _ecore_call_end_cb(ef->func_end, ef->data, ef->loop_data);
616
617 ef->references--;
618 }
619
620 if (event_filter_current) /* may have changed in recursive main loops */
621 event_filter_current = (Ecore_Event_Filter *)EINA_INLIST_GET(event_filter_current)->next;
622 }
623 if (event_filters_delete_me)
624 {
625 int deleted_in_use = 0;
626 Ecore_Event_Filter *l;
627 for (l = event_filters; l; )
628 {
629 Ecore_Event_Filter *ef = l;
630 l = (Ecore_Event_Filter *)EINA_INLIST_GET(l)->next;
631 if (ef->delete_me)
632 {
633 if (ef->references)
634 {
635 deleted_in_use++;
636 continue;
637 }
638
639 event_filters = (Ecore_Event_Filter *)eina_inlist_remove(EINA_INLIST_GET(event_filters), EINA_INLIST_GET(ef));
640 ECORE_MAGIC_SET(ef, ECORE_MAGIC_NONE);
641 free(ef);
642 }
643 }
644 if (!deleted_in_use)
645 event_filters_delete_me = 0;
646 }
647}
648
649void
650_ecore_event_call(void)
651{
652 Eina_List *l, *l_next;
653 Ecore_Event_Handler *eh;
654
655 _ecore_event_filters_apply();
656
657 if (!event_current)
658 {
659 /* regular main loop, start from head */
660 event_current = events;
661 event_handler_current = NULL;
662 }
663
664 while (event_current)
665 {
666 Ecore_Event *e = event_current;
667 int handle_count = 0;
668
669 if (e->delete_me)
670 {
671 event_current = (Ecore_Event *)EINA_INLIST_GET(event_current)->next;
672 continue;
673 }
674
675 ecore_raw_event_type = e->type;
676 ecore_raw_event_event = e->event;
677 e->references++;
678 if ((e->type >= 0) && (e->type < event_handlers_num))
679 {
680 if (!event_handler_current)
681 {
682 /* regular main loop, start from head */
683 event_handler_current = event_handlers[e->type];
684 }
685 else
686 {
687 /* recursive main loop, continue from where we were */
688 event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next;
689 }
690
691 while ((event_handler_current) && (!e->delete_me))
692 {
693 eh = event_handler_current;
694 if (!eh->delete_me)
695 {
696 Eina_Bool ret;
697
698 handle_count++;
699
700 eh->references++;
701 ret = _ecore_call_handler_cb(eh->func, eh->data, e->type, e->event);
702 eh->references--;
703
704 if (!ret)
705 {
706 event_handler_current = NULL;
707 break; /* 0 == "call no further handlers" */
708 }
709 }
710
711 if (event_handler_current) /* may have changed in recursive main loops */
712 event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next;
713 }
714 }
715 while (event_handlers_add_list)
716 {
717 eh = event_handlers_add_list;
718 event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh));
719 event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh));
720 }
721 /* if no handlers were set for EXIT signal - then default is */
722 /* to quit the main loop */
723 if ((e->type == ECORE_EVENT_SIGNAL_EXIT) && (handle_count == 0))
724 ecore_main_loop_quit();
725 e->references--;
726 e->delete_me = 1;
727
728 if (event_current) /* may have changed in recursive main loops */
729 event_current = (Ecore_Event *)EINA_INLIST_GET(event_current)->next;
730 }
731
732 ecore_raw_event_type = ECORE_EVENT_NONE;
733 ecore_raw_event_event = NULL;
734
735 _ecore_event_purge_deleted();
736
737 EINA_LIST_FOREACH_SAFE(event_handlers_delete_list, l, l_next, eh)
738 {
739 if (eh->references) continue;
740
741 event_handlers_delete_list = eina_list_remove_list(event_handlers_delete_list, l);
742
743 event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh));
744 ECORE_MAGIC_SET(eh, ECORE_MAGIC_NONE);
745 free(eh);
746 }
747}
748
749EAPI void *
750_ecore_event_signal_user_new(void)
751{
752 Ecore_Event_Signal_User *e;
753
754 e = calloc(1, sizeof(Ecore_Event_Signal_User));
755 return e;
756}
757
758void *
759_ecore_event_signal_hup_new(void)
760{
761 Ecore_Event_Signal_Hup *e;
762
763 e = calloc(1, sizeof(Ecore_Event_Signal_Hup));
764 return e;
765}
766
767void *
768_ecore_event_signal_exit_new(void)
769{
770 Ecore_Event_Signal_Exit *e;
771
772 e = calloc(1, sizeof(Ecore_Event_Signal_Exit));
773 return e;
774}
775
776void *
777_ecore_event_signal_power_new(void)
778{
779 Ecore_Event_Signal_Power *e;
780
781 e = calloc(1, sizeof(Ecore_Event_Signal_Power));
782 return e;
783}
784
785void *
786_ecore_event_signal_realtime_new(void)
787{
788 return calloc(1, sizeof(Ecore_Event_Signal_Realtime));
789}
790
diff --git a/libraries/ecore/src/lib/ecore/ecore_exe.c b/libraries/ecore/src/lib/ecore/ecore_exe.c
new file mode 100644
index 0000000..d5465fc
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_exe.c
@@ -0,0 +1,1880 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#if defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__)
6# include <sys/time.h>
7# include <sys/resource.h>
8#endif
9
10#include <stdlib.h>
11#include <stdio.h>
12#include <string.h>
13#include <errno.h>
14#include <sys/types.h>
15#include <unistd.h>
16#include <fcntl.h>
17
18#ifdef HAVE_SYS_PRCTL_H
19# include <sys/prctl.h>
20#endif
21
22#ifdef HAVE_SYS_WAIT_H
23# include <sys/wait.h>
24#endif
25
26#include "Ecore.h"
27#include "ecore_private.h"
28
29/* FIXME: Getting respawn to work
30 *
31 * There is no way that we can do anything about the internal state info of
32 * an external exe. The same can be said about the state of user code. User
33 * code in this context means the code that is using ecore_exe to manage exe's
34 * for it.
35 *
36 * Document that the exe must be respawnable, in other words, there is no
37 * state that it cannot regenerate by just killing it and starting it again.
38 * This includes state that the user code knows about, as the respawn is
39 * transparent to that code. On the other hand, maybe a respawn event might
40 * be useful, or maybe resend the currently non existent add event. For
41 * consistancy with ecore_con, an add event is good anyway.
42 *
43 * The Ecore_exe structure is reused for respawning, so that the (opaque)
44 * pointer held by the user remains valid. This means that the Ecore_Exe
45 * init and del functions may need to be split into two parts each to avoid
46 * duplicating code - common code part, and the rest. This implies that
47 * the unchanging members mentioned next should NEVER change.
48 *
49 * These structure members don't need to change -
50 * __list_data - we stay on the list
51 * ECORE_MAGIC - this is a constant
52 * data - passed in originally
53 * cmd - passed in originally
54 * flags - passed in originally
55 *
56 * These structure members need to change -
57 * tag - state that must be regenerated, zap it
58 * pid - it will be different
59 * child_fd_write - it will be different
60 * child_fd_read - it will be different
61 * child_fd_error - it will be different
62 * write_fd_handler - we cannot change the fd used by a handler, this changes coz the fd changes.
63 * read_fd_handler - we cannot change the fd used by a handler, this changes coz the fd changes.
64 * error_fd_handler - we cannot change the fd used by a handler, this changes coz the fd changes.
65 *
66 * Hmm, the read, write, and error buffers could be tricky.
67 * They are not atomic, and could be in a semi complete state.
68 * They fall into the "state must be regenerated" mentioned above.
69 * A respawn/add event should take care of it.
70 *
71 * These structure members need to change -
72 * write_data_buf - state that must be regenerated, zap it
73 * write_data_size - state that must be regenerated, zap it
74 * write_data_offset - state that must be regenerated, zap it
75 * read_data_buf - state that must be regenerated, zap it
76 * read_data_size - state that must be regenerated, zap it
77 * error_data_buf - state that must be regenerated, zap it
78 * error_data_size - state that must be regenerated, zap it
79 * close_write - state that must be regenerated, zap it
80 *
81 * There is the problem that an exe that fell over and needs respawning
82 * might keep falling over, keep needing to be respawned, and tie up system
83 * resources with the constant respawning. An exponentially increasing
84 * timeout (with maximum timeout) between respawns should take care of that.
85 * Although this is not a "contention for a resource" problem, the exe falling
86 * over may be, so a random element added to the timeout may help, and won't
87 * hurt. The user code may need to be informed that a timeout is in progress.
88 */
89
90struct _Ecore_Exe
91{
92 EINA_INLIST;
93 ECORE_MAGIC;
94 pid_t pid;
95 void *data;
96 char *tag, *cmd;
97 Ecore_Exe_Flags flags;
98 Ecore_Fd_Handler *write_fd_handler; /* the fd_handler to handle write to child - if this was used, or NULL if not */
99 Ecore_Fd_Handler *read_fd_handler; /* the fd_handler to handle read from child - if this was used, or NULL if not */
100 Ecore_Fd_Handler *error_fd_handler; /* the fd_handler to handle errors from child - if this was used, or NULL if not */
101 void *write_data_buf; /* a data buffer for data to write to the child -
102 * realloced as needed for more data and flushed when the fd handler says writes are possible
103 */
104 int write_data_size; /* the size in bytes of the data buffer */
105 int write_data_offset; /* the offset in bytes in the data buffer */
106 void *read_data_buf; /* data read from the child awating delivery to an event */
107 int read_data_size; /* data read from child in bytes */
108 void *error_data_buf; /* errors read from the child awating delivery to an event */
109 int error_data_size; /* errors read from child in bytes */
110 int child_fd_write; /* fd to write TO to send data to the child */
111 int child_fd_read; /* fd to read FROM when child has sent us (the parent) data */
112 int child_fd_error; /* fd to read FROM when child has sent us (the parent) errors */
113 int child_fd_write_x; /* fd to write TO to send data to the child */
114 int child_fd_read_x; /* fd to read FROM when child has sent us (the parent) data */
115 int child_fd_error_x; /* fd to read FROM when child has sent us (the parent) errors */
116 Eina_Bool close_stdin : 1;
117
118 int start_bytes, end_bytes, start_lines, end_lines; /* Number of bytes/lines to auto pipe at start/end of stdout/stderr. */
119
120 Ecore_Timer *doomsday_clock; /* The Timer of Death. Muahahahaha. */
121 void *doomsday_clock_dead; /* data for the doomsday clock */
122
123 Ecore_Exe_Cb pre_free_cb;
124};
125
126/* TODO: Something to let people build a command line and does auto escaping -
127 *
128 * ecore_exe_snprintf()
129 *
130 * OR
131 *
132 * cmd = ecore_exe_comand_parameter_append(cmd, "firefox");
133 * cmd = ecore_exe_comand_parameter_append(cmd, "http://www.foo.com/bar.html?baz=yes");
134 * each parameter appended is one argument, and it gets escaped, quoted, and
135 * appended with a preceding space. The first is the command off course.
136 */
137
138struct _ecore_exe_dead_exe
139{
140 pid_t pid;
141 char *cmd;
142};
143
144static inline void _ecore_exe_exec_it(const char *exe_cmd,
145 Ecore_Exe_Flags flags);
146static Eina_Bool _ecore_exe_data_generic_handler(void *data,
147 Ecore_Fd_Handler *fd_handler,
148 Ecore_Exe_Flags flags);
149static Eina_Bool _ecore_exe_data_error_handler(void *data,
150 Ecore_Fd_Handler *fd_handler);
151static Eina_Bool _ecore_exe_data_read_handler(void *data,
152 Ecore_Fd_Handler *fd_handler);
153static Eina_Bool _ecore_exe_data_write_handler(void *data,
154 Ecore_Fd_Handler *fd_handler);
155static void _ecore_exe_flush(Ecore_Exe *exe);
156static void _ecore_exe_event_exe_data_free(void *data __UNUSED__,
157 void *ev);
158static Ecore_Exe *_ecore_exe_is_it_alive(pid_t pid);
159static Eina_Bool _ecore_exe_make_sure_its_dead(void *data);
160static Eina_Bool _ecore_exe_make_sure_its_really_dead(void *data);
161static Ecore_Exe_Event_Add *_ecore_exe_event_add_new(void);
162static void _ecore_exe_event_add_free(void *data,
163 void *ev);
164static void _ecore_exe_dead_attach(Ecore_Exe *exe);
165
166EAPI int ECORE_EXE_EVENT_ADD = 0;
167EAPI int ECORE_EXE_EVENT_DEL = 0;
168EAPI int ECORE_EXE_EVENT_DATA = 0;
169EAPI int ECORE_EXE_EVENT_ERROR = 0;
170
171static Ecore_Exe *exes = NULL;
172static const char *shell = NULL;
173
174/* FIXME: This errno checking stuff should be put elsewhere for everybody to use.
175 * For now it lives here though, just to make testing easier.
176 */
177static int _ecore_exe_check_errno(int result,
178 const char *file,
179 int line);
180
181#define E_IF_NO_ERRNO(result, foo, ok) \
182 while (((ok) = _ecore_exe_check_errno((result) = (foo), __FILE__, __LINE__)) == -1) sleep(1); \
183 if (ok)
184
185#define E_NO_ERRNO(result, foo, ok) \
186 while (((ok) = _ecore_exe_check_errno((result) = (foo), __FILE__, __LINE__)) == -1) sleep(1)
187
188#define E_IF_NO_ERRNO_NOLOOP(result, foo, ok) \
189 if (((ok) = _ecore_exe_check_errno((result) = (foo), __FILE__, __LINE__)))
190
191static int
192_ecore_exe_check_errno(int result,
193 const char *file,
194 int line)
195{
196 int saved_errno = errno;
197
198 if (result == -1)
199 {
200 perror("*** errno reports ");
201/* What is currently supported -
202 *
203 * pipe
204 * EFAULT Argument is not valid.
205 * EMFILE Too many file descriptors used by process.
206 * ENFILE Too many open files by system.
207 * read
208 * EAGAIN No data now, try again.
209 * EBADF This is not an fd that can be read.
210 * EFAULT This is not a valid buffer.
211 * EINTR Interupted by signal, try again.
212 * EINVAL This is not an fd that can be read.
213 * EIO I/O error.
214 * EISDIR This is a directory, and cannot be read.
215 * others Depending on what sort of thing we are reading from.
216 * close
217 * EBADF This is not an fd that can be closed.
218 * EINTR Interupted by signal, try again.
219 * EIO I/O error.
220 * dup2
221 * EBADF This is not an fd that can be dup2'ed.
222 * EBUSY Race condition between open() and dup()
223 * EINTR Interupted by signal, try again.
224 * EMFILE Too many file descriptors used by process.
225 * fcntl
226 * EACCES, EAGAIN Locked or mapped by something else, try again later.
227 * EBADF This is not an fd that can be fcntl'ed.
228 * EDEADLK This will cause a deadlock.
229 * EFAULT This is not a valid lock.
230 * EINTR Interupted by signal, try again.
231 * EINVAL This is not a valid arg.
232 * EMFILE Too many file descriptors used by process.
233 * ENOLCK Problem getting a lock.
234 * EPERM Not allowed to do that.
235 * fsync
236 * EBADF This is not an fd that is open for writing.
237 * EINVAL, EROFS This is not an fd that can be fsynced.
238 * EIO I/O error.
239 *
240 * How to use it -
241 * int ok = 0;
242 * int result;
243 *
244 * E_IF_NO_ERRNO(result, foo(bar), ok)
245 * {
246 * E_IF_NO_ERRNO_NOLOOP(result, foo(bar), ok)
247 * {
248 * }
249 * }
250 *
251 * if (!ok)
252 * {
253 * // Something failed, cleanup.
254 * }
255 */
256 switch (saved_errno)
257 {
258 case EACCES:
259 case EAGAIN:
260 case EINTR:
261 { /* Not now, try later. */
262 ERR("*** Must try again in %s @%u.", file, line);
263 result = -1;
264 break;
265 }
266
267 case EMFILE:
268 case ENFILE:
269 case ENOLCK:
270 { /* Low on resources. */
271 ERR("*** Low on resources in %s @%u.", file,
272 line);
273 result = 0;
274 break;
275 }
276
277 case EIO:
278 { /* I/O error. */
279 ERR("*** I/O error in %s @%u.", file, line);
280 result = 0;
281 break;
282 }
283
284 case EFAULT:
285 case EBADF:
286 case EINVAL:
287 case EROFS:
288 case EISDIR:
289 case EDEADLK:
290 case EPERM:
291 case EBUSY:
292 { /* Programmer fucked up. */
293 ERR("*** NAUGHTY PROGRAMMER!!!\n"
294 "*** SPANK SPANK SPANK!!!\n"
295 "*** Now go fix your code in %s @%u. Tut tut tut!",
296 file, line);
297 result = 0;
298 break;
299 }
300
301 default:
302 { /* Unsupported errno code, please add this one. */
303 ERR("*** NAUGHTY PROGRAMMER!!!\n"
304 "*** SPANK SPANK SPANK!!!\n"
305 "*** Unsupported errno code %d, please add this one.\n"
306 "*** Now go fix your code in %s @%u, from %s @%u. Tut tut tut!",
307 saved_errno, __FILE__, __LINE__, file, line);
308 result = 0;
309 break;
310 }
311 }
312 }
313 else /* Everything is fine. */
314 result = 1;
315
316 errno = saved_errno;
317 return result;
318}
319
320/**
321 * @addtogroup Ecore_Exe_Group
322 *
323 * @{
324 */
325
326static int run_pri = ECORE_EXE_PRIORITY_INHERIT;
327
328/**
329 * Sets the priority at which to launch processes
330 *
331 * This sets the priority of processes run by ecore_exe_run() and
332 * ecore_exe_pipe_run().
333 * @li On Windows, the child process is created by default with the
334 * #ECORE_EXE_WIN32_PRIORITY_NORMAL priority, unless the calling
335 * process is in #ECORE_EXE_WIN32_PRIORITY_IDLE or
336 * #ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL priority. In that case, the
337 * child process inherits this priority.
338 * @li On other platforms, if set to #ECORE_EXE_PRIORITY_INHERIT child
339 * processes inherits the priority of their parent. This is the default.
340 *
341 * @param pri value a Ecore_Exe_Win32_Priority value on Windows, -20
342 * to 19 or ECORE_EXE_PRIORITY_INHERIT on other OS.
343 */
344EAPI void
345ecore_exe_run_priority_set(int pri)
346{
347 run_pri = pri;
348}
349
350/**
351 * Gets the priority at which to launch processes
352 *
353 * This gets ths priority of launched processes. See
354 * ecore_exe_run_priority_set() for details. This just returns the value set
355 * by this call.
356 *
357 * @return the value set by ecore_exe_run_priority_set()
358 */
359EAPI int
360ecore_exe_run_priority_get(void)
361{
362 return run_pri;
363}
364
365/**
366 * Spawns a child process.
367 *
368 * This is now just a thin wrapper around ecore_exe_pipe_run()
369 *
370 * @param exe_cmd The command to run with @c /bin/sh.
371 * @param data Data to attach to the returned process handle.
372 * @return A process handle to the spawned process.
373 */
374EAPI Ecore_Exe *
375ecore_exe_run(const char *exe_cmd,
376 const void *data)
377{
378 return ecore_exe_pipe_run(exe_cmd, 0, data);
379}
380
381/**
382 * Spawns a child process with its stdin/out available for communication.
383 *
384 * This function forks and runs the given command using @c /bin/sh.
385 *
386 * Note that the process handle is only valid until a child process
387 * terminated event is received. After all handlers for the child process
388 * terminated event have been called, the handle will be freed by Ecore.
389 *
390 * This function does the same thing as ecore_exe_run(), but also makes the
391 * standard in and/or out as well as stderr from the child process available
392 * for reading or writing. To write use ecore_exe_send(). To read listen to
393 * ECORE_EXE_EVENT_DATA or ECORE_EXE_EVENT_ERROR events (set up handlers).
394 * Ecore may buffer read and error data until a newline character if asked
395 * for with the @p flags. All data will be included in the events (newlines
396 * will be replaced with NULLS if line buffered). ECORE_EXE_EVENT_DATA events
397 * will only happen if the process is run with ECORE_EXE_PIPE_READ enabled
398 * in the flags. The same with the error version. Writing will only be
399 * allowed with ECORE_EXE_PIPE_WRITE enabled in the flags.
400 *
401 * @param exe_cmd The command to run with @c /bin/sh.
402 * @param flags The flag parameters for how to deal with inter-process I/O
403 * @param data Data to attach to the returned process handle.
404 * @return A process handle to the spawned process.
405 */
406EAPI Ecore_Exe *
407ecore_exe_pipe_run(const char *exe_cmd,
408 Ecore_Exe_Flags flags,
409 const void *data)
410{
411 Ecore_Exe *exe = NULL;
412 int statusPipe[2] = { -1, -1 };
413 int errorPipe[2] = { -1, -1 };
414 int readPipe[2] = { -1, -1 };
415 int writePipe[2] = { -1, -1 };
416 int n = 0;
417 int ok = 1;
418 int result;
419
420 if (!exe_cmd) return NULL;
421 exe = calloc(1, sizeof(Ecore_Exe));
422 if (!exe) return NULL;
423
424 if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR))
425 && (!(flags & ECORE_EXE_PIPE_READ)))
426 /* We need something to auto pipe. */
427 flags |= ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR;
428
429 exe->child_fd_error = -1;
430 exe->child_fd_read = -1;
431 exe->child_fd_write = -1;
432 exe->child_fd_error_x = -1;
433 exe->child_fd_read_x = -1;
434 exe->child_fd_write_x = -1;
435
436 /* Create some pipes. */
437 if (ok)
438 {
439 E_IF_NO_ERRNO_NOLOOP(result, pipe(statusPipe), ok)
440 {
441 }
442 }
443 if (ok && (flags & ECORE_EXE_PIPE_ERROR))
444 {
445 E_IF_NO_ERRNO_NOLOOP(result, pipe(errorPipe), ok)
446 {
447 exe->child_fd_error = errorPipe[0];
448 exe->child_fd_error_x = errorPipe[1];
449 }
450 }
451 if (ok && (flags & ECORE_EXE_PIPE_READ))
452 {
453 E_IF_NO_ERRNO_NOLOOP(result, pipe(readPipe), ok)
454 {
455 exe->child_fd_read = readPipe[0];
456 exe->child_fd_read_x = readPipe[1];
457 }
458 }
459 if (ok && (flags & ECORE_EXE_PIPE_WRITE))
460 {
461 E_IF_NO_ERRNO_NOLOOP(result, pipe(writePipe), ok)
462 {
463 exe->child_fd_write = writePipe[1];
464 exe->child_fd_write_x = writePipe[0];
465 }
466 }
467 if (ok)
468 {
469 pid_t pid = 0;
470 volatile int vfork_exec_errno = 0;
471
472 /* FIXME: I should double check this. After a quick look around, this is already done, but via a more modern method. */
473 /* signal(SIGPIPE, SIG_IGN); We only want EPIPE on errors */
474 pid = fork();
475
476 if (pid == -1)
477 {
478 ERR("Failed to fork process");
479 pid = 0;
480 }
481 else if (pid == 0) /* child */
482 {
483 if (run_pri != ECORE_EXE_PRIORITY_INHERIT)
484 {
485 if ((run_pri >= -20) && (run_pri <= 19))
486 setpriority(PRIO_PROCESS, 0, run_pri);
487 }
488 /* dup2 STDERR, STDIN, and STDOUT. dup2() allegedly closes the
489 * second pipe if it's open. On the other hand, there was the
490 * Great FD Leak Scare of '06, so let's be paranoid. */
491 if (ok && (flags & ECORE_EXE_PIPE_ERROR))
492 {
493 E_NO_ERRNO(result, close(STDERR_FILENO), ok);
494 E_NO_ERRNO(result, dup2(errorPipe[1], STDERR_FILENO), ok);
495 }
496 if (ok && (flags & ECORE_EXE_PIPE_READ))
497 {
498 E_NO_ERRNO(result, close(STDOUT_FILENO), ok);
499 E_NO_ERRNO(result, dup2(readPipe[1], STDOUT_FILENO), ok);
500 }
501 if (ok && (flags & ECORE_EXE_PIPE_WRITE))
502 {
503 E_NO_ERRNO(result, close(STDIN_FILENO), ok);
504 E_NO_ERRNO(result, dup2(writePipe[0], STDIN_FILENO), ok);
505 }
506
507 if (ok)
508 {
509 /* Setup the status pipe. */
510 E_NO_ERRNO(result, close(statusPipe[0]), ok);
511 E_IF_NO_ERRNO(result, fcntl(statusPipe[1], F_SETFD, FD_CLOEXEC), ok) /* close on exec shows success */
512 {
513 /* Run the actual command. */
514 _ecore_exe_exec_it(exe_cmd, flags); /* no return */
515 }
516 }
517
518 /* Something went 'orribly wrong. */
519 vfork_exec_errno = errno;
520
521 /* Close the pipes. */
522 if (flags & ECORE_EXE_PIPE_ERROR)
523 E_NO_ERRNO(result, close(errorPipe[1]), ok);
524 if (flags & ECORE_EXE_PIPE_READ)
525 E_NO_ERRNO(result, close(readPipe[1]), ok);
526 if (flags & ECORE_EXE_PIPE_WRITE)
527 E_NO_ERRNO(result, close(writePipe[0]), ok);
528 E_NO_ERRNO(result, close(statusPipe[1]), ok);
529
530 _exit(-1);
531 }
532 else /* parent */
533 {
534 /* Close the unused pipes. */
535 E_NO_ERRNO(result, close(statusPipe[1]), ok);
536
537 /* FIXME: after having a good look at the current e fd
538 * handling, investigate fcntl(dataPipe[x], F_SETSIG, ...) */
539 /* FIXME: above F_SETSIG etc. - this is async SIGIO based IO
540 * which is also linux specific so we probably don't want to
541 * do this as long as select() is working fine. the only time
542 * we really want to think of SIGIO async IO is when it all
543 * actually works basically everywhere and we can turn all
544 * IO into DMA async activities (i.e. you do a read() then
545 * the read is complete not on return but when you get a
546 * SIGIO - the read() just starts the transfer and it is
547 * completed in the background by DMA (or whatever mechanism
548 * the kernel choses)) */
549
550 /* Wait for it to start executing. */
551 /* FIXME: this doesn't seem very nice - we sit and block
552 * waiting on a child process... even though it's just
553 * the segment between the fork() and the exec) it just feels
554 * wrong */
555 for (;; )
556 {
557 char buf;
558
559 E_NO_ERRNO(result, read(statusPipe[0], &buf, 1), ok);
560 if (result == 0)
561 {
562 if (vfork_exec_errno != 0)
563 {
564 n = vfork_exec_errno;
565 ERR("Could not start \"%s\"", exe_cmd);
566 pid = 0;
567 }
568 break;
569 }
570 }
571
572 /* Close the status pipe. */
573 E_NO_ERRNO(result, close(statusPipe[0]), ok);
574 }
575
576 if (pid)
577 {
578 /* Setup the exe structure. */
579 ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
580 exe->start_bytes = -1;
581 exe->end_bytes = -1;
582 exe->start_lines = -1;
583 exe->end_lines = -1;
584 exe->pid = pid;
585 exe->flags = flags;
586 exe->data = (void *)data;
587 if ((exe->cmd = strdup(exe_cmd)))
588 {
589 if (flags & ECORE_EXE_PIPE_ERROR) /* Setup the error stuff. */
590 {
591 E_IF_NO_ERRNO(result,
592 fcntl(exe->child_fd_error, F_SETFL,
593 O_NONBLOCK), ok) {
594 }
595 E_IF_NO_ERRNO(result,
596 fcntl(exe->child_fd_error, F_SETFD,
597 FD_CLOEXEC), ok) {
598 }
599 E_IF_NO_ERRNO(result,
600 fcntl(exe->child_fd_error_x, F_SETFD,
601 FD_CLOEXEC), ok) {
602 }
603 {
604 exe->error_fd_handler =
605 ecore_main_fd_handler_add(exe->child_fd_error,
606 ECORE_FD_READ,
607 _ecore_exe_data_error_handler,
608 exe, NULL, NULL);
609 if (!exe->error_fd_handler)
610 ok = 0;
611 }
612 }
613 if (ok && (flags & ECORE_EXE_PIPE_READ)) /* Setup the read stuff. */
614 {
615 E_IF_NO_ERRNO(result,
616 fcntl(exe->child_fd_read, F_SETFL,
617 O_NONBLOCK), ok) {
618 }
619 E_IF_NO_ERRNO(result,
620 fcntl(exe->child_fd_read, F_SETFD,
621 FD_CLOEXEC), ok) {
622 }
623 E_IF_NO_ERRNO(result,
624 fcntl(exe->child_fd_read_x, F_SETFD,
625 FD_CLOEXEC), ok) {
626 }
627 {
628 exe->read_fd_handler =
629 ecore_main_fd_handler_add(exe->child_fd_read,
630 ECORE_FD_READ,
631 _ecore_exe_data_read_handler,
632 exe, NULL, NULL);
633 if (!exe->read_fd_handler)
634 ok = 0;
635 }
636 }
637 if (ok && (flags & ECORE_EXE_PIPE_WRITE)) /* Setup the write stuff. */
638 {
639 E_IF_NO_ERRNO(result,
640 fcntl(exe->child_fd_write, F_SETFL,
641 O_NONBLOCK), ok) {
642 }
643 E_IF_NO_ERRNO(result,
644 fcntl(exe->child_fd_write, F_SETFD,
645 FD_CLOEXEC), ok) {
646 }
647 E_IF_NO_ERRNO(result,
648 fcntl(exe->child_fd_write_x, F_SETFD,
649 FD_CLOEXEC), ok) {
650 }
651 {
652 exe->write_fd_handler =
653 ecore_main_fd_handler_add(exe->child_fd_write,
654 ECORE_FD_WRITE,
655 _ecore_exe_data_write_handler,
656 exe, NULL, NULL);
657 if (exe->write_fd_handler)
658 ecore_main_fd_handler_active_set(exe->write_fd_handler, 0); /* Nothing to write to start with. */
659 else
660 ok = 0;
661 }
662 }
663
664 exes = (Ecore_Exe *)eina_inlist_append(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
665 n = 0;
666 }
667 else
668 ok = 0;
669 }
670 else
671 ok = 0;
672 }
673
674 if (!ok) /* Something went wrong, so pull down everything. */
675 {
676 if (exe->pid) ecore_exe_terminate(exe);
677 IF_FN_DEL(ecore_exe_free, exe);
678 }
679 else
680 {
681 Ecore_Exe_Event_Add *e;
682
683 e = _ecore_exe_event_add_new();
684 e->exe = exe;
685 if (e) /* Send the event. */
686 ecore_event_add(ECORE_EXE_EVENT_ADD, e,
687 _ecore_exe_event_add_free, NULL);
688 /* INF("Running as %d for %s.\n", exe->pid, exe->cmd); */
689 }
690
691 errno = n;
692 return exe;
693}
694
695/**
696 * Defines a function to be called before really freeing the handle data.
697 *
698 * This might be useful for language bindings such as Python and Perl
699 * that need to deallocate wrappers associated with this handle.
700 *
701 * This handle should never be modified by this call. It should be
702 * considered informative only. All getters are valid when the given
703 * function is called back.
704 *
705 * @param exe The child process to attach the pre_free function.
706 * @param func The function to call before @a exe is freed.
707 */
708EAPI void
709ecore_exe_callback_pre_free_set(Ecore_Exe *exe,
710 Ecore_Exe_Cb func)
711{
712 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
713 {
714 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE,
715 "ecore_exe_callback_pre_free_set");
716 return;
717 }
718 exe->pre_free_cb = func;
719}
720
721/**
722 * Sends data to the given child process which it receives on stdin.
723 *
724 * This function writes to a child processes standard in, with unlimited
725 * buffering. This call will never block. It may fail if the system runs out
726 * of memory.
727 *
728 * @param exe The child process to send to
729 * @param data The data to send
730 * @param size The size of the data to send, in bytes
731 * @return EINA_TRUE if successful, EINA_FALSE on failure.
732 */
733EAPI Eina_Bool
734ecore_exe_send(Ecore_Exe *exe,
735 const void *data,
736 int size)
737{
738 void *buf;
739
740 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
741 {
742 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_send");
743 return EINA_FALSE;
744 }
745
746 if (exe->close_stdin)
747 {
748 ERR("Ecore_Exe %p stdin is closed! Cannot send %d bytes from %p",
749 exe, size, data);
750 return EINA_FALSE;
751 }
752
753 if (exe->child_fd_write == -1)
754 {
755 ERR("Ecore_Exe %p created without ECORE_EXE_PIPE_WRITE! "
756 "Cannot send %d bytes from %p", exe, size, data);
757 return EINA_FALSE;
758 }
759
760 buf = realloc(exe->write_data_buf, exe->write_data_size + size);
761 if (!buf) return EINA_FALSE;
762
763 exe->write_data_buf = buf;
764 memcpy((char *)exe->write_data_buf + exe->write_data_size, data, size);
765 exe->write_data_size += size;
766
767 if (exe->write_fd_handler)
768 ecore_main_fd_handler_active_set(exe->write_fd_handler, ECORE_FD_WRITE);
769
770 return EINA_TRUE;
771}
772
773/**
774 * The stdin of the given child process will close when the write buffer is empty.
775 *
776 * @param exe The child process
777 */
778EAPI void
779ecore_exe_close_stdin(Ecore_Exe *exe)
780{
781 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
782 {
783 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_close_stdin");
784 return;
785 }
786 exe->close_stdin = 1;
787}
788
789/**
790 * Sets the auto pipe limits for the given process handle. On Windows
791 * this function does nothing.
792 *
793 * @param exe The given process handle.
794 * @param start_bytes limit of bytes at start of output to buffer.
795 * @param end_bytes limit of bytes at end of output to buffer.
796 * @param start_lines limit of lines at start of output to buffer.
797 * @param end_lines limit of lines at end of output to buffer.
798 */
799EAPI void
800ecore_exe_auto_limits_set(Ecore_Exe *exe,
801 int start_bytes,
802 int end_bytes,
803 int start_lines,
804 int end_lines)
805{
806 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
807 {
808 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_auto_limits_set");
809 return;
810 }
811 /* FIXME: sanitize the input. */
812 exe->start_bytes = start_bytes;
813 exe->end_bytes = end_bytes;
814 exe->start_lines = start_lines;
815 exe->end_lines = end_lines;
816
817 /* FIXME: get this can of worms working.
818 *
819 * capture stderr & stdout internally
820 *
821 * raster and onefang keep moving the goal posts on this one. It started out as
822 * "show users the error output if an exe fails" and is rapidly approaching
823 * "alternative method of getting the data, poll vs event driven". Some serious
824 * thinking needs to be applied to this. Do we really want to go that far? If
825 * so, we should change the names. The basic design will probably remain the
826 * same which ever way we go. The constant goal post moving is probably due to
827 * generic design methods leading to feature creep as we inspired each other to
828 * more generic designs. It does seem like the closer we get to poll driven,
829 * the more issues and corner cases there are.
830 *
831 * Instead of doing the usual register an event handler thing, we are ecore_exe,
832 * we can take some short cuts. Don't send the events, just leave the exe buffers
833 * as is until the user asks for them, then return the event.
834 *
835 * start = 0, end = 0; clogged arteries get flushed, everything is ignored.
836 * start = -1, end = -1; clogged arteries get transferred to internal buffers. Actually, either == -1 means buffer everything.
837 * start = X, end = 0; buffer first X out of clogged arteries, flush and ignore rest.
838 * start = 0, end = X; circular buffer X
839 * start = X, end = Y; buffer first X out of clogged arteries, circular buffer Y from beginning.
840 *
841 * bytes vs lines, which ever one reaches the limit first.
842 * Before we go beyond the start+end limit, leave the end buffer empty, and store both in the start buffer, coz they overlap.
843 * After we pass the the start+end limit, insert "\n...\n" at the end of the start buffer, copy the rest to the end buffer, then store in the end buffer.
844 *
845 * Other issues -
846 * Spank programmer for polling data if polling is not turned on.
847 * Spank programmer for setting up event callbacks if polling is turned on.
848 * Spank programmer for freeing the event data if it came from the event system, as that autofrees.
849 * Spank the programmer if they try to set the limits bigger than what has been gathered & ignored already, coz they just lost data.
850 * Spank onefang and raster for opening this can of worms.
851 * Should we have separate out/err limits?
852 * Should we remove from the internal buffer the data that was delivered already?
853 * If so, what to do about limits, start, and end? They could loose their meaning.
854 */
855}
856
857/**
858 * Gets the auto pipe data for the given process handle
859 *
860 * @param exe The given process handle.
861 * @param flags Is this a ECORE_EXE_PIPE_READ or ECORE_EXE_PIPE_ERROR?
862 */
863EAPI Ecore_Exe_Event_Data *
864ecore_exe_event_data_get(Ecore_Exe *exe,
865 Ecore_Exe_Flags flags)
866{
867 Ecore_Exe_Event_Data *e = NULL;
868 int is_buffered = 0;
869 unsigned char *inbuf;
870 int inbuf_num;
871
872 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
873 {
874 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_event_data_get");
875 return NULL;
876 }
877
878 /* Sort out what sort of event we are. */
879 if (flags & ECORE_EXE_PIPE_READ)
880 {
881 flags = ECORE_EXE_PIPE_READ;
882 if (exe->flags & ECORE_EXE_PIPE_READ_LINE_BUFFERED)
883 is_buffered = 1;
884 }
885 else
886 {
887 flags = ECORE_EXE_PIPE_ERROR;
888 if (exe->flags & ECORE_EXE_PIPE_ERROR_LINE_BUFFERED)
889 is_buffered = 1;
890 }
891
892 /* Get the data. */
893 if (flags & ECORE_EXE_PIPE_READ)
894 {
895 inbuf = exe->read_data_buf;
896 inbuf_num = exe->read_data_size;
897 exe->read_data_buf = NULL;
898 exe->read_data_size = 0;
899 }
900 else
901 {
902 inbuf = exe->error_data_buf;
903 inbuf_num = exe->error_data_size;
904 exe->error_data_buf = NULL;
905 exe->error_data_size = 0;
906 }
907
908 e = calloc(1, sizeof(Ecore_Exe_Event_Data));
909 if (e)
910 {
911 e->exe = exe;
912 e->data = inbuf;
913 e->size = inbuf_num;
914
915 if (is_buffered) /* Deal with line buffering. */
916 {
917 int max = 0;
918 int count = 0;
919 int i;
920 int last = 0;
921 char *c;
922
923 c = (char *)inbuf;
924 for (i = 0; i < inbuf_num; i++) /* Find the lines. */
925 {
926 if (inbuf[i] == '\n')
927 {
928 if (count >= max)
929 {
930 /* In testing, the lines seem to arrive in batches of 500 to 1000 lines at most, roughly speaking. */
931 max += 10; /* FIXME: Maybe keep track of the largest number of lines ever sent, and add half that many instead of 10. */
932 e->lines = realloc(e->lines, sizeof(Ecore_Exe_Event_Data_Line) * (max + 1)); /* Allow room for the NULL termination. */
933 }
934 /* raster said to leave the line endings as line endings, however -
935 * This is line buffered mode, we are not dealing with binary here, but lines.
936 * If we are not dealing with binary, we must be dealing with ASCII, unicode, or some other text format.
937 * Thus the user is most likely gonna deal with this text as strings.
938 * Thus the user is most likely gonna pass this data to str functions.
939 * rasters way - the endings are always gonna be '\n'; onefangs way - they will always be '\0'
940 * We are handing them the string length as a convenience.
941 * Thus if they really want it in raw format, they can e->lines[i].line[e->lines[i].size - 1] = '\n'; easily enough.
942 * In the default case, we can do this conversion quicker than the user can, as we already have the index and pointer.
943 * Let's make it easy on them to use these as standard C strings.
944 *
945 * onefang is proud to announce that he has just set a new personal record for the
946 * most over documentation of a simple assignment statement. B-)
947 */
948 inbuf[i] = '\0';
949 e->lines[count].line = c;
950 e->lines[count].size = i - last;
951 last = i + 1;
952 c = (char *)&inbuf[last];
953 count++;
954 }
955 }
956 if (i > last) /* Partial line left over, save it for next time. */
957 {
958 if (count != 0) e->size = last;
959 if (flags & ECORE_EXE_PIPE_READ)
960 {
961 exe->read_data_size = i - last;
962 exe->read_data_buf = malloc(exe->read_data_size);
963 memcpy(exe->read_data_buf, c, exe->read_data_size);
964 }
965 else
966 {
967 exe->error_data_size = i - last;
968 exe->error_data_buf = malloc(exe->error_data_size);
969 memcpy(exe->error_data_buf, c, exe->error_data_size);
970 }
971 }
972 if (count == 0) /* No lines to send, cancel the event. */
973 {
974 _ecore_exe_event_exe_data_free(NULL, e);
975 e = NULL;
976 }
977 else /* NULL terminate the array, so that people know where the end is. */
978 {
979 e->lines[count].line = NULL;
980 e->lines[count].size = 0;
981 }
982 }
983 }
984
985 return e;
986}
987
988/**
989 * Sets the string tag for the given process handle
990 *
991 * @param exe The given process handle.
992 * @param tag The string tag to set on the process handle.
993 */
994EAPI void
995ecore_exe_tag_set(Ecore_Exe *exe,
996 const char *tag)
997{
998 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
999 {
1000 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_set");
1001 return;
1002 }
1003 IF_FREE(exe->tag);
1004 if (tag)
1005 exe->tag = strdup(tag);
1006 else
1007 exe->tag = NULL;
1008}
1009
1010/**
1011 * Retrieves the tag attached to the given process handle. There is no need to
1012 * free it as it just returns the internal pointer value. This value is only
1013 * valid as long as the @p exe is valid or until the tag is set to something
1014 * else on this @p exe.
1015 *
1016 * @param exe The given process handle.
1017 * @return The string attached to @p exe. It is a handle to existing
1018 * internal string and should not be modified, use
1019 * ecore_exe_tag_set() to change it. It might be @c NULL.
1020 */
1021EAPI const char *
1022ecore_exe_tag_get(const Ecore_Exe *exe)
1023{
1024 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1025 {
1026 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_get");
1027 return NULL;
1028 }
1029 return exe->tag;
1030}
1031
1032/**
1033 * Frees the given process handle.
1034 *
1035 * Note that the process that the handle represents is unaffected by this
1036 * function.
1037 *
1038 * @param exe The given process handle.
1039 * @return The data attached to the handle when @ref ecore_exe_run was
1040 * called.
1041 */
1042EAPI void *
1043ecore_exe_free(Ecore_Exe *exe)
1044{
1045 void *data;
1046 int ok = 0;
1047 int result;
1048
1049 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1050 {
1051 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_free");
1052 return NULL;
1053 }
1054
1055 data = exe->data;
1056
1057 if (exe->pre_free_cb)
1058 exe->pre_free_cb(data, exe);
1059
1060 if (exe->doomsday_clock)
1061 {
1062 struct _ecore_exe_dead_exe *dead;
1063
1064 ecore_timer_del(exe->doomsday_clock);
1065 exe->doomsday_clock = NULL;
1066 dead = exe->doomsday_clock_dead;
1067 if (dead)
1068 {
1069 IF_FREE(dead->cmd);
1070 free(dead);
1071 exe->doomsday_clock_dead = NULL;
1072 }
1073 }
1074 IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
1075 IF_FN_DEL(ecore_main_fd_handler_del, exe->read_fd_handler);
1076 IF_FN_DEL(ecore_main_fd_handler_del, exe->error_fd_handler);
1077 if (exe->child_fd_write_x != -1)
1078 E_NO_ERRNO(result, close(exe->child_fd_write_x), ok);
1079 if (exe->child_fd_read_x != -1)
1080 E_NO_ERRNO(result, close(exe->child_fd_read_x), ok);
1081 if (exe->child_fd_error_x != -1)
1082 E_NO_ERRNO(result, close(exe->child_fd_error_x), ok);
1083 if (exe->child_fd_write != -1)
1084 E_NO_ERRNO(result, close(exe->child_fd_write), ok);
1085 if (exe->child_fd_read != -1)
1086 E_NO_ERRNO(result, close(exe->child_fd_read), ok);
1087 if (exe->child_fd_error != -1)
1088 E_NO_ERRNO(result, close(exe->child_fd_error), ok);
1089 IF_FREE(exe->write_data_buf);
1090 IF_FREE(exe->read_data_buf);
1091 IF_FREE(exe->error_data_buf);
1092 IF_FREE(exe->cmd);
1093
1094 exes = (Ecore_Exe *)eina_inlist_remove(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
1095 ECORE_MAGIC_SET(exe, ECORE_MAGIC_NONE);
1096 IF_FREE(exe->tag);
1097 free(exe);
1098 return data;
1099}
1100
1101/**
1102 * Frees the given event data.
1103 *
1104 * @param e The given event data.
1105 */
1106EAPI void
1107ecore_exe_event_data_free(Ecore_Exe_Event_Data *e)
1108{
1109 if (!e) return;
1110 IF_FREE(e->lines);
1111 IF_FREE(e->data);
1112 free(e);
1113}
1114
1115/**
1116 * Retrieves the process ID of the given spawned process.
1117 * @param exe Handle to the given spawned process.
1118 * @return The process ID on success. @c -1 otherwise.
1119 */
1120EAPI pid_t
1121ecore_exe_pid_get(const Ecore_Exe *exe)
1122{
1123 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1124 {
1125 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pid_get");
1126 return -1;
1127 }
1128 return exe->pid;
1129}
1130
1131/**
1132 * Retrieves the command of the given spawned process.
1133 * @param exe Handle to the given spawned process.
1134 * @return The command on success. NULL otherwise. This string is the
1135 * pointer to the internal value and must not be modified in
1136 * any way.
1137 */
1138EAPI const char *
1139ecore_exe_cmd_get(const Ecore_Exe *exe)
1140{
1141 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1142 {
1143 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_cmd_get");
1144 return NULL;
1145 }
1146 return exe->cmd;
1147}
1148
1149/**
1150 * Retrieves the data attached to the given process handle.
1151 * @param exe The given process handle.
1152 * @return The data pointer attached to @p exe Given to
1153 * ecore_exe_run() or ecore_exe_pipe_run()
1154 */
1155EAPI void *
1156ecore_exe_data_get(const Ecore_Exe *exe)
1157{
1158 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1159 {
1160 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
1161 return NULL;
1162 }
1163 return exe->data;
1164}
1165
1166/**
1167 * Sets the data attached to the given process handle.
1168 * @param exe The given process handle.
1169 * @param data The pointer to attach
1170 * @return The data pointer previously attached to @p exe with
1171 * ecore_exe_run(), ecore_exe_pipe_run(), or ecore_exe_data_set()
1172 * @since 1.1
1173 */
1174EAPI void *
1175ecore_exe_data_set(Ecore_Exe *exe,
1176 void *data)
1177{
1178 void *ret;
1179 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1180 {
1181 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, __func__);
1182 return NULL;
1183 }
1184 ret = exe->data;
1185 exe->data = data;
1186 return ret;
1187}
1188
1189/**
1190 * Retrieves the flags attached to the given process handle.
1191 * @param exe The given process handle.
1192 * @return The flags attached to @p exe.
1193 */
1194EAPI Ecore_Exe_Flags
1195ecore_exe_flags_get(const Ecore_Exe *exe)
1196{
1197 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1198 {
1199 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
1200 return 0;
1201 }
1202 return exe->flags;
1203}
1204
1205/**
1206 * Pauses the given process by sending it a @c SIGSTOP signal.
1207 * @param exe Process handle to the given process.
1208 */
1209EAPI void
1210ecore_exe_pause(Ecore_Exe *exe)
1211{
1212 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1213 {
1214 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pause");
1215 return;
1216 }
1217 kill(exe->pid, SIGSTOP);
1218}
1219
1220/**
1221 * Continues the given paused process by sending it a @c SIGCONT signal.
1222 * @param exe Process handle to the given process.
1223 */
1224EAPI void
1225ecore_exe_continue(Ecore_Exe *exe)
1226{
1227 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1228 {
1229 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_continue");
1230 return;
1231 }
1232 kill(exe->pid, SIGCONT);
1233}
1234
1235/**
1236 * Sends the given spawned process a interrupt (@c SIGINT) signal.
1237 * @param exe Process handle to the given process.
1238 */
1239EAPI void
1240ecore_exe_interrupt(Ecore_Exe *exe)
1241{
1242 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1243 {
1244 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_interrupt");
1245 return;
1246 }
1247 _ecore_exe_dead_attach(exe);
1248 kill(exe->pid, SIGINT);
1249}
1250
1251/**
1252 * Sends the given spawned process a quit (@c SIGQUIT) signal.
1253 * @param exe Process handle to the given process.
1254 */
1255EAPI void
1256ecore_exe_quit(Ecore_Exe *exe)
1257{
1258 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1259 {
1260 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_quit");
1261 return;
1262 }
1263 _ecore_exe_dead_attach(exe);
1264 kill(exe->pid, SIGQUIT);
1265}
1266
1267/**
1268 * Sends the given spawned process a terminate (@c SIGTERM) signal.
1269 * @param exe Process handle to the given process.
1270 */
1271EAPI void
1272ecore_exe_terminate(Ecore_Exe *exe)
1273{
1274 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1275 {
1276 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_terminate");
1277 return;
1278 }
1279 _ecore_exe_dead_attach(exe);
1280 INF("Sending TERM signal to %s (%d).", exe->cmd, exe->pid);
1281 kill(exe->pid, SIGTERM);
1282}
1283
1284/**
1285 * Kills the given spawned process by sending it a @c SIGKILL signal.
1286 * @param exe Process handle to the given process.
1287 */
1288EAPI void
1289ecore_exe_kill(Ecore_Exe *exe)
1290{
1291 struct _ecore_exe_dead_exe *dead;
1292
1293 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1294 {
1295 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_kill");
1296 return;
1297 }
1298
1299 dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
1300 if (dead)
1301 {
1302 dead->pid = exe->pid;
1303 dead->cmd = strdup(exe->cmd);
1304 IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
1305 exe->doomsday_clock =
1306 ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead, dead);
1307 }
1308
1309 INF("Sending KILL signal to %s (%d).", exe->cmd, exe->pid);
1310 kill(exe->pid, SIGKILL);
1311}
1312
1313/**
1314 * Sends a @c SIGUSR signal to the given spawned process.
1315 * @param exe Process handle to the given process.
1316 * @param num The number user signal to send. Must be either 1 or 2, or
1317 * the signal will be ignored.
1318 */
1319EAPI void
1320ecore_exe_signal(Ecore_Exe *exe,
1321 int num)
1322{
1323 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1324 {
1325 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_signal");
1326 return;
1327 }
1328 if (num == 1)
1329 kill(exe->pid, SIGUSR1);
1330 else if (num == 2)
1331 kill(exe->pid, SIGUSR2);
1332}
1333
1334/**
1335 * Sends a @c SIGHUP signal to the given spawned process.
1336 * @param exe Process handle to the given process.
1337 */
1338EAPI void
1339ecore_exe_hup(Ecore_Exe *exe)
1340{
1341 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1342 {
1343 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_hup");
1344 return;
1345 }
1346 kill(exe->pid, SIGHUP);
1347}
1348
1349/**
1350 * @}
1351 */
1352
1353static Ecore_Exe *
1354_ecore_exe_is_it_alive(pid_t pid)
1355{
1356 Ecore_Exe *exe = NULL;
1357
1358 /* FIXME: There is no nice, safe, OS independent way to tell if a
1359 * particular PID is still alive. I have written code to do so
1360 * for my urunlevel busybox applet (http://urunlevel.sourceforge.net/),
1361 * but it's for linux only, and still not guaranteed.
1362 *
1363 * So for now, we just check that a valid Ecore_Exe structure
1364 * exists for it. Even that is not a guarantee, as the structure
1365 * can be freed without killing the process.
1366 *
1367 * I think we can safely put exe's into two categories, those users
1368 * that care about the life of the exe, and the run and forget type.
1369 * The run and forget type starts up the exe, then free's the
1370 * Ecore_Exe structure straight away. They can never call any of
1371 * the functions that can call this, so we don't worry about them.
1372 *
1373 * Those user's that care about the life of exe's will keep the
1374 * Ecore_Exe structure around, terminate them eventually, or
1375 * register for exit events. For these ones the assumption
1376 * that valid Ecore_Exe struct == live exe is almost valid.
1377 *
1378 * I will probably copy my urunlevel code into here someday.
1379 */
1380 exe = _ecore_exe_find(pid);
1381 if (exe)
1382 {
1383 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
1384 exe = NULL;
1385 }
1386
1387 return exe;
1388}
1389
1390static Eina_Bool
1391_ecore_exe_make_sure_its_dead(void *data)
1392{
1393 struct _ecore_exe_dead_exe *dead;
1394
1395 dead = data;
1396 if (dead)
1397 {
1398 Ecore_Exe *exe = NULL;
1399
1400 if ((exe = _ecore_exe_is_it_alive(dead->pid)))
1401 {
1402 if (dead->cmd)
1403 INF("Sending KILL signal to allegedly dead %s (%d).",
1404 dead->cmd, dead->pid);
1405 else
1406 INF("Sending KILL signal to allegedly dead PID %d.",
1407 dead->pid);
1408 exe->doomsday_clock =
1409 ecore_timer_add(10.0, _ecore_exe_make_sure_its_really_dead,
1410 dead);
1411 kill(dead->pid, SIGKILL);
1412 }
1413 else
1414 {
1415 IF_FREE(dead->cmd);
1416 free(dead);
1417 }
1418 }
1419 return ECORE_CALLBACK_CANCEL;
1420}
1421
1422static Eina_Bool
1423_ecore_exe_make_sure_its_really_dead(void *data)
1424{
1425 struct _ecore_exe_dead_exe *dead;
1426
1427 dead = data;
1428 if (dead)
1429 {
1430 Ecore_Exe *exe = NULL;
1431
1432 if ((exe = _ecore_exe_is_it_alive(dead->pid)))
1433 {
1434 ERR("RUN! The zombie wants to eat your brains! And your CPU!");
1435 if (dead->cmd)
1436 INF("%s (%d) is not really dead.", dead->cmd, dead->pid);
1437 else
1438 INF("PID %d is not really dead.", dead->pid);
1439 exe->doomsday_clock = NULL;
1440 }
1441 IF_FREE(dead->cmd);
1442 free(dead);
1443 }
1444 return ECORE_CALLBACK_CANCEL;
1445}
1446
1447void
1448_ecore_exe_init(void)
1449{
1450 ECORE_EXE_EVENT_ADD = ecore_event_type_new();
1451 ECORE_EXE_EVENT_DEL = ecore_event_type_new();
1452 ECORE_EXE_EVENT_DATA = ecore_event_type_new();
1453 ECORE_EXE_EVENT_ERROR = ecore_event_type_new();
1454}
1455
1456void
1457_ecore_exe_shutdown(void)
1458{
1459 while (exes)
1460 ecore_exe_free(exes);
1461}
1462
1463Ecore_Exe *
1464_ecore_exe_find(pid_t pid)
1465{
1466 Ecore_Exe *exe;
1467
1468 EINA_INLIST_FOREACH(exes, exe)
1469 {
1470 if (exe->pid == pid)
1471 return exe;
1472 }
1473 return NULL;
1474}
1475
1476Ecore_Timer *
1477_ecore_exe_doomsday_clock_get(Ecore_Exe *exe)
1478{
1479 return exe->doomsday_clock;
1480}
1481
1482void
1483_ecore_exe_doomsday_clock_set(Ecore_Exe *exe,
1484 Ecore_Timer *dc)
1485{
1486 exe->doomsday_clock = dc;
1487}
1488
1489static inline void
1490_ecore_exe_exec_it(const char *exe_cmd,
1491 Ecore_Exe_Flags flags)
1492{
1493 char use_sh = 1;
1494 char *buf = NULL;
1495 char **args = NULL;
1496 int save_errno = 0;
1497
1498 /* So what is this doing?
1499 *
1500 * We are trying to avoid wrapping the exe call with /bin/sh -c.
1501 * We conservatively search for certain shell meta characters,
1502 * If we don't find them, we can call the exe directly.
1503 */
1504 if (!strpbrk(exe_cmd, "|&;<>()$`\\\"'*?#"))
1505 {
1506 char *token;
1507 char pre_command = 1;
1508 int num_tokens = 0;
1509
1510 if (!(buf = strdup(exe_cmd)))
1511 return;
1512
1513 token = strtok(buf, " \t\n\v");
1514 while (token)
1515 {
1516 if (token[0] == '~')
1517 break;
1518 if (pre_command)
1519 {
1520 if (token[0] == '[')
1521 break;
1522 if (strchr(token, '='))
1523 break;
1524 else
1525 pre_command = 0;
1526 }
1527 num_tokens++;
1528 token = strtok(NULL, " \t\n\v");
1529 }
1530 IF_FREE(buf);
1531 if ((!token) && (num_tokens))
1532 {
1533 int i = 0;
1534
1535 if (!(buf = strdup(exe_cmd)))
1536 return;
1537
1538 token = strtok(buf, " \t\n\v");
1539 use_sh = 0;
1540 if (!(args = (char **)calloc(num_tokens + 1, sizeof(char *))))
1541 {
1542 IF_FREE(buf);
1543 return;
1544 }
1545 for (i = 0; i < num_tokens; i++)
1546 {
1547 if (token)
1548 args[i] = token;
1549 token = strtok(NULL, " \t\n\v");
1550 }
1551 args[num_tokens] = NULL;
1552 }
1553 }
1554
1555#ifdef HAVE_SYS_PRCTL_H
1556 if ((flags & ECORE_EXE_TERM_WITH_PARENT))
1557 {
1558 prctl(PR_SET_PDEATHSIG, SIGTERM);
1559 }
1560#endif
1561
1562 if (!(flags & ECORE_EXE_NOT_LEADER)) setsid();
1563 if ((flags & ECORE_EXE_USE_SH))
1564 {
1565 errno = 0;
1566 execl("/bin/sh", "/bin/sh", "-c", exe_cmd, (char *)NULL);
1567 }
1568 else if (use_sh) /* We have to use a shell to run this. */
1569 {
1570 if (!shell) /* Find users preferred shell. */
1571 {
1572 shell = getenv("SHELL");
1573 if (!shell)
1574 shell = "/bin/sh";
1575 }
1576 errno = 0;
1577 execl(shell, shell, "-c", exe_cmd, (char *)NULL);
1578 }
1579 else
1580 { /* We can run this directly. */
1581 if (!args)
1582 {
1583 IF_FREE(buf);
1584 IF_FREE(args);
1585 ERR("arg[0] is NULL!");
1586 return;
1587 }
1588 errno = 0;
1589 execvp(args[0], args);
1590 }
1591
1592 save_errno = errno;
1593 IF_FREE(buf);
1594 IF_FREE(args);
1595 errno = save_errno;
1596 return;
1597}
1598
1599static Eina_Bool
1600_ecore_exe_data_generic_handler(void *data,
1601 Ecore_Fd_Handler *fd_handler,
1602 Ecore_Exe_Flags flags)
1603{
1604 Ecore_Exe *exe;
1605 int child_fd;
1606 int event_type;
1607
1608 exe = data;
1609
1610 /* Sort out what sort of handler we are. */
1611 if (flags & ECORE_EXE_PIPE_READ)
1612 {
1613 flags = ECORE_EXE_PIPE_READ;
1614 event_type = ECORE_EXE_EVENT_DATA;
1615 child_fd = exe->child_fd_read;
1616 }
1617 else
1618 {
1619 flags = ECORE_EXE_PIPE_ERROR;
1620 event_type = ECORE_EXE_EVENT_ERROR;
1621 child_fd = exe->child_fd_error;
1622 }
1623
1624 if ((fd_handler)
1625 && (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)))
1626 {
1627 unsigned char *inbuf;
1628 int inbuf_num;
1629
1630 /* Get any left over data from last time. */
1631 if (flags & ECORE_EXE_PIPE_READ)
1632 {
1633 inbuf = exe->read_data_buf;
1634 inbuf_num = exe->read_data_size;
1635 exe->read_data_buf = NULL;
1636 exe->read_data_size = 0;
1637 }
1638 else
1639 {
1640 inbuf = exe->error_data_buf;
1641 inbuf_num = exe->error_data_size;
1642 exe->error_data_buf = NULL;
1643 exe->error_data_size = 0;
1644 }
1645
1646 for (;; )
1647 {
1648 int num, lost_exe;
1649 char buf[READBUFSIZ];
1650
1651 lost_exe = 0;
1652 errno = 0;
1653 if ((num = read(child_fd, buf, READBUFSIZ)) < 1)
1654 {
1655 /* FIXME: SPEED/SIZE TRADE OFF - add a smaller READBUFSIZE
1656 * (currently 64k) to inbuf, use that instead of buf, and
1657 * save ourselves a memcpy(). */
1658 lost_exe = ((errno == EIO) ||
1659 (errno == EBADF) ||
1660 (errno == EPIPE) ||
1661 (errno == EINVAL) || (errno == ENOSPC));
1662 if ((errno != EAGAIN) && (errno != EINTR))
1663 perror("_ecore_exe_generic_handler() read problem ");
1664 }
1665 if (num > 0) /* data got read. */
1666 {
1667 inbuf = realloc(inbuf, inbuf_num + num);
1668 memcpy(inbuf + inbuf_num, buf, num);
1669 inbuf_num += num;
1670 }
1671 else
1672 { /* No more data to read. */
1673 if (inbuf)
1674 {
1675 Ecore_Exe_Event_Data *e;
1676
1677 /* Stash the data away for later. */
1678 if (flags & ECORE_EXE_PIPE_READ)
1679 {
1680 exe->read_data_buf = inbuf;
1681 exe->read_data_size = inbuf_num;
1682 }
1683 else
1684 {
1685 exe->error_data_buf = inbuf;
1686 exe->error_data_size = inbuf_num;
1687 }
1688
1689 if (!(exe->flags & ECORE_EXE_PIPE_AUTO))
1690 {
1691 e = ecore_exe_event_data_get(exe, flags);
1692 if (e) /* Send the event. */
1693 ecore_event_add(event_type, e,
1694 _ecore_exe_event_exe_data_free,
1695 NULL);
1696 }
1697 }
1698 if (lost_exe)
1699 {
1700 if (flags & ECORE_EXE_PIPE_READ)
1701 {
1702 if (exe->read_data_size)
1703 INF("There are %d bytes left unsent from the dead exe %s.",
1704 exe->read_data_size, exe->cmd);
1705 }
1706 else
1707 {
1708 if (exe->error_data_size)
1709 INF("There are %d bytes left unsent from the dead exe %s.",
1710 exe->error_data_size, exe->cmd);
1711 }
1712 /* Thought about this a bit. If the exe has actually
1713 * died, this won't do any harm as it must have died
1714 * recently and the pid has not had a chance to recycle.
1715 * It is also a paranoid catchall, coz the usual ecore_signal
1716 * mechenism should kick in. But let's give it a good
1717 * kick in the head anyway.
1718 */
1719 ecore_exe_terminate(exe);
1720 }
1721 break;
1722 }
1723 }
1724 }
1725
1726 return ECORE_CALLBACK_RENEW;
1727}
1728
1729static Eina_Bool
1730_ecore_exe_data_error_handler(void *data,
1731 Ecore_Fd_Handler *fd_handler)
1732{
1733 return _ecore_exe_data_generic_handler(data, fd_handler,
1734 ECORE_EXE_PIPE_ERROR);
1735}
1736
1737static Eina_Bool
1738_ecore_exe_data_read_handler(void *data,
1739 Ecore_Fd_Handler *fd_handler)
1740{
1741 return _ecore_exe_data_generic_handler(data, fd_handler,
1742 ECORE_EXE_PIPE_READ);
1743}
1744
1745static Eina_Bool
1746_ecore_exe_data_write_handler(void *data,
1747 Ecore_Fd_Handler *fd_handler __UNUSED__)
1748{
1749 Ecore_Exe *exe;
1750
1751 exe = data;
1752 if ((exe->write_fd_handler) &&
1753 (ecore_main_fd_handler_active_get
1754 (exe->write_fd_handler, ECORE_FD_WRITE)))
1755 _ecore_exe_flush(exe);
1756
1757 /* If we have sent all there is to send, and we need to close the pipe, then close it. */
1758 if ((exe->close_stdin == 1)
1759 && (exe->write_data_size == exe->write_data_offset))
1760 {
1761 int ok = 0;
1762 int result;
1763
1764 INF("Closing stdin for %s", exe->cmd);
1765 /* if (exe->child_fd_write != -1) E_NO_ERRNO(result, fsync(exe->child_fd_write), ok); This a) doesn't work, and b) isn't needed. */
1766 IF_FN_DEL(ecore_main_fd_handler_del, exe->write_fd_handler);
1767 if (exe->child_fd_write != -1)
1768 E_NO_ERRNO(result, close(exe->child_fd_write), ok);
1769 exe->child_fd_write = -1;
1770 IF_FREE(exe->write_data_buf);
1771 }
1772
1773 return ECORE_CALLBACK_RENEW;
1774}
1775
1776static void
1777_ecore_exe_flush(Ecore_Exe *exe)
1778{
1779 int count;
1780
1781 /* check whether we need to write anything at all. */
1782 if ((exe->child_fd_write == -1) || (!exe->write_data_buf))
1783 return;
1784 if (exe->write_data_size == exe->write_data_offset)
1785 return;
1786
1787 count = write(exe->child_fd_write,
1788 (char *)exe->write_data_buf + exe->write_data_offset,
1789 exe->write_data_size - exe->write_data_offset);
1790 if (count < 1)
1791 {
1792 if (errno == EIO || errno == EBADF || errno == EPIPE || errno == EINVAL || errno == ENOSPC) /* we lost our exe! */
1793 {
1794 ecore_exe_terminate(exe);
1795 if (exe->write_fd_handler)
1796 ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
1797 }
1798 }
1799 else
1800 {
1801 exe->write_data_offset += count;
1802 if (exe->write_data_offset >= exe->write_data_size) /* Nothing left to write, clean up. */
1803 {
1804 exe->write_data_size = 0;
1805 exe->write_data_offset = 0;
1806 IF_FREE(exe->write_data_buf);
1807 if (exe->write_fd_handler)
1808 ecore_main_fd_handler_active_set(exe->write_fd_handler, 0);
1809 }
1810 }
1811}
1812
1813static void
1814_ecore_exe_event_exe_data_free(void *data __UNUSED__,
1815 void *ev)
1816{
1817 Ecore_Exe_Event_Data *e;
1818
1819 e = ev;
1820 ecore_exe_event_data_free(e);
1821}
1822
1823static Ecore_Exe_Event_Add *
1824_ecore_exe_event_add_new(void)
1825{
1826 Ecore_Exe_Event_Add *e;
1827
1828 e = calloc(1, sizeof(Ecore_Exe_Event_Add));
1829 return e;
1830}
1831
1832static void
1833_ecore_exe_event_add_free(void *data __UNUSED__,
1834 void *ev)
1835{
1836 Ecore_Exe_Event_Add *e;
1837
1838 e = ev;
1839 free(e);
1840}
1841
1842void *
1843_ecore_exe_event_del_new(void)
1844{
1845 Ecore_Exe_Event_Del *e;
1846
1847 e = calloc(1, sizeof(Ecore_Exe_Event_Del));
1848 return e;
1849}
1850
1851void
1852_ecore_exe_event_del_free(void *data __UNUSED__,
1853 void *ev)
1854{
1855 Ecore_Exe_Event_Del *e;
1856
1857 e = ev;
1858 if (e->exe)
1859 ecore_exe_free(e->exe);
1860 free(e);
1861}
1862
1863static void
1864_ecore_exe_dead_attach(Ecore_Exe *exe)
1865{
1866 struct _ecore_exe_dead_exe *dead;
1867
1868 if (exe->doomsday_clock_dead) return;
1869 dead = calloc(1, sizeof(struct _ecore_exe_dead_exe));
1870 if (dead)
1871 {
1872 dead->pid = exe->pid;
1873 dead->cmd = strdup(exe->cmd);
1874 IF_FN_DEL(ecore_timer_del, exe->doomsday_clock);
1875 exe->doomsday_clock =
1876 ecore_timer_add(10.0, _ecore_exe_make_sure_its_dead, dead);
1877 exe->doomsday_clock_dead = dead;
1878 }
1879}
1880
diff --git a/libraries/ecore/src/lib/ecore/ecore_exe_ps3.c b/libraries/ecore/src/lib/ecore/ecore_exe_ps3.c
new file mode 100644
index 0000000..1ef1e81
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_exe_ps3.c
@@ -0,0 +1,20 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#ifdef HAVE_ESCAPE
6# include <Escape.h>
7#endif
8
9#include "Ecore.h"
10#include "ecore_private.h"
11
12void
13_ecore_exe_init(void)
14{
15}
16
17void
18_ecore_exe_shutdown(void)
19{
20}
diff --git a/libraries/ecore/src/lib/ecore/ecore_exe_win32.c b/libraries/ecore/src/lib/ecore/ecore_exe_win32.c
new file mode 100644
index 0000000..1f5cb4e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_exe_win32.c
@@ -0,0 +1,1055 @@
1/*
2 * TODO:
3 * - manage I/O pipes (several ones, and stdin)
4 * - manage SetConsoleCtrlHandler ?
5 * - the child process seems to still run after the DEL event
6 * - add log messages
7 */
8
9#ifdef HAVE_CONFIG_H
10# include <config.h>
11#endif
12
13#ifdef HAVE_EVIL
14# include <Evil.h>
15#endif
16
17#include "Ecore.h"
18#include "ecore_private.h"
19
20#define WIN32_LEAN_AND_MEAN
21#include <windows.h>
22#undef WIN32_LEAN_AND_MEAN
23#include <process.h>
24
25#define ECORE_EXE_WIN32_TIMEOUT 3000
26
27typedef enum
28{
29 ECORE_EXE_WIN32_SIGINT,
30 ECORE_EXE_WIN32_SIGQUIT,
31 ECORE_EXE_WIN32_SIGTERM,
32 ECORE_EXE_WIN32_SIGKILL
33} Ecore_Exe_Win32_Signal;
34
35struct _Ecore_Exe
36{
37 EINA_INLIST;
38 ECORE_MAGIC;
39
40 HANDLE process2;
41 HANDLE process; /* CloseHandle */
42 HANDLE process_thread;
43 DWORD process_id;
44 DWORD thread_id;
45 void *data;
46 char *tag;
47 char *cmd;
48 Ecore_Exe_Flags flags;
49 Ecore_Exe_Win32_Signal sig;
50 Ecore_Win32_Handler *h_close;
51 struct
52 {
53 HANDLE child_pipe;
54 HANDLE child_pipe_x;
55 Ecore_Pipe *p;
56 HANDLE thread;
57 void *data_buf;
58 int data_size;
59 } pipe_read;
60 struct
61 {
62 HANDLE child_pipe;
63 HANDLE child_pipe_x;
64 HANDLE thread;
65 Ecore_Win32_Handler *h;
66 void *data_buf;
67 int data_size;
68 } pipe_write;
69 struct
70 {
71 HANDLE child_pipe;
72 HANDLE child_pipe_x;
73 Ecore_Pipe *p;
74 HANDLE thread;
75 void *data_buf;
76 int data_size;
77 } pipe_error;
78 Eina_Bool close_stdin : 1;
79 Eina_Bool is_suspended : 1;
80
81 Ecore_Exe_Cb pre_free_cb;
82};
83
84static Ecore_Exe *exes = NULL;
85
86static int _ecore_exe_win32_pipes_set(Ecore_Exe *exe);
87static void _ecore_exe_win32_pipes_close(Ecore_Exe *exe);
88
89static BOOL CALLBACK _ecore_exe_enum_windows_procedure(HWND window,
90 LPARAM data);
91static void _ecore_exe_event_add_free(void *data,
92 void *ev);
93static void _ecore_exe_event_del_free(void *data,
94 void *ev);
95static void _ecore_exe_event_exe_data_free(void *data,
96 void *ev);
97static int _ecore_exe_win32_pipe_thread_generic_cb(void *data,
98 Ecore_Exe_Flags flags);
99static DWORD WINAPI _ecore_exe_win32_pipe_thread_read_cb(void *data);
100static DWORD WINAPI _ecore_exe_win32_pipe_thread_error_cb(void *data);
101static Eina_Bool _ecore_exe_close_cb(void *data,
102 Ecore_Win32_Handler *wh);
103static void _ecore_exe_pipe_read_cb(void *data,
104 void *buf,
105 unsigned int size);
106static int _ecore_exe_pipe_write_cb(void *data,
107 Ecore_Win32_Handler *wh);
108static void _ecore_exe_pipe_error_cb(void *data,
109 void *buf,
110 unsigned int size);
111
112EAPI int ECORE_EXE_EVENT_ADD = 0;
113EAPI int ECORE_EXE_EVENT_DEL = 0;
114EAPI int ECORE_EXE_EVENT_DATA = 0;
115EAPI int ECORE_EXE_EVENT_ERROR = 0;
116
117void
118_ecore_exe_init(void)
119{
120 ECORE_EXE_EVENT_ADD = ecore_event_type_new();
121 ECORE_EXE_EVENT_DEL = ecore_event_type_new();
122 ECORE_EXE_EVENT_DATA = ecore_event_type_new();
123 ECORE_EXE_EVENT_ERROR = ecore_event_type_new();
124}
125
126void
127_ecore_exe_shutdown(void)
128{
129 while (exes)
130 ecore_exe_free(exes);
131}
132
133static int run_pri = NORMAL_PRIORITY_CLASS;
134
135EAPI void
136ecore_exe_run_priority_set(int pri)
137{
138 switch (pri)
139 {
140 case ECORE_EXE_WIN32_PRIORITY_IDLE:
141 run_pri = IDLE_PRIORITY_CLASS;
142 break;
143
144 case ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL:
145 run_pri = BELOW_NORMAL_PRIORITY_CLASS;
146 break;
147
148 case ECORE_EXE_WIN32_PRIORITY_NORMAL:
149 run_pri = NORMAL_PRIORITY_CLASS;
150 break;
151
152 case ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL:
153 run_pri = ABOVE_NORMAL_PRIORITY_CLASS;
154 break;
155
156 case ECORE_EXE_WIN32_PRIORITY_HIGH:
157 run_pri = HIGH_PRIORITY_CLASS;
158 break;
159
160 case ECORE_EXE_WIN32_PRIORITY_REALTIME:
161 run_pri = REALTIME_PRIORITY_CLASS;
162 break;
163
164 default:
165 break;
166 }
167}
168
169EAPI int
170ecore_exe_run_priority_get(void)
171{
172 switch (run_pri)
173 {
174 case IDLE_PRIORITY_CLASS:
175 return ECORE_EXE_WIN32_PRIORITY_IDLE;
176
177 case BELOW_NORMAL_PRIORITY_CLASS:
178 return ECORE_EXE_WIN32_PRIORITY_BELOW_NORMAL;
179
180 case NORMAL_PRIORITY_CLASS:
181 return ECORE_EXE_WIN32_PRIORITY_NORMAL;
182
183 case ABOVE_NORMAL_PRIORITY_CLASS:
184 return ECORE_EXE_WIN32_PRIORITY_ABOVE_NORMAL;
185
186 case HIGH_PRIORITY_CLASS:
187 return ECORE_EXE_WIN32_PRIORITY_HIGH;
188
189 case REALTIME_PRIORITY_CLASS:
190 return ECORE_EXE_WIN32_PRIORITY_REALTIME;
191
192 /* default should not be reached */
193 default:
194 return ECORE_EXE_WIN32_PRIORITY_NORMAL;
195 }
196}
197
198EAPI Ecore_Exe *
199ecore_exe_run(const char *exe_cmd,
200 const void *data)
201{
202 return ecore_exe_pipe_run(exe_cmd, 0, data);
203}
204
205EAPI Ecore_Exe *
206ecore_exe_pipe_run(const char *exe_cmd,
207 Ecore_Exe_Flags flags,
208 const void *data)
209{
210 STARTUPINFO si;
211 PROCESS_INFORMATION pi;
212 Ecore_Exe_Event_Add *e;
213 Ecore_Exe *exe;
214 char *ret = NULL;
215
216 exe = calloc(1, sizeof(Ecore_Exe));
217 if (!exe)
218 return NULL;
219
220 if ((flags & ECORE_EXE_PIPE_AUTO) && (!(flags & ECORE_EXE_PIPE_ERROR))
221 && (!(flags & ECORE_EXE_PIPE_READ)))
222 /* We need something to auto pipe. */
223 flags |= ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR;
224
225 exe->flags = flags;
226 if (exe->flags & ECORE_EXE_PIPE_READ)
227 if (!_ecore_exe_win32_pipes_set(exe))
228 goto free_exe;
229
230 if (exe->flags & ECORE_EXE_PIPE_WRITE)
231 if (!_ecore_exe_win32_pipes_set(exe))
232 goto close_pipes;
233
234 if (exe->flags & ECORE_EXE_PIPE_ERROR)
235 if (!_ecore_exe_win32_pipes_set(exe))
236 goto close_pipes;
237
238 if ((exe->flags & ECORE_EXE_USE_SH) ||
239 ((ret = strrstr(exe_cmd, ".bat")) && (ret[4] == '\0')))
240 {
241 char buf[PATH_MAX];
242 snprintf(buf, PATH_MAX, "cmd.exe /c %s", exe_cmd);
243 exe->cmd = strdup(buf);
244 }
245 else
246 exe->cmd = strdup(exe_cmd);
247
248 if (!exe->cmd)
249 goto close_pipes;
250
251 ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
252
253 ZeroMemory(&si, sizeof(STARTUPINFO));
254 si.cb = sizeof(STARTUPINFO);
255 si.hStdOutput = exe->pipe_read.child_pipe_x;
256 si.hStdInput = exe->pipe_write.child_pipe;
257 si.hStdError = exe->pipe_error.child_pipe_x;
258 si.dwFlags |= STARTF_USESTDHANDLES;
259
260 /* FIXME: gerer la priorite */
261
262 if (!CreateProcess(NULL, exe->cmd, NULL, NULL, EINA_TRUE,
263 run_pri | CREATE_SUSPENDED, NULL, NULL, &si, &pi))
264 goto free_exe_cmd;
265
266 /* be sure that the child process is running */
267 /* FIXME: This does not work if the child is an EFL-based app */
268 /* if (WaitForInputIdle(pi.hProcess, INFINITE) == WAIT_FAILED) */
269 /* goto free_exe_cmd; */
270
271 ECORE_MAGIC_SET(exe, ECORE_MAGIC_EXE);
272 exe->process = pi.hProcess;
273 exe->process_thread = pi.hThread;
274 exe->process_id = pi.dwProcessId;
275 exe->thread_id = pi.dwThreadId;
276 exe->data = (void *)data;
277
278 if (!(exe->process2 = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_SUSPEND_RESUME | PROCESS_TERMINATE | SYNCHRONIZE,
279 EINA_FALSE, pi.dwProcessId)))
280 goto close_thread;
281
282 exe->h_close = ecore_main_win32_handler_add(exe->process2, _ecore_exe_close_cb, exe);
283 if (!exe->h_close) goto close_process2;
284
285 if (ResumeThread(exe->process_thread) == ((DWORD)-1))
286 goto close_process2;
287
288 exes = (Ecore_Exe *)eina_inlist_append(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
289
290 e = (Ecore_Exe_Event_Add *)calloc(1, sizeof(Ecore_Exe_Event_Add));
291 if (!e) goto delete_h_close;
292
293 e->exe = exe;
294 ecore_event_add(ECORE_EXE_EVENT_ADD, e,
295 _ecore_exe_event_add_free, NULL);
296
297 return exe;
298
299delete_h_close:
300 ecore_main_win32_handler_del(exe->h_close);
301close_process2:
302 CloseHandle(exe->process2);
303close_thread:
304 CloseHandle(exe->process_thread);
305 CloseHandle(exe->process);
306free_exe_cmd:
307 free(exe->cmd);
308close_pipes:
309 _ecore_exe_win32_pipes_close(exe);
310free_exe:
311 free(exe);
312 return NULL;
313}
314
315EAPI void
316ecore_exe_callback_pre_free_set(Ecore_Exe *exe,
317 Ecore_Exe_Cb func)
318{
319 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
320 {
321 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE,
322 "ecore_exe_callback_pre_free_set");
323 return;
324 }
325 exe->pre_free_cb = func;
326}
327
328EAPI Eina_Bool
329ecore_exe_send(Ecore_Exe *exe,
330 const void *data,
331 int size)
332{
333 void *buf;
334
335 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
336 {
337 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_send");
338 return 0;
339 }
340
341 if (exe->close_stdin)
342 {
343 ERR("Ecore_Exe %p stdin is closed! Cannot send %d bytes from %p",
344 exe, size, data);
345 return 0;
346 }
347
348 if (!exe->pipe_write.child_pipe)
349 {
350 ERR("Ecore_Exe %p created without ECORE_EXE_PIPE_WRITE! "
351 "Cannot send %d bytes from %p", exe, size, data);
352 return 0;
353 }
354
355 buf = realloc(exe->pipe_write.data_buf, exe->pipe_write.data_size + size);
356 if (!buf) return 0;
357
358 exe->pipe_write.data_buf = buf;
359 memcpy((char *)exe->pipe_write.data_buf + exe->pipe_write.data_size, data, size);
360 exe->pipe_write.data_size += size;
361
362 /* if (exe->pipe_write.) */
363 /* ecore_main_fd_handler_active_set(exe->pipe_write.h, ECORE_FD_WRITE); */
364
365 return 1;
366}
367
368EAPI void
369ecore_exe_close_stdin(Ecore_Exe *exe)
370{
371 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
372 {
373 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_close_stdin");
374 return;
375 }
376 exe->close_stdin = 1;
377}
378
379/* Not used on Windows */
380EAPI void
381ecore_exe_auto_limits_set(Ecore_Exe *exe __UNUSED__,
382 int start_bytes __UNUSED__,
383 int end_bytes __UNUSED__,
384 int start_lines __UNUSED__,
385 int end_lines __UNUSED__)
386{
387}
388
389EAPI Ecore_Exe_Event_Data *
390ecore_exe_event_data_get(Ecore_Exe *exe,
391 Ecore_Exe_Flags flags)
392{
393 Ecore_Exe_Event_Data *e = NULL;
394 unsigned char *inbuf;
395 int inbuf_num;
396
397 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
398 {
399 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_event_data_get");
400 return NULL;
401 }
402
403 /* Sort out what sort of event we are, */
404 /* And get the data. */
405 if (flags & ECORE_EXE_PIPE_READ)
406 {
407 inbuf = exe->pipe_read.data_buf;
408 inbuf_num = exe->pipe_read.data_size;
409 exe->pipe_read.data_buf = NULL;
410 exe->pipe_read.data_size = 0;
411 }
412 else
413 {
414 inbuf = exe->pipe_error.data_buf;
415 inbuf_num = exe->pipe_error.data_size;
416 exe->pipe_error.data_buf = NULL;
417 exe->pipe_error.data_size = 0;
418 }
419
420 e = calloc(1, sizeof(Ecore_Exe_Event_Data));
421 if (e)
422 {
423 e->exe = exe;
424 e->data = inbuf;
425 e->size = inbuf_num;
426 }
427
428 return e;
429}
430
431EAPI void
432ecore_exe_event_data_free(Ecore_Exe_Event_Data *e)
433{
434 if (!e) return;
435 IF_FREE(e->lines);
436 IF_FREE(e->data);
437 free(e);
438}
439
440EAPI void *
441ecore_exe_free(Ecore_Exe *exe)
442{
443 void *data;
444
445 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
446 {
447 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_free");
448 return NULL;
449 }
450
451 data = exe->data;
452
453 if (exe->pre_free_cb)
454 exe->pre_free_cb(data, exe);
455
456 CloseHandle(exe->process2);
457 CloseHandle(exe->process_thread);
458 CloseHandle(exe->process);
459 free(exe->cmd);
460 _ecore_exe_win32_pipes_close(exe);
461 exes = (Ecore_Exe *)eina_inlist_remove(EINA_INLIST_GET(exes), EINA_INLIST_GET(exe));
462 ECORE_MAGIC_SET(exe, ECORE_MAGIC_NONE);
463 if (exe->tag) free(exe->tag);
464 free(exe);
465
466 return data;
467}
468
469EAPI pid_t
470ecore_exe_pid_get(const Ecore_Exe *exe)
471{
472 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
473 {
474 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pid_get");
475 return -1;
476 }
477 return exe->process_id;
478}
479
480EAPI void
481ecore_exe_tag_set(Ecore_Exe *exe,
482 const char *tag)
483{
484 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
485 {
486 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_set");
487 return;
488 }
489 IF_FREE(exe->tag);
490 if (tag)
491 exe->tag = strdup(tag);
492}
493
494EAPI const char *
495ecore_exe_tag_get(const Ecore_Exe *exe)
496{
497 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
498 {
499 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_tag_get");
500 return NULL;
501 }
502 return exe->tag;
503}
504
505EAPI const char *
506ecore_exe_cmd_get(const Ecore_Exe *exe)
507{
508 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
509 {
510 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_cmd_get");
511 return NULL;
512 }
513 return exe->cmd;
514}
515
516EAPI void *
517ecore_exe_data_get(const Ecore_Exe *exe)
518{
519 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
520 {
521 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
522 return NULL;
523 }
524 return exe->data;
525}
526
527EAPI Ecore_Exe_Flags
528ecore_exe_flags_get(const Ecore_Exe *exe)
529{
530 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
531 {
532 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_data_get");
533 return 0;
534 }
535 return exe->flags;
536}
537
538EAPI void
539ecore_exe_pause(Ecore_Exe *exe)
540{
541 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
542 {
543 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_pause");
544 return;
545 }
546
547 if (exe->is_suspended)
548 return;
549
550 if (SuspendThread(exe->process_thread) != (DWORD)-1)
551 exe->is_suspended = 1;
552}
553
554EAPI void
555ecore_exe_continue(Ecore_Exe *exe)
556{
557 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
558 {
559 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_continue");
560 return;
561 }
562
563 if (!exe->is_suspended)
564 return;
565
566 if (ResumeThread(exe->process_thread) != (DWORD)-1)
567 exe->is_suspended = 0;
568}
569
570EAPI void
571ecore_exe_interrupt(Ecore_Exe *exe)
572{
573 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
574 {
575 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_interrupt");
576 return;
577 }
578
579 CloseHandle(exe->process_thread);
580 CloseHandle(exe->process);
581 exe->sig = ECORE_EXE_WIN32_SIGINT;
582 while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
583}
584
585EAPI void
586ecore_exe_quit(Ecore_Exe *exe)
587{
588 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
589 {
590 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_quit");
591 return;
592 }
593
594 CloseHandle(exe->process_thread);
595 CloseHandle(exe->process);
596 exe->sig = ECORE_EXE_WIN32_SIGQUIT;
597 while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
598}
599
600EAPI void
601ecore_exe_terminate(Ecore_Exe *exe)
602{
603 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
604 {
605 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_terminate");
606 return;
607 }
608
609/* CloseHandle(exe->thread); */
610 CloseHandle(exe->process);
611 exe->sig = ECORE_EXE_WIN32_SIGTERM;
612 while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
613}
614
615EAPI void
616ecore_exe_kill(Ecore_Exe *exe)
617{
618 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
619 {
620 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_kill");
621 return;
622 }
623
624 CloseHandle(exe->process_thread);
625 CloseHandle(exe->process);
626 exe->sig = ECORE_EXE_WIN32_SIGKILL;
627 while (EnumWindows(_ecore_exe_enum_windows_procedure, (LPARAM)exe)) ;
628}
629
630EAPI void
631ecore_exe_signal(Ecore_Exe *exe,
632 int num __UNUSED__)
633{
634 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
635 {
636 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_signal");
637 return;
638 }
639
640 /* does nothing */
641}
642
643EAPI void
644ecore_exe_hup(Ecore_Exe *exe)
645{
646 if (!ECORE_MAGIC_CHECK(exe, ECORE_MAGIC_EXE))
647 {
648 ECORE_MAGIC_FAIL(exe, ECORE_MAGIC_EXE, "ecore_exe_hup");
649 return;
650 }
651
652 /* does nothing */
653}
654
655/* FIXME: manage error mode */
656static int
657_ecore_exe_win32_pipe_thread_generic_cb(void *data,
658 Ecore_Exe_Flags flags)
659{
660#define BUFSIZE 2048
661 char buf[BUFSIZE];
662 Ecore_Exe *exe;
663 char *current_buf = NULL;
664 HANDLE child_pipe;
665 Ecore_Pipe *ecore_pipe;
666 Ecore_Exe_Event_Data *event;
667 DWORD size;
668 DWORD current_size = 0;
669 BOOL res;
670
671 exe = (Ecore_Exe *)data;
672
673 /* Sort out what sort of handler we are. */
674 /* And get any left over data from last time. */
675 if ((exe->flags & ECORE_EXE_PIPE_READ) && (flags == ECORE_EXE_PIPE_READ))
676 {
677 child_pipe = exe->pipe_read.child_pipe;
678 ecore_pipe = exe->pipe_read.p;
679 flags = ECORE_EXE_PIPE_READ;
680 }
681 else if ((exe->flags & ECORE_EXE_PIPE_ERROR) && (flags == ECORE_EXE_PIPE_ERROR))
682 {
683 child_pipe = exe->pipe_error.child_pipe;
684 ecore_pipe = exe->pipe_error.p;
685 flags = ECORE_EXE_PIPE_ERROR;
686 }
687 else
688 return 0;
689
690 while (1)
691 {
692 if (!PeekNamedPipe(child_pipe, buf, sizeof(buf), &size, &current_size, NULL))
693 continue;
694 if (size == 0)
695 continue;
696 current_buf = (char *)malloc(current_size);
697 if (!current_buf)
698 continue;
699 res = ReadFile(child_pipe, current_buf, current_size, &size, NULL);
700 if (!res || (size == 0))
701 {
702 free(current_buf);
703 current_buf = NULL;
704 continue;
705 }
706 if (current_size != size)
707 {
708 free(current_buf);
709 current_buf = NULL;
710 continue;
711 }
712 current_size = size;
713
714 if (flags == ECORE_EXE_PIPE_READ)
715 {
716 exe->pipe_read.data_buf = current_buf;
717 exe->pipe_read.data_size = current_size;
718 }
719 else
720 {
721 exe->pipe_error.data_buf = current_buf;
722 exe->pipe_error.data_size = current_size;
723 }
724
725 event = ecore_exe_event_data_get(exe, flags);
726 if (event)
727 ecore_pipe_write(ecore_pipe, &event, sizeof(event));
728
729 current_buf = NULL;
730 current_size = 0;
731 }
732
733 return 1;
734}
735
736static DWORD WINAPI
737_ecore_exe_win32_pipe_thread_read_cb(void *data)
738{
739 return _ecore_exe_win32_pipe_thread_generic_cb(data, ECORE_EXE_PIPE_READ);
740}
741
742static DWORD WINAPI
743_ecore_exe_win32_pipe_thread_error_cb(void *data)
744{
745 return _ecore_exe_win32_pipe_thread_generic_cb(data, ECORE_EXE_PIPE_ERROR);
746}
747
748static int
749_ecore_exe_win32_pipes_set(Ecore_Exe *exe)
750{
751 SECURITY_ATTRIBUTES sa;
752 HANDLE child_pipe;
753 HANDLE child_pipe_x;
754
755 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
756 sa.bInheritHandle = EINA_TRUE;
757 sa.lpSecurityDescriptor = NULL;
758
759 if (!CreatePipe(&child_pipe, &child_pipe_x, &sa, 0))
760 return 0;
761 if (exe->flags & ECORE_EXE_PIPE_WRITE)
762 {
763 if (!SetHandleInformation(child_pipe_x, HANDLE_FLAG_INHERIT, 0))
764 goto close_pipe;
765 }
766 else
767 {
768 if (!SetHandleInformation(child_pipe, HANDLE_FLAG_INHERIT, 0))
769 goto close_pipe;
770 }
771
772 if (exe->flags & ECORE_EXE_PIPE_READ)
773 {
774 exe->pipe_read.child_pipe = child_pipe;
775 exe->pipe_read.child_pipe_x = child_pipe_x;
776 exe->pipe_read.p = ecore_pipe_add(_ecore_exe_pipe_read_cb, exe);
777 exe->pipe_read.thread = CreateThread(NULL, 0,
778 _ecore_exe_win32_pipe_thread_read_cb,
779 exe, 0, NULL);
780 }
781 else if (exe->flags & ECORE_EXE_PIPE_WRITE)
782 {
783 exe->pipe_write.child_pipe = child_pipe;
784 exe->pipe_write.child_pipe_x = child_pipe_x;
785/* exe->pipe_write.thread = CreateThread(NULL, 0, */
786/* _ecore_exe_win32_pipe_thread_cb, */
787/* exe, 0, NULL); */
788 }
789 else
790 {
791 exe->pipe_error.child_pipe = child_pipe;
792 exe->pipe_error.child_pipe_x = child_pipe_x;
793 exe->pipe_error.p = ecore_pipe_add(_ecore_exe_pipe_error_cb, exe);
794 exe->pipe_error.thread = CreateThread(NULL, 0,
795 _ecore_exe_win32_pipe_thread_error_cb,
796 exe, 0, NULL);
797 }
798
799 return 1;
800
801close_pipe:
802 CloseHandle(child_pipe);
803 CloseHandle(child_pipe_x);
804
805 return 0;
806}
807
808static void
809_ecore_exe_win32_pipes_close(Ecore_Exe *exe)
810{
811 if (exe->flags & ECORE_EXE_PIPE_READ)
812 {
813 if (exe->pipe_read.child_pipe)
814 {
815 CloseHandle(exe->pipe_read.child_pipe);
816 exe->pipe_read.child_pipe = NULL;
817 }
818 if (exe->pipe_read.child_pipe_x)
819 {
820 CloseHandle(exe->pipe_read.child_pipe_x);
821 exe->pipe_read.child_pipe_x = NULL;
822 }
823 }
824
825 if (exe->flags & ECORE_EXE_PIPE_WRITE)
826 {
827 if (exe->pipe_write.child_pipe)
828 {
829 CloseHandle(exe->pipe_write.child_pipe);
830 exe->pipe_write.child_pipe = NULL;
831 }
832 if (exe->pipe_write.child_pipe_x)
833 {
834 CloseHandle(exe->pipe_write.child_pipe_x);
835 exe->pipe_write.child_pipe_x = NULL;
836 }
837 }
838
839 if (exe->flags & ECORE_EXE_PIPE_ERROR)
840 {
841 if (exe->pipe_error.child_pipe)
842 {
843 CloseHandle(exe->pipe_error.child_pipe);
844 exe->pipe_error.child_pipe = NULL;
845 }
846 if (exe->pipe_error.child_pipe_x)
847 {
848 CloseHandle(exe->pipe_error.child_pipe_x);
849 exe->pipe_error.child_pipe_x = NULL;
850 }
851 }
852}
853
854static DWORD WINAPI
855_ecore_exe_thread_procedure(LPVOID data __UNUSED__)
856{
857 GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
858 GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0);
859 return 1;
860}
861
862static BOOL CALLBACK
863_ecore_exe_enum_windows_procedure(HWND window,
864 LPARAM data)
865{
866 Ecore_Exe *exe;
867 DWORD thread_id;
868
869 exe = (Ecore_Exe *)data;
870 thread_id = GetWindowThreadProcessId(window, NULL);
871
872 if (thread_id == exe->thread_id)
873 {
874 /* Ctrl-C or Ctrl-Break */
875 if (CreateRemoteThread(exe->process, NULL, 0,
876 (LPTHREAD_START_ROUTINE)_ecore_exe_thread_procedure, NULL,
877 0, NULL))
878 {
879 printf ("remote thread\n");
880 return EINA_FALSE;
881 }
882
883 if ((exe->sig == ECORE_EXE_WIN32_SIGINT) ||
884 (exe->sig == ECORE_EXE_WIN32_SIGQUIT))
885 {
886 printf ("int or quit\n");
887 return EINA_FALSE;
888 }
889
890 /* WM_CLOSE message */
891 PostMessage(window, WM_CLOSE, 0, 0);
892 if (WaitForSingleObject(exe->process, ECORE_EXE_WIN32_TIMEOUT) == WAIT_OBJECT_0)
893 {
894 printf ("CLOSE\n");
895 return EINA_FALSE;
896 }
897
898 /* WM_QUIT message */
899 PostMessage(window, WM_QUIT, 0, 0);
900 if (WaitForSingleObject(exe->process, ECORE_EXE_WIN32_TIMEOUT) == WAIT_OBJECT_0)
901 {
902 printf ("QUIT\n");
903 return EINA_FALSE;
904 }
905
906 /* Exit process */
907 if (CreateRemoteThread(exe->process, NULL, 0,
908 (LPTHREAD_START_ROUTINE)ExitProcess, NULL,
909 0, NULL))
910 {
911 printf ("remote thread 2\n");
912 return EINA_FALSE;
913 }
914
915 if (exe->sig == ECORE_EXE_WIN32_SIGTERM)
916 {
917 printf ("term\n");
918 return EINA_FALSE;
919 }
920
921 TerminateProcess(exe->process, 0);
922
923 return EINA_FALSE;
924 }
925
926 return EINA_TRUE;
927}
928
929static void
930_ecore_exe_event_add_free(void *data __UNUSED__,
931 void *ev)
932{
933 Ecore_Exe_Event_Add *e;
934
935 e = (Ecore_Exe_Event_Add *)ev;
936 free(e);
937}
938
939static void
940_ecore_exe_event_del_free(void *data __UNUSED__,
941 void *ev)
942{
943 Ecore_Exe_Event_Del *e;
944
945 e = (Ecore_Exe_Event_Del *)ev;
946 if (e->exe)
947 ecore_exe_free(e->exe);
948 free(e);
949}
950
951static void
952_ecore_exe_event_exe_data_free(void *data __UNUSED__,
953 void *ev)
954{
955 Ecore_Exe_Event_Data *e;
956
957 e = (Ecore_Exe_Event_Data *)ev;
958 ecore_exe_event_data_free(e);
959}
960
961static Eina_Bool
962_ecore_exe_close_cb(void *data,
963 Ecore_Win32_Handler *wh __UNUSED__)
964{
965 Ecore_Exe_Event_Del *e;
966 Ecore_Exe *exe;
967 DWORD exit_code = 0;
968
969 e = calloc(1, sizeof(Ecore_Exe_Event_Del));
970 if (!e) return 0;
971
972 exe = (Ecore_Exe *)data;
973
974 if (GetExitCodeProcess(exe->process2, &exit_code))
975 {
976 e->exit_code = exit_code;
977 e->exited = 1;
978 }
979 else
980 {
981 char *msg;
982
983 msg = evil_last_error_get();
984 printf("%s\n", msg);
985 free(msg);
986 }
987 e->pid = exe->process_id;
988 e->exe = exe;
989
990 ecore_event_add(ECORE_EXE_EVENT_DEL, e,
991 _ecore_exe_event_del_free, NULL);
992
993 return 0;
994}
995
996static void
997_ecore_exe_pipe_read_cb(void *data,
998 void *buf,
999 unsigned int size)
1000{
1001 Ecore_Exe_Event_Data *e;
1002
1003 e = *((Ecore_Exe_Event_Data **)buf);
1004 if (e)
1005 ecore_event_add(ECORE_EXE_EVENT_DATA, e,
1006 _ecore_exe_event_exe_data_free,
1007 NULL);
1008}
1009
1010static int
1011_ecore_exe_pipe_write_cb(void *data,
1012 Ecore_Win32_Handler *wh __UNUSED__)
1013{
1014 char buf[READBUFSIZ];
1015 Ecore_Exe *exe;
1016 DWORD num_exe;
1017 BOOL res;
1018
1019 exe = (Ecore_Exe *)data;
1020
1021 res = WriteFile(exe->pipe_write.child_pipe_x, buf, READBUFSIZ, &num_exe, NULL);
1022 if (!res || num_exe == 0)
1023 {
1024 /* FIXME: what to do here ?? */
1025 }
1026
1027 if (exe->close_stdin == 1)
1028 {
1029 if (exe->pipe_write.h)
1030 {
1031 ecore_main_win32_handler_del(exe->pipe_write.h);
1032 exe->pipe_write.h = NULL;
1033 }
1034 exe->pipe_write.h = NULL;
1035 CloseHandle(exe->pipe_write.child_pipe);
1036 exe->pipe_write.child_pipe = NULL;
1037 }
1038
1039 return 1;
1040}
1041
1042static void
1043_ecore_exe_pipe_error_cb(void *data,
1044 void *buf,
1045 unsigned int size)
1046{
1047 Ecore_Exe_Event_Data *e;
1048
1049 e = *((Ecore_Exe_Event_Data **)buf);
1050 if (e)
1051 ecore_event_add(ECORE_EXE_EVENT_ERROR, e,
1052 _ecore_exe_event_exe_data_free,
1053 NULL);
1054}
1055
diff --git a/libraries/ecore/src/lib/ecore/ecore_exe_wince.c b/libraries/ecore/src/lib/ecore/ecore_exe_wince.c
new file mode 100644
index 0000000..c07fcbe
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_exe_wince.c
@@ -0,0 +1,21 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#ifdef HAVE_EVIL
6# include <Evil.h>
7#endif
8
9#include "Ecore.h"
10#include "ecore_private.h"
11
12void
13_ecore_exe_init(void)
14{
15}
16
17void
18_ecore_exe_shutdown(void)
19{
20}
21
diff --git a/libraries/ecore/src/lib/ecore/ecore_getopt.c b/libraries/ecore/src/lib/ecore/ecore_getopt.c
new file mode 100644
index 0000000..0ce8f6e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_getopt.c
@@ -0,0 +1,1908 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#ifdef HAVE_ALLOCA_H
6# include <alloca.h>
7#elif defined __GNUC__
8# define alloca __builtin_alloca
9#elif defined _AIX
10# define alloca __alloca
11#elif defined _MSC_VER
12# include <malloc.h>
13# define alloca _alloca
14#else
15# include <stddef.h>
16# ifdef __cplusplus
17extern "C"
18# endif
19void *alloca(size_t);
20#endif
21
22#include <stdio.h>
23#include <string.h>
24#include <stdarg.h>
25#include <ctype.h>
26
27#ifdef ENABLE_NLS
28# include <libintl.h>
29#else
30# define gettext(x) (x)
31# define dgettext(domain, x) (x)
32#endif
33
34#define _(x) dgettext("ecore", x)
35
36#ifdef _WIN32_WCE
37# include <Evil.h>
38#endif
39
40#include "Ecore.h"
41#include "Ecore_Getopt.h"
42
43static const char *prog = NULL;
44static char **argv = NULL;
45static int argc = 0;
46static int cols = 80;
47static int helpcol = 80 / 3;
48
49static void
50_ecore_getopt_help_print_replace_program(FILE *fp,
51 const Ecore_Getopt *parser __UNUSED__,
52 const char *text)
53{
54 do
55 {
56 const char *d = strchr(text, '%');
57
58 if (!d)
59 {
60 fputs(text, fp);
61 break;
62 }
63
64 if (fwrite(text, 1, d - text, fp) != (size_t)(d - text))
65 return;
66 d++;
67 if (strncmp(d, "prog", sizeof("prog") - 1) == 0)
68 {
69 fputs(prog ? prog : "???", fp);
70 d += sizeof("prog") - 1;
71 }
72 else
73 {
74 if (d[0] == '%')
75 d++;
76 fputc('%', fp);
77 }
78
79 text = d;
80 }
81 while (text[0] != '\0');
82
83 fputc('\n', fp);
84}
85
86static void
87_ecore_getopt_version(FILE *fp,
88 const Ecore_Getopt *parser)
89{
90 fputs(_("Version:"), fp);
91 fputc(' ', fp);
92 _ecore_getopt_help_print_replace_program(fp, parser, parser->version);
93}
94
95static void
96_ecore_getopt_help_usage(FILE *fp,
97 const Ecore_Getopt *parser)
98{
99 fputs(_("Usage:"), fp);
100 fputc(' ', fp);
101
102 if (!parser->usage)
103 {
104 fprintf(fp, _("%s [options]\n"), prog);
105 return;
106 }
107
108 _ecore_getopt_help_print_replace_program(fp, parser, gettext(parser->usage));
109}
110
111static int
112_ecore_getopt_help_line(FILE *fp,
113 const int base,
114 const int total,
115 int used,
116 const char *text,
117 int len)
118{
119 int linebreak = 0;
120 do
121 {
122 /* process line considering spaces (new line and tabs are spaces!) */
123 while ((used < total) && (len > 0))
124 {
125 const char *space = NULL;
126 int i, todo;
127
128 todo = total - used;
129 if (todo > len)
130 todo = len;
131
132 for (i = 0; i < todo; i++)
133 if (isspace(text[i]))
134 {
135 space = text + i;
136 break;
137 }
138
139 if (space)
140 {
141 i = fwrite(text, 1, i, fp);
142 i++;
143 text += i;
144 len -= i;
145 used += i;
146
147 if (linebreak)
148 {
149 linebreak = 0;
150 continue;
151 }
152
153 if (space[0] == '\n')
154 break;
155 else if (space[0] == '\t')
156 {
157 int c;
158
159 used--;
160 c = ((used / 8) + 1) * 8;
161 if (c < total)
162 {
163 for (; used < c; used++)
164 fputc(' ', fp);
165 }
166 else
167 {
168 text--;
169 len++;
170 break;
171 }
172 }
173 else if (used < total)
174 fputc(space[0], fp);
175 }
176 else
177 {
178 i = fwrite(text, 1, i, fp);
179 text += i;
180 len -= i;
181 used += i;
182 }
183 linebreak = 0;
184 }
185 if (len <= 0)
186 break;
187 linebreak = 1;
188 fputc('\n', fp);
189 for (used = 0; used < base; used++)
190 fputc(' ', fp);
191 }
192 while (1);
193
194 return used;
195}
196
197static void
198_ecore_getopt_help_description(FILE *fp,
199 const Ecore_Getopt *parser)
200{
201 const char *p, *prg, *ver;
202 int used, prglen, verlen;
203
204 p = gettext(parser->description);
205 if (!p)
206 return;
207
208 fputc('\n', fp);
209
210 prg = prog ? prog : "???";
211 ver = parser->version ? parser->version : "???";
212
213 prglen = strlen(prg);
214 verlen = strlen(ver);
215
216 used = 0;
217
218 do
219 {
220 const char *d = strchr(p, '%');
221
222 if (!d)
223 {
224 _ecore_getopt_help_line(fp, 0, cols, used, p, strlen(p));
225 break;
226 }
227
228 used = _ecore_getopt_help_line(fp, 0, cols, used, p, d - p);
229 d++;
230 if (strncmp(d, "prog", sizeof("prog") - 1) == 0)
231 {
232 used = _ecore_getopt_help_line(fp, 0, cols, used, prg, prglen);
233 d += sizeof("prog") - 1;
234 }
235 else if (strncmp(d, "version", sizeof("version") - 1) == 0)
236 {
237 used = _ecore_getopt_help_line(fp, 0, cols, used, ver, verlen);
238 d += sizeof("version") - 1;
239 }
240 else
241 {
242 if (d[0] == '%')
243 d++;
244 used = _ecore_getopt_help_line(fp, 0, cols, used, "%", 1);
245 }
246
247 p = d;
248 }
249 while (p[0] != '\0');
250
251 fputs("\n\n", fp);
252}
253
254static void
255_ecore_getopt_copyright(FILE *fp,
256 const Ecore_Getopt *parser)
257{
258 const char *txt = gettext(parser->copyright);
259 fputs(_("Copyright:"), fp);
260 fputs("\n ", fp);
261 _ecore_getopt_help_line
262 (fp, 3, cols, 3, txt, strlen(txt));
263 fputc('\n', fp);
264}
265
266static void
267_ecore_getopt_license(FILE *fp,
268 const Ecore_Getopt *parser)
269{
270 const char *txt = gettext(parser->license);
271 fputs(_("License:"), fp);
272 fputs("\n ", fp);
273 _ecore_getopt_help_line
274 (fp, 3, cols, 3, txt, strlen(txt));
275 fputc('\n', fp);
276}
277
278static Ecore_Getopt_Desc_Arg_Requirement
279_ecore_getopt_desc_arg_requirement(const Ecore_Getopt_Desc *desc)
280{
281 switch (desc->action)
282 {
283 case ECORE_GETOPT_ACTION_STORE:
284 return desc->action_param.store.arg_req;
285
286 case ECORE_GETOPT_ACTION_STORE_CONST:
287 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
288
289 case ECORE_GETOPT_ACTION_STORE_TRUE:
290 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
291
292 case ECORE_GETOPT_ACTION_STORE_FALSE:
293 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
294
295 case ECORE_GETOPT_ACTION_CHOICE:
296 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES;
297
298 case ECORE_GETOPT_ACTION_APPEND:
299 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES;
300
301 case ECORE_GETOPT_ACTION_COUNT:
302 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
303
304 case ECORE_GETOPT_ACTION_CALLBACK:
305 return desc->action_param.callback.arg_req;
306
307 case ECORE_GETOPT_ACTION_HELP:
308 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
309
310 case ECORE_GETOPT_ACTION_VERSION:
311 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
312
313 default:
314 return ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO;
315 }
316}
317
318static void
319_ecore_getopt_help_desc_setup_metavar(const Ecore_Getopt_Desc *desc,
320 char *metavar,
321 int *metavarlen,
322 int maxsize)
323{
324 if (desc->metavar)
325 {
326 const char *txt = gettext(desc->metavar);
327 *metavarlen = strlen(txt);
328 if (*metavarlen > maxsize - 1)
329 *metavarlen = maxsize - 1;
330
331 memcpy(metavar, txt, *metavarlen);
332 metavar[*metavarlen] = '\0';
333 }
334 else if (desc->longname)
335 {
336 int i;
337
338 *metavarlen = strlen(desc->longname);
339 if (*metavarlen > maxsize - 1)
340 *metavarlen = maxsize - 1;
341
342 for (i = 0; i < *metavarlen; i++)
343 metavar[i] = toupper((int) desc->longname[i]);
344 metavar[i] = '\0';
345 }
346}
347
348static int
349_ecore_getopt_help_desc_show_arg(FILE *fp,
350 Ecore_Getopt_Desc_Arg_Requirement requirement,
351 const char *metavar,
352 int metavarlen)
353{
354 int used;
355
356 if (requirement == ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
357 return 0;
358
359 used = 0;
360
361 if (requirement == ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL)
362 {
363 fputc('[', fp);
364 used++;
365 }
366
367 if (requirement != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
368 {
369 fputc('=', fp);
370 fputs(metavar, fp);
371 used += metavarlen + 1;
372 }
373
374 if (requirement == ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL)
375 {
376 fputc(']', fp);
377 used++;
378 }
379
380 return used;
381}
382
383static int
384_ecore_getopt_help_desc_store(FILE *fp,
385 const int base,
386 const int total,
387 int used,
388 const Ecore_Getopt_Desc *desc)
389{
390 const Ecore_Getopt_Desc_Store *store = &desc->action_param.store;
391 char buf[64];
392 const char *str;
393 size_t len;
394
395 fputc('\n', fp);
396 for (used = 0; used < base; used++)
397 fputc(' ', fp);
398
399 switch (store->type)
400 {
401 case ECORE_GETOPT_TYPE_STR:
402 str = "STR";
403 len = sizeof("STR") - 1;
404 break;
405
406 case ECORE_GETOPT_TYPE_BOOL:
407 str = "BOOL";
408 len = sizeof("BOOL") - 1;
409 break;
410
411 case ECORE_GETOPT_TYPE_SHORT:
412 str = "SHORT";
413 len = sizeof("SHORT") - 1;
414 break;
415
416 case ECORE_GETOPT_TYPE_INT:
417 str = "INT";
418 len = sizeof("INT") - 1;
419 break;
420
421 case ECORE_GETOPT_TYPE_LONG:
422 str = "LONG";
423 len = sizeof("LONG") - 1;
424 break;
425
426 case ECORE_GETOPT_TYPE_USHORT:
427 str = "USHORT";
428 len = sizeof("USHORT") - 1;
429 break;
430
431 case ECORE_GETOPT_TYPE_UINT:
432 str = "UINT";
433 len = sizeof("UINT") - 1;
434 break;
435
436 case ECORE_GETOPT_TYPE_ULONG:
437 str = "ULONG";
438 len = sizeof("ULONG") - 1;
439 break;
440
441 case ECORE_GETOPT_TYPE_DOUBLE:
442 str = "DOUBLE";
443 len = sizeof("DOUBLE") - 1;
444 break;
445
446 default:
447 str = "???";
448 len = sizeof("???") - 1;
449 }
450
451 used = _ecore_getopt_help_line
452 (fp, base, total, used, _("Type: "), strlen(_("Type: ")));
453 used = _ecore_getopt_help_line(fp, base, total, used, str, len);
454
455 if (store->arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES)
456 goto end;
457
458 used = _ecore_getopt_help_line
459 (fp, base, total, used, ". ", sizeof(". ") - 1);
460
461 switch (store->type)
462 {
463 case ECORE_GETOPT_TYPE_STR:
464 str = store->def.strv;
465 len = str ? strlen(str) : 0;
466 break;
467
468 case ECORE_GETOPT_TYPE_BOOL:
469 str = store->def.boolv ? "true" : "false";
470 len = strlen(str);
471 break;
472
473 case ECORE_GETOPT_TYPE_SHORT:
474 str = buf;
475 len = snprintf(buf, sizeof(buf), "%hd", store->def.shortv);
476 if (len > sizeof(buf) - 1)
477 len = sizeof(buf) - 1;
478 break;
479
480 case ECORE_GETOPT_TYPE_INT:
481 str = buf;
482 len = snprintf(buf, sizeof(buf), "%d", store->def.intv);
483 if (len > sizeof(buf) - 1)
484 len = sizeof(buf) - 1;
485 break;
486
487 case ECORE_GETOPT_TYPE_LONG:
488 str = buf;
489 len = snprintf(buf, sizeof(buf), "%ld", store->def.longv);
490 if (len > sizeof(buf) - 1)
491 len = sizeof(buf) - 1;
492 break;
493
494 case ECORE_GETOPT_TYPE_USHORT:
495 str = buf;
496 len = snprintf(buf, sizeof(buf), "%hu", store->def.ushortv);
497 if (len > sizeof(buf) - 1)
498 len = sizeof(buf) - 1;
499 break;
500
501 case ECORE_GETOPT_TYPE_UINT:
502 str = buf;
503 len = snprintf(buf, sizeof(buf), "%u", store->def.uintv);
504 if (len > sizeof(buf) - 1)
505 len = sizeof(buf) - 1;
506 break;
507
508 case ECORE_GETOPT_TYPE_ULONG:
509 str = buf;
510 len = snprintf(buf, sizeof(buf), "%lu", store->def.ulongv);
511 if (len > sizeof(buf) - 1)
512 len = sizeof(buf) - 1;
513 break;
514
515 case ECORE_GETOPT_TYPE_DOUBLE:
516 str = buf;
517 len = snprintf(buf, sizeof(buf), "%f", store->def.doublev);
518 if (len > sizeof(buf) - 1)
519 len = sizeof(buf) - 1;
520 break;
521
522 default:
523 str = "???";
524 len = sizeof("???") - 1;
525 }
526
527 used = _ecore_getopt_help_line
528 (fp, base, total, used, _("Default: "), strlen(_("Default: ")));
529 used = _ecore_getopt_help_line(fp, base, total, used, str, len);
530
531end:
532 return _ecore_getopt_help_line(fp, base, total, used, ".", 1);
533}
534
535static int
536_ecore_getopt_help_desc_choices(FILE *fp,
537 const int base,
538 const int total,
539 int used,
540 const Ecore_Getopt_Desc *desc)
541{
542 const char *const *itr;
543 const char sep[] = ", ";
544 const int seplen = sizeof(sep) - 1;
545
546 if (used > 0)
547 {
548 fputc('\n', fp);
549 used = 0;
550 }
551 for (; used < base; used++)
552 fputc(' ', fp);
553
554 used = _ecore_getopt_help_line
555 (fp, base, total, used, _("Choices: "), strlen(_("Choices: ")));
556
557 for (itr = desc->action_param.choices; *itr; itr++)
558 {
559 used = _ecore_getopt_help_line
560 (fp, base, total, used, *itr, strlen(*itr));
561 if (itr[1])
562 used = _ecore_getopt_help_line(fp, base, total, used, sep, seplen);
563 }
564
565 return _ecore_getopt_help_line(fp, base, total, used, ".", 1);
566}
567
568static void
569_ecore_getopt_help_desc(FILE *fp,
570 const Ecore_Getopt_Desc *desc)
571{
572 Ecore_Getopt_Desc_Arg_Requirement arg_req;
573 char metavar[32] = "ARG";
574 int metavarlen = 3;
575 int used;
576
577 arg_req = _ecore_getopt_desc_arg_requirement(desc);
578 if (arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
579 _ecore_getopt_help_desc_setup_metavar
580 (desc, metavar, &metavarlen, sizeof(metavar));
581
582 fputs(" ", fp);
583 used = 2;
584
585 if (desc->shortname)
586 {
587 fputc('-', fp);
588 fputc(desc->shortname, fp);
589 used += 2;
590 used += _ecore_getopt_help_desc_show_arg
591 (fp, arg_req, metavar, metavarlen);
592 }
593
594 if (desc->shortname && desc->longname)
595 {
596 fputs(", ", fp);
597 used += 2;
598 }
599
600 if (desc->longname)
601 {
602 int namelen = strlen(desc->longname);
603
604 fputs("--", fp);
605 fputs(desc->longname, fp);
606 used += 2 + namelen;
607 used += _ecore_getopt_help_desc_show_arg
608 (fp, arg_req, metavar, metavarlen);
609 }
610
611 if (!desc->help)
612 goto end;
613
614 if (used + 3 >= helpcol)
615 {
616 fputc('\n', fp);
617 used = 0;
618 }
619
620 for (; used < helpcol; used++)
621 fputc(' ', fp);
622
623 used = _ecore_getopt_help_line
624 (fp, helpcol, cols, used, desc->help, strlen(desc->help));
625
626 switch (desc->action)
627 {
628 case ECORE_GETOPT_ACTION_STORE:
629 _ecore_getopt_help_desc_store(fp, helpcol, cols, used, desc);
630 break;
631
632 case ECORE_GETOPT_ACTION_CHOICE:
633 _ecore_getopt_help_desc_choices(fp, helpcol, cols, used, desc);
634 break;
635
636 default:
637 break;
638 }
639
640end:
641 fputc('\n', fp);
642}
643
644static Eina_Bool
645_ecore_getopt_desc_is_sentinel(const Ecore_Getopt_Desc *desc)
646{
647 return (desc->shortname == '\0') && (!desc->longname);
648}
649
650static void
651_ecore_getopt_help_options(FILE *fp,
652 const Ecore_Getopt *parser)
653{
654 const Ecore_Getopt_Desc *desc;
655
656 fputs(_("Options:\n"), fp);
657
658 for (desc = parser->descs; !_ecore_getopt_desc_is_sentinel(desc); desc++)
659 _ecore_getopt_help_desc(fp, desc);
660
661 fputc('\n', fp);
662}
663
664/**
665 * Show nicely formatted help message for the given parser.
666 *
667 * Message will be print to stderr.
668 */
669void
670ecore_getopt_help(FILE *fp,
671 const Ecore_Getopt *parser)
672{
673 const char *var;
674
675 if (!parser) return;
676
677 if (argc < 1)
678 {
679 ecore_app_args_get(&argc, &argv);
680 if ((argc > 0) && (argv[0]))
681 prog = argv[0];
682 else
683 prog = parser->prog;
684 }
685
686 var = getenv("COLUMNS");
687 if (var)
688 {
689 cols = atoi(var);
690 if (cols < 20)
691 cols = 20;
692
693 helpcol = cols / 3;
694 }
695
696 _ecore_getopt_help_usage(fp, parser);
697 _ecore_getopt_help_description(fp, parser);
698 _ecore_getopt_help_options(fp, parser);
699}
700
701static const Ecore_Getopt_Desc *
702_ecore_getopt_parse_find_long(const Ecore_Getopt *parser,
703 const char *name)
704{
705 const Ecore_Getopt_Desc *desc = parser->descs;
706 const char *p = strchr(name, '=');
707 int len = 0;
708
709 if (p)
710 len = p - name;
711
712 for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
713 {
714 if (!desc->longname)
715 continue;
716
717 if (p)
718 {
719 if ((strncmp(name, desc->longname, len) == 0) &&
720 (desc->longname[len] == '\0'))
721 return desc;
722 }
723 else
724 {
725 if (strcmp(name, desc->longname) == 0)
726 return desc;
727 }
728 }
729
730 return NULL;
731}
732
733static const Ecore_Getopt_Desc *
734_ecore_getopt_parse_find_short(const Ecore_Getopt *parser,
735 char name)
736{
737 const Ecore_Getopt_Desc *desc = parser->descs;
738 for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
739 if (name == desc->shortname)
740 return desc;
741 return NULL;
742}
743
744static int
745_ecore_getopt_parse_find_nonargs_base(const Ecore_Getopt *parser,
746 int argc,
747 char **argv)
748{
749 char **nonargs;
750 int src, dst, used, base;
751
752 nonargs = alloca(sizeof(char *) * argc);
753 src = 1;
754 dst = 1;
755 used = 0;
756 base = 0;
757 while (src < argc)
758 {
759 const Ecore_Getopt_Desc *desc;
760 Ecore_Getopt_Desc_Arg_Requirement arg_req;
761 char *arg = argv[src];
762
763 if (arg[0] != '-')
764 goto found_nonarg;
765
766 if (arg[1] == '-')
767 {
768 if (arg[2] == '\0') /* explicit end of options, "--" */
769 {
770 base = 1;
771 break;
772 }
773 desc = _ecore_getopt_parse_find_long(parser, arg + 2);
774 }
775 else
776 desc = _ecore_getopt_parse_find_short(parser, arg[1]);
777
778 if (!desc)
779 {
780 if (arg[1] == '-')
781 fprintf(stderr, _("ERROR: unknown option --%s.\n"), arg + 2);
782 else
783 fprintf(stderr, _("ERROR: unknown option -%c.\n"), arg[1]);
784 if (parser->strict)
785 {
786 memmove(argv + dst, nonargs, used * sizeof(char *));
787 return -1;
788 }
789 else
790 goto found_nonarg;
791 }
792
793 if (src != dst)
794 argv[dst] = argv[src];
795 src++;
796 dst++;
797
798 arg_req = _ecore_getopt_desc_arg_requirement(desc);
799 if (arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
800 continue;
801
802 if (strchr(arg, '='))
803 continue;
804
805 if ((src >= argc) || (argv[src][0] == '-'))
806 continue;
807
808 if (src != dst)
809 argv[dst] = argv[src];
810 src++;
811 dst++;
812 continue;
813
814found_nonarg:
815 nonargs[used] = arg;
816 used++;
817 src++;
818 }
819
820 if (!base) /* '--' not found */
821 base = dst;
822 else
823 {
824 base = dst;
825 if (src != dst)
826 argv[dst] = argv[src];
827 dst++;
828 }
829
830 memmove(argv + dst, nonargs, used * sizeof(char *));
831 return base;
832}
833
834static void
835_ecore_getopt_desc_print_error(const Ecore_Getopt_Desc *desc,
836 const char *fmt,
837 ...)
838{
839 va_list ap;
840
841 fputs(_("ERROR: "), stderr);
842
843 if (desc->shortname)
844 {
845 fputc('-', stderr);
846 fputc(desc->shortname, stderr);
847 }
848
849 if (desc->shortname && desc->longname)
850 fputs(", ", stderr);
851
852 if (desc->longname)
853 {
854 fputs("--", stderr);
855 fputs(desc->longname, stderr);
856 }
857
858 fputs(": ", stderr);
859
860 va_start(ap, fmt);
861 vfprintf(stderr, fmt, ap);
862 va_end(ap);
863}
864
865static Eina_Bool
866_ecore_getopt_parse_bool(const char *str,
867 Eina_Bool *v)
868{
869 if ((strcmp(str, "0") == 0) ||
870 (strcasecmp(str, "f") == 0) ||
871 (strcasecmp(str, "false") == 0) ||
872 (strcasecmp(str, "no") == 0) ||
873 (strcasecmp(str, "off") == 0)
874 )
875 {
876 *v = EINA_FALSE;
877 return EINA_TRUE;
878 }
879 else if ((strcmp(str, "1") == 0) ||
880 (strcasecmp(str, "t") == 0) ||
881 (strcasecmp(str, "true") == 0) ||
882 (strcasecmp(str, "yes") == 0) ||
883 (strcasecmp(str, "on") == 0)
884 )
885 {
886 *v = EINA_TRUE;
887 return EINA_TRUE;
888 }
889
890 return EINA_FALSE;
891}
892
893static Eina_Bool
894_ecore_getopt_parse_long(const char *str,
895 long int *v)
896{
897 char *endptr = NULL;
898 *v = strtol(str, &endptr, 0);
899 return endptr > str;
900}
901
902static Eina_Bool
903_ecore_getopt_parse_double(const char *str,
904 double *v)
905{
906 char *endptr = NULL;
907 *v = strtod(str, &endptr);
908 return endptr > str;
909}
910
911static Eina_Bool
912_ecore_getopt_parse_store(const Ecore_Getopt *parser __UNUSED__,
913 const Ecore_Getopt_Desc *desc,
914 Ecore_Getopt_Value *value,
915 const char *arg_val)
916{
917 const Ecore_Getopt_Desc_Store *store = &desc->action_param.store;
918 long int v;
919 double d;
920 Eina_Bool b;
921
922 if (!value->ptrp)
923 {
924 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
925 return EINA_FALSE;
926 }
927
928 switch (store->arg_req)
929 {
930 case ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO:
931 goto use_optional;
932
933 case ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL:
934 if (!arg_val)
935 goto use_optional;
936
937 case ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES:
938 break;
939 }
940
941 switch (store->type)
942 {
943 case ECORE_GETOPT_TYPE_STR:
944 *value->strp = (char *)arg_val;
945 return EINA_TRUE;
946
947 case ECORE_GETOPT_TYPE_BOOL:
948 if (_ecore_getopt_parse_bool(arg_val, &b))
949 {
950 *value->boolp = b;
951 return EINA_TRUE;
952 }
953 else
954 {
955 _ecore_getopt_desc_print_error
956 (desc, _("unknown boolean value %s.\n"), arg_val);
957 return EINA_FALSE;
958 }
959
960 case ECORE_GETOPT_TYPE_SHORT:
961 if (!_ecore_getopt_parse_long(arg_val, &v))
962 goto error;
963 *value->shortp = v;
964 return EINA_TRUE;
965
966 case ECORE_GETOPT_TYPE_INT:
967 if (!_ecore_getopt_parse_long(arg_val, &v))
968 goto error;
969 *value->intp = v;
970 return EINA_TRUE;
971
972 case ECORE_GETOPT_TYPE_LONG:
973 if (!_ecore_getopt_parse_long(arg_val, &v))
974 goto error;
975 *value->longp = v;
976 return EINA_TRUE;
977
978 case ECORE_GETOPT_TYPE_USHORT:
979 if (!_ecore_getopt_parse_long(arg_val, &v))
980 goto error;
981 *value->ushortp = v;
982 return EINA_TRUE;
983
984 case ECORE_GETOPT_TYPE_UINT:
985 if (!_ecore_getopt_parse_long(arg_val, &v))
986 goto error;
987 *value->uintp = v;
988 return EINA_TRUE;
989
990 case ECORE_GETOPT_TYPE_ULONG:
991 if (!_ecore_getopt_parse_long(arg_val, &v))
992 goto error;
993 *value->ulongp = v;
994 return EINA_TRUE;
995
996 case ECORE_GETOPT_TYPE_DOUBLE:
997 if (!_ecore_getopt_parse_double(arg_val, &d))
998 goto error;
999 *value->doublep = d;
1000 break;
1001 }
1002
1003 return EINA_TRUE;
1004
1005error:
1006 _ecore_getopt_desc_print_error
1007 (desc, _("invalid number format %s\n"), arg_val);
1008 return EINA_FALSE;
1009
1010use_optional:
1011 switch (store->type)
1012 {
1013 case ECORE_GETOPT_TYPE_STR:
1014 *value->strp = (char *)store->def.strv;
1015 break;
1016
1017 case ECORE_GETOPT_TYPE_BOOL:
1018 *value->boolp = store->def.boolv;
1019 break;
1020
1021 case ECORE_GETOPT_TYPE_SHORT:
1022 *value->shortp = store->def.shortv;
1023 break;
1024
1025 case ECORE_GETOPT_TYPE_INT:
1026 *value->intp = store->def.intv;
1027 break;
1028
1029 case ECORE_GETOPT_TYPE_LONG:
1030 *value->longp = store->def.longv;
1031 break;
1032
1033 case ECORE_GETOPT_TYPE_USHORT:
1034 *value->ushortp = store->def.ushortv;
1035 break;
1036
1037 case ECORE_GETOPT_TYPE_UINT:
1038 *value->uintp = store->def.uintv;
1039 break;
1040
1041 case ECORE_GETOPT_TYPE_ULONG:
1042 *value->ulongp = store->def.ulongv;
1043 break;
1044
1045 case ECORE_GETOPT_TYPE_DOUBLE:
1046 *value->doublep = store->def.doublev;
1047 break;
1048 }
1049
1050 return EINA_TRUE;
1051}
1052
1053static Eina_Bool
1054_ecore_getopt_parse_store_const(const Ecore_Getopt *parser __UNUSED__,
1055 const Ecore_Getopt_Desc *desc,
1056 Ecore_Getopt_Value *val,
1057 const char *arg_val __UNUSED__)
1058{
1059 if (!val->ptrp)
1060 {
1061 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1062 return EINA_FALSE;
1063 }
1064
1065 *val->ptrp = (void *)desc->action_param.store_const;
1066 return EINA_TRUE;
1067}
1068
1069static Eina_Bool
1070_ecore_getopt_parse_store_true(const Ecore_Getopt *parser __UNUSED__,
1071 const Ecore_Getopt_Desc *desc,
1072 Ecore_Getopt_Value *val,
1073 const char *arg_val __UNUSED__)
1074{
1075 if (!val->boolp)
1076 {
1077 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1078 return EINA_FALSE;
1079 }
1080 *val->boolp = EINA_TRUE;
1081 return EINA_TRUE;
1082}
1083
1084static Eina_Bool
1085_ecore_getopt_parse_store_false(const Ecore_Getopt *parser __UNUSED__,
1086 const Ecore_Getopt_Desc *desc,
1087 Ecore_Getopt_Value *val,
1088 const char *arg_val __UNUSED__)
1089{
1090 if (!val->boolp)
1091 {
1092 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1093 return EINA_FALSE;
1094 }
1095 *val->boolp = EINA_FALSE;
1096 return EINA_TRUE;
1097}
1098
1099static Eina_Bool
1100_ecore_getopt_parse_choice(const Ecore_Getopt *parser __UNUSED__,
1101 const Ecore_Getopt_Desc *desc,
1102 Ecore_Getopt_Value *val,
1103 const char *arg_val)
1104{
1105 const char *const *pchoice;
1106
1107 if (!val->strp)
1108 {
1109 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1110 return EINA_FALSE;
1111 }
1112
1113 pchoice = desc->action_param.choices;
1114 for (; *pchoice; pchoice++)
1115 if (strcmp(*pchoice, arg_val) == 0)
1116 {
1117 *val->strp = (char *)*pchoice;
1118 return EINA_TRUE;
1119 }
1120
1121 _ecore_getopt_desc_print_error
1122 (desc, _("invalid choice \"%s\". Valid values are: "), arg_val);
1123
1124 pchoice = desc->action_param.choices;
1125 for (; *pchoice; pchoice++)
1126 {
1127 fputs(*pchoice, stderr);
1128 if (pchoice[1])
1129 fputs(", ", stderr);
1130 }
1131
1132 fputs(".\n", stderr);
1133 return EINA_FALSE;
1134}
1135
1136static Eina_Bool
1137_ecore_getopt_parse_append(const Ecore_Getopt *parser __UNUSED__,
1138 const Ecore_Getopt_Desc *desc,
1139 Ecore_Getopt_Value *val,
1140 const char *arg_val)
1141{
1142 void *data;
1143 long int v;
1144 double d;
1145 Eina_Bool b;
1146
1147 if (!arg_val)
1148 {
1149 _ecore_getopt_desc_print_error
1150 (desc, _("missing parameter to append.\n"));
1151 return EINA_FALSE;
1152 }
1153
1154 if (!val->listp)
1155 {
1156 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1157 return EINA_FALSE;
1158 }
1159
1160 switch (desc->action_param.append_type)
1161 {
1162 case ECORE_GETOPT_TYPE_STR:
1163 data = strdup(arg_val);
1164 break;
1165
1166 case ECORE_GETOPT_TYPE_BOOL:
1167 {
1168 if (_ecore_getopt_parse_bool(arg_val, &b))
1169 {
1170 data = malloc(sizeof(Eina_Bool));
1171 if (data)
1172 *(Eina_Bool *)data = b;
1173 }
1174 else
1175 {
1176 _ecore_getopt_desc_print_error(desc, _("unknown boolean value %s.\n"), arg_val);
1177 return EINA_FALSE;
1178 }
1179 }
1180 break;
1181
1182 case ECORE_GETOPT_TYPE_SHORT:
1183 {
1184 if (!_ecore_getopt_parse_long(arg_val, &v))
1185 goto error;
1186 data = malloc(sizeof(short));
1187 if (data)
1188 *(short *)data = (short)v;
1189 }
1190 break;
1191
1192 case ECORE_GETOPT_TYPE_INT:
1193 {
1194 if (!_ecore_getopt_parse_long(arg_val, &v))
1195 goto error;
1196 data = malloc(sizeof(int));
1197 if (data)
1198 *(int *)data = (int)v;
1199 }
1200 break;
1201
1202 case ECORE_GETOPT_TYPE_LONG:
1203 {
1204 if (!_ecore_getopt_parse_long(arg_val, &v))
1205 goto error;
1206 data = malloc(sizeof(long));
1207 if (data)
1208 *(long *)data = v;
1209 }
1210 break;
1211
1212 case ECORE_GETOPT_TYPE_USHORT:
1213 {
1214 if (!_ecore_getopt_parse_long(arg_val, &v))
1215 goto error;
1216 data = malloc(sizeof(unsigned short));
1217 if (data)
1218 *(unsigned short *)data = (unsigned short)v;
1219 }
1220 break;
1221
1222 case ECORE_GETOPT_TYPE_UINT:
1223 {
1224 if (!_ecore_getopt_parse_long(arg_val, &v))
1225 goto error;
1226 data = malloc(sizeof(unsigned int));
1227 if (data)
1228 *(unsigned int *)data = (unsigned int)v;
1229 }
1230 break;
1231
1232 case ECORE_GETOPT_TYPE_ULONG:
1233 {
1234 if (!_ecore_getopt_parse_long(arg_val, &v))
1235 goto error;
1236 data = malloc(sizeof(unsigned long));
1237 if (data)
1238 *(unsigned long *)data = v;
1239 }
1240 break;
1241
1242 case ECORE_GETOPT_TYPE_DOUBLE:
1243 {
1244 if (!_ecore_getopt_parse_double(arg_val, &d))
1245 goto error;
1246 data = malloc(sizeof(double));
1247 if (data)
1248 *(double *)data = d;
1249 }
1250 break;
1251
1252 default:
1253 {
1254 _ecore_getopt_desc_print_error(desc, _("could not parse value.\n"));
1255 return EINA_FALSE;
1256 }
1257 }
1258
1259 *val->listp = eina_list_append(*val->listp, data);
1260 return EINA_TRUE;
1261
1262error:
1263 _ecore_getopt_desc_print_error
1264 (desc, _("invalid number format %s\n"), arg_val);
1265 return EINA_FALSE;
1266}
1267
1268static Eina_Bool
1269_ecore_getopt_parse_count(const Ecore_Getopt *parser __UNUSED__,
1270 const Ecore_Getopt_Desc *desc,
1271 Ecore_Getopt_Value *val,
1272 const char *arg_val __UNUSED__)
1273{
1274 if (!val->intp)
1275 {
1276 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1277 return EINA_FALSE;
1278 }
1279
1280 (*val->intp)++;
1281 return EINA_TRUE;
1282}
1283
1284static Eina_Bool
1285_ecore_getopt_parse_callback(const Ecore_Getopt *parser,
1286 const Ecore_Getopt_Desc *desc,
1287 Ecore_Getopt_Value *val,
1288 const char *arg_val)
1289{
1290 const Ecore_Getopt_Desc_Callback *cb = &desc->action_param.callback;
1291
1292 switch (cb->arg_req)
1293 {
1294 case ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO:
1295 arg_val = cb->def;
1296 break;
1297
1298 case ECORE_GETOPT_DESC_ARG_REQUIREMENT_OPTIONAL:
1299 if (!arg_val)
1300 arg_val = cb->def;
1301 break;
1302
1303 case ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES:
1304 break;
1305 }
1306
1307 if (cb->arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
1308 {
1309 if ((!arg_val) || (arg_val[0] == '\0'))
1310 {
1311 _ecore_getopt_desc_print_error(desc, _("missing parameter.\n"));
1312 return EINA_FALSE;
1313 }
1314
1315 if (!val->ptrp)
1316 {
1317 _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n"));
1318 return EINA_FALSE;
1319 }
1320 }
1321
1322 if (!cb->func)
1323 {
1324 _ecore_getopt_desc_print_error(desc, _("missing callback function!\n"));
1325 return EINA_FALSE;
1326 }
1327
1328 return cb->func(parser, desc, arg_val, (void *)cb->data, val);
1329}
1330
1331static Eina_Bool
1332_ecore_getopt_parse_help(const Ecore_Getopt *parser,
1333 const Ecore_Getopt_Desc *desc __UNUSED__,
1334 Ecore_Getopt_Value *val,
1335 const char *arg_val __UNUSED__)
1336{
1337 if (val->boolp)
1338 (*val->boolp) = EINA_TRUE;
1339 ecore_getopt_help(stdout, parser);
1340 return EINA_TRUE;
1341}
1342
1343static Eina_Bool
1344_ecore_getopt_parse_version(const Ecore_Getopt *parser,
1345 const Ecore_Getopt_Desc *desc,
1346 Ecore_Getopt_Value *val,
1347 const char *arg_val __UNUSED__)
1348{
1349 if (val->boolp)
1350 (*val->boolp) = EINA_TRUE;
1351 if (!parser->version)
1352 {
1353 _ecore_getopt_desc_print_error(desc, _("no version was defined.\n"));
1354 return EINA_FALSE;
1355 }
1356 _ecore_getopt_version(stdout, parser);
1357 return EINA_TRUE;
1358}
1359
1360static Eina_Bool
1361_ecore_getopt_parse_copyright(const Ecore_Getopt *parser,
1362 const Ecore_Getopt_Desc *desc,
1363 Ecore_Getopt_Value *val,
1364 const char *arg_val __UNUSED__)
1365{
1366 if (val->boolp)
1367 (*val->boolp) = EINA_TRUE;
1368 if (!parser->copyright)
1369 {
1370 _ecore_getopt_desc_print_error(desc, _("no copyright was defined.\n"));
1371 return EINA_FALSE;
1372 }
1373 _ecore_getopt_copyright(stdout, parser);
1374 return EINA_TRUE;
1375}
1376
1377static Eina_Bool
1378_ecore_getopt_parse_license(const Ecore_Getopt *parser,
1379 const Ecore_Getopt_Desc *desc,
1380 Ecore_Getopt_Value *val,
1381 const char *arg_val __UNUSED__)
1382{
1383 if (val->boolp)
1384 (*val->boolp) = EINA_TRUE;
1385 if (!parser->license)
1386 {
1387 _ecore_getopt_desc_print_error(desc, _("no license was defined.\n"));
1388 return EINA_FALSE;
1389 }
1390 _ecore_getopt_license(stdout, parser);
1391 return EINA_TRUE;
1392}
1393
1394static Eina_Bool
1395_ecore_getopt_desc_handle(const Ecore_Getopt *parser,
1396 const Ecore_Getopt_Desc *desc,
1397 Ecore_Getopt_Value *value,
1398 const char *arg_val)
1399{
1400 switch (desc->action)
1401 {
1402 case ECORE_GETOPT_ACTION_STORE:
1403 return _ecore_getopt_parse_store(parser, desc, value, arg_val);
1404
1405 case ECORE_GETOPT_ACTION_STORE_CONST:
1406 return _ecore_getopt_parse_store_const(parser, desc, value, arg_val);
1407
1408 case ECORE_GETOPT_ACTION_STORE_TRUE:
1409 return _ecore_getopt_parse_store_true(parser, desc, value, arg_val);
1410
1411 case ECORE_GETOPT_ACTION_STORE_FALSE:
1412 return _ecore_getopt_parse_store_false(parser, desc, value, arg_val);
1413
1414 case ECORE_GETOPT_ACTION_CHOICE:
1415 return _ecore_getopt_parse_choice(parser, desc, value, arg_val);
1416
1417 case ECORE_GETOPT_ACTION_APPEND:
1418 return _ecore_getopt_parse_append(parser, desc, value, arg_val);
1419
1420 case ECORE_GETOPT_ACTION_COUNT:
1421 return _ecore_getopt_parse_count(parser, desc, value, arg_val);
1422
1423 case ECORE_GETOPT_ACTION_CALLBACK:
1424 return _ecore_getopt_parse_callback(parser, desc, value, arg_val);
1425
1426 case ECORE_GETOPT_ACTION_HELP:
1427 return _ecore_getopt_parse_help(parser, desc, value, arg_val);
1428
1429 case ECORE_GETOPT_ACTION_VERSION:
1430 return _ecore_getopt_parse_version(parser, desc, value, arg_val);
1431
1432 case ECORE_GETOPT_ACTION_COPYRIGHT:
1433 return _ecore_getopt_parse_copyright(parser, desc, value, arg_val);
1434
1435 case ECORE_GETOPT_ACTION_LICENSE:
1436 return _ecore_getopt_parse_license(parser, desc, value, arg_val);
1437
1438 default:
1439 return EINA_FALSE;
1440 }
1441}
1442
1443static Eina_Bool
1444_ecore_getopt_parse_arg_long(const Ecore_Getopt *parser,
1445 Ecore_Getopt_Value *values,
1446 int argc __UNUSED__,
1447 char **argv,
1448 int *idx,
1449 int *nonargs,
1450 const char *arg)
1451{
1452 const Ecore_Getopt_Desc *desc;
1453 Ecore_Getopt_Desc_Arg_Requirement arg_req;
1454 const char *arg_val;
1455 int desc_idx;
1456 Ecore_Getopt_Value *value;
1457 Eina_Bool ret;
1458
1459 desc = _ecore_getopt_parse_find_long(parser, arg);
1460 if (!desc)
1461 {
1462 fprintf(stderr, _("ERROR: unknown option --%s, ignored.\n"), arg);
1463 if (parser->strict)
1464 return EINA_FALSE;
1465
1466 (*idx)++;
1467 return EINA_TRUE;
1468 }
1469
1470 (*idx)++;
1471
1472 arg_req = _ecore_getopt_desc_arg_requirement(desc);
1473 if (arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
1474 {
1475 arg_val = strchr(arg, '=');
1476 if (arg_val)
1477 arg_val++;
1478 else
1479 {
1480 if ((*idx < *nonargs) && (argv[*idx][0] != '-'))
1481 {
1482 arg_val = argv[*idx];
1483 (*idx)++;
1484 }
1485 else
1486 arg_val = NULL;
1487 }
1488
1489 if (arg_val && arg_val[0] == '\0')
1490 arg_val = NULL;
1491
1492 if ((!arg_val) && (arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES))
1493 {
1494 fprintf
1495 (stderr, _("ERROR: option --%s requires an argument!\n"), arg);
1496 if (parser->strict)
1497 return EINA_FALSE;
1498 return EINA_TRUE;
1499 }
1500 }
1501 else
1502 arg_val = NULL;
1503
1504 desc_idx = desc - parser->descs;
1505 value = values + desc_idx;
1506 ret = _ecore_getopt_desc_handle(parser, desc, value, arg_val);
1507 if ((!ret) && parser->strict)
1508 return EINA_FALSE;
1509
1510 return EINA_TRUE;
1511}
1512
1513static Eina_Bool
1514_ecore_getopt_parse_arg_short(const Ecore_Getopt *parser,
1515 Ecore_Getopt_Value *values,
1516 int argc __UNUSED__,
1517 char **argv,
1518 int *idx,
1519 int *nonargs,
1520 const char *arg)
1521{
1522 int run = 1;
1523 while (run && (arg[0] != '\0'))
1524 {
1525 int opt = arg[0];
1526 const Ecore_Getopt_Desc *desc;
1527 Ecore_Getopt_Desc_Arg_Requirement arg_req;
1528 const char *arg_val;
1529 int desc_idx;
1530 Ecore_Getopt_Value *value;
1531 Eina_Bool ret;
1532
1533 desc = _ecore_getopt_parse_find_short(parser, arg[0]);
1534 if (!desc)
1535 {
1536 fprintf
1537 (stderr, _("ERROR: unknown option -%c, ignored.\n"), arg[0]);
1538 if (parser->strict)
1539 return EINA_FALSE;
1540
1541 arg++;
1542 continue;
1543 }
1544
1545 arg++;
1546
1547 arg_req = _ecore_getopt_desc_arg_requirement(desc);
1548 if (arg_req != ECORE_GETOPT_DESC_ARG_REQUIREMENT_NO)
1549 {
1550 (*idx)++;
1551 run = 0;
1552
1553 if (arg[0] == '=')
1554 arg_val = arg + 1;
1555 else if (arg[0] != '\0')
1556 arg_val = arg;
1557 else
1558 {
1559 if ((*idx < *nonargs) && (argv[*idx][0] != '-'))
1560 {
1561 arg_val = argv[*idx];
1562 (*idx)++;
1563 }
1564 else
1565 arg_val = NULL;
1566 }
1567
1568 if (arg_val && arg_val[0] == '\0')
1569 arg_val = NULL;
1570
1571 if ((!arg_val) &&
1572 (arg_req == ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES))
1573 {
1574 fprintf
1575 (stderr, _("ERROR: option -%c requires an argument!\n"),
1576 opt);
1577 if (parser->strict)
1578 return EINA_FALSE;
1579 return EINA_TRUE;
1580 }
1581 }
1582 else
1583 arg_val = NULL;
1584
1585 desc_idx = desc - parser->descs;
1586 value = values + desc_idx;
1587 ret = _ecore_getopt_desc_handle(parser, desc, value, arg_val);
1588 if ((!ret) && parser->strict)
1589 return EINA_FALSE;
1590 }
1591
1592 if (run)
1593 (*idx)++;
1594
1595 return EINA_TRUE;
1596}
1597
1598static Eina_Bool
1599_ecore_getopt_parse_arg(const Ecore_Getopt *parser,
1600 Ecore_Getopt_Value *values,
1601 int argc,
1602 char **argv,
1603 int *idx,
1604 int *nonargs)
1605{
1606 char *arg = argv[*idx];
1607
1608 if (arg[0] != '-')
1609 {
1610 char **dst, **src, **src_end;
1611
1612 dst = argv + *idx;
1613 src = dst + 1;
1614 src_end = src + *nonargs - *idx - 1;
1615
1616 for (; src < src_end; src++, dst++)
1617 *dst = *src;
1618
1619 *dst = arg;
1620 (*nonargs)--;
1621 return EINA_TRUE;
1622 }
1623
1624 if (arg[1] == '-')
1625 return _ecore_getopt_parse_arg_long(parser, values, argc, argv, idx, nonargs, arg + 2);
1626 else
1627 return _ecore_getopt_parse_arg_short(parser, values, argc, argv, idx, nonargs, arg + 1);
1628}
1629
1630static const Ecore_Getopt_Desc *
1631_ecore_getopt_parse_find_short_other(const Ecore_Getopt *parser,
1632 const Ecore_Getopt_Desc *orig)
1633{
1634 const Ecore_Getopt_Desc *desc = parser->descs;
1635 const char c = orig->shortname;
1636
1637 for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
1638 {
1639 if (desc == orig)
1640 return NULL;
1641
1642 if (c == desc->shortname)
1643 return desc;
1644 }
1645
1646 return NULL;
1647}
1648
1649static const Ecore_Getopt_Desc *
1650_ecore_getopt_parse_find_long_other(const Ecore_Getopt *parser,
1651 const Ecore_Getopt_Desc *orig)
1652{
1653 const Ecore_Getopt_Desc *desc = parser->descs;
1654 const char *name = orig->longname;
1655
1656 for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
1657 {
1658 if (desc == orig)
1659 return NULL;
1660
1661 if (desc->longname && (strcmp(name, desc->longname) == 0))
1662 return desc;
1663 }
1664
1665 return NULL;
1666}
1667
1668/**
1669 * Check parser for duplicate entries, print them out.
1670 *
1671 * @return EINA_TRUE if there are duplicates, EINA_FALSE otherwise.
1672 */
1673Eina_Bool
1674ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser)
1675{
1676 const Ecore_Getopt_Desc *desc = parser->descs;
1677 for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
1678 {
1679 if (desc->shortname)
1680 {
1681 const Ecore_Getopt_Desc *other;
1682 other = _ecore_getopt_parse_find_short_other(parser, desc);
1683 if (other)
1684 {
1685 _ecore_getopt_desc_print_error(desc, "short name -%c already exists.", desc->shortname);
1686
1687 if (other->longname)
1688 fprintf(stderr, " Other is --%s.\n", other->longname);
1689 else
1690 fputc('\n', stderr);
1691 return EINA_TRUE;
1692 }
1693 }
1694
1695 if (desc->longname)
1696 {
1697 const Ecore_Getopt_Desc *other;
1698 other = _ecore_getopt_parse_find_long_other(parser, desc);
1699 if (other)
1700 {
1701 _ecore_getopt_desc_print_error(desc, "long name --%s already exists.", desc->longname);
1702
1703 if (other->shortname)
1704 fprintf(stderr, " Other is -%c.\n", other->shortname);
1705 else
1706 fputc('\n', stderr);
1707 return EINA_TRUE;
1708 }
1709 }
1710 }
1711 return EINA_FALSE;
1712}
1713
1714static const Ecore_Getopt_Desc *
1715_ecore_getopt_find_help(const Ecore_Getopt *parser)
1716{
1717 const Ecore_Getopt_Desc *desc = parser->descs;
1718 for (; !_ecore_getopt_desc_is_sentinel(desc); desc++)
1719 if (desc->action == ECORE_GETOPT_ACTION_HELP)
1720 return desc;
1721 return NULL;
1722}
1723
1724/**
1725 * Parse command line parameters.
1726 *
1727 * Walks the command line parameters and parse them based on @a parser
1728 * description, doing actions based on @c parser->descs->action, like
1729 * showing help text, license, copyright, storing values in values and
1730 * so on.
1731 *
1732 * It is expected that values is of the same size than @c parser->descs,
1733 * options that do not need a value it will be left untouched.
1734 *
1735 * All values are expected to be initialized before use. Options with
1736 * action @c ECORE_GETOPT_ACTION_STORE and non required arguments
1737 * (others than @c ECORE_GETOPT_DESC_ARG_REQUIREMENT_YES), are expected
1738 * to provide a value in @c def to be used.
1739 *
1740 * The following actions will store 1 on value as a boolean
1741 * (@c value->boolp) if it's not NULL to indicate these actions were executed:
1742 * - @c ECORE_GETOPT_ACTION_HELP
1743 * - @c ECORE_GETOPT_ACTION_VERSION
1744 * - @c ECORE_GETOPT_ACTION_COPYRIGHT
1745 * - @c ECORE_GETOPT_ACTION_LICENSE
1746 *
1747 * Just @c ECORE_GETOPT_ACTION_APPEND will allocate memory and thus
1748 * need to be freed. For consistency between all of appended subtypes,
1749 * @c eina_list->data will contain an allocated memory with the value,
1750 * that is, for @c ECORE_GETOPT_TYPE_STR it will contain a copy of the
1751 * argument, @c ECORE_GETOPT_TYPE_INT a pointer to an allocated
1752 * integer and so on.
1753 *
1754 * If parser is in strict mode (see @c Ecore_Getopt->strict), then any
1755 * error will abort parsing and -1 is returned. Otherwise it will try
1756 * to continue as far as possible.
1757 *
1758 * This function may reorder @a argv elements.
1759 *
1760 * Translation of help strings (description), metavar, usage, license
1761 * and copyright may be translated, standard/global gettext() call
1762 * will be applied on them if ecore was compiled with such support.
1763 *
1764 * @param parser description of how to work.
1765 * @param value where to store values, it is assumed that this is a vector
1766 * of the same size as @c parser->descs. Values should be previously
1767 * initialized.
1768 * @param argc how many elements in @a argv. If not provided it will be
1769 * retrieved with ecore_app_args_get().
1770 * @param argv command line parameters.
1771 *
1772 * @return index of first non-option parameter or -1 on error.
1773 */
1774int
1775ecore_getopt_parse(const Ecore_Getopt *parser,
1776 Ecore_Getopt_Value *values,
1777 int argc,
1778 char **argv)
1779{
1780 int i, nonargs;
1781
1782 if (!parser)
1783 {
1784 fputs(_("ERROR: no parser provided.\n"), stderr);
1785 return -1;
1786 }
1787 if (!values)
1788 {
1789 fputs(_("ERROR: no values provided.\n"), stderr);
1790 return -1;
1791 }
1792
1793 if ((argc < 1) || (!argv))
1794 ecore_app_args_get(&argc, &argv);
1795
1796 if (argc < 1)
1797 {
1798 fputs(_("ERROR: no arguments provided.\n"), stderr);
1799 return -1;
1800 }
1801
1802 if (argv[0])
1803 prog = argv[0];
1804 else
1805 prog = parser->prog;
1806
1807 nonargs = _ecore_getopt_parse_find_nonargs_base(parser, argc, argv);
1808 if (nonargs < 0)
1809 goto error;
1810
1811 if (nonargs > argc)
1812 nonargs = argc;
1813
1814 i = 1;
1815 while (i < nonargs)
1816 if (!_ecore_getopt_parse_arg(parser, values, argc, argv, &i, &nonargs))
1817 goto error;
1818
1819 return nonargs;
1820
1821error:
1822 {
1823 const Ecore_Getopt_Desc *help;
1824 fputs(_("ERROR: invalid options found."), stderr);
1825
1826 help = _ecore_getopt_find_help(parser);
1827 if (!help)
1828 fputc('\n', stderr);
1829 else if (help->longname)
1830 fprintf(stderr, _(" See --%s.\n"), help->longname);
1831 else
1832 fprintf(stderr, _(" See -%c.\n"), help->shortname);
1833 }
1834
1835 return -1;
1836}
1837
1838/**
1839 * Utility to free list and nodes allocated by @a ECORE_GETOPT_ACTION_APPEND.
1840 *
1841 * @param list pointer to list to be freed.
1842 * @return always NULL, so you can easily make your list head NULL.
1843 */
1844Eina_List *
1845ecore_getopt_list_free(Eina_List *list)
1846{
1847 void *data;
1848
1849 EINA_LIST_FREE(list, data)
1850 free(data);
1851 return NULL;
1852}
1853
1854/**
1855 * Helper ecore_getopt callback to parse geometry (x:y:w:h).
1856 *
1857 * Storage must be a pointer to @c Eina_Rectangle and will be used to
1858 * store the four values passed in the given string.
1859 *
1860 * @c callback_data value is ignored, you can safely use @c NULL.
1861 */
1862Eina_Bool
1863ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser __UNUSED__,
1864 const Ecore_Getopt_Desc *desc __UNUSED__,
1865 const char *str,
1866 void *data __UNUSED__,
1867 Ecore_Getopt_Value *storage)
1868{
1869 Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp;
1870
1871 if (sscanf(str, "%d:%d:%d:%d", &v->x, &v->y, &v->w, &v->h) != 4)
1872 {
1873 fprintf(stderr, _("ERROR: incorrect geometry value '%s'\n"), str);
1874 return EINA_FALSE;
1875 }
1876
1877 return EINA_TRUE;
1878}
1879
1880/**
1881 * Helper ecore_getopt callback to parse geometry size (WxH).
1882 *
1883 * Storage must be a pointer to @c Eina_Rectangle and will be used to
1884 * store the two values passed in the given string and 0 in the x and y
1885 * fields.
1886 *
1887 * @c callback_data value is ignored, you can safely use @c NULL.
1888 */
1889Eina_Bool
1890ecore_getopt_callback_size_parse(const Ecore_Getopt *parser __UNUSED__,
1891 const Ecore_Getopt_Desc *desc __UNUSED__,
1892 const char *str,
1893 void *data __UNUSED__,
1894 Ecore_Getopt_Value *storage)
1895{
1896 Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp;
1897
1898 if (sscanf(str, "%dx%d", &v->w, &v->h) != 2)
1899 {
1900 fprintf(stderr, _("ERROR: incorrect size value '%s'\n"), str);
1901 return EINA_FALSE;
1902 }
1903 v->x = 0;
1904 v->y = 0;
1905
1906 return EINA_TRUE;
1907}
1908
diff --git a/libraries/ecore/src/lib/ecore/ecore_glib.c b/libraries/ecore/src/lib/ecore/ecore_glib.c
new file mode 100644
index 0000000..6ddcd36
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_glib.c
@@ -0,0 +1,338 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10#ifdef HAVE_GLIB
11#include <glib.h>
12
13static Eina_Bool _ecore_glib_active = EINA_FALSE;
14static Ecore_Select_Function _ecore_glib_select_original;
15static GCond *_ecore_glib_cond = NULL;
16static GPollFD *_ecore_glib_fds = NULL;
17static size_t _ecore_glib_fds_size = 0;
18static const size_t ECORE_GLIB_FDS_INITIAL = 128;
19static const size_t ECORE_GLIB_FDS_STEP = 8;
20static const size_t ECORE_GLIB_FDS_MAX_FREE = 256;
21
22static Eina_Bool
23_ecore_glib_fds_resize(size_t size)
24{
25 void *tmp = realloc(_ecore_glib_fds, sizeof(GPollFD) * size);
26
27 if (!tmp)
28 {
29 ERR("Could not realloc from %zu to %zu buckets.",
30 _ecore_glib_fds_size, size);
31 return EINA_FALSE;
32 }
33
34 _ecore_glib_fds = tmp;
35 _ecore_glib_fds_size = size;
36 return EINA_TRUE;
37}
38
39static int
40_ecore_glib_context_query(GMainContext *ctx,
41 int priority,
42 int *p_timer)
43{
44 int reqfds;
45
46 if (_ecore_glib_fds_size == 0)
47 {
48 if (!_ecore_glib_fds_resize(ECORE_GLIB_FDS_INITIAL)) return -1;
49 }
50
51 while (1)
52 {
53 size_t size;
54
55 reqfds = g_main_context_query
56 (ctx, priority, p_timer, _ecore_glib_fds, _ecore_glib_fds_size);
57 if (reqfds <= (int)_ecore_glib_fds_size) break;
58
59 size = (1 + reqfds / ECORE_GLIB_FDS_STEP) * ECORE_GLIB_FDS_STEP;
60 if (!_ecore_glib_fds_resize(size)) return -1;
61 }
62
63 if (reqfds + ECORE_GLIB_FDS_MAX_FREE < _ecore_glib_fds_size)
64 {
65 size_t size;
66
67 size = (1 + reqfds / ECORE_GLIB_FDS_MAX_FREE) * ECORE_GLIB_FDS_MAX_FREE;
68 _ecore_glib_fds_resize(size);
69 }
70
71 return reqfds;
72}
73
74static int
75_ecore_glib_context_poll_from(const GPollFD *pfds,
76 int count,
77 fd_set *rfds,
78 fd_set *wfds,
79 fd_set *efds)
80{
81 const GPollFD *itr = pfds, *itr_end = pfds + count;
82 int glib_fds = -1;
83
84 for (; itr < itr_end; itr++)
85 {
86 if (glib_fds < itr->fd)
87 glib_fds = itr->fd;
88
89 if (itr->events & G_IO_IN)
90 FD_SET(itr->fd, rfds);
91 if (itr->events & G_IO_OUT)
92 FD_SET(itr->fd, wfds);
93 if (itr->events & (G_IO_HUP | G_IO_ERR))
94 FD_SET(itr->fd, efds);
95 }
96
97 return glib_fds + 1;
98}
99
100static int
101_ecore_glib_context_poll_to(GPollFD *pfds,
102 int count,
103 const fd_set *rfds,
104 const fd_set *wfds,
105 const fd_set *efds,
106 int ready)
107{
108 GPollFD *itr = pfds, *itr_end = pfds + count;
109
110 for (; itr < itr_end && ready > 0; itr++)
111 {
112 itr->revents = 0;
113 if (FD_ISSET(itr->fd, rfds))
114 {
115 itr->revents |= G_IO_IN;
116 ready--;
117 }
118 if (FD_ISSET(itr->fd, wfds))
119 {
120 itr->revents |= G_IO_OUT;
121 ready--;
122 }
123 if (FD_ISSET(itr->fd, efds))
124 {
125 itr->revents |= G_IO_ERR;
126 ready--;
127 }
128 }
129 return ready;
130}
131
132static int
133_ecore_glib_select__locked(GMainContext *ctx,
134 int ecore_fds,
135 fd_set *rfds,
136 fd_set *wfds,
137 fd_set *efds,
138 struct timeval *ecore_timeout)
139{
140 int priority, maxfds, glib_fds, reqfds, reqtimeout, ret;
141 struct timeval *timeout, glib_timeout;
142
143 g_main_context_prepare(ctx, &priority);
144 reqfds = _ecore_glib_context_query(ctx, priority, &reqtimeout);
145 if (reqfds < 0) goto error;
146
147 glib_fds = _ecore_glib_context_poll_from
148 (_ecore_glib_fds, reqfds, rfds, wfds, efds);
149
150 if (reqtimeout == -1)
151 timeout = ecore_timeout;
152 else
153 {
154 glib_timeout.tv_sec = reqtimeout / 1000;
155 glib_timeout.tv_usec = (reqtimeout % 1000) * 1000;
156
157 if (!ecore_timeout || timercmp(ecore_timeout, &glib_timeout, >))
158 timeout = &glib_timeout;
159 else
160 timeout = ecore_timeout;
161 }
162
163 maxfds = (ecore_fds >= glib_fds) ? ecore_fds : glib_fds;
164 ret = _ecore_glib_select_original(maxfds, rfds, wfds, efds, timeout);
165
166 ret = _ecore_glib_context_poll_to
167 (_ecore_glib_fds, reqfds, rfds, wfds, efds, ret);
168
169 if (g_main_context_check(ctx, priority, _ecore_glib_fds, reqfds))
170 g_main_context_dispatch(ctx);
171
172 return ret;
173
174error:
175 return _ecore_glib_select_original
176 (ecore_fds, rfds, wfds, efds, ecore_timeout);
177}
178
179static int
180_ecore_glib_select(int ecore_fds,
181 fd_set *rfds,
182 fd_set *wfds,
183 fd_set *efds,
184 struct timeval *ecore_timeout)
185{
186 GStaticMutex lock = G_STATIC_MUTEX_INIT;
187 GMutex *mutex = g_static_mutex_get_mutex(&lock);
188 GMainContext *ctx = g_main_context_default();
189 int ret;
190
191 if (g_main_context_acquire(ctx))
192 g_mutex_lock(mutex);
193 else
194 {
195 if (!_ecore_glib_cond)
196 _ecore_glib_cond = g_cond_new();
197
198 while (!g_main_context_wait(ctx, _ecore_glib_cond, mutex))
199 g_thread_yield();
200 }
201
202 ret = _ecore_glib_select__locked
203 (ctx, ecore_fds, rfds, wfds, efds, ecore_timeout);
204
205 g_mutex_unlock(mutex);
206 g_main_context_release(ctx);
207
208 return ret;
209}
210
211#endif
212
213void
214_ecore_glib_init(void)
215{
216}
217
218void
219_ecore_glib_shutdown(void)
220{
221#ifdef HAVE_GLIB
222 if (!_ecore_glib_active) return;
223 _ecore_glib_active = EINA_FALSE;
224
225 if (ecore_main_loop_select_func_get() == _ecore_glib_select)
226 ecore_main_loop_select_func_set(_ecore_glib_select_original);
227
228 if (_ecore_glib_fds)
229 {
230 free(_ecore_glib_fds);
231 _ecore_glib_fds = NULL;
232 }
233 _ecore_glib_fds_size = 0;
234
235 if (_ecore_glib_cond)
236 {
237 g_cond_free(_ecore_glib_cond);
238 _ecore_glib_cond = NULL;
239 }
240#endif
241}
242
243/**
244 * @addtogroup Ecore_Main_Loop_Group
245 *
246 * @}
247 */
248
249/**
250 * Request ecore to integrate GLib's main loop.
251 *
252 * This will add a small overhead during every main loop interaction
253 * by checking glib's default main context (used by its main loop). If
254 * it have events to be checked (timers, file descriptors or idlers),
255 * then these will be polled alongside with Ecore's own events, then
256 * dispatched before Ecore's. This is done by calling
257 * ecore_main_loop_select_func_set().
258 *
259 * This will cooperate with previously set
260 * ecore_main_loop_select_func_set() by calling the old
261 * function. Similarly, if you want to override
262 * ecore_main_loop_select_func_set() after main loop is integrated,
263 * call the new select function set by this call (get it by calling
264 * ecore_main_loop_select_func_get() right after
265 * ecore_main_loop_glib_integrate()).
266 *
267 * This is useful to use GMainLoop libraries, like GTK, GUPnP,
268 * LibSoup, GConf and more. Adobe Flash plugin and other plugins
269 * systems depend on this as well.
270 *
271 * Once initialized/integrated, it will be valid until Ecore is
272 * completely shut down.
273 *
274 * Example of use:
275 * @code
276 *
277 * int main(void)
278 * {
279 * ecore_init();
280 * ecore_main_loop_glib_integrate();
281 *
282 * // some code here
283 *
284 * ecore_main_loop_begin();
285 *
286 * ecore_shutdown();
287 *
288 * return 0;
289 * }
290 *
291 * @endcode
292 *
293 * @note This is only available if Ecore was compiled with GLib support.
294 * @note You don't need to call this function if Ecore was compiled with
295 * --enable-glib-integration-always.
296 *
297 * @return @c EINA_TRUE on success of @c EINA_FALSE if it failed,
298 * likely no GLib support in Ecore.
299 */
300EAPI Eina_Bool
301ecore_main_loop_glib_integrate(void)
302{
303#ifdef HAVE_GLIB
304 void *func;
305
306 if (_ecore_glib_active) return EINA_TRUE;
307 func = ecore_main_loop_select_func_get();
308 if (func == _ecore_glib_select) return EINA_TRUE;
309 _ecore_glib_select_original = func;
310 ecore_main_loop_select_func_set(_ecore_glib_select);
311 _ecore_glib_active = EINA_TRUE;
312 return EINA_TRUE;
313#else
314 fputs("ERROR: no glib support in ecore.\n", stderr);
315 return EINA_FALSE;
316#endif
317}
318
319Eina_Bool _ecore_glib_always_integrate = 1;
320
321/**
322 * Disable always integrating glib
323 *
324 * If ecore is compiled with --enable-glib-integration-always (to always
325 * call ecore_main_loop_glib_integrate() when ecore_init() is called), then
326 * calling this before calling ecore_init() will disable the integration.
327 * This is for apps that explicitly do not want this to happen for whatever
328 * reasons they may have.
329 */
330EAPI void
331ecore_main_loop_glib_always_integrate_disable(void)
332{
333 _ecore_glib_always_integrate = 0;
334}
335
336/**
337 * @}
338 */
diff --git a/libraries/ecore/src/lib/ecore/ecore_idle_enterer.c b/libraries/ecore/src/lib/ecore/ecore_idle_enterer.c
new file mode 100644
index 0000000..03cd1c4
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_idle_enterer.c
@@ -0,0 +1,207 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10struct _Ecore_Idle_Enterer
11{
12 EINA_INLIST;
13 ECORE_MAGIC;
14 Ecore_Task_Cb func;
15 void *data;
16 int references;
17 Eina_Bool delete_me : 1;
18};
19
20static Ecore_Idle_Enterer *idle_enterers = NULL;
21static Ecore_Idle_Enterer *idle_enterer_current = NULL;
22static int idle_enterers_delete_me = 0;
23
24static void *
25_ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
26
27/**
28 * @addtogroup Ecore_Idle_Group
29 *
30 * @{
31 */
32
33/**
34 * Add an idle enterer handler.
35 * @param func The function to call when entering an idle state.
36 * @param data The data to be passed to the @p func call
37 * @return A handle to the idle enterer callback if successful. Otherwise,
38 * NULL is returned.
39 * @note The function func will be called every time the main loop is entering
40 * idle state, as long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
41 * (or ECORE_CALLBACK_CANCEL) deletes the idle enterer.
42 */
43EAPI Ecore_Idle_Enterer *
44ecore_idle_enterer_add(Ecore_Task_Cb func,
45 const void *data)
46{
47 Ecore_Idle_Enterer *ie = NULL;
48
49 _ecore_lock();
50
51 if (!func) goto unlock;
52 ie = calloc(1, sizeof(Ecore_Idle_Enterer));
53 if (!ie) goto unlock;
54 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER);
55 ie->func = func;
56 ie->data = (void *)data;
57 idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_append(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
58unlock:
59 _ecore_unlock();
60 return ie;
61}
62
63/**
64 * Add an idle enterer handler at the start of the list so it gets called earlier than others.
65 * @param func The function to call when entering an idle state.
66 * @param data The data to be passed to the @p func call
67 * @return A handle to the idle enterer callback if successful. Otherwise,
68 * NULL is returned.
69 * @note The function func will be called every time the main loop is entering
70 * idle state, as long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
71 * (or ECORE_CALLBACK_CANCEL) deletes the idle enterer.
72 */
73EAPI Ecore_Idle_Enterer *
74ecore_idle_enterer_before_add(Ecore_Task_Cb func,
75 const void *data)
76{
77 Ecore_Idle_Enterer *ie = NULL;
78
79 _ecore_lock();
80
81 if (!func) goto unlock;
82 ie = calloc(1, sizeof(Ecore_Idle_Enterer));
83 if (!ie) goto unlock;
84 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_ENTERER);
85 ie->func = func;
86 ie->data = (void *)data;
87 idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_prepend(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
88unlock:
89 _ecore_unlock();
90 return ie;
91}
92
93/**
94 * Delete an idle enterer callback.
95 * @param idle_enterer The idle enterer to delete
96 * @return The data pointer passed to the idler enterer callback on success.
97 * NULL otherwise.
98 */
99EAPI void *
100ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
101{
102 void *data;
103
104 if (!ECORE_MAGIC_CHECK(idle_enterer, ECORE_MAGIC_IDLE_ENTERER))
105 {
106 ECORE_MAGIC_FAIL(idle_enterer, ECORE_MAGIC_IDLE_ENTERER,
107 "ecore_idle_enterer_del");
108 return NULL;
109 }
110 _ecore_lock();
111 data = _ecore_idle_enterer_del(idle_enterer);
112 _ecore_unlock();
113 return data;
114}
115
116/**
117 * @}
118 */
119
120static void *
121_ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer)
122{
123 EINA_SAFETY_ON_TRUE_RETURN_VAL(idle_enterer->delete_me, NULL);
124 idle_enterer->delete_me = 1;
125 idle_enterers_delete_me = 1;
126 return idle_enterer->data;
127}
128
129void
130_ecore_idle_enterer_shutdown(void)
131{
132 Ecore_Idle_Enterer *ie;
133 while ((ie = idle_enterers))
134 {
135 idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(idle_enterers));
136 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
137 free(ie);
138 }
139 idle_enterers_delete_me = 0;
140 idle_enterer_current = NULL;
141}
142
143void
144_ecore_idle_enterer_call(void)
145{
146 if (!idle_enterer_current)
147 {
148 /* regular main loop, start from head */
149 idle_enterer_current = idle_enterers;
150 }
151 else
152 {
153 /* recursive main loop, continue from where we were */
154 idle_enterer_current =
155 (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next;
156 }
157
158 while (idle_enterer_current)
159 {
160 Ecore_Idle_Enterer *ie = (Ecore_Idle_Enterer *)idle_enterer_current;
161 if (!ie->delete_me)
162 {
163 ie->references++;
164 if (!_ecore_call_task_cb(ie->func, ie->data))
165 {
166 if (!ie->delete_me) _ecore_idle_enterer_del(ie);
167 }
168 ie->references--;
169 }
170 if (idle_enterer_current) /* may have changed in recursive main loops */
171 idle_enterer_current =
172 (Ecore_Idle_Enterer *)EINA_INLIST_GET(idle_enterer_current)->next;
173 }
174 if (idle_enterers_delete_me)
175 {
176 Ecore_Idle_Enterer *l;
177 int deleted_idler_enterers_in_use = 0;
178
179 for (l = idle_enterers; l; )
180 {
181 Ecore_Idle_Enterer *ie = l;
182 l = (Ecore_Idle_Enterer *)EINA_INLIST_GET(l)->next;
183 if (ie->delete_me)
184 {
185 if (ie->references)
186 {
187 deleted_idler_enterers_in_use++;
188 continue;
189 }
190
191 idle_enterers = (Ecore_Idle_Enterer *)eina_inlist_remove(EINA_INLIST_GET(idle_enterers), EINA_INLIST_GET(ie));
192 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
193 free(ie);
194 }
195 }
196 if (!deleted_idler_enterers_in_use)
197 idle_enterers_delete_me = 0;
198 }
199}
200
201int
202_ecore_idle_enterer_exist(void)
203{
204 if (idle_enterers) return 1;
205 return 0;
206}
207
diff --git a/libraries/ecore/src/lib/ecore/ecore_idle_exiter.c b/libraries/ecore/src/lib/ecore/ecore_idle_exiter.c
new file mode 100644
index 0000000..70c6a7a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_idle_exiter.c
@@ -0,0 +1,176 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10struct _Ecore_Idle_Exiter
11{
12 EINA_INLIST;
13 ECORE_MAGIC;
14 Ecore_Task_Cb func;
15 void *data;
16 int references;
17 Eina_Bool delete_me : 1;
18};
19
20static Ecore_Idle_Exiter *idle_exiters = NULL;
21static Ecore_Idle_Exiter *idle_exiter_current = NULL;
22static int idle_exiters_delete_me = 0;
23
24static void *
25_ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
26
27/**
28 * @addtogroup Ecore_Idle_Group
29 *
30 * @{
31 */
32
33/**
34 * Add an idle exiter handler.
35 * @param func The function to call when exiting an idle state.
36 * @param data The data to be passed to the @p func call
37 * @return A handle to the idle exiter callback on success. NULL otherwise.
38 * @note The function func will be called every time the main loop is exiting
39 * idle state, as long as it returns 1 (or ECORE_CALLBACK_RENEW). A return of 0
40 * (or ECORE_CALLBACK_CANCEL) deletes the idle exiter.
41 */
42EAPI Ecore_Idle_Exiter *
43ecore_idle_exiter_add(Ecore_Task_Cb func,
44 const void *data)
45{
46 Ecore_Idle_Exiter *ie = NULL;
47
48 _ecore_lock();
49 if (!func) goto unlock;
50 ie = calloc(1, sizeof(Ecore_Idle_Exiter));
51 if (!ie) goto unlock;
52 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLE_EXITER);
53 ie->func = func;
54 ie->data = (void *)data;
55 idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_append(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
56unlock:
57 _ecore_unlock();
58 return ie;
59}
60
61/**
62 * Delete an idle exiter handler from the list to be run on exiting idle state.
63 * @param idle_exiter The idle exiter to delete
64 * @return The data pointer that was being being passed to the handler if
65 * successful. NULL otherwise.
66 */
67EAPI void *
68ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
69{
70 void *data;
71
72 if (!ECORE_MAGIC_CHECK(idle_exiter, ECORE_MAGIC_IDLE_EXITER))
73 {
74 ECORE_MAGIC_FAIL(idle_exiter, ECORE_MAGIC_IDLE_EXITER,
75 "ecore_idle_exiter_del");
76 return NULL;
77 }
78 _ecore_lock();
79 data = _ecore_idle_exiter_del(idle_exiter);
80 _ecore_unlock();
81 return data;
82}
83
84/**
85 * @}
86 */
87
88static void *
89_ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter)
90{
91 EINA_SAFETY_ON_TRUE_RETURN_VAL(idle_exiter->delete_me, NULL);
92 idle_exiter->delete_me = 1;
93 idle_exiters_delete_me = 1;
94 return idle_exiter->data;
95}
96
97void
98_ecore_idle_exiter_shutdown(void)
99{
100 Ecore_Idle_Exiter *ie;
101 while ((ie = idle_exiters))
102 {
103 idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(idle_exiters));
104 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
105 free(ie);
106 }
107 idle_exiters_delete_me = 0;
108 idle_exiter_current = NULL;
109}
110
111void
112_ecore_idle_exiter_call(void)
113{
114 if (!idle_exiter_current)
115 {
116 /* regular main loop, start from head */
117 idle_exiter_current = idle_exiters;
118 }
119 else
120 {
121 /* recursive main loop, continue from where we were */
122 idle_exiter_current =
123 (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
124 }
125
126 while (idle_exiter_current)
127 {
128 Ecore_Idle_Exiter *ie = (Ecore_Idle_Exiter *)idle_exiter_current;
129 if (!ie->delete_me)
130 {
131 ie->references++;
132 if (!_ecore_call_task_cb(ie->func, ie->data))
133 {
134 if (!ie->delete_me) _ecore_idle_exiter_del(ie);
135 }
136 ie->references--;
137 }
138 if (idle_exiter_current) /* may have changed in recursive main loops */
139 idle_exiter_current =
140 (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next;
141 }
142 if (idle_exiters_delete_me)
143 {
144 Ecore_Idle_Exiter *l;
145 int deleted_idler_exiters_in_use = 0;
146
147 for (l = idle_exiters; l; )
148 {
149 Ecore_Idle_Exiter *ie = l;
150
151 l = (Ecore_Idle_Exiter *)EINA_INLIST_GET(l)->next;
152 if (ie->delete_me)
153 {
154 if (ie->references)
155 {
156 deleted_idler_exiters_in_use++;
157 continue;
158 }
159
160 idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie));
161 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
162 free(ie);
163 }
164 }
165 if (!deleted_idler_exiters_in_use)
166 idle_exiters_delete_me = 0;
167 }
168}
169
170int
171_ecore_idle_exiter_exist(void)
172{
173 if (idle_exiters) return 1;
174 return 0;
175}
176
diff --git a/libraries/ecore/src/lib/ecore/ecore_idler.c b/libraries/ecore/src/lib/ecore/ecore_idler.c
new file mode 100644
index 0000000..6c0cab8
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_idler.c
@@ -0,0 +1,158 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10struct _Ecore_Idler
11{
12 EINA_INLIST;
13 ECORE_MAGIC;
14 Ecore_Task_Cb func;
15 void *data;
16 int references;
17 Eina_Bool delete_me : 1;
18};
19
20static Ecore_Idler *idlers = NULL;
21static Ecore_Idler *idler_current = NULL;
22static int idlers_delete_me = 0;
23
24static void *
25_ecore_idler_del(Ecore_Idler *idler);
26
27EAPI Ecore_Idler *
28ecore_idler_add(Ecore_Task_Cb func,
29 const void *data)
30{
31 Ecore_Idler *ie = NULL;
32
33 _ecore_lock();
34 if (!func) goto unlock;
35 ie = calloc(1, sizeof(Ecore_Idler));
36 if (!ie) goto unlock;
37 ECORE_MAGIC_SET(ie, ECORE_MAGIC_IDLER);
38 ie->func = func;
39 ie->data = (void *)data;
40 idlers = (Ecore_Idler *)eina_inlist_append(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie));
41unlock:
42 _ecore_unlock();
43 return ie;
44}
45
46EAPI void *
47ecore_idler_del(Ecore_Idler *idler)
48{
49 void *data = NULL;
50
51 if (!ECORE_MAGIC_CHECK(idler, ECORE_MAGIC_IDLER))
52 {
53 ECORE_MAGIC_FAIL(idler, ECORE_MAGIC_IDLER,
54 "ecore_idler_del");
55 return NULL;
56 }
57
58 _ecore_lock();
59 data = _ecore_idler_del(idler);
60 _ecore_unlock();
61 return data;
62}
63
64/**
65 * @}
66 */
67
68/**
69 * @}
70 */
71
72static void *
73_ecore_idler_del(Ecore_Idler *idler)
74{
75 EINA_SAFETY_ON_TRUE_RETURN_VAL(idler->delete_me, NULL);
76 idler->delete_me = 1;
77 idlers_delete_me = 1;
78 return idler->data;
79}
80
81void
82_ecore_idler_shutdown(void)
83{
84 Ecore_Idler *ie;
85 while ((ie = idlers))
86 {
87 idlers = (Ecore_Idler *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(idlers));
88 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
89 free(ie);
90 }
91 idlers_delete_me = 0;
92 idler_current = NULL;
93}
94
95int
96_ecore_idler_all_call(void)
97{
98 if (!idler_current)
99 {
100 /* regular main loop, start from head */
101 idler_current = idlers;
102 }
103 else
104 {
105 /* recursive main loop, continue from where we were */
106 idler_current = (Ecore_Idler *)EINA_INLIST_GET(idler_current)->next;
107 }
108
109 while (idler_current)
110 {
111 Ecore_Idler *ie = (Ecore_Idler *)idler_current;
112 if (!ie->delete_me)
113 {
114 ie->references++;
115 if (!_ecore_call_task_cb(ie->func, ie->data))
116 {
117 if (!ie->delete_me) _ecore_idler_del(ie);
118 }
119 ie->references--;
120 }
121 if (idler_current) /* may have changed in recursive main loops */
122 idler_current = (Ecore_Idler *)EINA_INLIST_GET(idler_current)->next;
123 }
124 if (idlers_delete_me)
125 {
126 Ecore_Idler *l;
127 int deleted_idlers_in_use = 0;
128 for (l = idlers; l; )
129 {
130 Ecore_Idler *ie = l;
131 l = (Ecore_Idler *)EINA_INLIST_GET(l)->next;
132 if (ie->delete_me)
133 {
134 if (ie->references)
135 {
136 deleted_idlers_in_use++;
137 continue;
138 }
139
140 idlers = (Ecore_Idler *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie));
141 ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE);
142 free(ie);
143 }
144 }
145 if (!deleted_idlers_in_use)
146 idlers_delete_me = 0;
147 }
148 if (idlers) return 1;
149 return 0;
150}
151
152int
153_ecore_idler_exist(void)
154{
155 if (idlers) return 1;
156 return 0;
157}
158
diff --git a/libraries/ecore/src/lib/ecore/ecore_job.c b/libraries/ecore/src/lib/ecore/ecore_job.c
new file mode 100644
index 0000000..481c3f3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_job.c
@@ -0,0 +1,122 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10static Eina_Bool _ecore_job_event_handler(void *data,
11 int type,
12 void *ev);
13static void _ecore_job_event_free(void *data,
14 void *ev);
15
16static int ecore_event_job_type = 0;
17static Ecore_Event_Handler *_ecore_job_handler = NULL;
18
19struct _Ecore_Job
20{
21 ECORE_MAGIC;
22 Ecore_Event *event;
23 Ecore_Cb func;
24 void *data;
25};
26
27void
28_ecore_job_init(void)
29{
30 ecore_event_job_type = ecore_event_type_new();
31 _ecore_job_handler = ecore_event_handler_add(ecore_event_job_type, _ecore_job_event_handler, NULL);
32}
33
34void
35_ecore_job_shutdown(void)
36{
37 _ecore_event_handler_del(_ecore_job_handler);
38 _ecore_job_handler = NULL;
39}
40
41/**
42 * @addtogroup Ecore_Job_Group
43 *
44 * @{
45 */
46
47/**
48 * Add a job to the event queue.
49 * @param func The function to call when the job gets handled.
50 * @param data Data pointer to be passed to the job function when the job is
51 * handled.
52 * @return The handle of the job. @c NULL is returned if the job could not be
53 * added to the queue.
54 * @note Once the job has been executed, the job handle is invalid.
55 */
56EAPI Ecore_Job *
57ecore_job_add(Ecore_Cb func,
58 const void *data)
59{
60 Ecore_Job *job;
61
62 if (!func) return NULL;
63
64 job = calloc(1, sizeof(Ecore_Job));
65 if (!job) return NULL;
66 ECORE_MAGIC_SET(job, ECORE_MAGIC_JOB);
67 job->event = ecore_event_add(ecore_event_job_type, job, _ecore_job_event_free, NULL);
68 if (!job->event)
69 {
70 free(job);
71 return NULL;
72 }
73 job->func = func;
74 job->data = (void *)data;
75 return job;
76}
77
78/**
79 * Delete a queued job that has not yet been executed.
80 * @param job Handle of the job to delete.
81 * @return The data pointer that was to be passed to the job.
82 */
83EAPI void *
84ecore_job_del(Ecore_Job *job)
85{
86 void *data;
87
88 if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_JOB))
89 {
90 ECORE_MAGIC_FAIL(job, ECORE_MAGIC_JOB,
91 "ecore_job_del");
92 return NULL;
93 }
94 data = job->data;
95 ECORE_MAGIC_SET(job, ECORE_MAGIC_NONE);
96 ecore_event_del(job->event);
97 return data;
98}
99
100/**
101 * @}
102 */
103
104static Eina_Bool
105_ecore_job_event_handler(void *data __UNUSED__,
106 int type __UNUSED__,
107 void *ev)
108{
109 Ecore_Job *job;
110
111 job = ev;
112 job->func(job->data);
113 return ECORE_CALLBACK_CANCEL;
114}
115
116static void
117_ecore_job_event_free(void *data __UNUSED__,
118 void *ev)
119{
120 free(ev);
121}
122
diff --git a/libraries/ecore/src/lib/ecore/ecore_main.c b/libraries/ecore/src/lib/ecore/ecore_main.c
new file mode 100644
index 0000000..152836a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_main.c
@@ -0,0 +1,2020 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#ifdef _WIN32
6# define WIN32_LEAN_AND_MEAN
7# include <winsock2.h>
8# undef WIN32_LEAN_AND_MEAN
9# ifndef USER_TIMER_MINIMUM
10# define USER_TIMER_MINIMUM 0x0a
11# endif
12#endif
13
14#ifdef __SUNPRO_C
15# include <ieeefp.h>
16# include <string.h>
17#endif
18
19#include <stdlib.h>
20#include <stdio.h>
21#include <math.h>
22#include <sys/types.h>
23#include <errno.h>
24#include <fcntl.h>
25
26#ifndef _MSC_VER
27# include <sys/time.h>
28# include <unistd.h>
29#else
30# include <float.h>
31#endif
32
33#ifdef HAVE_ISFINITE
34# define ECORE_FINITE(t) isfinite(t)
35#else
36# ifdef _MSC_VER
37# define ECORE_FINITE(t) _finite(t)
38# else
39# define ECORE_FINITE(t) finite(t)
40# endif
41#endif
42
43//#define FIX_HZ 1
44
45#ifdef FIX_HZ
46# ifndef _MSC_VER
47# include <sys/param.h>
48# endif
49# ifndef HZ
50# define HZ 100
51# endif
52#endif
53
54#ifdef HAVE_EVIL
55# include <Evil.h>
56#endif
57
58#include "Ecore.h"
59#include "ecore_private.h"
60
61#ifdef HAVE_SYS_EPOLL_H
62# define HAVE_EPOLL 1
63# include <sys/epoll.h>
64#else
65
66# define HAVE_EPOLL 0
67# define EPOLLIN 1
68# define EPOLLOUT 2
69# define EPOLLERR 8
70
71#define EPOLL_CTL_ADD 1
72#define EPOLL_CTL_DEL 2
73#define EPOLL_CTL_MOD 3
74
75typedef union epoll_data {
76 void *ptr;
77 int fd;
78 uint32_t u32;
79 uint64_t u64;
80} epoll_data_t;
81
82struct epoll_event
83{
84 uint32_t events;
85 epoll_data_t data;
86};
87
88static inline int
89epoll_create(int size __UNUSED__)
90{
91 return -1;
92}
93
94static inline int
95epoll_wait(int epfd __UNUSED__,
96 struct epoll_event *events __UNUSED__,
97 int maxevents __UNUSED__,
98 int timeout __UNUSED__)
99{
100 return -1;
101}
102
103static inline int
104epoll_ctl(int epfd __UNUSED__,
105 int op __UNUSED__,
106 int fd __UNUSED__,
107 struct epoll_event *event __UNUSED__)
108{
109 return -1;
110}
111
112#endif
113
114#ifdef HAVE_SYS_TIMERFD_H
115#include <sys/timerfd.h>
116#else
117/* fallback code if we don't have real timerfd - reduces number of ifdefs */
118#ifndef CLOCK_MONOTONIC
119#define CLOCK_MONOTONIC 0 /* bogus value */
120#endif
121#ifndef TFD_NONBLOCK
122#define TFD_NONBLOCK 0 /* bogus value */
123#endif
124static inline int
125timerfd_create(int clockid __UNUSED__,
126 int flags __UNUSED__)
127{
128 return -1;
129}
130
131static inline int
132timerfd_settime(int fd __UNUSED__,
133 int flags __UNUSED__,
134 const struct itimerspec *new_value __UNUSED__,
135 struct itimerspec *old_value __UNUSED__)
136{
137 return -1;
138}
139
140#endif /* HAVE_SYS_TIMERFD_H */
141
142#ifdef USE_G_MAIN_LOOP
143# include <glib.h>
144#endif
145
146#define NS_PER_SEC (1000.0 * 1000.0 * 1000.0)
147
148struct _Ecore_Fd_Handler
149{
150 EINA_INLIST;
151 ECORE_MAGIC;
152 Ecore_Fd_Handler *next_ready;
153 int fd;
154 Ecore_Fd_Handler_Flags flags;
155 Ecore_Fd_Cb func;
156 void *data;
157 Ecore_Fd_Cb buf_func;
158 void *buf_data;
159 Ecore_Fd_Prep_Cb prep_func;
160 void *prep_data;
161 int references;
162 Eina_Bool read_active : 1;
163 Eina_Bool write_active : 1;
164 Eina_Bool error_active : 1;
165 Eina_Bool delete_me : 1;
166#if defined(USE_G_MAIN_LOOP)
167 GPollFD gfd;
168#endif
169};
170
171#ifdef _WIN32
172struct _Ecore_Win32_Handler
173{
174 EINA_INLIST;
175 ECORE_MAGIC;
176 HANDLE h;
177 Ecore_Win32_Handle_Cb func;
178 void *data;
179 int references;
180 Eina_Bool delete_me : 1;
181};
182#endif
183
184#ifndef USE_G_MAIN_LOOP
185static int _ecore_main_select(double timeout);
186#endif
187static void _ecore_main_prepare_handlers(void);
188static void _ecore_main_fd_handlers_cleanup(void);
189#ifndef _WIN32
190# ifndef USE_G_MAIN_LOOP
191static void _ecore_main_fd_handlers_bads_rem(void);
192# endif
193#endif
194static void _ecore_main_fd_handlers_call(void);
195static int _ecore_main_fd_handlers_buf_call(void);
196#ifndef USE_G_MAIN_LOOP
197static void _ecore_main_loop_iterate_internal(int once_only);
198#endif
199
200#ifdef _WIN32
201static int _ecore_main_win32_select(int nfds,
202 fd_set *readfds,
203 fd_set *writefds,
204 fd_set *exceptfds,
205 struct timeval *timeout);
206static void _ecore_main_win32_handlers_cleanup(void);
207#endif
208
209static int in_main_loop = 0;
210#ifndef USE_G_MAIN_LOOP
211static int do_quit = 0;
212#endif
213static Ecore_Fd_Handler *fd_handlers = NULL;
214static Ecore_Fd_Handler *fd_handler_current = NULL;
215static Eina_List *fd_handlers_with_prep = NULL;
216static Eina_List *fd_handlers_with_buffer = NULL;
217static Eina_List *fd_handlers_to_delete = NULL;
218
219/* single linked list of ready fdhs, terminated by loop to self */
220static Ecore_Fd_Handler *fd_handlers_to_call;
221static Ecore_Fd_Handler *fd_handlers_to_call_current;
222
223#ifdef _WIN32
224static Ecore_Win32_Handler *win32_handlers = NULL;
225static Ecore_Win32_Handler *win32_handler_current = NULL;
226static Eina_Bool win32_handlers_delete_me = EINA_FALSE;
227#endif
228
229#ifdef _WIN32
230Ecore_Select_Function main_loop_select = _ecore_main_win32_select;
231#else
232# ifdef HAVE_SYS_SELECT_H
233# include <sys/select.h>
234# endif
235Ecore_Select_Function main_loop_select = select;
236#endif
237
238#ifndef USE_G_MAIN_LOOP
239static double t1 = 0.0;
240static double t2 = 0.0;
241#endif
242
243static int timer_fd = -1;
244static int epoll_fd = -1;
245static pid_t epoll_pid;
246
247#ifdef USE_G_MAIN_LOOP
248static GPollFD ecore_epoll_fd;
249static GPollFD ecore_timer_fd;
250static GSource *ecore_glib_source;
251static guint ecore_glib_source_id;
252static GMainLoop *ecore_main_loop;
253static gboolean ecore_idling;
254static gboolean _ecore_glib_idle_enterer_called;
255static gboolean ecore_fds_ready;
256#endif
257
258static inline void
259_ecore_fd_valid(void)
260{
261 if (HAVE_EPOLL && epoll_fd >= 0)
262 {
263 if (fcntl(epoll_fd, F_GETFD) < 0)
264 {
265 ERR("arghhh you caught me! report a backtrace to edevel!");
266 pause();
267 }
268 }
269}
270
271static inline void
272_ecore_try_add_to_call_list(Ecore_Fd_Handler *fdh)
273{
274 /* check if this fdh is already in the list */
275 if (fdh->next_ready)
276 return;
277 if (fdh->read_active || fdh->write_active || fdh->error_active)
278 {
279 /*
280 * make sure next_ready is non-null by pointing to ourselves
281 * use that to indicate this fdh is in the ready list
282 * insert at the head of the list to avoid trouble
283 */
284 fdh->next_ready = fd_handlers_to_call ? fd_handlers_to_call : fdh;
285 fd_handlers_to_call = fdh;
286 }
287}
288
289static inline int
290_ecore_get_epoll_fd(void)
291{
292 if (epoll_pid && epoll_pid != getpid())
293 {
294 /* forked! */
295 _ecore_main_loop_shutdown();
296 }
297 if (epoll_pid == 0 && epoll_fd < 0)
298 {
299 _ecore_main_loop_init();
300 }
301 return epoll_fd;
302}
303
304static inline int
305_ecore_epoll_add(int efd,
306 int fd,
307 int events,
308 void *ptr)
309{
310 struct epoll_event ev;
311
312 memset(&ev, 0, sizeof (ev));
313 ev.events = events;
314 ev.data.ptr = ptr;
315 INF("adding poll on %d %08x", fd, events);
316 return epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev);
317}
318
319static inline int
320_ecore_poll_events_from_fdh(Ecore_Fd_Handler *fdh)
321{
322 int events = 0;
323 if (fdh->flags & ECORE_FD_READ) events |= EPOLLIN;
324 if (fdh->flags & ECORE_FD_WRITE) events |= EPOLLOUT;
325 if (fdh->flags & ECORE_FD_ERROR) events |= EPOLLERR;
326 return events;
327}
328
329#ifdef USE_G_MAIN_LOOP
330static inline int
331_gfd_events_from_fdh(Ecore_Fd_Handler *fdh)
332{
333 int events = 0;
334 if (fdh->flags & ECORE_FD_READ) events |= G_IO_IN;
335 if (fdh->flags & ECORE_FD_WRITE) events |= G_IO_OUT;
336 if (fdh->flags & ECORE_FD_ERROR) events |= G_IO_ERR;
337 return events;
338}
339
340#endif
341
342static inline int
343_ecore_main_fdh_poll_add(Ecore_Fd_Handler *fdh)
344{
345 int r = 0;
346
347 if (HAVE_EPOLL && epoll_fd >= 0)
348 {
349 r = _ecore_epoll_add(_ecore_get_epoll_fd(), fdh->fd,
350 _ecore_poll_events_from_fdh(fdh), fdh);
351 }
352 else
353 {
354#ifdef USE_G_MAIN_LOOP
355 fdh->gfd.fd = fdh->fd;
356 fdh->gfd.events = _gfd_events_from_fdh(fdh);
357 fdh->gfd.revents = 0;
358 INF("adding gpoll on %d %08x", fdh->fd, fdh->gfd.events);
359 g_source_add_poll(ecore_glib_source, &fdh->gfd);
360#endif
361 }
362 return r;
363}
364
365static inline void
366_ecore_main_fdh_poll_del(Ecore_Fd_Handler *fdh)
367{
368 if (HAVE_EPOLL && epoll_fd >= 0)
369 {
370 struct epoll_event ev;
371 int efd = _ecore_get_epoll_fd();
372
373 memset(&ev, 0, sizeof (ev));
374 INF("removing poll on %d", fdh->fd);
375 /* could get an EBADF if somebody closed the FD before removing it */
376 if ((epoll_ctl(efd, EPOLL_CTL_DEL, fdh->fd, &ev) < 0))
377 {
378 if (errno == EBADF)
379 {
380 WRN("fd %d was closed, can't remove from epoll - reinit!",
381 fdh->fd);
382 _ecore_main_loop_shutdown();
383 _ecore_main_loop_init();
384 }
385 else
386 {
387 ERR("Failed to delete epoll fd %d! (errno=%d)", fdh->fd, errno);
388 }
389 }
390 }
391 else
392 {
393#ifdef USE_G_MAIN_LOOP
394 fdh->gfd.fd = fdh->fd;
395 fdh->gfd.events = _gfd_events_from_fdh(fdh);
396 fdh->gfd.revents = 0;
397 INF("adding gpoll on %d %08x", fdh->fd, fdh->gfd.events);
398 g_source_add_poll(ecore_glib_source, &fdh->gfd);
399#endif
400 }
401}
402
403static inline int
404_ecore_main_fdh_poll_modify(Ecore_Fd_Handler *fdh)
405{
406 int r = 0;
407 if (HAVE_EPOLL && epoll_fd >= 0)
408 {
409 struct epoll_event ev;
410 int efd = _ecore_get_epoll_fd();
411
412 memset(&ev, 0, sizeof (ev));
413 ev.events = _ecore_poll_events_from_fdh(fdh);
414 ev.data.ptr = fdh;
415 INF("modifing epoll on %d to %08x", fdh->fd, ev.events);
416 r = epoll_ctl(efd, EPOLL_CTL_MOD, fdh->fd, &ev);
417 }
418 else
419 {
420#ifdef USE_G_MAIN_LOOP
421 fdh->gfd.fd = fdh->fd;
422 fdh->gfd.events = _gfd_events_from_fdh(fdh);
423 fdh->gfd.revents = 0;
424 INF("modifing gpoll on %d to %08x", fdh->fd, fdh->gfd.events);
425#endif
426 }
427 return r;
428}
429
430static inline int
431_ecore_main_fdh_epoll_mark_active(void)
432{
433 struct epoll_event ev[32];
434 int i, ret;
435 int efd = _ecore_get_epoll_fd();
436
437 memset(&ev, 0, sizeof (ev));
438 ret = epoll_wait(efd, ev, sizeof(ev) / sizeof(struct epoll_event), 0);
439 if (ret < 0)
440 {
441 if (errno == EINTR) return -1;
442 ERR("epoll_wait failed %d", errno);
443 return -1;
444 }
445
446 for (i = 0; i < ret; i++)
447 {
448 Ecore_Fd_Handler *fdh;
449
450 fdh = ev[i].data.ptr;
451 if (!ECORE_MAGIC_CHECK(fdh, ECORE_MAGIC_FD_HANDLER))
452 {
453 ECORE_MAGIC_FAIL(fdh, ECORE_MAGIC_FD_HANDLER,
454 "_ecore_main_fdh_epoll_mark_active");
455 continue;
456 }
457 if (fdh->delete_me)
458 {
459 ERR("deleted fd in epoll");
460 continue;
461 }
462
463 if (ev[i].events & EPOLLIN)
464 fdh->read_active = EINA_TRUE;
465 if (ev[i].events & EPOLLOUT)
466 fdh->write_active = EINA_TRUE;
467 if (ev[i].events & EPOLLERR)
468 fdh->error_active = EINA_TRUE;
469
470 _ecore_try_add_to_call_list(fdh);
471 }
472
473 return ret;
474}
475
476#ifdef USE_G_MAIN_LOOP
477
478static inline int
479_ecore_main_fdh_glib_mark_active(void)
480{
481 Ecore_Fd_Handler *fdh;
482 int ret = 0;
483
484 /* call the prepare callback for all handlers */
485 EINA_INLIST_FOREACH(fd_handlers, fdh)
486 {
487 if (fdh->delete_me)
488 continue;
489
490 if (fdh->gfd.revents & G_IO_IN)
491 fdh->read_active = EINA_TRUE;
492 if (fdh->gfd.revents & G_IO_OUT)
493 fdh->write_active = EINA_TRUE;
494 if (fdh->gfd.revents & G_IO_ERR)
495 fdh->error_active = EINA_TRUE;
496
497 _ecore_try_add_to_call_list(fdh);
498
499 if (fdh->gfd.revents & (G_IO_IN | G_IO_OUT | G_IO_ERR)) ret++;
500 }
501
502 return ret;
503}
504
505/* like we are about to enter main_loop_select in _ecore_main_select */
506static gboolean
507_ecore_main_gsource_prepare(GSource *source __UNUSED__,
508 gint *next_time)
509{
510 gboolean ready = FALSE;
511
512 _ecore_lock();
513 in_main_loop++;
514
515 if (!ecore_idling && !_ecore_glib_idle_enterer_called)
516 {
517 _ecore_time_loop_time = ecore_time_get();
518 _ecore_timer_expired_timers_call(_ecore_time_loop_time);
519 _ecore_timer_cleanup();
520
521 _ecore_idle_enterer_call();
522 _ecore_throttle();
523 _ecore_glib_idle_enterer_called = FALSE;
524
525 if (fd_handlers_with_buffer)
526 _ecore_main_fd_handlers_buf_call();
527 }
528
529 _ecore_signal_received_process();
530
531 /* don't check fds if somebody quit */
532 if (g_main_loop_is_running(ecore_main_loop))
533 {
534 /* only set idling state in dispatch */
535 if (ecore_idling && !_ecore_idler_exist() && !_ecore_event_exist())
536 {
537 if (_ecore_timers_exists())
538 {
539 int r = -1;
540 double t = _ecore_timer_next_get();
541 if (timer_fd >= 0 && t > 0.0)
542 {
543 struct itimerspec ts;
544
545 ts.it_interval.tv_sec = 0;
546 ts.it_interval.tv_nsec = 0;
547 ts.it_value.tv_sec = t;
548 ts.it_value.tv_nsec = fmod(t * NS_PER_SEC, NS_PER_SEC);
549
550 /* timerfd cannot sleep for 0 time */
551 if (ts.it_value.tv_sec || ts.it_value.tv_nsec)
552 {
553 r = timerfd_settime(timer_fd, 0, &ts, NULL);
554 if (r < 0)
555 {
556 ERR("timer set returned %d (errno=%d)", r, errno);
557 close(timer_fd);
558 timer_fd = -1;
559 }
560 else
561 INF("sleeping for %ld s %06ldus",
562 ts.it_value.tv_sec,
563 ts.it_value.tv_nsec / 1000);
564 }
565 }
566 if (r == -1)
567 {
568 *next_time = ceil(t * 1000.0);
569 if (t == 0.0)
570 ready = TRUE;
571 }
572 }
573 else
574 *next_time = -1;
575 }
576 else
577 {
578 *next_time = 0;
579 if (_ecore_event_exist())
580 ready = TRUE;
581 }
582
583 if (fd_handlers_with_prep)
584 _ecore_main_prepare_handlers();
585 }
586 else
587 ready = TRUE;
588
589 in_main_loop--;
590 INF("leave, timeout = %d", *next_time);
591 _ecore_unlock();
592
593 /* ready if we're not running (about to quit) */
594 return ready;
595}
596
597static gboolean
598_ecore_main_gsource_check(GSource *source __UNUSED__)
599{
600 gboolean ret = FALSE;
601
602 _ecore_lock();
603 in_main_loop++;
604
605 /* check if old timers expired */
606 if (ecore_idling && !_ecore_idler_exist() && !_ecore_event_exist())
607 {
608 if (timer_fd >= 0)
609 {
610 uint64_t count = 0;
611 int r = read(timer_fd, &count, sizeof count);
612 if (r == -1 && errno == EAGAIN)
613 ;
614 else if (r == sizeof count)
615 ret = TRUE;
616 else
617 {
618 /* unexpected things happened... fail back to old way */
619 ERR("timer read returned %d (errno=%d)", r, errno);
620 close(timer_fd);
621 timer_fd = -1;
622 }
623 }
624 }
625 else
626 ret = TRUE;
627
628 /* check if fds are ready */
629 if (HAVE_EPOLL && epoll_fd >= 0)
630 ecore_fds_ready = (_ecore_main_fdh_epoll_mark_active() > 0);
631 else
632 ecore_fds_ready = (_ecore_main_fdh_glib_mark_active() > 0);
633 _ecore_main_fd_handlers_cleanup();
634 if (ecore_fds_ready)
635 ret = TRUE;
636
637 /* check timers after updating loop time */
638 if (!ret && _ecore_timers_exists())
639 ret = (0.0 == _ecore_timer_next_get());
640
641 in_main_loop--;
642 _ecore_unlock();
643
644 return ret;
645}
646
647/* like we just came out of main_loop_select in _ecore_main_select */
648static gboolean
649_ecore_main_gsource_dispatch(GSource *source __UNUSED__,
650 GSourceFunc callback __UNUSED__,
651 gpointer user_data __UNUSED__)
652{
653 gboolean events_ready, timers_ready, idlers_ready;
654 double next_time;
655
656 _ecore_lock();
657 _ecore_time_loop_time = ecore_time_get();
658 _ecore_timer_enable_new();
659 next_time = _ecore_timer_next_get();
660
661 events_ready = _ecore_event_exist();
662 timers_ready = _ecore_timers_exists() && (0.0 == next_time);
663 idlers_ready = _ecore_idler_exist();
664
665 in_main_loop++;
666 INF("enter idling=%d fds=%d events=%d timers=%d (next=%.2f) idlers=%d",
667 ecore_idling, ecore_fds_ready, events_ready,
668 timers_ready, next_time, idlers_ready);
669
670 if (ecore_idling && events_ready)
671 {
672 _ecore_idle_exiter_call();
673 ecore_idling = 0;
674 }
675 else if (!ecore_idling && !events_ready)
676 {
677 ecore_idling = 1;
678 }
679
680 if (ecore_idling)
681 {
682 _ecore_idler_all_call();
683
684 events_ready = _ecore_event_exist();
685
686 if (ecore_fds_ready || events_ready || timers_ready)
687 {
688 _ecore_idle_exiter_call();
689 ecore_idling = 0;
690 }
691 }
692
693 /* process events */
694 if (!ecore_idling)
695 {
696 _ecore_main_fd_handlers_call();
697 if (fd_handlers_with_buffer)
698 _ecore_main_fd_handlers_buf_call();
699 _ecore_signal_received_process();
700 _ecore_event_call();
701 _ecore_main_fd_handlers_cleanup();
702
703 _ecore_timer_expired_timers_call(_ecore_time_loop_time);
704 _ecore_timer_cleanup();
705
706 _ecore_idle_enterer_call();
707 _ecore_throttle();
708 _ecore_glib_idle_enterer_called = TRUE;
709
710 if (fd_handlers_with_buffer)
711 _ecore_main_fd_handlers_buf_call();
712 }
713
714 in_main_loop--;
715 _ecore_unlock();
716
717 return TRUE; /* what should be returned here? */
718}
719
720static void
721_ecore_main_gsource_finalize(GSource *source __UNUSED__)
722{
723}
724
725static GSourceFuncs ecore_gsource_funcs =
726{
727 .prepare = _ecore_main_gsource_prepare,
728 .check = _ecore_main_gsource_check,
729 .dispatch = _ecore_main_gsource_dispatch,
730 .finalize = _ecore_main_gsource_finalize,
731};
732
733#endif
734
735void
736_ecore_main_loop_init(void)
737{
738 epoll_fd = epoll_create(1);
739 if (epoll_fd < 0)
740 WRN("Failed to create epoll fd!");
741 epoll_pid = getpid();
742
743 /* add polls on all our file descriptors */
744 Ecore_Fd_Handler *fdh;
745 EINA_INLIST_FOREACH(fd_handlers, fdh)
746 {
747 if (fdh->delete_me)
748 continue;
749 _ecore_epoll_add(epoll_fd, fdh->fd,
750 _ecore_poll_events_from_fdh(fdh), fdh);
751 _ecore_main_fdh_poll_add(fdh);
752 }
753
754 /* setup for the g_main_loop only integration */
755#ifdef USE_G_MAIN_LOOP
756 ecore_glib_source = g_source_new(&ecore_gsource_funcs, sizeof (GSource));
757 if (!ecore_glib_source)
758 CRIT("Failed to create glib source for epoll!");
759 else
760 {
761 g_source_set_priority(ecore_glib_source, G_PRIORITY_HIGH_IDLE + 20);
762 if (HAVE_EPOLL && epoll_fd >= 0)
763 {
764 /* epoll multiplexes fds into the g_main_loop */
765 ecore_epoll_fd.fd = epoll_fd;
766 ecore_epoll_fd.events = G_IO_IN;
767 ecore_epoll_fd.revents = 0;
768 g_source_add_poll(ecore_glib_source, &ecore_epoll_fd);
769 }
770
771 /* timerfd gives us better than millisecond accuracy in g_main_loop */
772 timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
773 if (timer_fd < 0)
774 WRN("failed to create timer fd!");
775 else
776 {
777 ecore_timer_fd.fd = timer_fd;
778 ecore_timer_fd.events = G_IO_IN;
779 ecore_timer_fd.revents = 0;
780 g_source_add_poll(ecore_glib_source, &ecore_timer_fd);
781 }
782
783 ecore_glib_source_id = g_source_attach(ecore_glib_source, NULL);
784 if (ecore_glib_source_id <= 0)
785 CRIT("Failed to attach glib source to default context");
786 }
787#endif
788}
789
790void
791_ecore_main_loop_shutdown(void)
792{
793#ifdef USE_G_MAIN_LOOP
794 if (ecore_glib_source)
795 {
796 g_source_destroy(ecore_glib_source);
797 ecore_glib_source = NULL;
798 }
799#endif
800
801 if (epoll_fd >= 0)
802 {
803 close(epoll_fd);
804 epoll_fd = -1;
805 }
806 epoll_pid = 0;
807
808 if (timer_fd >= 0)
809 {
810 close(timer_fd);
811 timer_fd = -1;
812 }
813}
814
815void *
816_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
817{
818 if (fd_handler->delete_me)
819 {
820 ERR("fdh %p deleted twice", fd_handler);
821 return NULL;
822 }
823
824 _ecore_main_fdh_poll_del(fd_handler);
825 fd_handler->delete_me = EINA_TRUE;
826 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fd_handler);
827 if (fd_handler->prep_func && fd_handlers_with_prep)
828 fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler);
829 if (fd_handler->buf_func && fd_handlers_with_buffer)
830 fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler);
831 return fd_handler->data;
832}
833
834/**
835 * @addtogroup Ecore_Main_Loop_Group
836 *
837 * @{
838 */
839
840/**
841 * Runs a single iteration of the main loop to process everything on the
842 * queue.
843 *
844 * It does everything that is already done inside an @c Ecore main loop, like
845 * checking for expired timers, idlers, etc. But it will do it only once and
846 * return, instead of keep watching for new events.
847 *
848 * DO NOT use this function unless you are the person God comes to ask for
849 * advice when He has trouble managing the Universe.
850 */
851EAPI void
852ecore_main_loop_iterate(void)
853{
854#ifndef USE_G_MAIN_LOOP
855 _ecore_lock();
856 _ecore_main_loop_iterate_internal(1);
857 _ecore_unlock();
858#else
859 g_main_context_iteration(NULL, 0);
860#endif
861}
862
863/**
864 * Runs the application main loop.
865 *
866 * This function will not return until @ref ecore_main_loop_quit is called. It
867 * will check for expired timers, idlers, file descriptors being watched by fd
868 * handlers, etc. Once everything is done, before entering again on idle state,
869 * any callback set as @c Idle_Enterer will be called.
870 *
871 * Each main loop iteration is done by calling ecore_main_loop_iterate()
872 * internally.
873 *
874 * The polling (select) function used can be changed with
875 * ecore_main_loop_select_func_set().
876 *
877 * The function used to check for file descriptors, events, and that has a
878 * timeout for the timers can be changed using
879 * ecore_main_loop_select_func_set().
880 */
881EAPI void
882ecore_main_loop_begin(void)
883{
884#ifndef USE_G_MAIN_LOOP
885 _ecore_lock();
886 in_main_loop++;
887 while (do_quit == 0) _ecore_main_loop_iterate_internal(0);
888 do_quit = 0;
889 in_main_loop--;
890 _ecore_unlock();
891#else
892 ecore_main_loop = g_main_loop_new(NULL, FALSE);
893 g_main_loop_run(ecore_main_loop);
894#endif
895}
896
897/**
898 * Quits the main loop once all the events currently on the queue have
899 * been processed.
900 *
901 * This function returns immediately, but will mark the ecore_main_loop_begin()
902 * function to return at the end of the current main loop iteration.
903 */
904EAPI void
905ecore_main_loop_quit(void)
906{
907#ifndef USE_G_MAIN_LOOP
908 do_quit = 1;
909#else
910 g_main_loop_quit(ecore_main_loop);
911#endif
912}
913
914/**
915 * Sets the function to use when monitoring multiple file descriptors,
916 * and waiting until one of more of the file descriptors before ready
917 * for some class of I/O operation.
918 *
919 * This function will be used instead of the system call select and
920 * could possible be used to integrate the Ecore event loop with an
921 * external event loop.
922 *
923 * @warning you don't know how to use, don't even try to use it.
924 *
925 */
926EAPI void
927ecore_main_loop_select_func_set(Ecore_Select_Function func)
928{
929 main_loop_select = func;
930}
931
932/**
933 * Gets the select function set by ecore_select_func_set(),
934 * or the native select function if none was set.
935 *
936 */
937EAPI Ecore_Select_Function
938ecore_main_loop_select_func_get(void)
939{
940 return main_loop_select;
941}
942
943/**
944 * Adds a callback for activity on the given file descriptor.
945 *
946 * @p func will be called during the execution of @ref ecore_main_loop_begin
947 * when the file descriptor is available for reading, or writing, or both.
948 *
949 * Normally when @p func returns ECORE_CALLBACK_CANCEL, it indicates that the
950 * handler should be marked for deletion (identical to calling @ref ecore_main_fd_handler_del).
951 * However, if the @p buf_func is supplied, then the return value from the @p func indicates that
952 * @p func should be called repeatedly until it returns ECORE_CALLBACK_CANCEL.
953 *
954 * @p buf_func is called during event loop handling to check if data that has
955 * been read from the file descriptor is in a buffer and is available to
956 * read. Some systems (notably xlib) handle their own buffering, and would
957 * otherwise not work with select(). These systems should use a @p buf_func.
958 * This is a most annoying hack, only ecore_x uses it, so refer to that for
959 * an example. NOTE - @p func should probably return ECORE_CALLBACK_RENEW always if
960 * @p buf_func is used, to avoid confusion with the other return value
961 * semantics.
962 *
963 * @param fd The file descriptor to watch.
964 * @param flags To watch it for read (@c ECORE_FD_READ) and/or
965 * (@c ECORE_FD_WRITE) write ability. @c ECORE_FD_ERROR
966 *
967 * @param func The callback function.
968 * @param data The data to pass to the callback.
969 * @param buf_func The function to call to check if any data has been
970 * buffered and already read from the fd. Can be @c NULL.
971 * @param buf_data The data to pass to the @p buf_func function.
972 * @return A fd handler handle if successful. @c NULL otherwise.
973 * @note This function CANNOT be used for reading/writing to regular files!
974 * @ingroup Ecore_FD_Handler_Group
975 */
976EAPI Ecore_Fd_Handler *
977ecore_main_fd_handler_add(int fd,
978 Ecore_Fd_Handler_Flags flags,
979 Ecore_Fd_Cb func,
980 const void *data,
981 Ecore_Fd_Cb buf_func,
982 const void *buf_data)
983{
984 Ecore_Fd_Handler *fdh = NULL;
985
986 _ecore_lock();
987
988 if ((fd < 0) || (flags == 0) || (!func)) goto unlock;
989
990 fdh = calloc(1, sizeof(Ecore_Fd_Handler));
991 if (!fdh) goto unlock;
992 ECORE_MAGIC_SET(fdh, ECORE_MAGIC_FD_HANDLER);
993 fdh->next_ready = NULL;
994 fdh->fd = fd;
995 fdh->flags = flags;
996 if (_ecore_main_fdh_poll_add(fdh) < 0)
997 {
998 int err = errno;
999 ERR("Failed to add poll on fd %d (errno = %d: %s)!", fd, err, strerror(err));
1000 free(fdh);
1001 fdh = NULL;
1002 goto unlock;
1003 }
1004 fdh->read_active = EINA_FALSE;
1005 fdh->write_active = EINA_FALSE;
1006 fdh->error_active = EINA_FALSE;
1007 fdh->delete_me = EINA_FALSE;
1008 fdh->func = func;
1009 fdh->data = (void *)data;
1010 fdh->buf_func = buf_func;
1011 if (buf_func)
1012 fd_handlers_with_buffer = eina_list_append(fd_handlers_with_buffer, fdh);
1013 fdh->buf_data = (void *)buf_data;
1014 fd_handlers = (Ecore_Fd_Handler *)
1015 eina_inlist_append(EINA_INLIST_GET(fd_handlers),
1016 EINA_INLIST_GET(fdh));
1017unlock:
1018 _ecore_unlock();
1019
1020 return fdh;
1021}
1022
1023#ifdef _WIN32
1024EAPI Ecore_Win32_Handler *
1025ecore_main_win32_handler_add(void *h,
1026 Ecore_Win32_Handle_Cb func,
1027 const void *data)
1028{
1029 Ecore_Win32_Handler *wh;
1030
1031 if (!h || !func) return NULL;
1032
1033 wh = calloc(1, sizeof(Ecore_Win32_Handler));
1034 if (!wh) return NULL;
1035 ECORE_MAGIC_SET(wh, ECORE_MAGIC_WIN32_HANDLER);
1036 wh->h = (HANDLE)h;
1037 wh->delete_me = EINA_FALSE;
1038 wh->func = func;
1039 wh->data = (void *)data;
1040 win32_handlers = (Ecore_Win32_Handler *)
1041 eina_inlist_append(EINA_INLIST_GET(win32_handlers),
1042 EINA_INLIST_GET(wh));
1043 return wh;
1044}
1045
1046#else
1047EAPI Ecore_Win32_Handler *
1048ecore_main_win32_handler_add(void *h __UNUSED__,
1049 Ecore_Win32_Handle_Cb func __UNUSED__,
1050 const void *data __UNUSED__)
1051{
1052 return NULL;
1053}
1054
1055#endif
1056
1057/**
1058 * Marks an FD handler for deletion.
1059 * @param fd_handler The FD handler.
1060 * @return The data pointer set using @ref ecore_main_fd_handler_add,
1061 * for @p fd_handler on success. @c NULL otherwise.
1062 * @ingroup Ecore_FD_Handler_Group
1063 * This function marks an fd handler to be deleted during an iteration of the main loop.
1064 * It does NOT close the associated fd!
1065 *
1066 * @note If the underlying fd is already closed ecore may complain if the main loop
1067 * is using epoll internally, and also in some rare cases this may cause
1068 * crashes and instability. Remember to delete your fd handlers before the
1069 * fds they listen to are closed.
1070 */
1071EAPI void *
1072ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler)
1073{
1074 void *ret = NULL;
1075
1076 _ecore_lock();
1077
1078 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
1079 {
1080 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
1081 "ecore_main_fd_handler_del");
1082 goto unlock;
1083 }
1084 ret = _ecore_main_fd_handler_del(fd_handler);
1085unlock:
1086 _ecore_unlock();
1087 return ret;
1088}
1089
1090#ifdef _WIN32
1091EAPI void *
1092ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler)
1093{
1094 if (!ECORE_MAGIC_CHECK(win32_handler, ECORE_MAGIC_WIN32_HANDLER))
1095 {
1096 ECORE_MAGIC_FAIL(win32_handler, ECORE_MAGIC_WIN32_HANDLER,
1097 "ecore_main_win32_handler_del");
1098 return NULL;
1099 }
1100 win32_handler->delete_me = EINA_TRUE;
1101 win32_handlers_delete_me = EINA_TRUE;
1102 return win32_handler->data;
1103}
1104
1105#else
1106EAPI void *
1107ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler __UNUSED__)
1108{
1109 return NULL;
1110}
1111
1112#endif
1113
1114/**
1115 * @brief Set the prepare callback with data for a given #Ecore_Fd_Handler
1116 *
1117 * @param fd_handler The fd handler
1118 * @param func The prep function
1119 * @param data The data to pass to the prep function
1120 *
1121 * This function will be called prior to any fd handler's callback function
1122 * (even the other fd handlers), before entering the main loop select function.
1123 *
1124 * @note Once a prepare callback is set for a fd handler, it cannot be changed.
1125 * You need to delete the fd handler and create a new one, to set another
1126 * callback.
1127 * @note You probably don't need this function. It is only necessary for very
1128 * uncommon cases that need special behavior.
1129 *
1130 * @ingroup Ecore_FD_Handler_Group
1131 */
1132EAPI void
1133ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler,
1134 Ecore_Fd_Prep_Cb func,
1135 const void *data)
1136{
1137 _ecore_lock();
1138
1139 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
1140 {
1141 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
1142 "ecore_main_fd_handler_prepare_callback_set");
1143 goto unlock;
1144 }
1145 fd_handler->prep_func = func;
1146 fd_handler->prep_data = (void *)data;
1147 if ((!fd_handlers_with_prep) ||
1148 (fd_handlers_with_prep && (!eina_list_data_find(fd_handlers_with_prep, fd_handler))))
1149 /* FIXME: THIS WILL NOT SCALE WITH LOTS OF PREP FUNCTIONS!!! */
1150 fd_handlers_with_prep = eina_list_append(fd_handlers_with_prep, fd_handler);
1151unlock:
1152 _ecore_unlock();
1153}
1154
1155/**
1156 * Retrieves the file descriptor that the given handler is handling.
1157 * @param fd_handler The given FD handler.
1158 * @return The file descriptor the handler is watching.
1159 * @ingroup Ecore_FD_Handler_Group
1160 */
1161EAPI int
1162ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler)
1163{
1164 int fd = -1;
1165
1166 _ecore_lock();
1167
1168 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
1169 {
1170 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
1171 "ecore_main_fd_handler_fd_get");
1172 goto unlock;
1173 }
1174 fd = fd_handler->fd;
1175unlock:
1176 _ecore_unlock();
1177 return fd;
1178}
1179
1180/**
1181 * Return if read, write or error, or a combination thereof, is active on the
1182 * file descriptor of the given FD handler.
1183 * @param fd_handler The given FD handler.
1184 * @param flags The flags, @c ECORE_FD_READ, @c ECORE_FD_WRITE or
1185 * @c ECORE_FD_ERROR to query.
1186 * @return #EINA_TRUE if any of the given flags are active. #EINA_FALSE otherwise.
1187 * @ingroup Ecore_FD_Handler_Group
1188 */
1189EAPI Eina_Bool
1190ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler,
1191 Ecore_Fd_Handler_Flags flags)
1192{
1193 int ret = EINA_FALSE;
1194
1195 _ecore_lock();
1196
1197 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
1198 {
1199 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
1200 "ecore_main_fd_handler_active_get");
1201 goto unlock;
1202 }
1203 if ((flags & ECORE_FD_READ) && (fd_handler->read_active)) ret = EINA_TRUE;
1204 if ((flags & ECORE_FD_WRITE) && (fd_handler->write_active)) ret = EINA_TRUE;
1205 if ((flags & ECORE_FD_ERROR) && (fd_handler->error_active)) ret = EINA_TRUE;
1206unlock:
1207 _ecore_unlock();
1208 return ret;
1209}
1210
1211/**
1212 * Set what active streams the given FD handler should be monitoring.
1213 * @param fd_handler The given FD handler.
1214 * @param flags The flags to be watching.
1215 * @ingroup Ecore_FD_Handler_Group
1216 */
1217EAPI void
1218ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler,
1219 Ecore_Fd_Handler_Flags flags)
1220{
1221 int ret;
1222
1223 _ecore_lock();
1224
1225 if (!ECORE_MAGIC_CHECK(fd_handler, ECORE_MAGIC_FD_HANDLER))
1226 {
1227 ECORE_MAGIC_FAIL(fd_handler, ECORE_MAGIC_FD_HANDLER,
1228 "ecore_main_fd_handler_active_set");
1229 goto unlock;
1230 }
1231 fd_handler->flags = flags;
1232 ret = _ecore_main_fdh_poll_modify(fd_handler);
1233 if (ret < 0)
1234 {
1235 ERR("Failed to mod epoll fd %d: %s!", fd_handler->fd, strerror(ret));
1236 }
1237unlock:
1238 _ecore_unlock();
1239}
1240
1241/**
1242 * @}
1243 */
1244
1245void
1246_ecore_main_shutdown(void)
1247{
1248 if (in_main_loop)
1249 {
1250 ERR("\n"
1251 "*** ECORE WARINING: Calling ecore_shutdown() while still in the main loop.\n"
1252 "*** Program may crash or behave strangely now.");
1253 return;
1254 }
1255 while (fd_handlers)
1256 {
1257 Ecore_Fd_Handler *fdh;
1258
1259 fdh = fd_handlers;
1260 fd_handlers = (Ecore_Fd_Handler *)eina_inlist_remove(EINA_INLIST_GET(fd_handlers),
1261 EINA_INLIST_GET(fdh));
1262 ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
1263 free(fdh);
1264 }
1265 if (fd_handlers_with_buffer)
1266 fd_handlers_with_buffer = eina_list_free(fd_handlers_with_buffer);
1267 if (fd_handlers_with_prep)
1268 fd_handlers_with_prep = eina_list_free(fd_handlers_with_prep);
1269 if (fd_handlers_to_delete)
1270 fd_handlers_to_delete = eina_list_free(fd_handlers_to_delete);
1271
1272 fd_handlers_to_call = NULL;
1273 fd_handlers_to_call_current = NULL;
1274 fd_handlers_to_delete = NULL;
1275 fd_handler_current = NULL;
1276
1277#ifdef _WIN32
1278 while (win32_handlers)
1279 {
1280 Ecore_Win32_Handler *wh;
1281
1282 wh = win32_handlers;
1283 win32_handlers = (Ecore_Win32_Handler *)eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
1284 EINA_INLIST_GET(wh));
1285 ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
1286 free(wh);
1287 }
1288 win32_handlers_delete_me = EINA_FALSE;
1289 win32_handler_current = NULL;
1290#endif
1291}
1292
1293static void
1294_ecore_main_prepare_handlers(void)
1295{
1296 Ecore_Fd_Handler *fdh;
1297 Eina_List *l, *l2;
1298
1299 /* call the prepare callback for all handlers with prep functions */
1300 EINA_LIST_FOREACH_SAFE(fd_handlers_with_prep, l, l2, fdh)
1301 {
1302 if (!fdh)
1303 {
1304 fd_handlers_with_prep = eina_list_remove_list(l, fd_handlers_with_prep);
1305 continue;
1306 }
1307 if (!fdh->delete_me && fdh->prep_func)
1308 {
1309 fdh->references++;
1310 _ecore_call_prep_cb(fdh->prep_func, fdh->prep_data, fdh);
1311 fdh->references--;
1312 }
1313 else
1314 fd_handlers_with_prep = eina_list_remove_list(fd_handlers_with_prep, l);
1315 }
1316}
1317
1318#ifndef USE_G_MAIN_LOOP
1319static int
1320_ecore_main_select(double timeout)
1321{
1322 struct timeval tv, *t;
1323 fd_set rfds, wfds, exfds;
1324 int max_fd;
1325 int ret;
1326
1327 t = NULL;
1328 if ((!ECORE_FINITE(timeout)) || (timeout == 0.0)) /* finite() tests for NaN, too big, too small, and infinity. */
1329 {
1330 tv.tv_sec = 0;
1331 tv.tv_usec = 0;
1332 t = &tv;
1333 }
1334 else if (timeout > 0.0)
1335 {
1336 int sec, usec;
1337
1338#ifdef FIX_HZ
1339 timeout += (0.5 / HZ);
1340 sec = (int)timeout;
1341 usec = (int)((timeout - (double)sec) * 1000000);
1342#else
1343 sec = (int)timeout;
1344 usec = (int)((timeout - (double)sec) * 1000000);
1345#endif
1346 tv.tv_sec = sec;
1347 tv.tv_usec = usec;
1348 t = &tv;
1349 }
1350 max_fd = 0;
1351 FD_ZERO(&rfds);
1352 FD_ZERO(&wfds);
1353 FD_ZERO(&exfds);
1354
1355 /* call the prepare callback for all handlers */
1356 if (fd_handlers_with_prep)
1357 _ecore_main_prepare_handlers();
1358
1359 if (!HAVE_EPOLL || epoll_fd < 0)
1360 {
1361 Ecore_Fd_Handler *fdh;
1362
1363 EINA_INLIST_FOREACH(fd_handlers, fdh)
1364 {
1365 if (!fdh->delete_me)
1366 {
1367 if (fdh->flags & ECORE_FD_READ)
1368 {
1369 FD_SET(fdh->fd, &rfds);
1370 if (fdh->fd > max_fd) max_fd = fdh->fd;
1371 }
1372 if (fdh->flags & ECORE_FD_WRITE)
1373 {
1374 FD_SET(fdh->fd, &wfds);
1375 if (fdh->fd > max_fd) max_fd = fdh->fd;
1376 }
1377 if (fdh->flags & ECORE_FD_ERROR)
1378 {
1379 FD_SET(fdh->fd, &exfds);
1380 if (fdh->fd > max_fd) max_fd = fdh->fd;
1381 }
1382 }
1383 }
1384 }
1385 else
1386 {
1387 /* polling on the epoll fd will wake when an fd in the epoll set is active */
1388 max_fd = _ecore_get_epoll_fd();
1389 FD_SET(max_fd, &rfds);
1390 }
1391
1392 if (_ecore_signal_count_get()) return -1;
1393
1394 _ecore_unlock();
1395 ret = main_loop_select(max_fd + 1, &rfds, &wfds, &exfds, t);
1396 _ecore_lock();
1397
1398 _ecore_time_loop_time = ecore_time_get();
1399 if (ret < 0)
1400 {
1401#ifndef _WIN32
1402 if (errno == EINTR) return -1;
1403 else if (errno == EBADF)
1404 _ecore_main_fd_handlers_bads_rem();
1405#endif
1406 }
1407 if (ret > 0)
1408 {
1409 if (HAVE_EPOLL && epoll_fd >= 0)
1410 _ecore_main_fdh_epoll_mark_active();
1411 else
1412 {
1413 Ecore_Fd_Handler *fdh;
1414
1415 EINA_INLIST_FOREACH(fd_handlers, fdh)
1416 {
1417 if (!fdh->delete_me)
1418 {
1419 if (FD_ISSET(fdh->fd, &rfds))
1420 fdh->read_active = EINA_TRUE;
1421 if (FD_ISSET(fdh->fd, &wfds))
1422 fdh->write_active = EINA_TRUE;
1423 if (FD_ISSET(fdh->fd, &exfds))
1424 fdh->error_active = EINA_TRUE;
1425 _ecore_try_add_to_call_list(fdh);
1426 }
1427 }
1428 }
1429
1430 _ecore_main_fd_handlers_cleanup();
1431#ifdef _WIN32
1432 _ecore_main_win32_handlers_cleanup();
1433#endif
1434 return 1;
1435 }
1436 return 0;
1437}
1438
1439#endif
1440
1441#ifndef _WIN32
1442# ifndef USE_G_MAIN_LOOP
1443static void
1444_ecore_main_fd_handlers_bads_rem(void)
1445{
1446 Ecore_Fd_Handler *fdh;
1447 Eina_Inlist *l;
1448 int found = 0;
1449
1450 ERR("Removing bad fds");
1451 for (l = EINA_INLIST_GET(fd_handlers); l; )
1452 {
1453 fdh = (Ecore_Fd_Handler *)l;
1454 l = l->next;
1455 errno = 0;
1456
1457 if ((fcntl(fdh->fd, F_GETFD) < 0) && (errno == EBADF))
1458 {
1459 ERR("Found bad fd at index %d", fdh->fd);
1460 if (fdh->flags & ECORE_FD_ERROR)
1461 {
1462 ERR("Fd set for error! calling user");
1463 fdh->references++;
1464 if (!_ecore_call_fd_cb(fdh->func, fdh->data, fdh))
1465 {
1466 ERR("Fd function err returned 0, remove it");
1467 if (!fdh->delete_me)
1468 {
1469 fdh->delete_me = EINA_TRUE;
1470 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
1471 }
1472 found++;
1473 }
1474 fdh->references--;
1475 }
1476 else
1477 {
1478 ERR("Problematic fd found at %d! setting it for delete", fdh->fd);
1479 if (!fdh->delete_me)
1480 {
1481 fdh->delete_me = EINA_TRUE;
1482 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
1483 }
1484
1485 found++;
1486 }
1487 }
1488 }
1489 if (found == 0)
1490 {
1491# ifdef HAVE_GLIB
1492 ERR("No bad fd found. Maybe a foreign fd from glib?");
1493# else
1494 ERR("No bad fd found. EEEK!");
1495# endif
1496 }
1497 _ecore_main_fd_handlers_cleanup();
1498}
1499
1500# endif
1501#endif
1502
1503static void
1504_ecore_main_fd_handlers_cleanup(void)
1505{
1506 Ecore_Fd_Handler *fdh;
1507 Eina_List *l, *l2;
1508
1509 if (!fd_handlers_to_delete) return;
1510 EINA_LIST_FOREACH_SAFE(fd_handlers_to_delete, l, l2, fdh)
1511 {
1512 if (!fdh)
1513 {
1514 fd_handlers_to_delete = eina_list_remove_list(l, fd_handlers_to_delete);
1515 continue;
1516 }
1517 /* fdh->delete_me should be set for all fdhs at the start of the list */
1518 if (fdh->references)
1519 continue;
1520 if (fdh->buf_func && fd_handlers_with_buffer)
1521 fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fdh);
1522 if (fdh->prep_func && fd_handlers_with_prep)
1523 fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fdh);
1524 fd_handlers = (Ecore_Fd_Handler *)
1525 eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh));
1526 ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
1527 free(fdh);
1528 fd_handlers_to_delete = eina_list_remove_list(fd_handlers_to_delete, l);
1529 }
1530}
1531
1532#ifdef _WIN32
1533static void
1534_ecore_main_win32_handlers_cleanup(void)
1535{
1536 Ecore_Win32_Handler *wh;
1537 Eina_Inlist *l;
1538 int deleted_in_use = 0;
1539
1540 if (!win32_handlers_delete_me) return;
1541 for (l = EINA_INLIST_GET(win32_handlers); l; )
1542 {
1543 wh = (Ecore_Win32_Handler *)l;
1544
1545 l = l->next;
1546 if (wh->delete_me)
1547 {
1548 if (wh->references)
1549 {
1550 deleted_in_use++;
1551 continue;
1552 }
1553
1554 win32_handlers = (Ecore_Win32_Handler *)
1555 eina_inlist_remove(EINA_INLIST_GET(win32_handlers),
1556 EINA_INLIST_GET(wh));
1557 ECORE_MAGIC_SET(wh, ECORE_MAGIC_NONE);
1558 free(wh);
1559 }
1560 }
1561 if (!deleted_in_use) win32_handlers_delete_me = EINA_FALSE;
1562}
1563
1564#endif
1565
1566static void
1567_ecore_main_fd_handlers_call(void)
1568{
1569 /* grab a new list */
1570 if (!fd_handlers_to_call_current)
1571 {
1572 fd_handlers_to_call_current = fd_handlers_to_call;
1573 fd_handlers_to_call = NULL;
1574 }
1575
1576 while (fd_handlers_to_call_current)
1577 {
1578 Ecore_Fd_Handler *fdh = fd_handlers_to_call_current;
1579
1580 if (!fdh->delete_me)
1581 {
1582 if ((fdh->read_active) ||
1583 (fdh->write_active) ||
1584 (fdh->error_active))
1585 {
1586 fdh->references++;
1587 if (!_ecore_call_fd_cb(fdh->func, fdh->data, fdh))
1588 {
1589 if (!fdh->delete_me)
1590 {
1591 fdh->delete_me = EINA_TRUE;
1592 fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh);
1593 }
1594 }
1595 fdh->references--;
1596 _ecore_fd_valid();
1597
1598 fdh->read_active = EINA_FALSE;
1599 fdh->write_active = EINA_FALSE;
1600 fdh->error_active = EINA_FALSE;
1601 }
1602 }
1603
1604 /* stop when we point to ourselves */
1605 if (fdh->next_ready == fdh)
1606 {
1607 fdh->next_ready = NULL;
1608 fd_handlers_to_call_current = NULL;
1609 break;
1610 }
1611
1612 fd_handlers_to_call_current = fdh->next_ready;
1613 fdh->next_ready = NULL;
1614 }
1615}
1616
1617static int
1618_ecore_main_fd_handlers_buf_call(void)
1619{
1620 Ecore_Fd_Handler *fdh;
1621 Eina_List *l, *l2;
1622 int ret;
1623
1624 ret = 0;
1625 EINA_LIST_FOREACH_SAFE(fd_handlers_with_buffer, l, l2, fdh)
1626 {
1627 if (!fdh)
1628 {
1629 fd_handlers_with_buffer = eina_list_remove_list(l, fd_handlers_with_buffer);
1630 continue;
1631 }
1632 if ((!fdh->delete_me) && fdh->buf_func)
1633 {
1634 fdh->references++;
1635 if (_ecore_call_fd_cb(fdh->buf_func, fdh->buf_data, fdh))
1636 {
1637 ret |= _ecore_call_fd_cb(fdh->func, fdh->data, fdh);
1638 fdh->read_active = EINA_TRUE;
1639 _ecore_try_add_to_call_list(fdh);
1640 }
1641 fdh->references--;
1642 }
1643 else
1644 fd_handlers_with_buffer = eina_list_remove_list(fd_handlers_with_buffer, l);
1645 }
1646 return ret;
1647}
1648
1649#ifndef USE_G_MAIN_LOOP
1650
1651enum {
1652 SPIN_MORE,
1653 SPIN_RESTART,
1654 LOOP_CONTINUE
1655};
1656
1657static int
1658_ecore_main_loop_spin_core(void)
1659{
1660 /* as we are spinning we need to update loop time per spin */
1661 _ecore_time_loop_time = ecore_time_get();
1662 /* call all idlers, which returns false if no more idelrs exist */
1663 if (!_ecore_idler_all_call()) return SPIN_RESTART;
1664 /* sneaky - drop through or if checks - the first one to succeed
1665 * drops through and returns "continue" so further ones dont run */
1666 if ((_ecore_main_select(0.0) > 0) || (_ecore_event_exist()) ||
1667 (_ecore_signal_count_get() > 0) || (do_quit))
1668 return LOOP_CONTINUE;
1669 /* default - spin more */
1670 return SPIN_MORE;
1671}
1672
1673static int
1674_ecore_main_loop_spin_no_timers(void)
1675{
1676 /* if we have idlers we HAVE to spin and handle everything
1677 * in a polling way - spin in a tight polling loop */
1678 for (;; )
1679 {
1680 int action = _ecore_main_loop_spin_core();
1681 if (action != SPIN_MORE) return action;
1682 /* if an idler has added a timer then we need to go through
1683 * the start of the spin cycle again to handle cases properly */
1684 if (_ecore_timers_exists()) return SPIN_RESTART;
1685 }
1686 /* just contiune handling events etc. */
1687 return LOOP_CONTINUE;
1688}
1689
1690static int
1691_ecore_main_loop_spin_timers(void)
1692{
1693 /* if we have idlers we HAVE to spin and handle everything
1694 * in a polling way - spin in a tight polling loop */
1695 for (;; )
1696 {
1697 int action = _ecore_main_loop_spin_core();
1698 if (action != SPIN_MORE) return action;
1699 /* if next timer expires now or in the past - stop spinning and
1700 * continue the mainloop walk as our "select" timeout has
1701 * expired now */
1702 if (_ecore_timer_next_get() <= 0.0) return LOOP_CONTINUE;
1703 }
1704 /* just contiune handling events etc. */
1705 return LOOP_CONTINUE;
1706}
1707
1708static void
1709_ecore_fps_marker_1(void)
1710{
1711 if (!_ecore_fps_debug) return;
1712 t2 = ecore_time_get();
1713 if ((t1 > 0.0) && (t2 > 0.0)) _ecore_fps_debug_runtime_add(t2 - t1);
1714}
1715
1716static void
1717_ecore_fps_marker_2(void)
1718{
1719 if (!_ecore_fps_debug) return;
1720 t1 = ecore_time_get();
1721}
1722
1723static void
1724_ecore_main_loop_iterate_internal(int once_only)
1725{
1726 double next_time = -1.0;
1727
1728 in_main_loop++;
1729 /* expire any timers */
1730 _ecore_timer_expired_timers_call(_ecore_time_loop_time);
1731 _ecore_timer_cleanup();
1732
1733 /* process signals into events .... */
1734 _ecore_signal_received_process();
1735 /* if as a result of timers/animators or signals we have accumulated
1736 * events, then instantly handle them */
1737 if (_ecore_event_exist())
1738 {
1739 /* but first conceptually enter an idle state */
1740 _ecore_idle_enterer_call();
1741 _ecore_throttle();
1742 /* now quickly poll to see which input fd's are active */
1743 _ecore_main_select(0.0);
1744 /* allow newly queued timers to expire from now on */
1745 _ecore_timer_enable_new();
1746 /* go straight to processing the events we had queued */
1747 goto process_all;
1748 }
1749
1750 if (once_only)
1751 {
1752 /* in once_only mode we should quickly poll for inputs, signals
1753 * if we got any events or signals, allow new timers to process.
1754 * use bitwise or to force both conditions to be tested and
1755 * merged together */
1756 if (_ecore_main_select(0.0) | _ecore_signal_count_get())
1757 {
1758 _ecore_timer_enable_new();
1759 goto process_all;
1760 }
1761 }
1762 else
1763 {
1764 /* call idle enterers ... */
1765 _ecore_idle_enterer_call();
1766 _ecore_throttle();
1767 }
1768
1769 /* if these calls caused any buffered events to appear - deal with them */
1770 if (fd_handlers_with_buffer)
1771 _ecore_main_fd_handlers_buf_call();
1772
1773 /* if there are any (buffered fd handling may generate them)
1774 * then jump to processing them */
1775 if (_ecore_event_exist())
1776 {
1777 _ecore_main_select(0.0);
1778 _ecore_timer_enable_new();
1779 goto process_all;
1780 }
1781
1782 if (once_only)
1783 {
1784 /* in once_only mode enter idle here instead and then return */
1785 _ecore_idle_enterer_call();
1786 _ecore_throttle();
1787 _ecore_timer_enable_new();
1788 goto done;
1789 }
1790
1791 _ecore_fps_marker_1();
1792
1793 /* start of the sleeping or looping section */
1794start_loop: /***************************************************************/
1795 /* any timers re-added as a result of these are allowed to go */
1796 _ecore_timer_enable_new();
1797 /* if we have been asked to quit the mainloop then exit at this point */
1798 if (do_quit)
1799 {
1800 _ecore_timer_enable_new();
1801 goto done;
1802 }
1803 if (!_ecore_event_exist())
1804 {
1805 /* init flags */
1806 next_time = _ecore_timer_next_get();
1807 /* no idlers */
1808 if (!_ecore_idler_exist())
1809 {
1810 /* sleep until timeout or forever (-1.0) waiting for on fds */
1811 _ecore_main_select(next_time);
1812 }
1813 else
1814 {
1815 int action = LOOP_CONTINUE;
1816
1817 /* no timers - spin */
1818 if (next_time < 0) action = _ecore_main_loop_spin_no_timers();
1819 /* timers - spin */
1820 else action = _ecore_main_loop_spin_timers();
1821 if (action == SPIN_RESTART) goto start_loop;
1822 }
1823 }
1824 _ecore_fps_marker_2();
1825
1826 /* actually wake up and deal with input, events etc. */
1827process_all: /***********************************************************/
1828
1829 /* we came out of our "wait state" so idle has exited */
1830 if (!once_only) _ecore_idle_exiter_call();
1831 /* call the fd handler per fd that became alive... */
1832 /* this should read or write any data to the monitored fd and then */
1833 /* post events onto the ecore event pipe if necessary */
1834 _ecore_main_fd_handlers_call();
1835 if (fd_handlers_with_buffer) _ecore_main_fd_handlers_buf_call();
1836 /* process signals into events .... */
1837 _ecore_signal_received_process();
1838 /* handle events ... */
1839 _ecore_event_call();
1840 _ecore_main_fd_handlers_cleanup();
1841
1842 if (once_only)
1843 {
1844 /* if in once_only mode handle idle exiting */
1845 _ecore_idle_enterer_call();
1846 _ecore_throttle();
1847 }
1848
1849done: /*******************************************************************/
1850 in_main_loop--;
1851}
1852
1853#endif
1854
1855#ifdef _WIN32
1856static int
1857_ecore_main_win32_select(int nfds __UNUSED__,
1858 fd_set *readfds,
1859 fd_set *writefds,
1860 fd_set *exceptfds,
1861 struct timeval *tv)
1862{
1863 HANDLE objects[MAXIMUM_WAIT_OBJECTS];
1864 int sockets[MAXIMUM_WAIT_OBJECTS];
1865 Ecore_Fd_Handler *fdh;
1866 Ecore_Win32_Handler *wh;
1867 unsigned int objects_nbr = 0;
1868 unsigned int handles_nbr = 0;
1869 unsigned int events_nbr = 0;
1870 DWORD result;
1871 DWORD timeout;
1872 MSG msg;
1873 unsigned int i;
1874 int res;
1875
1876 /* Create an event object per socket */
1877 EINA_INLIST_FOREACH(fd_handlers, fdh)
1878 {
1879 WSAEVENT event;
1880 long network_event;
1881
1882 network_event = 0;
1883 if (FD_ISSET(fdh->fd, readfds))
1884 network_event |= FD_READ;
1885 if (FD_ISSET(fdh->fd, writefds))
1886 network_event |= FD_WRITE;
1887 if (FD_ISSET(fdh->fd, exceptfds))
1888 network_event |= FD_OOB;
1889
1890 if (network_event)
1891 {
1892 event = WSACreateEvent();
1893 WSAEventSelect(fdh->fd, event, network_event);
1894 objects[objects_nbr] = event;
1895 sockets[events_nbr] = fdh->fd;
1896 events_nbr++;
1897 objects_nbr++;
1898 }
1899 }
1900
1901 /* store the HANDLEs in the objects to wait for */
1902 EINA_INLIST_FOREACH(win32_handlers, wh)
1903 {
1904 objects[objects_nbr] = wh->h;
1905 handles_nbr++;
1906 objects_nbr++;
1907 }
1908
1909 /* Empty the queue before waiting */
1910 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
1911 {
1912 TranslateMessage(&msg);
1913 DispatchMessage(&msg);
1914 }
1915
1916 /* Wait for any message sent or posted to this queue */
1917 /* or for one of the passed handles be set to signaled. */
1918 if (!tv)
1919 timeout = INFINITE;
1920 else
1921 timeout = (DWORD)((tv->tv_sec * 1000.0) + (tv->tv_usec / 1000.0));
1922
1923 if (timeout == 0) return 0;
1924
1925 result = MsgWaitForMultipleObjects(objects_nbr, (const HANDLE *)objects, EINA_FALSE,
1926 timeout, QS_ALLINPUT);
1927
1928 FD_ZERO(readfds);
1929 FD_ZERO(writefds);
1930 FD_ZERO(exceptfds);
1931
1932 /* The result tells us the type of event we have. */
1933 if (result == WAIT_FAILED)
1934 {
1935 char *m;
1936
1937 m = evil_last_error_get();
1938 ERR(" * %s\n", m);
1939 free(m);
1940 res = -1;
1941 }
1942 else if (result == WAIT_TIMEOUT)
1943 {
1944 /* ERR("time out\n"); */
1945 res = 0;
1946 }
1947 else if (result == (WAIT_OBJECT_0 + objects_nbr))
1948 {
1949 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
1950 {
1951 TranslateMessage(&msg);
1952 DispatchMessage(&msg);
1953 }
1954
1955 res = 0;
1956 }
1957 else if ((result >= 0) && (result < WAIT_OBJECT_0 + events_nbr))
1958 {
1959 WSANETWORKEVENTS network_event;
1960
1961 WSAEnumNetworkEvents(sockets[result], objects[result], &network_event);
1962
1963 if (network_event.lNetworkEvents & FD_READ)
1964 FD_SET(sockets[result], readfds);
1965 if (network_event.lNetworkEvents & FD_WRITE)
1966 FD_SET(sockets[result], writefds);
1967 if (network_event.lNetworkEvents & FD_OOB)
1968 FD_SET(sockets[result], exceptfds);
1969
1970 res = 1;
1971 }
1972 else if ((result >= (WAIT_OBJECT_0 + events_nbr)) &&
1973 (result < (WAIT_OBJECT_0 + objects_nbr)))
1974 {
1975 if (!win32_handler_current)
1976 {
1977 /* regular main loop, start from head */
1978 win32_handler_current = win32_handlers;
1979 }
1980 else
1981 {
1982 /* recursive main loop, continue from where we were */
1983 win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next;
1984 }
1985
1986 while (win32_handler_current)
1987 {
1988 wh = win32_handler_current;
1989
1990 if (objects[result - WAIT_OBJECT_0] == wh->h)
1991 {
1992 if (!wh->delete_me)
1993 {
1994 wh->references++;
1995 if (!wh->func(wh->data, wh))
1996 {
1997 wh->delete_me = EINA_TRUE;
1998 win32_handlers_delete_me = EINA_TRUE;
1999 }
2000 wh->references--;
2001 }
2002 }
2003 if (win32_handler_current) /* may have changed in recursive main loops */
2004 win32_handler_current = (Ecore_Win32_Handler *)EINA_INLIST_GET(win32_handler_current)->next;
2005 }
2006 res = 1;
2007 }
2008 else
2009 {
2010 ERR("unknown result...\n");
2011 res = -1;
2012 }
2013
2014 /* Remove event objects again */
2015 for (i = 0; i < events_nbr; i++) WSACloseEvent(objects[i]);
2016
2017 return res;
2018}
2019
2020#endif
diff --git a/libraries/ecore/src/lib/ecore/ecore_pipe.c b/libraries/ecore/src/lib/ecore/ecore_pipe.c
new file mode 100644
index 0000000..0ab7dd0
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_pipe.c
@@ -0,0 +1,682 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <errno.h>
8#include <math.h>
9
10#ifdef HAVE_ISFINITE
11# define ECORE_FINITE(t) isfinite(t)
12#else
13# ifdef _MSC_VER
14# define ECORE_FINITE(t) _finite(t)
15# else
16# define ECORE_FINITE(t) finite(t)
17# endif
18#endif
19
20#define FIX_HZ 1
21
22#ifdef FIX_HZ
23# ifndef _MSC_VER
24# include <sys/param.h>
25# endif
26# ifndef HZ
27# define HZ 100
28# endif
29#endif
30
31#ifdef HAVE_EVIL
32# include <Evil.h>
33#endif
34
35#ifdef HAVE_ESCAPE
36# include <Escape.h>
37#endif
38
39#include "Ecore.h"
40#include "ecore_private.h"
41
42#ifdef _WIN32
43# define FMT_SSIZE_T "%Id"
44#else
45# define FMT_SSIZE_T "%zd"
46#endif
47
48/* How of then we should retry to write to the pipe */
49#define ECORE_PIPE_WRITE_RETRY 6
50
51/*
52 * On Windows, pipe() is implemented with sockets.
53 * Contrary to Linux, Windows uses different functions
54 * for sockets and fd's: write() is for fd's and send
55 * is for sockets. So I need to put some win32 code
56 * here. I can't think of a solution where the win32
57 * code is in Evil and not here.
58 */
59
60#ifdef _WIN32
61
62# include <winsock2.h>
63
64# define pipe_write(fd, buffer, size) send((fd), (char *)(buffer), size, 0)
65# define pipe_read(fd, buffer, size) recv((fd), (char *)(buffer), size, 0)
66# define pipe_close(fd) closesocket(fd)
67# define PIPE_FD_INVALID INVALID_SOCKET
68# define PIPE_FD_ERROR SOCKET_ERROR
69
70#else
71
72# include <unistd.h>
73# include <fcntl.h>
74
75# define pipe_write(fd, buffer, size) write((fd), buffer, size)
76# define pipe_read(fd, buffer, size) read((fd), buffer, size)
77# define pipe_close(fd) close(fd)
78# define PIPE_FD_INVALID -1
79# define PIPE_FD_ERROR -1
80
81#endif /* ! _WIN32 */
82
83struct _Ecore_Pipe
84{
85 ECORE_MAGIC;
86 int fd_read;
87 int fd_write;
88 Ecore_Fd_Handler *fd_handler;
89 const void *data;
90 Ecore_Pipe_Cb handler;
91 unsigned int len;
92 int handling;
93 size_t already_read;
94 void *passed_data;
95 int message;
96 Eina_Bool delete_me : 1;
97};
98
99static Eina_Bool _ecore_pipe_read(void *data,
100 Ecore_Fd_Handler *fd_handler);
101
102/**
103 * @addtogroup Ecore_Pipe_Group
104 *
105 * @{
106 */
107
108/**
109 * Create two file descriptors (sockets on Windows). Add
110 * a callback that will be called when the file descriptor that
111 * is listened receives data. An event is also put in the event
112 * queue when data is received.
113 *
114 * @param handler The handler called when data is received.
115 * @param data Data to pass to @p handler when it is called.
116 * @return A newly created Ecore_Pipe object if successful.
117 * @c NULL otherwise.
118 */
119EAPI Ecore_Pipe *
120ecore_pipe_add(Ecore_Pipe_Cb handler,
121 const void *data)
122{
123 Ecore_Pipe *p;
124 int fds[2];
125
126 if (!handler) return NULL;
127
128 p = (Ecore_Pipe *)calloc(1, sizeof(Ecore_Pipe));
129 if (!p) return NULL;
130
131 if (pipe(fds))
132 {
133 free(p);
134 return NULL;
135 }
136
137 ECORE_MAGIC_SET(p, ECORE_MAGIC_PIPE);
138 p->fd_read = fds[0];
139 p->fd_write = fds[1];
140 p->handler = handler;
141 p->data = data;
142
143 fcntl(p->fd_read, F_SETFL, O_NONBLOCK);
144 p->fd_handler = ecore_main_fd_handler_add(p->fd_read,
145 ECORE_FD_READ,
146 _ecore_pipe_read,
147 p,
148 NULL, NULL);
149 return p;
150}
151
152/**
153 * Free an Ecore_Pipe object created with ecore_pipe_add().
154 *
155 * @param p The Ecore_Pipe object to be freed.
156 * @return The pointer to the private data
157 */
158EAPI void *
159ecore_pipe_del(Ecore_Pipe *p)
160{
161 void *data;
162
163 if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
164 {
165 ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_del");
166 return NULL;
167 }
168 p->delete_me = EINA_TRUE;
169 if (p->handling > 0) return (void *)p->data;
170 if (p->fd_handler) _ecore_main_fd_handler_del(p->fd_handler);
171 if (p->fd_read != PIPE_FD_INVALID) pipe_close(p->fd_read);
172 if (p->fd_write != PIPE_FD_INVALID) pipe_close(p->fd_write);
173 data = (void *)p->data;
174 free(p);
175 return data;
176}
177
178/**
179 * Close the read end of an Ecore_Pipe object created with ecore_pipe_add().
180 *
181 * @param p The Ecore_Pipe object.
182 */
183EAPI void
184ecore_pipe_read_close(Ecore_Pipe *p)
185{
186 if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
187 {
188 ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_read_close");
189 return;
190 }
191 if (p->fd_handler)
192 {
193 _ecore_main_fd_handler_del(p->fd_handler);
194 p->fd_handler = NULL;
195 }
196 if (p->fd_read != PIPE_FD_INVALID)
197 {
198 pipe_close(p->fd_read);
199 p->fd_read = PIPE_FD_INVALID;
200 }
201}
202
203/**
204 * Stop monitoring if necessary the pipe for reading. See ecore_pipe_thaw()
205 * for monitoring it again.
206 *
207 * @param p The Ecore_Pipe object.
208 * @since 1.1
209 */
210EAPI void
211ecore_pipe_freeze(Ecore_Pipe *p)
212{
213 if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
214 {
215 ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_read_freeze");
216 return;
217 }
218 if (p->fd_handler)
219 {
220 _ecore_main_fd_handler_del(p->fd_handler);
221 p->fd_handler = NULL;
222 }
223}
224
225/**
226 * Start monitoring again the pipe for reading. See ecore_pipe_freeze() for
227 * stopping the monitoring activity. This will not work if
228 * ecore_pipe_read_close() was previously called on the same pipe.
229 *
230 * @param p The Ecore_Pipe object.
231 * @since 1.1
232 */
233EAPI void
234ecore_pipe_thaw(Ecore_Pipe *p)
235{
236 if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
237 {
238 ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_read_thaw");
239 return;
240 }
241 if (!p->fd_handler && p->fd_read != PIPE_FD_INVALID)
242 {
243 p->fd_handler = ecore_main_fd_handler_add(p->fd_read,
244 ECORE_FD_READ,
245 _ecore_pipe_read,
246 p,
247 NULL, NULL);
248 }
249}
250
251/**
252 * @brief Wait from another thread on the read side of a pipe.
253 *
254 * @param p The pipe to watch on.
255 * @param message_count The minimal number of message to wait before exiting.
256 * @param wait The amount of time in second to wait before exiting.
257 * @return the number of message catched during that wait call.
258 * @since 1.1
259 *
260 * Negative value for @p wait means infite wait.
261 */
262EAPI int
263ecore_pipe_wait(Ecore_Pipe *p,
264 int message_count,
265 double wait)
266{
267 struct timeval tv, *t;
268 fd_set rset;
269 double end = 0.0;
270 double timeout;
271 int ret;
272 int total = 0;
273
274 if (p->fd_read == PIPE_FD_INVALID)
275 return -1;
276
277 FD_ZERO(&rset);
278 FD_SET(p->fd_read, &rset);
279
280 if (wait >= 0.0)
281 end = ecore_time_get() + wait;
282 timeout = wait;
283
284 while (message_count > 0 && (timeout > 0.0 || wait <= 0.0))
285 {
286 if (wait >= 0.0)
287 {
288 /* finite() tests for NaN, too big, too small, and infinity. */
289 if ((!ECORE_FINITE(timeout)) || (timeout == 0.0))
290 {
291 tv.tv_sec = 0;
292 tv.tv_usec = 0;
293 }
294 else if (timeout > 0.0)
295 {
296 int sec, usec;
297#ifdef FIX_HZ
298 timeout += (0.5 / HZ);
299 sec = (int)timeout;
300 usec = (int)((timeout - (double)sec) * 1000000);
301#else
302 sec = (int)timeout;
303 usec = (int)((timeout - (double)sec) * 1000000);
304#endif
305 tv.tv_sec = sec;
306 tv.tv_usec = usec;
307 }
308 t = &tv;
309 }
310 else
311 {
312 t = NULL;
313 }
314
315 ret = main_loop_select(p->fd_read + 1, &rset, NULL, NULL, t);
316
317 if (ret > 0)
318 {
319 _ecore_pipe_read(p, NULL);
320 message_count -= p->message;
321 total += p->message;
322 p->message = 0;
323 }
324 else if (ret == 0)
325 {
326 break;
327 }
328 else if (errno != EINTR)
329 {
330 close(p->fd_read);
331 p->fd_read = PIPE_FD_INVALID;
332 break;
333 }
334
335 if (wait >= 0.0)
336 timeout = end - ecore_time_get();
337 }
338
339 return total;
340}
341
342/**
343 * Close the write end of an Ecore_Pipe object created with ecore_pipe_add().
344 *
345 * @param p The Ecore_Pipe object.
346 */
347EAPI void
348ecore_pipe_write_close(Ecore_Pipe *p)
349{
350 if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
351 {
352 ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_write_close");
353 return;
354 }
355 if (p->fd_write != PIPE_FD_INVALID)
356 {
357 pipe_close(p->fd_write);
358 p->fd_write = PIPE_FD_INVALID;
359 }
360}
361
362/**
363 * Write on the file descriptor the data passed as parameter.
364 *
365 * @param p The Ecore_Pipe object.
366 * @param buffer The data to write into the pipe.
367 * @param nbytes The size of the @p buffer in bytes
368 * @return Returns EINA_TRUE on a successful write, EINA_FALSE on an error
369 */
370EAPI Eina_Bool
371ecore_pipe_write(Ecore_Pipe *p,
372 const void *buffer,
373 unsigned int nbytes)
374{
375 ssize_t ret;
376 size_t already_written = 0;
377 int retry = ECORE_PIPE_WRITE_RETRY;
378
379 if (!ECORE_MAGIC_CHECK(p, ECORE_MAGIC_PIPE))
380 {
381 ECORE_MAGIC_FAIL(p, ECORE_MAGIC_PIPE, "ecore_pipe_write");
382 return EINA_FALSE;
383 }
384
385 if (p->delete_me) return EINA_FALSE;
386
387 if (p->fd_write == PIPE_FD_INVALID) return EINA_FALSE;
388
389 /* First write the len into the pipe */
390 do
391 {
392 ret = pipe_write(p->fd_write, &nbytes, sizeof(nbytes));
393 if (ret == sizeof(nbytes))
394 {
395 retry = ECORE_PIPE_WRITE_RETRY;
396 break;
397 }
398 else if (ret > 0)
399 {
400 /* XXX What should we do here? */
401 ERR("The length of the data was not written complete"
402 " to the pipe");
403 return EINA_FALSE;
404 }
405 else if (ret == PIPE_FD_ERROR && errno == EPIPE)
406 {
407 pipe_close(p->fd_write);
408 p->fd_write = PIPE_FD_INVALID;
409 return EINA_FALSE;
410 }
411 else if (ret == PIPE_FD_ERROR && errno == EINTR)
412 /* try it again */
413 ;
414 else
415 {
416 ERR("An unhandled error (ret: " FMT_SSIZE_T " errno: %d)"
417 "occurred while writing to the pipe the length",
418 ret, errno);
419 }
420 }
421 while (retry--);
422
423 if (retry != ECORE_PIPE_WRITE_RETRY) return EINA_FALSE;
424
425 /* and now pass the data to the pipe */
426 do
427 {
428 ret = pipe_write(p->fd_write,
429 ((unsigned char *)buffer) + already_written,
430 nbytes - already_written);
431
432 if (ret == (ssize_t)(nbytes - already_written))
433 return EINA_TRUE;
434 else if (ret >= 0)
435 {
436 already_written -= ret;
437 continue;
438 }
439 else if (ret == PIPE_FD_ERROR && errno == EPIPE)
440 {
441 pipe_close(p->fd_write);
442 p->fd_write = PIPE_FD_INVALID;
443 return EINA_FALSE;
444 }
445 else if (ret == PIPE_FD_ERROR && errno == EINTR)
446 /* try it again */
447 ;
448 else
449 {
450 ERR("An unhandled error (ret: " FMT_SSIZE_T " errno: %d)"
451 "occurred while writing to the pipe the length",
452 ret, errno);
453 }
454 }
455 while (retry--);
456
457 return EINA_FALSE;
458}
459
460/**
461 * @}
462 */
463
464/* Private function */
465static void
466_ecore_pipe_unhandle(Ecore_Pipe *p)
467{
468 p->handling--;
469 if (p->delete_me)
470 {
471 ecore_pipe_del(p);
472 }
473}
474
475static Eina_Bool
476_ecore_pipe_read(void *data,
477 Ecore_Fd_Handler *fd_handler __UNUSED__)
478{
479 Ecore_Pipe *p = (Ecore_Pipe *)data;
480 int i;
481
482 p->handling++;
483 for (i = 0; i < 16; i++)
484 {
485 ssize_t ret;
486
487 /* if we already have read some data we don't need to read the len
488 * but to finish the already started job
489 */
490 if (p->len == 0)
491 {
492 /* read the len of the passed data */
493 ret = pipe_read(p->fd_read, &p->len, sizeof(p->len));
494
495 /* catch the non error case first */
496 /* read amount ok - nothing more to do */
497 if (ret == sizeof(p->len))
498 ;
499 else if (ret > 0)
500 {
501 /* we got more data than we asked for - definite error */
502 ERR("Only read %i bytes from the pipe, although"
503 " we need to read %i bytes.",
504 (int)ret, (int)sizeof(p->len));
505 _ecore_pipe_unhandle(p);
506 return ECORE_CALLBACK_CANCEL;
507 }
508 else if (ret == 0)
509 {
510 /* we got no data */
511 if (i == 0)
512 {
513 /* no data on first try through means an error */
514 if (!p->delete_me)
515 p->handler((void *)p->data, NULL, 0);
516 if (p->passed_data) free(p->passed_data);
517 p->passed_data = NULL;
518 p->already_read = 0;
519 p->len = 0;
520 p->message++;
521 pipe_close(p->fd_read);
522 p->fd_read = PIPE_FD_INVALID;
523 p->fd_handler = NULL;
524 _ecore_pipe_unhandle(p);
525 return ECORE_CALLBACK_CANCEL;
526 }
527 else
528 {
529 /* no data after first loop try is ok */
530 _ecore_pipe_unhandle(p);
531 return ECORE_CALLBACK_RENEW;
532 }
533 }
534#ifndef _WIN32
535 else if ((ret == PIPE_FD_ERROR) &&
536 ((errno == EINTR) || (errno == EAGAIN)))
537 {
538 _ecore_pipe_unhandle(p);
539 return ECORE_CALLBACK_RENEW;
540 }
541 else
542 {
543 ERR("An unhandled error (ret: %i errno: %i [%s])"
544 "occurred while reading from the pipe the length",
545 (int)ret, errno, strerror(errno));
546 _ecore_pipe_unhandle(p);
547 return ECORE_CALLBACK_RENEW;
548 }
549#else
550 else /* ret == PIPE_FD_ERROR is the only other case on Windows */
551 {
552 if (WSAGetLastError() != WSAEWOULDBLOCK)
553 {
554 if (!p->delete_me)
555 p->handler((void *)p->data, NULL, 0);
556 if (p->passed_data) free(p->passed_data);
557 p->passed_data = NULL;
558 p->already_read = 0;
559 p->len = 0;
560 p->message++;
561 pipe_close(p->fd_read);
562 p->fd_read = PIPE_FD_INVALID;
563 p->fd_handler = NULL;
564 _ecore_pipe_unhandle(p);
565 return ECORE_CALLBACK_CANCEL;
566 }
567 }
568#endif
569 }
570
571 /* if somehow we got less than or equal to 0 we got an errnoneous
572 * messages so call callback with null and len we got. this case should
573 * never happen */
574 if (p->len == 0)
575 {
576 if (!p->delete_me)
577 p->handler((void *)p->data, NULL, 0);
578 /* reset all values to 0 */
579 if (p->passed_data) free(p->passed_data);
580 p->passed_data = NULL;
581 p->already_read = 0;
582 p->len = 0;
583 p->message++;
584 _ecore_pipe_unhandle(p);
585 return ECORE_CALLBACK_RENEW;
586 }
587
588 /* we dont have a buffer to hold the data, so alloc it */
589 if (!p->passed_data)
590 {
591 p->passed_data = malloc(p->len);
592 /* alloc failed - error case */
593 if (!p->passed_data)
594 {
595 if (!p->delete_me)
596 p->handler((void *)p->data, NULL, 0);
597 /* close the pipe */
598 p->already_read = 0;
599 p->len = 0;
600 p->message++;
601 pipe_close(p->fd_read);
602 p->fd_read = PIPE_FD_INVALID;
603 p->fd_handler = NULL;
604 _ecore_pipe_unhandle(p);
605 return ECORE_CALLBACK_CANCEL;
606 }
607 }
608
609 /* and read the passed data */
610 ret = pipe_read(p->fd_read,
611 ((unsigned char *)p->passed_data) + p->already_read,
612 p->len - p->already_read);
613
614 /* catch the non error case first */
615 /* if we read enough data to finish the message/buffer */
616 if (ret == (ssize_t)(p->len - p->already_read))
617 {
618 if (!p->delete_me)
619 p->handler((void *)p->data, p->passed_data, p->len);
620 free(p->passed_data);
621 /* reset all values to 0 */
622 p->passed_data = NULL;
623 p->already_read = 0;
624 p->len = 0;
625 p->message++;
626 }
627 else if (ret > 0)
628 {
629 /* more data left to read */
630 p->already_read += ret;
631 _ecore_pipe_unhandle(p);
632 return ECORE_CALLBACK_RENEW;
633 }
634 else if (ret == 0)
635 {
636 /* 0 bytes to read - could be more to read next select wake up */
637 _ecore_pipe_unhandle(p);
638 return ECORE_CALLBACK_RENEW;
639 }
640#ifndef _WIN32
641 else if ((ret == PIPE_FD_ERROR) &&
642 ((errno == EINTR) || (errno == EAGAIN)))
643 {
644 _ecore_pipe_unhandle(p);
645 return ECORE_CALLBACK_RENEW;
646 }
647 else
648 {
649 ERR("An unhandled error (ret: %zd errno: %d)"
650 "occurred while reading from the pipe the data",
651 ret, errno);
652 _ecore_pipe_unhandle(p);
653 return ECORE_CALLBACK_RENEW;
654 }
655#else
656 else /* ret == PIPE_FD_ERROR is the only other case on Windows */
657 {
658 if (WSAGetLastError() != WSAEWOULDBLOCK)
659 {
660 if (!p->delete_me)
661 p->handler((void *)p->data, NULL, 0);
662 if (p->passed_data) free(p->passed_data);
663 p->passed_data = NULL;
664 p->already_read = 0;
665 p->len = 0;
666 p->message++;
667 pipe_close(p->fd_read);
668 p->fd_read = PIPE_FD_INVALID;
669 p->fd_handler = NULL;
670 _ecore_pipe_unhandle(p);
671 return ECORE_CALLBACK_CANCEL;
672 }
673 else
674 break;
675 }
676#endif
677 }
678
679 _ecore_pipe_unhandle(p);
680 return ECORE_CALLBACK_RENEW;
681}
682
diff --git a/libraries/ecore/src/lib/ecore/ecore_poll.c b/libraries/ecore/src/lib/ecore/ecore_poll.c
new file mode 100644
index 0000000..a283cb5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_poll.c
@@ -0,0 +1,440 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9
10struct _Ecore_Poller
11{
12 EINA_INLIST;
13 ECORE_MAGIC;
14 int ibit;
15 unsigned char delete_me : 1;
16 Ecore_Task_Cb func;
17 void *data;
18};
19
20static Ecore_Timer *timer = NULL;
21static int min_interval = -1;
22static int interval_incr = 0;
23static int at_tick = 0;
24static int just_added_poller = 0;
25static int poller_delete_count = 0;
26static int poller_walking = 0;
27static double poll_interval = 0.125;
28static double poll_cur_interval = 0.0;
29static double last_tick = 0.0;
30static Ecore_Poller *pollers[16] =
31{
32 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
33 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
34};
35static unsigned short poller_counters[16] =
36{
37 0, 0, 0, 0, 0, 0, 0, 0,
38 0, 0, 0, 0, 0, 0, 0, 0
39};
40
41static void _ecore_poller_next_tick_eval(void);
42static Eina_Bool _ecore_poller_cb_timer(void *data);
43
44static void
45_ecore_poller_next_tick_eval(void)
46{
47 int i;
48 double interval;
49
50 min_interval = -1;
51 for (i = 0; i < 15; i++)
52 {
53 if (pollers[i])
54 {
55 min_interval = i;
56 break;
57 }
58 }
59 if (min_interval < 0)
60 {
61 /* no pollers */
62 if (timer)
63 {
64 ecore_timer_del(timer);
65 timer = NULL;
66 }
67 return;
68 }
69 interval_incr = (1 << min_interval);
70 interval = interval_incr * poll_interval;
71 /* we are at the tick callback - so no need to do inter-tick adjustments
72 * so we can fasttrack this as t -= last_tick in theory is 0.0 (though
73 * in practice it will be a very very very small value. also the tick
74 * callback will adjust the timer interval at the end anyway */
75 if (at_tick)
76 {
77 if (!timer)
78 timer = ecore_timer_add(interval, _ecore_poller_cb_timer, NULL);
79 }
80 else
81 {
82 double t;
83
84 if (!timer)
85 timer = ecore_timer_add(interval, _ecore_poller_cb_timer, NULL);
86 else
87 {
88 t = ecore_time_get();
89 if (interval != poll_cur_interval)
90 {
91 t -= last_tick; /* time since we last ticked */
92 /* delete the timer and reset it to tick off in the new
93 * time interval. at the tick this will be adjusted */
94 ecore_timer_del(timer);
95 timer = ecore_timer_add(interval - t,
96 _ecore_poller_cb_timer, NULL);
97 }
98 }
99 }
100 poll_cur_interval = interval;
101}
102
103static Eina_Bool
104_ecore_poller_cb_timer(void *data __UNUSED__)
105{
106 int i;
107 Ecore_Poller *poller, *l;
108 int changes = 0;
109
110 at_tick++;
111 last_tick = ecore_time_get();
112 /* we have 16 counters - each incriments every time the poller counter
113 * "ticks". it incriments by the minimum interval (which can be 1, 2, 4,
114 * 7, 16 etc. up to 32768) */
115 for (i = 0; i < 15; i++)
116 {
117 poller_counters[i] += interval_incr;
118 /* wrap back to 0 if we exceed out loop count for the counter */
119 if (poller_counters[i] >= (1 << i)) poller_counters[i] = 0;
120 }
121
122 just_added_poller = 0;
123 /* walk the pollers now */
124 poller_walking++;
125 for (i = 0; i < 15; i++)
126 {
127 /* if the counter is @ 0 - this means that counter "went off" this
128 * tick interval, so run all pollers hooked to that counter */
129 if (poller_counters[i] == 0)
130 {
131 EINA_INLIST_FOREACH(pollers[i], poller)
132 {
133 if (!poller->delete_me)
134 {
135 if (!poller->func(poller->data))
136 {
137 if (!poller->delete_me)
138 {
139 poller->delete_me = 1;
140 poller_delete_count++;
141 }
142 }
143 }
144 }
145 }
146 }
147 poller_walking--;
148
149 /* handle deletes afterwards */
150 if (poller_delete_count > 0)
151 {
152 /* FIXME: walk all pollers and remove deleted ones */
153 for (i = 0; i < 15; i++)
154 {
155 for (l = pollers[i]; l; )
156 {
157 poller = l;
158 l = (Ecore_Poller *)EINA_INLIST_GET(l)->next;
159 if (poller->delete_me)
160 {
161 pollers[i] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[i]), EINA_INLIST_GET(poller));
162 free(poller);
163 poller_delete_count--;
164 changes++;
165 if (poller_delete_count <= 0) break;
166 }
167 }
168 if (poller_delete_count <= 0) break;
169 }
170 }
171 /* if we deleted or added any pollers, then we need to re-evaluate our
172 * minimum poll interval */
173 if ((changes > 0) || (just_added_poller > 0))
174 _ecore_poller_next_tick_eval();
175
176 just_added_poller = 0;
177 poller_delete_count = 0;
178
179 at_tick--;
180
181 /* if the timer was deleted then there is no point returning 1 - ambiguous
182 * if we do as it im plies "keep running me" but we have been deleted
183 * anyway */
184 if (!timer) return ECORE_CALLBACK_CANCEL;
185
186 /* adjust interval */
187 ecore_timer_interval_set(timer, poll_cur_interval);
188 return ECORE_CALLBACK_RENEW;
189}
190
191/**
192 * @addtogroup Ecore_Poller_Group
193 *
194 * @{
195 */
196
197/**
198 * Sets the time between ticks (in seconds) for the given ticker clock.
199 * @param type The ticker type to adjust
200 * @param poll_time The time (in seconds) between ticks of the clock
201 *
202 * This will adjust the time between ticks of the given ticker type defined
203 * by @p type to the time period defined by @p poll_time.
204 */
205EAPI void
206ecore_poller_poll_interval_set(Ecore_Poller_Type type __UNUSED__,
207 double poll_time)
208{
209 poll_interval = poll_time;
210 _ecore_poller_next_tick_eval();
211}
212
213/**
214 * Gets the time between ticks (in seconds) for the given ticker clock.
215 * @param type The ticker type to query
216 * @return The time in seconds between ticks of the ticker clock
217 *
218 * This will get the time between ticks of the specifider ticker clock.
219 */
220EAPI double
221ecore_poller_poll_interval_get(Ecore_Poller_Type type __UNUSED__)
222{
223 return poll_interval;
224}
225
226/**
227 * Creates a poller to call the given function at a particular tick interval.
228 * @param type The ticker type to attach the poller to
229 * @param interval The poll interval
230 * @param func The given function. If @p func returns 1, the poller is
231 * rescheduled for the next tick interval.
232 * @param data Data to pass to @p func when it is called.
233 * @return A poller object on success. @c NULL on failure.
234 *
235 * This function adds a poller callback that is to be called regularly
236 * along with all other poller callbacks so the pollers are synchronized with
237 * all other pollers running off the same poller type and at the same tick
238 * interval. This should be used for polling things when polling is desired
239 * or required, and you do not have specific requirements on the exact times
240 * to poll and want to avoid extra process wakeups for polling. This will
241 * save power as the CPU has more of a chance to go into a low power state
242 * the longer it is asleep for, so this should be used if you are at all
243 * power conscious.
244 *
245 * The @p type parameter defines the poller tick type (there is a virtual
246 * clock ticking all the time - though ecore avoids making it tick when
247 * there will not be any work to do at that tick point). There is only one
248 * ticker at the moment - that is ECORE_POLLER_CORE. This is here for future
249 * expansion if multiple clocks with different frequencies are really required.
250 * The default time between ticks for the ECORE_POLLER_CORE ticker is 0.125
251 * seconds.
252 *
253 * The @p interval is the number of ticker ticks that will pass by in between
254 * invocations of the @p func callback. This must be between 1 and 32768
255 * inclusive, and must be a power of 2 (i.e. 1, 2, 4, 8, 16, ... 16384, 32768).
256 * If it is 1, then the function will be called every tick. if it is 2, then it
257 * will be called every 2nd tick, if it is 8, then every 8th tick etc. Exactly
258 * which tick is undefined, as only the interval between calls can be defined.
259 * Ecore will endeavour to keep pollers synchronised and to call as many in
260 * 1 wakeup event as possible.
261 *
262 * This function adds a poller and returns its handle on success and NULL on
263 * failure. The function @p func will be called at tick intervals described
264 * above. The function will be passed the @p data pointer as its parameter.
265 *
266 * When the poller @p func is called, it must return a value of either
267 * 1 (or ECORE_CALLBACK_RENEW) or 0 (or ECORE_CALLBACK_CANCEL). If it
268 * returns 1, it will be called again at the next tick, or if it returns
269 * 0 it will be deleted automatically making any references/handles for it
270 * invalid.
271 */
272EAPI Ecore_Poller *
273ecore_poller_add(Ecore_Poller_Type type __UNUSED__,
274 int interval,
275 Ecore_Task_Cb func,
276 const void *data)
277{
278 Ecore_Poller *poller;
279 int ibit;
280
281 if (!func) return NULL;
282 if (interval < 1) interval = 1;
283
284 poller = calloc(1, sizeof(Ecore_Poller));
285 if (!poller) return NULL;
286 ECORE_MAGIC_SET(poller, ECORE_MAGIC_POLLER);
287 /* interval MUST be a power of 2, so enforce it */
288 if (interval < 1) interval = 1;
289 ibit = -1;
290 while (interval != 0)
291 {
292 ibit++;
293 interval >>= 1;
294 }
295 /* only allow up to 32768 - i.e. ibit == 15, so limit it */
296 if (ibit > 15) ibit = 15;
297
298 poller->ibit = ibit;
299 poller->func = func;
300 poller->data = (void *)data;
301 pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_prepend(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
302 if (poller_walking)
303 just_added_poller++;
304 else
305 _ecore_poller_next_tick_eval();
306 return poller;
307}
308
309/**
310 * Changes the polling interval rate of @p poller.
311 *
312 * @param poller The Ecore_Poller to change the interval of
313 * @param interval The tick interval to set; must be a power of 2 but <= 32768
314 * @return Returns true on success, false on failure
315 *
316 * This allows the changing of a poller's polling interval. It is useful when you want to alter
317 * a poll rate without deleting and re-creating a poller.
318 */
319EAPI Eina_Bool
320ecore_poller_poller_interval_set(Ecore_Poller *poller,
321 int interval)
322{
323 int ibit;
324
325 if (!ECORE_MAGIC_CHECK(poller, ECORE_MAGIC_POLLER))
326 {
327 ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
328 "ecore_poller_poller_interval_set");
329 return EINA_FALSE;
330 }
331
332 /* interval MUST be a power of 2, so enforce it */
333 if (interval < 1) interval = 1;
334 ibit = -1;
335 while (interval != 0)
336 {
337 ibit++;
338 interval >>= 1;
339 }
340 /* only allow up to 32768 - i.e. ibit == 15, so limit it */
341 if (ibit > 15) ibit = 15;
342 /* if interval specified is the same as interval set, return true without wasting time */
343 if (poller->ibit == ibit)
344 return EINA_TRUE;
345 pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
346 poller->ibit = ibit;
347 pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_prepend(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
348 if (poller_walking)
349 just_added_poller++;
350 else
351 _ecore_poller_next_tick_eval();
352 return EINA_TRUE;
353}
354
355/**
356 * Gets the polling interval rate of @p poller.
357 *
358 * @param poller The Ecore_Poller to change the interval of
359 * @return Returns the interval, in ticks, that @p poller polls at
360 *
361 * This returns a poller's polling interval, or 0 on error.
362 */
363EAPI int
364ecore_poller_poller_interval_get(Ecore_Poller *poller)
365{
366 int ibit, interval = 1;
367
368 if (!ECORE_MAGIC_CHECK(poller, ECORE_MAGIC_POLLER))
369 {
370 ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
371 "ecore_poller_poller_interval_get");
372 return 0;
373 }
374
375 ibit = poller->ibit;
376 while (ibit != 0)
377 {
378 ibit--;
379 interval <<= 1;
380 }
381 return interval;
382}
383
384/**
385 * Delete the specified poller from the timer list.
386 * @param poller The poller to delete.
387 * @return The data pointer set for the timer when @ref ecore_poller_add was
388 * called. @c NULL is returned if the function is unsuccessful.
389 *
390 * Note: @p poller must be a valid handle. If the poller function has already
391 * returned 0, the handle is no longer valid (and does not need to be delete).
392 */
393EAPI void *
394ecore_poller_del(Ecore_Poller *poller)
395{
396 void *data;
397
398 if (!ECORE_MAGIC_CHECK(poller, ECORE_MAGIC_POLLER))
399 {
400 ECORE_MAGIC_FAIL(poller, ECORE_MAGIC_POLLER,
401 "ecore_poller_del");
402 return NULL;
403 }
404 /* we are walking the poller list - a bad idea to remove from it while
405 * walking it, so just flag it as delete_me and come back to it after
406 * the loop has finished */
407 if (poller_walking > 0)
408 {
409 poller_delete_count++;
410 poller->delete_me = 1;
411 return poller->data;
412 }
413 /* not in loop so safe - delete immediately */
414 data = poller->data;
415 pollers[poller->ibit] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[poller->ibit]), EINA_INLIST_GET(poller));
416 free(poller);
417 _ecore_poller_next_tick_eval();
418 return data;
419}
420
421/**
422 * @}
423 */
424
425void
426_ecore_poller_shutdown(void)
427{
428 int i;
429 Ecore_Poller *poller;
430
431 for (i = 0; i < 15; i++)
432 {
433 while ((poller = pollers[i]))
434 {
435 pollers[i] = (Ecore_Poller *)eina_inlist_remove(EINA_INLIST_GET(pollers[i]), EINA_INLIST_GET(pollers[i]));
436 free(poller);
437 }
438 }
439}
440
diff --git a/libraries/ecore/src/lib/ecore/ecore_private.h b/libraries/ecore/src/lib/ecore/ecore_private.h
new file mode 100644
index 0000000..f328605
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_private.h
@@ -0,0 +1,353 @@
1#ifndef _ECORE_PRIVATE_H
2#define _ECORE_PRIVATE_H
3
4#include <assert.h>
5
6extern int _ecore_log_dom;
7#ifdef _ECORE_DEFAULT_LOG_DOM
8# undef _ECORE_DEFAULT_LOG_DOM
9#endif
10#define _ECORE_DEFAULT_LOG_DOM _ecore_log_dom
11
12#ifdef ECORE_DEFAULT_LOG_COLOR
13# undef ECORE_DEFAULT_LOG_COLOR
14#endif
15#define ECORE_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
16
17#ifdef ERR
18# undef ERR
19#endif
20#define ERR(...) EINA_LOG_DOM_ERR(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
21
22#ifdef DBG
23# undef DBG
24#endif
25#define DBG(...) EINA_LOG_DOM_DBG(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
26
27#ifdef INF
28# undef INF
29#endif
30#define INF(...) EINA_LOG_DOM_INFO(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
31
32#ifdef WRN
33# undef WRN
34#endif
35#define WRN(...) EINA_LOG_DOM_WARN(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
36
37#ifdef CRIT
38# undef CRIT
39#endif
40#define CRIT(...) EINA_LOG_DOM_CRIT(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
41
42#ifndef PATH_MAX
43# define PATH_MAX 4096
44#endif
45
46#ifndef MIN
47# define MIN(x, y) (((x) > (y)) ? (y) : (x))
48#endif
49
50#ifndef MAX
51# define MAX(x, y) (((x) > (y)) ? (x) : (y))
52#endif
53
54#ifndef ABS
55# define ABS(x) ((x) < 0 ? -(x) : (x))
56#endif
57
58#ifndef CLAMP
59# define CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))
60#endif
61
62#define EVAS_FRAME_QUEUING 1 /* for test */
63
64#define READBUFSIZ 65536
65
66#define ECORE_MAGIC_NONE 0x1234fedc
67#define ECORE_MAGIC_EXE 0xf7e812f5
68#define ECORE_MAGIC_TIMER 0xf7d713f4
69#define ECORE_MAGIC_IDLER 0xf7c614f3
70#define ECORE_MAGIC_IDLE_ENTERER 0xf7b515f2
71#define ECORE_MAGIC_IDLE_EXITER 0xf7601afd
72#define ECORE_MAGIC_FD_HANDLER 0xf7a416f1
73#define ECORE_MAGIC_EVENT_HANDLER 0xf79317f0
74#define ECORE_MAGIC_EVENT_FILTER 0xf78218ff
75#define ECORE_MAGIC_EVENT 0xf77119fe
76#define ECORE_MAGIC_ANIMATOR 0xf7643ea5
77#define ECORE_MAGIC_POLLER 0xf7568127
78#define ECORE_MAGIC_PIPE 0xf7458226
79#define ECORE_MAGIC_WIN32_HANDLER 0xf7e8f1a3
80#define ECORE_MAGIC_JOB 0x76543210
81
82#define ECORE_MAGIC Ecore_Magic __magic
83
84#define ECORE_MAGIC_SET(d, m) (d)->__magic = (m)
85#define ECORE_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
86#define ECORE_MAGIC_FAIL(d, m, fn) _ecore_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
87
88/* undef the following, we want our version */
89#undef FREE
90#define FREE(ptr) free(ptr); ptr = NULL;
91
92#undef IF_FREE
93#define IF_FREE(ptr) if (ptr) free(ptr); ptr = NULL;
94
95#undef IF_FN_DEL
96#define IF_FN_DEL(_fn, ptr) if (ptr) { _fn(ptr); ptr = NULL; }
97
98EAPI void
99ecore_print_warning(const char *function,
100 const char *sparam);
101
102/* convenience macros for checking pointer parameters for non-NULL */
103#undef CHECK_PARAM_POINTER_RETURN
104#define CHECK_PARAM_POINTER_RETURN(sparam, param, ret) \
105 if (!(param)) \
106 { \
107 ecore_print_warning(__FUNCTION__, sparam); \
108 return ret; \
109 }
110
111#undef CHECK_PARAM_POINTER
112#define CHECK_PARAM_POINTER(sparam, param) \
113 if (!(param)) \
114 { \
115 ecore_print_warning(__FUNCTION__, sparam); \
116 return; \
117 }
118
119typedef unsigned int Ecore_Magic;
120
121EAPI void _ecore_magic_fail(const void *d,
122 Ecore_Magic m,
123 Ecore_Magic req_m,
124 const char *fname);
125
126void _ecore_time_init(void);
127
128Ecore_Timer *_ecore_timer_loop_add(double in,
129 Ecore_Task_Cb func,
130 const void *data);
131void *_ecore_timer_del(Ecore_Timer *timer);
132void _ecore_timer_delay(Ecore_Timer *timer,
133 double add);
134void _ecore_timer_shutdown(void);
135void _ecore_timer_cleanup(void);
136void _ecore_timer_enable_new(void);
137double _ecore_timer_next_get(void);
138void _ecore_timer_expired_timers_call(double when);
139int _ecore_timers_exists(void);
140
141int _ecore_timer_expired_call(double when);
142
143void _ecore_idler_shutdown(void);
144int _ecore_idler_all_call(void);
145int _ecore_idler_exist(void);
146
147void _ecore_idle_enterer_shutdown(void);
148void _ecore_idle_enterer_call(void);
149int _ecore_idle_enterer_exist(void);
150
151void _ecore_idle_exiter_shutdown(void);
152void _ecore_idle_exiter_call(void);
153int _ecore_idle_exiter_exist(void);
154
155void _ecore_event_shutdown(void);
156int _ecore_event_exist(void);
157Ecore_Event *_ecore_event_add(int type,
158 void *ev,
159 Ecore_End_Cb func_free,
160 void *data);
161void _ecore_event_call(void);
162void *_ecore_event_handler_del(Ecore_Event_Handler *event_handler);
163
164Ecore_Timer *_ecore_exe_doomsday_clock_get(Ecore_Exe *exe);
165void _ecore_exe_doomsday_clock_set(Ecore_Exe *exe,
166 Ecore_Timer *dc);
167
168EAPI void *_ecore_event_signal_user_new(void);
169void *_ecore_event_signal_hup_new(void);
170void *_ecore_event_signal_exit_new(void);
171void *_ecore_event_signal_power_new(void);
172void *_ecore_event_signal_realtime_new(void);
173
174void *_ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
175
176void _ecore_main_shutdown(void);
177
178#if defined (_WIN32) || defined (__lv2ppu__)
179static inline void _ecore_signal_shutdown(void) { }
180
181static inline void _ecore_signal_init(void) { }
182
183static inline void _ecore_signal_received_process(void) { }
184
185static inline int _ecore_signal_count_get(void) { return 0; }
186
187static inline void _ecore_signal_call(void) { }
188
189#else
190void _ecore_signal_shutdown(void);
191void _ecore_signal_init(void);
192void _ecore_signal_received_process(void);
193int _ecore_signal_count_get(void);
194void _ecore_signal_call(void);
195#endif
196
197void _ecore_exe_init(void);
198void _ecore_exe_shutdown(void);
199#ifndef _WIN32
200Ecore_Exe *_ecore_exe_find(pid_t pid);
201void *_ecore_exe_event_del_new(void);
202void _ecore_exe_event_del_free(void *data,
203 void *ev);
204#endif
205
206void _ecore_animator_shutdown(void);
207
208void _ecore_poller_shutdown(void);
209
210void _ecore_fps_debug_init(void);
211void _ecore_fps_debug_shutdown(void);
212void _ecore_fps_debug_runtime_add(double t);
213
214void _ecore_thread_init(void);
215void _ecore_thread_shutdown(void);
216
217void _ecore_glib_init(void);
218void _ecore_glib_shutdown(void);
219
220void _ecore_job_init(void);
221void _ecore_job_shutdown(void);
222
223void _ecore_main_loop_init(void);
224void _ecore_main_loop_shutdown(void);
225
226void _ecore_throttle(void);
227
228extern int _ecore_main_lock_count;
229extern Eina_Lock _ecore_main_loop_lock;
230
231static inline void
232_ecore_lock(void)
233{
234#ifdef HAVE_THREAD_SAFETY
235 eina_lock_take(&_ecore_main_loop_lock);
236#else
237 /* at least check we're not being called from a thread */
238 EINA_MAIN_LOOP_CHECK_RETURN;
239#endif
240 _ecore_main_lock_count++;
241 assert(_ecore_main_lock_count == 1);
242}
243
244static inline void
245_ecore_unlock(void)
246{
247 _ecore_main_lock_count--;
248 assert(_ecore_main_lock_count == 0);
249#ifdef HAVE_THREAD_SAFETY
250 eina_lock_release(&_ecore_main_loop_lock);
251#endif
252}
253
254/*
255 * Callback wrappers all assume that ecore _ecore_lock has been called
256 */
257static inline Eina_Bool
258_ecore_call_task_cb(Ecore_Task_Cb func,
259 void *data)
260{
261 Eina_Bool r;
262
263 _ecore_unlock();
264 r = func(data);
265 _ecore_lock();
266
267 return r;
268}
269
270static inline void *
271_ecore_call_data_cb(Ecore_Data_Cb func,
272 void *data)
273{
274 void *r;
275
276 _ecore_unlock();
277 r = func(data);
278 _ecore_lock();
279
280 return r;
281}
282
283static inline void
284_ecore_call_end_cb(Ecore_End_Cb func,
285 void *user_data,
286 void *func_data)
287{
288 _ecore_unlock();
289 func(user_data, func_data);
290 _ecore_lock();
291}
292
293static inline Eina_Bool
294_ecore_call_filter_cb(Ecore_Filter_Cb func,
295 void *data,
296 void *loop_data,
297 int type,
298 void *event)
299{
300 Eina_Bool r;
301
302 _ecore_unlock();
303 r = func(data, loop_data, type, event);
304 _ecore_lock();
305
306 return r;
307}
308
309static inline Eina_Bool
310_ecore_call_handler_cb(Ecore_Event_Handler_Cb func,
311 void *data,
312 int type,
313 void *event)
314{
315 Eina_Bool r;
316
317 _ecore_unlock();
318 r = func(data, type, event);
319 _ecore_lock();
320
321 return r;
322}
323
324static inline void
325_ecore_call_prep_cb(Ecore_Fd_Prep_Cb func,
326 void *data,
327 Ecore_Fd_Handler *fd_handler)
328{
329 _ecore_unlock();
330 func(data, fd_handler);
331 _ecore_lock();
332}
333
334static inline Eina_Bool
335_ecore_call_fd_cb(Ecore_Fd_Cb func,
336 void *data,
337 Ecore_Fd_Handler *fd_handler)
338{
339 Eina_Bool r;
340
341 _ecore_unlock();
342 r = func(data, fd_handler);
343 _ecore_lock();
344
345 return r;
346}
347
348extern int _ecore_fps_debug;
349extern double _ecore_time_loop_time;
350extern Eina_Bool _ecore_glib_always_integrate;
351extern Ecore_Select_Function main_loop_select;
352
353#endif
diff --git a/libraries/ecore/src/lib/ecore/ecore_signal.c b/libraries/ecore/src/lib/ecore/ecore_signal.c
new file mode 100644
index 0000000..78edb8c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_signal.c
@@ -0,0 +1,565 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <sys/types.h>
7#include <sys/wait.h>
8#include <signal.h>
9#include <unistd.h>
10#include <assert.h>
11
12#include "Ecore.h"
13#include "ecore_private.h"
14
15/* make mono happy - this is evil though... */
16#undef SIGPWR
17/* valgrind in some versions/setups uses SIGRT's... hmmm */
18
19typedef void (*Signal_Handler)(int sig, siginfo_t *si, void *foo);
20
21static void _ecore_signal_callback_set(int sig,
22 Signal_Handler func);
23static void _ecore_signal_callback_ignore(int sig,
24 siginfo_t *si,
25 void *foo);
26static void _ecore_signal_callback_sigchld(int sig,
27 siginfo_t *si,
28 void *foo);
29static void _ecore_signal_callback_sigusr1(int sig,
30 siginfo_t *si,
31 void *foo);
32static void _ecore_signal_callback_sigusr2(int sig,
33 siginfo_t *si,
34 void *foo);
35static void _ecore_signal_callback_sighup(int sig,
36 siginfo_t *si,
37 void *foo);
38static void _ecore_signal_callback_sigquit(int sig,
39 siginfo_t *si,
40 void *foo);
41static void _ecore_signal_callback_sigint(int sig,
42 siginfo_t *si,
43 void *foo);
44static void _ecore_signal_callback_sigterm(int sig,
45 siginfo_t *si,
46 void *foo);
47#ifdef SIGPWR
48static void _ecore_signal_callback_sigpwr(int sig,
49 siginfo_t *si,
50 void *foo);
51#endif
52
53static Eina_Bool _ecore_signal_exe_exit_delay(void *data);
54
55//#define MAXSIGQ 256 // 32k
56#define MAXSIGQ 64 // 8k
57
58static volatile sig_atomic_t sig_count = 0;
59static volatile sig_atomic_t sigchld_count = 0;
60static volatile sig_atomic_t sigusr1_count = 0;
61static volatile sig_atomic_t sigusr2_count = 0;
62static volatile sig_atomic_t sighup_count = 0;
63static volatile sig_atomic_t sigquit_count = 0;
64static volatile sig_atomic_t sigint_count = 0;
65static volatile sig_atomic_t sigterm_count = 0;
66#ifdef SIGPWR
67static volatile sig_atomic_t sigpwr_count = 0;
68#endif
69
70static volatile siginfo_t sigchld_info[MAXSIGQ];
71static volatile siginfo_t sigusr1_info[MAXSIGQ];
72static volatile siginfo_t sigusr2_info[MAXSIGQ];
73static volatile siginfo_t sighup_info[MAXSIGQ];
74static volatile siginfo_t sigquit_info[MAXSIGQ];
75static volatile siginfo_t sigint_info[MAXSIGQ];
76static volatile siginfo_t sigterm_info[MAXSIGQ];
77#ifdef SIGPWR
78static volatile siginfo_t sigpwr_info[MAXSIGQ];
79#endif
80
81void
82_ecore_signal_shutdown(void)
83{
84 _ecore_signal_callback_set(SIGPIPE, (Signal_Handler)SIG_DFL);
85 _ecore_signal_callback_set(SIGALRM, (Signal_Handler)SIG_DFL);
86 _ecore_signal_callback_set(SIGCHLD, (Signal_Handler)SIG_DFL);
87 _ecore_signal_callback_set(SIGUSR1, (Signal_Handler)SIG_DFL);
88 _ecore_signal_callback_set(SIGUSR2, (Signal_Handler)SIG_DFL);
89 _ecore_signal_callback_set(SIGHUP, (Signal_Handler)SIG_DFL);
90 _ecore_signal_callback_set(SIGQUIT, (Signal_Handler)SIG_DFL);
91 _ecore_signal_callback_set(SIGINT, (Signal_Handler)SIG_DFL);
92 _ecore_signal_callback_set(SIGTERM, (Signal_Handler)SIG_DFL);
93#ifdef SIGPWR
94 _ecore_signal_callback_set(SIGPWR, (Signal_Handler)SIG_DFL);
95 sigpwr_count = 0;
96#endif
97 sigchld_count = 0;
98 sigusr1_count = 0;
99 sigusr2_count = 0;
100 sighup_count = 0;
101 sigquit_count = 0;
102 sigint_count = 0;
103 sigterm_count = 0;
104 sig_count = 0;
105}
106
107void
108_ecore_signal_init(void)
109{
110 _ecore_signal_callback_set(SIGPIPE, _ecore_signal_callback_ignore);
111 _ecore_signal_callback_set(SIGALRM, _ecore_signal_callback_ignore);
112 _ecore_signal_callback_set(SIGCHLD, _ecore_signal_callback_sigchld);
113 _ecore_signal_callback_set(SIGUSR1, _ecore_signal_callback_sigusr1);
114 _ecore_signal_callback_set(SIGUSR2, _ecore_signal_callback_sigusr2);
115 _ecore_signal_callback_set(SIGHUP, _ecore_signal_callback_sighup);
116 _ecore_signal_callback_set(SIGQUIT, _ecore_signal_callback_sigquit);
117 _ecore_signal_callback_set(SIGINT, _ecore_signal_callback_sigint);
118 _ecore_signal_callback_set(SIGTERM, _ecore_signal_callback_sigterm);
119#ifdef SIGPWR
120 _ecore_signal_callback_set(SIGPWR, _ecore_signal_callback_sigpwr);
121#endif
122}
123
124void
125_ecore_signal_received_process(void)
126{
127 while (_ecore_signal_count_get()) _ecore_signal_call();
128}
129
130int
131_ecore_signal_count_get(void)
132{
133 return sig_count;
134}
135
136void
137_ecore_signal_call(void)
138{
139 volatile sig_atomic_t n;
140 sigset_t oldset, newset;
141
142 if (sig_count == 0) return;
143 sigemptyset(&newset);
144 sigaddset(&newset, SIGPIPE);
145 sigaddset(&newset, SIGALRM);
146 sigaddset(&newset, SIGCHLD);
147 sigaddset(&newset, SIGUSR1);
148 sigaddset(&newset, SIGUSR2);
149 sigaddset(&newset, SIGHUP);
150 sigaddset(&newset, SIGQUIT);
151 sigaddset(&newset, SIGINT);
152 sigaddset(&newset, SIGTERM);
153#ifdef SIGPWR
154 sigaddset(&newset, SIGPWR);
155#endif
156 sigprocmask(SIG_BLOCK, &newset, &oldset);
157 if (sigchld_count > MAXSIGQ)
158 WRN("%i SIGCHLD in queue. max queue size %i. losing "
159 "siginfo for extra signals.", sigchld_count, MAXSIGQ);
160 for (n = 0; n < sigchld_count; n++)
161 {
162 pid_t pid;
163 int status;
164
165 while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
166 {
167 Ecore_Exe_Event_Del *e;
168
169 /* FIXME: If this process is set respawn, respawn with a suitable backoff
170 * period for those that need too much respawning.
171 */
172 e = _ecore_exe_event_del_new();
173 if (e)
174 {
175 if (WIFEXITED(status))
176 {
177 e->exit_code = WEXITSTATUS(status);
178 e->exited = 1;
179 }
180 else if (WIFSIGNALED(status))
181 {
182 e->exit_signal = WTERMSIG(status);
183 e->signalled = 1;
184 }
185 e->pid = pid;
186 e->exe = _ecore_exe_find(pid);
187
188 if ((n < MAXSIGQ) && (sigchld_info[n].si_signo))
189 e->data = sigchld_info[n]; /* No need to clone this. */
190
191 if ((e->exe) && (ecore_exe_flags_get(e->exe) & (ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR)))
192 {
193 /* We want to report the Last Words of the exe, so delay this event.
194 * This is twice as relevant for stderr.
195 * There are three possibilities here -
196 * 1 There are no Last Words.
197 * 2 There are Last Words, they are not ready to be read.
198 * 3 There are Last Words, they are ready to be read.
199 *
200 * For 1 we don't want to delay, for 3 we want to delay.
201 * 2 is the problem. If we check for data now and there
202 * is none, then there is no way to differentiate 1 and 2.
203 * If we don't delay, we may loose data, but if we do delay,
204 * there may not be data and the exit event never gets sent.
205 *
206 * Any way you look at it, there has to be some time passed
207 * before the exit event gets sent. So the strategy here is
208 * to setup a timer event that will send the exit event after
209 * an arbitrary, but brief, time.
210 *
211 * This is probably paranoid, for the less paraniod, we could
212 * check to see for Last Words, and only delay if there are any.
213 * This has it's own set of problems.
214 */
215 Ecore_Timer *doomsday_clock;
216
217 doomsday_clock = _ecore_exe_doomsday_clock_get(e->exe);
218 IF_FN_DEL(ecore_timer_del, doomsday_clock);
219 _ecore_unlock();
220 doomsday_clock = ecore_timer_add
221 (0.1, _ecore_signal_exe_exit_delay, e);
222 _ecore_lock();
223 _ecore_exe_doomsday_clock_set(e->exe, doomsday_clock);
224 }
225 else
226 {
227 _ecore_event_add(ECORE_EXE_EVENT_DEL, e,
228 _ecore_exe_event_del_free, NULL);
229 }
230 }
231 }
232 sig_count--;
233 }
234 sigchld_count = 0;
235
236 if (sigusr1_count > MAXSIGQ)
237 WRN("%i SIGUSR1 in queue. max queue size %i. losing "
238 "siginfo for extra signals.", sigusr1_count, MAXSIGQ);
239 for (n = 0; n < sigusr1_count; n++)
240 {
241 Ecore_Event_Signal_User *e;
242
243 e = _ecore_event_signal_user_new();
244 if (e)
245 {
246 e->number = 1;
247
248 if ((n < MAXSIGQ) && (sigusr1_info[n].si_signo))
249 e->data = sigusr1_info[n];
250
251 _ecore_event_add(ECORE_EVENT_SIGNAL_USER, e, NULL, NULL);
252 }
253 sig_count--;
254 }
255 sigusr1_count = 0;
256
257 if (sigusr2_count > MAXSIGQ)
258 WRN("%i SIGUSR2 in queue. max queue size %i. losing "
259 "siginfo for extra signals.", sigusr2_count, MAXSIGQ);
260 for (n = 0; n < sigusr2_count; n++)
261 {
262 Ecore_Event_Signal_User *e;
263
264 e = _ecore_event_signal_user_new();
265 if (e)
266 {
267 e->number = 2;
268
269 if ((n < MAXSIGQ) && (sigusr2_info[n].si_signo))
270 e->data = sigusr2_info[n];
271
272 _ecore_event_add(ECORE_EVENT_SIGNAL_USER, e, NULL, NULL);
273 }
274 sig_count--;
275 }
276 sigusr2_count = 0;
277
278 if (sighup_count > MAXSIGQ)
279 WRN("%i SIGHUP in queue. max queue size %i. losing "
280 "siginfo for extra signals.", sighup_count, MAXSIGQ);
281 for (n = 0; n < sighup_count; n++)
282 {
283 Ecore_Event_Signal_Hup *e;
284
285 e = _ecore_event_signal_hup_new();
286 if (e)
287 {
288 if ((n < MAXSIGQ) && (sighup_info[n].si_signo))
289 e->data = sighup_info[n];
290
291 _ecore_event_add(ECORE_EVENT_SIGNAL_HUP, e, NULL, NULL);
292 }
293 sig_count--;
294 }
295 sighup_count = 0;
296
297 if (sigquit_count > MAXSIGQ)
298 WRN("%i SIGQUIT in queue. max queue size %i. losing "
299 "siginfo for extra signals.", sigquit_count, MAXSIGQ);
300 for (n = 0; n < sigquit_count; n++)
301 {
302 Ecore_Event_Signal_Exit *e;
303
304 e = _ecore_event_signal_exit_new();
305 if (e)
306 {
307 e->quit = 1;
308
309 if ((n < MAXSIGQ) && (sigquit_info[n].si_signo))
310 e->data = sigquit_info[n];
311
312 _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL);
313 }
314 sig_count--;
315 }
316 sigquit_count = 0;
317
318 if (sigint_count > MAXSIGQ)
319 WRN("%i SIGINT in queue. max queue size %i. losing "
320 "siginfo for extra signals.", sigint_count, MAXSIGQ);
321 for (n = 0; n < sigint_count; n++)
322 {
323 Ecore_Event_Signal_Exit *e;
324
325 e = _ecore_event_signal_exit_new();
326 if (e)
327 {
328 e->interrupt = 1;
329
330 if ((n < MAXSIGQ) && (sigint_info[n].si_signo))
331 e->data = sigint_info[n];
332
333 _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL);
334 }
335 sig_count--;
336 }
337 sigint_count = 0;
338
339 if (sigterm_count > MAXSIGQ)
340 WRN("%i SIGTERM in queue. max queue size %i. losing "
341 "siginfo for extra signals.", sigterm_count, MAXSIGQ);
342 for (n = 0; n < sigterm_count; n++)
343 {
344 Ecore_Event_Signal_Exit *e;
345
346 e = _ecore_event_signal_exit_new();
347 if (e)
348 {
349 e->terminate = 1;
350
351 if ((n < MAXSIGQ) && (sigterm_info[n].si_signo))
352 e->data = sigterm_info[n];
353
354 _ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, e, NULL, NULL);
355 }
356 sig_count--;
357 }
358 sigterm_count = 0;
359
360#ifdef SIGPWR
361 if (sigpwr_count > MAXSIGQ)
362 WRN("%i SIGPWR in queue. max queue size %i. losing "
363 "siginfo for extra signals.", sigpwr_count, MAXSIGQ);
364 for (n = 0; n < sigpwr_count; n++)
365 {
366 Ecore_Event_Signal_Power *e;
367
368 e = _ecore_event_signal_power_new();
369 if (e)
370 {
371 if ((n < MAXSIGQ) && (sigpwr_info[n].si_signo))
372 e->data = sigpwr_info[n];
373
374 _ecore_event_add(ECORE_EVENT_SIGNAL_POWER, e, NULL, NULL);
375 }
376 sig_count--;
377 }
378 sigpwr_count = 0;
379#endif
380
381 sigprocmask(SIG_SETMASK, &oldset, NULL);
382}
383
384static void
385_ecore_signal_callback_set(int sig,
386 Signal_Handler func)
387{
388 struct sigaction sa;
389
390 sa.sa_sigaction = func;
391 sa.sa_flags = SA_RESTART | SA_SIGINFO;
392 sigemptyset(&sa.sa_mask);
393 sigaction(sig, &sa, NULL);
394}
395
396static void
397_ecore_signal_callback_ignore(int sig __UNUSED__,
398 siginfo_t *si __UNUSED__,
399 void *foo __UNUSED__)
400{
401}
402
403static void
404_ecore_signal_callback_sigchld(int sig __UNUSED__,
405 siginfo_t *si,
406 void *foo __UNUSED__)
407{
408 volatile sig_atomic_t n;
409 n = sigchld_count;
410 if (n < MAXSIGQ)
411 {
412 if (si)
413 sigchld_info[n] = *si;
414 else
415 sigchld_info[n].si_signo = 0;
416 }
417
418 sigchld_count++;
419 sig_count++;
420}
421
422static void
423_ecore_signal_callback_sigusr1(int sig __UNUSED__,
424 siginfo_t *si,
425 void *foo __UNUSED__)
426{
427 volatile sig_atomic_t n;
428 n = sigusr1_count;
429 if (n < MAXSIGQ)
430 {
431 if (si)
432 sigusr1_info[n] = *si;
433 else
434 sigusr1_info[n].si_signo = 0;
435 }
436 sigusr1_count++;
437 sig_count++;
438}
439
440static void
441_ecore_signal_callback_sigusr2(int sig __UNUSED__,
442 siginfo_t *si,
443 void *foo __UNUSED__)
444{
445 volatile sig_atomic_t n;
446 n = sigusr2_count;
447 if (n < MAXSIGQ)
448 {
449 if (si)
450 sigusr2_info[n] = *si;
451 else
452 sigusr2_info[n].si_signo = 0;
453 }
454 sigusr2_count++;
455 sig_count++;
456}
457
458static void
459_ecore_signal_callback_sighup(int sig __UNUSED__,
460 siginfo_t *si,
461 void *foo __UNUSED__)
462{
463 volatile sig_atomic_t n;
464 n = sighup_count;
465 if (n < MAXSIGQ)
466 {
467 if (si)
468 sighup_info[n] = *si;
469 else
470 sighup_info[n].si_signo = 0;
471 }
472 sighup_count++;
473 sig_count++;
474}
475
476static void
477_ecore_signal_callback_sigquit(int sig __UNUSED__,
478 siginfo_t *si,
479 void *foo __UNUSED__)
480{
481 volatile sig_atomic_t n;
482 n = sigquit_count;
483 if (n < MAXSIGQ)
484 {
485 if (si)
486 sigquit_info[n] = *si;
487 else
488 sigquit_info[n].si_signo = 0;
489 }
490 sigquit_count++;
491 sig_count++;
492}
493
494static void
495_ecore_signal_callback_sigint(int sig __UNUSED__,
496 siginfo_t *si,
497 void *foo __UNUSED__)
498{
499 volatile sig_atomic_t n;
500 n = sigint_count;
501 if (n < MAXSIGQ)
502 {
503 if (si)
504 sigint_info[n] = *si;
505 else
506 sigint_info[n].si_signo = 0;
507 }
508 sigint_count++;
509 sig_count++;
510}
511
512static void
513_ecore_signal_callback_sigterm(int sig __UNUSED__,
514 siginfo_t *si,
515 void *foo __UNUSED__)
516{
517 volatile sig_atomic_t n;
518 n = sigterm_count;
519 if (n < MAXSIGQ)
520 {
521 if (si)
522 sigterm_info[n] = *si;
523 else
524 sigterm_info[n].si_signo = 0;
525 }
526 sigterm_count++;
527 sig_count++;
528}
529
530#ifdef SIGPWR
531static void
532_ecore_signal_callback_sigpwr(int sig __UNUSED__,
533 siginfo_t *si,
534 void *foo __UNUSED__)
535{
536 volatile sig_atomic_t n;
537 n = sigpwr_count;
538 if (n < MAXSIGQ)
539 {
540 if (si)
541 sigpwr_info[n] = *si;
542 else
543 sigpwr_info[n].si_signo = 0;
544 }
545 sigpwr_count++;
546 sig_count++;
547}
548
549#endif
550
551static Eina_Bool
552_ecore_signal_exe_exit_delay(void *data)
553{
554 Ecore_Exe_Event_Del *e;
555
556 e = data;
557 if (e)
558 {
559 _ecore_exe_doomsday_clock_set(e->exe, NULL);
560 _ecore_event_add(ECORE_EXE_EVENT_DEL, e,
561 _ecore_exe_event_del_free, NULL);
562 }
563 return ECORE_CALLBACK_CANCEL;
564}
565
diff --git a/libraries/ecore/src/lib/ecore/ecore_thread.c b/libraries/ecore/src/lib/ecore/ecore_thread.c
new file mode 100644
index 0000000..2a8ea76
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_thread.c
@@ -0,0 +1,1666 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <sys/time.h>
6#include <assert.h>
7#include <sys/types.h>
8#include <unistd.h>
9
10#ifdef HAVE_EVIL
11# include <Evil.h>
12#endif
13
14#include "Ecore.h"
15#include "ecore_private.h"
16
17#ifdef EFL_HAVE_THREADS
18
19# ifdef EFL_HAVE_POSIX_THREADS
20# include <pthread.h>
21# ifdef __linux__
22# include <sched.h>
23# include <sys/resource.h>
24# include <unistd.h>
25# include <sys/syscall.h>
26# include <errno.h>
27# endif
28
29# define PH(x) pthread_t x
30# define PHE(x, y) pthread_equal(x, y)
31# define PHS() pthread_self()
32# define PHC(x, f, d) pthread_create(&(x), NULL, (void *)f, d)
33# define PHJ(x, p) pthread_join(x, (void **)(&(p)))
34# define PHA(x) pthread_cancel(x)
35
36# define CD(x) pthread_cond_t x
37# define CDI(x) pthread_cond_init(&(x), NULL);
38# define CDD(x) pthread_cond_destroy(&(x));
39# define CDB(x) pthread_cond_broadcast(&(x));
40# define CDW(x, y, t) pthread_cond_timedwait(&(x), &(y), t);
41
42# define LK(x) pthread_mutex_t x
43# define LKI(x) pthread_mutex_init(&(x), NULL);
44# define LKD(x) pthread_mutex_destroy(&(x));
45# define LKL(x) pthread_mutex_lock(&(x));
46# define LKU(x) pthread_mutex_unlock(&(x));
47
48# define LRWK(x) pthread_rwlock_t x
49# define LRWKI(x) pthread_rwlock_init(&(x), NULL);
50# define LRWKD(x) pthread_rwlock_destroy(&(x));
51# define LRWKWL(x) pthread_rwlock_wrlock(&(x));
52# define LRWKRL(x) pthread_rwlock_rdlock(&(x));
53# define LRWKU(x) pthread_rwlock_unlock(&(x));
54
55# else /* EFL_HAVE_WIN32_THREADS */
56
57# define WIN32_LEAN_AND_MEAN
58# include <windows.h>
59# undef WIN32_LEAN_AND_MEAN
60
61typedef struct
62{
63 HANDLE thread;
64 void *val;
65} win32_thread;
66
67# define PH(x) win32_thread * x
68# define PHE(x, y) ((x) == (y))
69# define PHS() (HANDLE)GetCurrentThreadId()
70
71int
72_ecore_thread_win32_create(win32_thread **x,
73 LPTHREAD_START_ROUTINE f,
74 void *d)
75{
76 win32_thread *t;
77 t = (win32_thread *)calloc(1, sizeof(win32_thread));
78 if (!t)
79 return -1;
80
81 (t)->thread = CreateThread(NULL, 0, f, d, 0, NULL);
82 if (!t->thread)
83 {
84 free(t);
85 return -1;
86 }
87 t->val = d;
88 *x = t;
89
90 return 0;
91}
92
93# define PHC(x, f, d) _ecore_thread_win32_create(&(x), (LPTHREAD_START_ROUTINE)f, d)
94
95int
96_ecore_thread_win32_join(win32_thread *x,
97 void **res)
98{
99 if (!PHE(x, PHS()))
100 {
101 WaitForSingleObject(x->thread, INFINITE);
102 CloseHandle(x->thread);
103 }
104 if (res) *res = x->val;
105 free(x);
106
107 return 0;
108}
109
110# define PHJ(x, p) _ecore_thread_win32_join(x, (void **)(&(p)))
111# define PHA(x) TerminateThread(x->thread, 0)
112
113# define LK(x) HANDLE x
114# define LKI(x) x = CreateMutex(NULL, FALSE, NULL)
115# define LKD(x) CloseHandle(x)
116# define LKL(x) WaitForSingleObject(x, INFINITE)
117# define LKU(x) ReleaseMutex(x)
118
119typedef struct
120{
121 HANDLE semaphore;
122 LONG threads_count;
123 CRITICAL_SECTION threads_count_lock;
124} win32_cond;
125
126# define CD(x) win32_cond * x
127
128# define CDI(x) \
129 do { \
130 x = (win32_cond *)calloc(1, sizeof(win32_cond)); \
131 if (x) \
132 { \
133 x->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); \
134 if (x->semaphore) \
135 InitializeCriticalSection(&x->threads_count_lock); \
136 else \
137 { \
138 free(x); \
139 x = NULL; \
140 } \
141 } \
142 } while (0)
143
144# define CDD(x) \
145 do { \
146 CloseHandle(x->semaphore); \
147 free(x); \
148 x = NULL; \
149 } while (0)
150
151# define CDB(x) \
152 do { \
153 EnterCriticalSection(&x->threads_count_lock); \
154 if (x->threads_count > 0) \
155 ReleaseSemaphore(x->semaphore, x->threads_count, NULL); \
156 LeaveCriticalSection (&x->threads_count_lock); \
157 } while (0)
158
159int
160_ecore_thread_win32_cond_timedwait(win32_cond *c,
161 HANDLE *external_mutex,
162 struct timeval *t)
163{
164 DWORD res;
165 DWORD val = t->tv_sec * 1000 + (t->tv_usec / 1000);
166 LKL(external_mutex);
167 EnterCriticalSection (&c->threads_count_lock);
168 c->threads_count++;
169 LeaveCriticalSection (&c->threads_count_lock);
170 LKU(external_mutex);
171 res = WaitForSingleObject(c->semaphore, val);
172 if (res == WAIT_OBJECT_0)
173 return 0;
174 else
175 return -1;
176}
177
178# define CDW(x, y, t) _ecore_thread_win32_cond_timedwait(x, y, t)
179
180typedef struct
181{
182 LONG readers_count;
183 LONG writers_count;
184 int readers;
185 int writers;
186 LK(mutex);
187 CD(cond_read);
188 CD(cond_write);
189} win32_rwl;
190
191# define LRWK(x) win32_rwl * x
192# define LRWKI(x) \
193 do { \
194 x = (win32_rwl *)calloc(1, sizeof(win32_rwl)); \
195 if (x) \
196 { \
197 LKI(x->mutex); \
198 if (x->mutex) \
199 { \
200 CDI(x->cond_read); \
201 if (x->cond_read) \
202 { \
203 CDI(x->cond_write); \
204 if (!x->cond_write) \
205 { \
206 CDD(x->cond_read); \
207 LKD(x->mutex); \
208 free(x); \
209 x = NULL; \
210 } \
211 } \
212 else \
213 { \
214 LKD(x->mutex); \
215 free(x); \
216 x = NULL; \
217 } \
218 } \
219 else \
220 { \
221 free(x); \
222 x = NULL; \
223 } \
224 } \
225 } while (0)
226
227# define LRWKD(x) \
228 do { \
229 LKU(x->mutex); \
230 LKD(x->mutex); \
231 CDD(x->cond_write); \
232 CDD(x->cond_read); \
233 free(x); \
234 } while (0)
235# define LRWKWL(x) \
236 do { \
237 DWORD res; \
238 LKU(x->mutex); \
239 if (x->writers || x->readers > 0) \
240 { \
241 x->writers_count++; \
242 while (x->writers || x->readers > 0) \
243 { \
244 EnterCriticalSection(&x->cond_write->threads_count_lock); \
245 x->cond_read->threads_count++; \
246 LeaveCriticalSection(&x->cond_write->threads_count_lock); \
247 res = WaitForSingleObject(x->cond_write->semaphore, INFINITE); \
248 if (res != WAIT_OBJECT_0) break; \
249 } \
250 x->writers_count--; \
251 } \
252 if (res == 0) x->writers_count = 1; \
253 LKU(x->mutex); \
254 } while (0)
255# define LRWKRL(x) \
256 do { \
257 DWORD res; \
258 LKL(x->mutex); \
259 if (x->writers) \
260 { \
261 x->readers_count++; \
262 while (x->writers) \
263 { \
264 EnterCriticalSection(&x->cond_write->threads_count_lock); \
265 x->cond_read->threads_count++; \
266 LeaveCriticalSection(&x->cond_write->threads_count_lock); \
267 res = WaitForSingleObject(x->cond_write->semaphore, INFINITE); \
268 if (res != WAIT_OBJECT_0) break; \
269 } \
270 x->readers_count--; \
271 } \
272 if (res == 0) \
273 x->readers++; \
274 LKU(x->mutex); \
275 } while (0)
276# define LRWKU(x) \
277 do { \
278 LKL(x->mutex); \
279 if (x->writers) \
280 { \
281 x->writers = 0; \
282 if (x->readers_count == 1) \
283 { \
284 EnterCriticalSection(&x->cond_read->threads_count_lock); \
285 if (x->cond_read->threads_count > 0) \
286 ReleaseSemaphore(x->cond_read->semaphore, 1, 0); \
287 LeaveCriticalSection(&x->cond_read->threads_count_lock); \
288 } \
289 else if (x->readers_count > 0) \
290 CDB(x->cond_read); \
291 else if (x->writers_count > 0) \
292 { \
293 EnterCriticalSection (&x->cond_write->threads_count_lock); \
294 if (x->cond_write->threads_count > 0) \
295 ReleaseSemaphore(x->cond_write->semaphore, 1, 0); \
296 LeaveCriticalSection (&x->cond_write->threads_count_lock); \
297 } \
298 } \
299 else if (x->readers > 0) \
300 { \
301 x->readers--; \
302 if (x->readers == 0 && x->writers_count > 0) \
303 { \
304 EnterCriticalSection (&x->cond_write->threads_count_lock); \
305 if (x->cond_write->threads_count > 0) \
306 ReleaseSemaphore(x->cond_write->semaphore, 1, 0); \
307 LeaveCriticalSection (&x->cond_write->threads_count_lock); \
308 } \
309 } \
310 LKU(x->mutex); \
311 } while (0)
312
313# endif
314
315#endif
316
317typedef struct _Ecore_Pthread_Worker Ecore_Pthread_Worker;
318typedef struct _Ecore_Pthread Ecore_Pthread;
319typedef struct _Ecore_Thread_Data Ecore_Thread_Data;
320
321struct _Ecore_Thread_Data
322{
323 void *data;
324 Eina_Free_Cb cb;
325};
326
327struct _Ecore_Pthread_Worker
328{
329 union {
330 struct
331 {
332 Ecore_Thread_Cb func_blocking;
333 } short_run;
334 struct
335 {
336 Ecore_Thread_Cb func_heavy;
337 Ecore_Thread_Notify_Cb func_notify;
338 Ecore_Pipe *notify;
339
340 Ecore_Pipe *direct_pipe;
341 Ecore_Pthread_Worker *direct_worker;
342
343 int send;
344 int received;
345 } feedback_run;
346 } u;
347
348 Ecore_Thread_Cb func_cancel;
349 Ecore_Thread_Cb func_end;
350#ifdef EFL_HAVE_THREADS
351 PH(self);
352 Eina_Hash *hash;
353 CD(cond);
354 LK(mutex);
355#endif
356
357 const void *data;
358
359 Eina_Bool cancel : 1;
360 Eina_Bool feedback_run : 1;
361 Eina_Bool kill : 1;
362 Eina_Bool reschedule : 1;
363 Eina_Bool no_queue : 1;
364};
365
366#ifdef EFL_HAVE_THREADS
367typedef struct _Ecore_Pthread_Data Ecore_Pthread_Data;
368
369struct _Ecore_Pthread_Data
370{
371 Ecore_Pthread_Worker *death_job;
372 Ecore_Pipe *p;
373 void *data;
374 PH(thread);
375};
376#endif
377
378static int _ecore_thread_count_max = 0;
379static int ECORE_THREAD_PIPE_DEL = 0;
380static Eina_Array *_ecore_thread_pipe = NULL;
381
382#ifdef EFL_HAVE_THREADS
383
384static void _ecore_thread_handler(void *data __UNUSED__,
385 void *buffer,
386 unsigned int nbyte);
387
388static Ecore_Pipe *
389_ecore_thread_pipe_get(void)
390{
391 if (eina_array_count_get(_ecore_thread_pipe) > 0)
392 return eina_array_pop(_ecore_thread_pipe);
393
394 return ecore_pipe_add(_ecore_thread_handler, NULL);
395}
396
397static int _ecore_thread_count = 0;
398
399static Ecore_Event_Handler *del_handler = NULL;
400static Eina_List *_ecore_active_job_threads = NULL;
401static Eina_List *_ecore_pending_job_threads = NULL;
402static Eina_List *_ecore_pending_job_threads_feedback = NULL;
403static LK(_ecore_pending_job_threads_mutex);
404
405static Eina_Hash *_ecore_thread_global_hash = NULL;
406static LRWK(_ecore_thread_global_hash_lock);
407static LK(_ecore_thread_global_hash_mutex);
408static CD(_ecore_thread_global_hash_cond);
409
410static Eina_Bool have_main_loop_thread = 0;
411
412static Eina_Trash *_ecore_thread_worker_trash = NULL;
413static int _ecore_thread_worker_count = 0;
414
415static void *_ecore_thread_worker(Ecore_Pthread_Data *pth);
416static Ecore_Pthread_Worker *_ecore_thread_worker_new(void);
417
418static PH(get_main_loop_thread) (void)
419{
420 static PH(main_loop_thread);
421 static pid_t main_loop_pid;
422 pid_t pid = getpid();
423
424 if (pid != main_loop_pid)
425 {
426 main_loop_pid = pid;
427 main_loop_thread = PHS();
428 have_main_loop_thread = 1;
429 }
430
431 return main_loop_thread;
432}
433
434static void
435_ecore_thread_worker_free(Ecore_Pthread_Worker *worker)
436{
437 if (_ecore_thread_worker_count > (_ecore_thread_count_max + 1) * 16)
438 {
439 free(worker);
440 return;
441 }
442
443 eina_trash_push(&_ecore_thread_worker_trash, worker);
444}
445
446static void
447_ecore_thread_data_free(void *data)
448{
449 Ecore_Thread_Data *d = data;
450
451 if (d->cb) d->cb(d->data);
452 free(d);
453}
454
455static void
456_ecore_thread_pipe_free(void *data __UNUSED__,
457 void *event)
458{
459 Ecore_Pipe *p = event;
460
461 if (eina_array_count_get(_ecore_thread_pipe) < 50)
462 eina_array_push(_ecore_thread_pipe, p);
463 else
464 ecore_pipe_del(p);
465 eina_threads_shutdown();
466}
467
468static Eina_Bool
469_ecore_thread_pipe_del(void *data __UNUSED__,
470 int type __UNUSED__,
471 void *event __UNUSED__)
472{
473 /* This is a hack to delay pipe destruction until we are out of its internal loop. */
474 return ECORE_CALLBACK_CANCEL;
475}
476
477static void
478_ecore_thread_end(Ecore_Pthread_Data *pth,
479 Ecore_Thread *work)
480{
481 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)work;
482 Ecore_Pipe *p;
483
484 if (!worker->feedback_run || (worker->feedback_run && !worker->no_queue))
485 _ecore_thread_count--;
486
487 if (PHJ(pth->thread, p) != 0)
488 return;
489
490 if (eina_list_count(_ecore_pending_job_threads) > 0
491 && (unsigned int)_ecore_thread_count < eina_list_count(_ecore_pending_job_threads)
492 && _ecore_thread_count < _ecore_thread_count_max)
493 {
494 /* One more thread should be created. */
495 INF("spawning threads because of still pending jobs.");
496
497 pth->death_job = _ecore_thread_worker_new();
498 if (!pth->p || !pth->death_job) goto end;
499
500 eina_threads_init();
501
502 if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
503 {
504 _ecore_thread_count++;
505 return;
506 }
507
508 eina_threads_shutdown();
509
510end:
511 if (pth->death_job) _ecore_thread_worker_free(pth->death_job);
512 }
513
514 _ecore_active_job_threads = eina_list_remove(_ecore_active_job_threads, pth);
515
516 ecore_event_add(ECORE_THREAD_PIPE_DEL, pth->p, _ecore_thread_pipe_free, NULL);
517 free(pth);
518}
519
520static void
521_ecore_thread_kill(Ecore_Pthread_Worker *work)
522{
523 if (work->cancel)
524 {
525 if (work->func_cancel)
526 work->func_cancel((void *)work->data, (Ecore_Thread *)work);
527 }
528 else
529 {
530 if (work->func_end)
531 work->func_end((void *)work->data, (Ecore_Thread *)work);
532 }
533
534 if (work->feedback_run)
535 {
536 ecore_pipe_del(work->u.feedback_run.notify);
537
538 if (work->u.feedback_run.direct_pipe)
539 eina_array_push(_ecore_thread_pipe, work->u.feedback_run.direct_pipe);
540 if (work->u.feedback_run.direct_worker)
541 _ecore_thread_worker_free(work->u.feedback_run.direct_worker);
542 }
543 CDD(work->cond);
544 LKD(work->mutex);
545 if (work->hash)
546 eina_hash_free(work->hash);
547 free(work);
548}
549
550static void
551_ecore_thread_handler(void *data __UNUSED__,
552 void *buffer,
553 unsigned int nbyte)
554{
555 Ecore_Pthread_Worker *work;
556
557 if (nbyte != sizeof (Ecore_Pthread_Worker *)) return;
558
559 work = *(Ecore_Pthread_Worker **)buffer;
560
561 if (work->feedback_run)
562 {
563 if (work->u.feedback_run.send != work->u.feedback_run.received)
564 {
565 work->kill = EINA_TRUE;
566 return;
567 }
568 }
569
570 _ecore_thread_kill(work);
571}
572
573static void
574_ecore_notify_handler(void *data,
575 void *buffer,
576 unsigned int nbyte)
577{
578 Ecore_Pthread_Worker *work = data;
579 void *user_data;
580
581 if (nbyte != sizeof (Ecore_Pthread_Worker *)) return;
582
583 user_data = *(void **)buffer;
584 work->u.feedback_run.received++;
585
586 if (work->u.feedback_run.func_notify)
587 work->u.feedback_run.func_notify((void *)work->data, (Ecore_Thread *)work, user_data);
588
589 /* Force reading all notify event before killing the thread */
590 if (work->kill && work->u.feedback_run.send == work->u.feedback_run.received)
591 {
592 _ecore_thread_kill(work);
593 }
594}
595
596static void
597_ecore_short_job(Ecore_Pipe *end_pipe)
598{
599 Ecore_Pthread_Worker *work;
600
601 while (_ecore_pending_job_threads)
602 {
603 LKL(_ecore_pending_job_threads_mutex);
604
605 if (!_ecore_pending_job_threads)
606 {
607 LKU(_ecore_pending_job_threads_mutex);
608 break;
609 }
610
611 work = eina_list_data_get(_ecore_pending_job_threads);
612 _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads,
613 _ecore_pending_job_threads);
614
615 LKU(_ecore_pending_job_threads_mutex);
616
617 if (!work->cancel)
618 work->u.short_run.func_blocking((void *)work->data, (Ecore_Thread *)work);
619
620 if (work->reschedule)
621 {
622 work->reschedule = EINA_FALSE;
623
624 LKL(_ecore_pending_job_threads_mutex);
625 _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work);
626 LKU(_ecore_pending_job_threads_mutex);
627 }
628 else
629 {
630 ecore_pipe_write(end_pipe, &work, sizeof (Ecore_Pthread_Worker *));
631 }
632 }
633}
634
635static void
636_ecore_feedback_job(Ecore_Pipe *end_pipe,
637 PH(thread))
638{
639 Ecore_Pthread_Worker *work;
640
641 while (_ecore_pending_job_threads_feedback)
642 {
643 LKL(_ecore_pending_job_threads_mutex);
644
645 if (!_ecore_pending_job_threads_feedback)
646 {
647 LKU(_ecore_pending_job_threads_mutex);
648 break;
649 }
650
651 work = eina_list_data_get(_ecore_pending_job_threads_feedback);
652 _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback,
653 _ecore_pending_job_threads_feedback);
654
655 LKU(_ecore_pending_job_threads_mutex);
656
657 work->self = thread;
658 if (!work->cancel)
659 work->u.feedback_run.func_heavy((void *)work->data, (Ecore_Thread *)work);
660
661 if (work->reschedule)
662 {
663 work->reschedule = EINA_FALSE;
664
665 LKL(_ecore_pending_job_threads_mutex);
666 _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, work);
667 LKU(_ecore_pending_job_threads_mutex);
668 }
669 else
670 {
671 ecore_pipe_write(end_pipe, &work, sizeof (Ecore_Pthread_Worker *));
672 }
673 }
674}
675
676static void *
677_ecore_direct_worker(Ecore_Pthread_Worker *work)
678{
679 Ecore_Pthread_Data *pth;
680
681#ifdef EFL_POSIX_THREADS
682 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
683 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
684#endif
685
686 eina_sched_prio_drop();
687
688 pth = malloc(sizeof (Ecore_Pthread_Data));
689 if (!pth) return NULL;
690
691 pth->p = work->u.feedback_run.direct_pipe;
692 if (!pth->p)
693 {
694 free(pth);
695 return NULL;
696 }
697 pth->thread = PHS();
698
699 work->self = pth->thread;
700 work->u.feedback_run.func_heavy((void *)work->data, (Ecore_Thread *)work);
701
702 ecore_pipe_write(pth->p, &work, sizeof (Ecore_Pthread_Worker *));
703
704 work = work->u.feedback_run.direct_worker;
705 if (!work)
706 {
707 free(pth);
708 return NULL;
709 }
710
711 work->data = pth;
712 work->u.short_run.func_blocking = NULL;
713 work->func_end = (void *)_ecore_thread_end;
714 work->func_cancel = NULL;
715 work->cancel = EINA_FALSE;
716 work->feedback_run = EINA_FALSE;
717 work->kill = EINA_FALSE;
718 work->hash = NULL;
719 CDI(work->cond);
720 LKI(work->mutex);
721
722 ecore_pipe_write(pth->p, &work, sizeof (Ecore_Pthread_Worker *));
723
724 return pth->p;
725}
726
727static void *
728_ecore_thread_worker(Ecore_Pthread_Data *pth)
729{
730 Ecore_Pthread_Worker *work;
731
732#ifdef EFL_POSIX_THREADS
733 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
734 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
735#endif
736
737 eina_sched_prio_drop();
738
739restart:
740 if (_ecore_pending_job_threads) _ecore_short_job(pth->p);
741 if (_ecore_pending_job_threads_feedback) _ecore_feedback_job(pth->p, pth->thread);
742
743 /* FIXME: Check if there is feedback running task todo, and switch to feedback run handler. */
744
745 LKL(_ecore_pending_job_threads_mutex);
746 if (_ecore_pending_job_threads || _ecore_pending_job_threads_feedback)
747 {
748 LKU(_ecore_pending_job_threads_mutex);
749 goto restart;
750 }
751 LKU(_ecore_pending_job_threads_mutex);
752
753 /* Sleep a little to prevent premature death */
754#ifdef _WIN32
755 Sleep(1); /* around 50ms */
756#else
757 usleep(200);
758#endif
759
760 LKL(_ecore_pending_job_threads_mutex);
761 if (_ecore_pending_job_threads || _ecore_pending_job_threads_feedback)
762 {
763 LKU(_ecore_pending_job_threads_mutex);
764 goto restart;
765 }
766 LKU(_ecore_pending_job_threads_mutex);
767
768 work = pth->death_job;
769 if (!work) return NULL;
770
771 work->data = pth;
772 work->u.short_run.func_blocking = NULL;
773 work->func_end = (void *)_ecore_thread_end;
774 work->func_cancel = NULL;
775 work->cancel = EINA_FALSE;
776 work->feedback_run = EINA_FALSE;
777 work->kill = EINA_FALSE;
778 work->hash = NULL;
779 CDI(work->cond);
780 LKI(work->mutex);
781
782 ecore_pipe_write(pth->p, &work, sizeof (Ecore_Pthread_Worker *));
783
784 return pth->p;
785}
786
787#endif
788
789static Ecore_Pthread_Worker *
790_ecore_thread_worker_new(void)
791{
792#ifdef EFL_HAVE_THREADS
793 Ecore_Pthread_Worker *result;
794
795 result = eina_trash_pop(&_ecore_thread_worker_trash);
796
797 if (!result) result = malloc(sizeof (Ecore_Pthread_Worker));
798 else _ecore_thread_worker_count--;
799
800 return result;
801#else
802 return malloc(sizeof (Ecore_Pthread_Worker));
803#endif
804}
805
806void
807_ecore_thread_init(void)
808{
809 _ecore_thread_count_max = eina_cpu_count();
810 if (_ecore_thread_count_max <= 0)
811 _ecore_thread_count_max = 1;
812
813 ECORE_THREAD_PIPE_DEL = ecore_event_type_new();
814 _ecore_thread_pipe = eina_array_new(8);
815
816#ifdef EFL_HAVE_THREADS
817 del_handler = ecore_event_handler_add(ECORE_THREAD_PIPE_DEL, _ecore_thread_pipe_del, NULL);
818
819 LKI(_ecore_pending_job_threads_mutex);
820 LRWKI(_ecore_thread_global_hash_lock);
821 LKI(_ecore_thread_global_hash_mutex);
822 CDI(_ecore_thread_global_hash_cond);
823#endif
824}
825
826void
827_ecore_thread_shutdown(void)
828{
829 /* FIXME: If function are still running in the background, should we kill them ? */
830 Ecore_Pipe *p;
831 Eina_Array_Iterator it;
832 unsigned int i;
833
834#ifdef EFL_HAVE_THREADS
835 Ecore_Pthread_Worker *work;
836 Ecore_Pthread_Data *pth;
837
838 LKL(_ecore_pending_job_threads_mutex);
839
840 EINA_LIST_FREE(_ecore_pending_job_threads, work)
841 {
842 if (work->func_cancel)
843 work->func_cancel((void *)work->data, (Ecore_Thread *)work);
844 free(work);
845 }
846
847 EINA_LIST_FREE(_ecore_pending_job_threads_feedback, work)
848 {
849 if (work->func_cancel)
850 work->func_cancel((void *)work->data, (Ecore_Thread *)work);
851 free(work);
852 }
853
854 LKU(_ecore_pending_job_threads_mutex);
855
856 /* Improve emergency shutdown */
857 EINA_LIST_FREE(_ecore_active_job_threads, pth)
858 {
859 Ecore_Pipe *ep;
860
861 PHA(pth->thread);
862 PHJ(pth->thread, ep);
863
864 ecore_pipe_del(pth->p);
865 }
866 if (_ecore_thread_global_hash)
867 eina_hash_free(_ecore_thread_global_hash);
868 _ecore_event_handler_del(del_handler);
869 have_main_loop_thread = 0;
870 del_handler = NULL;
871
872 LKD(_ecore_pending_job_threads_mutex);
873 LRWKD(_ecore_thread_global_hash_lock);
874 LKD(_ecore_thread_global_hash_mutex);
875 CDD(_ecore_thread_global_hash_cond);
876#endif
877
878 EINA_ARRAY_ITER_NEXT(_ecore_thread_pipe, i, p, it)
879 ecore_pipe_del(p);
880
881 eina_array_free(_ecore_thread_pipe);
882 _ecore_thread_pipe = NULL;
883}
884
885void
886_ecore_thread_assert_main_loop_thread(const char *function)
887{
888 Eina_Bool good;
889#ifdef EFL_HAVE_THREADS
890 good = PHE(get_main_loop_thread(), PHS());
891#else
892 good = EINA_TRUE;
893#endif
894 if (!good)
895 {
896 EINA_LOG_CRIT("Call to %s from wrong thread!", function);
897 abort();
898 }
899}
900
901EAPI Ecore_Thread *
902ecore_thread_run(Ecore_Thread_Cb func_blocking,
903 Ecore_Thread_Cb func_end,
904 Ecore_Thread_Cb func_cancel,
905 const void *data)
906{
907 Ecore_Pthread_Worker *work;
908#ifdef EFL_HAVE_THREADS
909 Ecore_Pthread_Data *pth = NULL;
910#endif
911
912 if (!func_blocking) return NULL;
913
914 work = _ecore_thread_worker_new();
915 if (!work)
916 {
917 if (func_cancel)
918 func_cancel((void *)data, NULL);
919 return NULL;
920 }
921
922 work->u.short_run.func_blocking = func_blocking;
923 work->func_end = func_end;
924 work->func_cancel = func_cancel;
925 work->cancel = EINA_FALSE;
926 work->feedback_run = EINA_FALSE;
927 work->kill = EINA_FALSE;
928 work->reschedule = EINA_FALSE;
929 work->data = data;
930
931#ifdef EFL_HAVE_THREADS
932 work->hash = NULL;
933 CDI(work->cond);
934 LKI(work->mutex);
935
936 LKL(_ecore_pending_job_threads_mutex);
937 _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work);
938
939 if (_ecore_thread_count == _ecore_thread_count_max)
940 {
941 LKU(_ecore_pending_job_threads_mutex);
942 return (Ecore_Thread *)work;
943 }
944
945 LKU(_ecore_pending_job_threads_mutex);
946
947 /* One more thread could be created. */
948 pth = malloc(sizeof (Ecore_Pthread_Data));
949 if (!pth) goto on_error;
950
951 pth->p = _ecore_thread_pipe_get();
952 pth->death_job = _ecore_thread_worker_new();
953 if (!pth->p || !pth->death_job) goto on_error;
954
955 eina_threads_init();
956
957 if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
958 {
959 _ecore_thread_count++;
960 return (Ecore_Thread *)work;
961 }
962
963 eina_threads_shutdown();
964
965on_error:
966 if (pth)
967 {
968 if (pth->p) eina_array_push(_ecore_thread_pipe, pth->p);
969 if (pth->death_job) _ecore_thread_worker_free(pth->death_job);
970 free(pth);
971 }
972
973 if (_ecore_thread_count == 0)
974 {
975 LKL(_ecore_pending_job_threads_mutex);
976 _ecore_pending_job_threads = eina_list_remove(_ecore_pending_job_threads, work);
977 LKU(_ecore_pending_job_threads_mutex);
978
979 if (work->func_cancel)
980 work->func_cancel((void *)work->data, (Ecore_Thread *)work);
981 free(work);
982 work = NULL;
983 }
984 return (Ecore_Thread *)work;
985#else
986 /*
987 If no thread and as we don't want to break app that rely on this
988 facility, we will lock the interface until we are done.
989 */
990 do {
991 /* Handle reschedule by forcing it here. That would mean locking the app,
992 * would be better with an idler, but really to complex for a case where
993 * thread should really exist.
994 */
995 work->reschedule = EINA_FALSE;
996
997 func_blocking((void *)data, (Ecore_Thread *)work);
998 if (work->cancel == EINA_FALSE) func_end((void *)data, (Ecore_Thread *)work);
999 else func_cancel((void *)data, (Ecore_Thread *)work);
1000 } while (work->reschedule == EINA_TRUE);
1001
1002 free(work);
1003
1004 return NULL;
1005#endif
1006}
1007
1008EAPI Eina_Bool
1009ecore_thread_cancel(Ecore_Thread *thread)
1010{
1011#ifdef EFL_HAVE_THREADS
1012 Ecore_Pthread_Worker *work = (Ecore_Pthread_Worker *)thread;
1013 Eina_List *l;
1014
1015 if (!work)
1016 return EINA_TRUE;
1017 if (work->cancel)
1018 return EINA_FALSE;
1019
1020 if (work->feedback_run)
1021 {
1022 if (work->kill)
1023 return EINA_TRUE;
1024 if (work->u.feedback_run.send != work->u.feedback_run.received)
1025 goto on_exit;
1026 }
1027
1028 LKL(_ecore_pending_job_threads_mutex);
1029
1030 if ((have_main_loop_thread) &&
1031 (PHE(get_main_loop_thread(), PHS())))
1032 {
1033 if (!work->feedback_run)
1034 EINA_LIST_FOREACH(_ecore_pending_job_threads, l, work)
1035 {
1036 if ((void *)work == (void *)thread)
1037 {
1038 _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads, l);
1039
1040 LKU(_ecore_pending_job_threads_mutex);
1041
1042 if (work->func_cancel)
1043 work->func_cancel((void *)work->data, (Ecore_Thread *)work);
1044 free(work);
1045
1046 return EINA_TRUE;
1047 }
1048 }
1049 else
1050 EINA_LIST_FOREACH(_ecore_pending_job_threads_feedback, l, work)
1051 {
1052 if ((void *)work == (void *)thread)
1053 {
1054 _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback, l);
1055
1056 LKU(_ecore_pending_job_threads_mutex);
1057
1058 if (work->func_cancel)
1059 work->func_cancel((void *)work->data, (Ecore_Thread *)work);
1060 free(work);
1061
1062 return EINA_TRUE;
1063 }
1064 }
1065 }
1066
1067 LKU(_ecore_pending_job_threads_mutex);
1068
1069 /* Delay the destruction */
1070on_exit:
1071 ((Ecore_Pthread_Worker *)thread)->cancel = EINA_TRUE;
1072 return EINA_FALSE;
1073#else
1074 (void) thread;
1075 return EINA_TRUE;
1076#endif
1077}
1078
1079EAPI Eina_Bool
1080ecore_thread_check(Ecore_Thread *thread)
1081{
1082 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1083
1084 if (!worker) return EINA_TRUE;
1085 return worker->cancel;
1086}
1087
1088EAPI Ecore_Thread *
1089ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy,
1090 Ecore_Thread_Notify_Cb func_notify,
1091 Ecore_Thread_Cb func_end,
1092 Ecore_Thread_Cb func_cancel,
1093 const void *data,
1094 Eina_Bool try_no_queue)
1095{
1096#ifdef EFL_HAVE_THREADS
1097 Ecore_Pthread_Worker *worker;
1098 Ecore_Pthread_Data *pth = NULL;
1099
1100 if (!func_heavy) return NULL;
1101
1102 worker = _ecore_thread_worker_new();
1103 if (!worker) goto on_error;
1104
1105 worker->u.feedback_run.func_heavy = func_heavy;
1106 worker->u.feedback_run.func_notify = func_notify;
1107 worker->hash = NULL;
1108 CDI(worker->cond);
1109 LKI(worker->mutex);
1110 worker->func_cancel = func_cancel;
1111 worker->func_end = func_end;
1112 worker->data = data;
1113 worker->cancel = EINA_FALSE;
1114 worker->feedback_run = EINA_TRUE;
1115 worker->kill = EINA_FALSE;
1116 worker->reschedule = EINA_FALSE;
1117
1118 worker->u.feedback_run.send = 0;
1119 worker->u.feedback_run.received = 0;
1120
1121 worker->u.feedback_run.notify = ecore_pipe_add(_ecore_notify_handler, worker);
1122 worker->u.feedback_run.direct_pipe = NULL;
1123 worker->u.feedback_run.direct_worker = NULL;
1124
1125 if (!try_no_queue)
1126 {
1127 PH(t);
1128
1129 worker->u.feedback_run.direct_pipe = _ecore_thread_pipe_get();
1130 worker->u.feedback_run.direct_worker = _ecore_thread_worker_new();
1131 worker->no_queue = EINA_TRUE;
1132
1133 eina_threads_init();
1134
1135 if (PHC(t, _ecore_direct_worker, worker) == 0)
1136 return (Ecore_Thread *)worker;
1137
1138 eina_threads_shutdown();
1139 }
1140
1141 worker->no_queue = EINA_FALSE;
1142
1143 LKL(_ecore_pending_job_threads_mutex);
1144 _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, worker);
1145
1146 if (_ecore_thread_count == _ecore_thread_count_max)
1147 {
1148 LKU(_ecore_pending_job_threads_mutex);
1149 return (Ecore_Thread *)worker;
1150 }
1151
1152 LKU(_ecore_pending_job_threads_mutex);
1153
1154 /* One more thread could be created. */
1155 pth = malloc(sizeof (Ecore_Pthread_Data));
1156 if (!pth) goto on_error;
1157
1158 pth->p = _ecore_thread_pipe_get();
1159 pth->death_job = _ecore_thread_worker_new();
1160 if (!pth->p || !pth->death_job) goto on_error;
1161
1162 eina_threads_init();
1163
1164 if (PHC(pth->thread, _ecore_thread_worker, pth) == 0)
1165 {
1166 _ecore_thread_count++;
1167 return (Ecore_Thread *)worker;
1168 }
1169
1170 eina_threads_shutdown();
1171
1172on_error:
1173 if (pth)
1174 {
1175 if (pth->p) eina_array_push(_ecore_thread_pipe, pth->p);
1176 if (pth->death_job) _ecore_thread_worker_free(pth->death_job);
1177 free(pth);
1178 }
1179
1180 if (_ecore_thread_count == 0)
1181 {
1182 LKL(_ecore_pending_job_threads_mutex);
1183 _ecore_pending_job_threads_feedback = eina_list_remove(_ecore_pending_job_threads_feedback,
1184 worker);
1185 LKU(_ecore_pending_job_threads_mutex);
1186
1187 if (func_cancel) func_cancel((void *)data, NULL);
1188
1189 if (worker)
1190 {
1191 ecore_pipe_del(worker->u.feedback_run.notify);
1192 free(worker);
1193 worker = NULL;
1194 }
1195 }
1196
1197 return (Ecore_Thread *)worker;
1198#else
1199 Ecore_Pthread_Worker worker;
1200
1201 (void)try_no_queue;
1202
1203 /*
1204 If no thread and as we don't want to break app that rely on this
1205 facility, we will lock the interface until we are done.
1206 */
1207 worker.u.feedback_run.func_heavy = func_heavy;
1208 worker.u.feedback_run.func_notify = func_notify;
1209 worker.u.feedback_run.notify = NULL;
1210 worker.u.feedback_run.send = 0;
1211 worker.u.feedback_run.received = 0;
1212 worker.func_cancel = func_cancel;
1213 worker.func_end = func_end;
1214 worker.data = data;
1215 worker.cancel = EINA_FALSE;
1216 worker.feedback_run = EINA_TRUE;
1217 worker.kill = EINA_FALSE;
1218
1219 do {
1220 worker.reschedule = EINA_FALSE;
1221
1222 func_heavy((void *)data, (Ecore_Thread *)&worker);
1223
1224 if (worker.cancel) func_cancel((void *)data, (Ecore_Thread *)&worker);
1225 else func_end((void *)data, (Ecore_Thread *)&worker);
1226 } while (worker.reschedule == EINA_TRUE);
1227
1228 return NULL;
1229#endif
1230}
1231
1232EAPI Eina_Bool
1233ecore_thread_feedback(Ecore_Thread *thread,
1234 const void *data)
1235{
1236 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1237
1238 if (!worker) return EINA_FALSE;
1239 if (!worker->feedback_run) return EINA_FALSE;
1240
1241#ifdef EFL_HAVE_THREADS
1242 if (!PHE(worker->self, PHS())) return EINA_FALSE;
1243
1244 worker->u.feedback_run.send++;
1245 ecore_pipe_write(worker->u.feedback_run.notify, &data, sizeof (void *));
1246
1247 return EINA_TRUE;
1248#else
1249 worker->u.feedback_run.func_notify((void *)worker->data, thread, (void *)data);
1250
1251 return EINA_TRUE;
1252#endif
1253}
1254
1255EAPI Eina_Bool
1256ecore_thread_reschedule(Ecore_Thread *thread)
1257{
1258 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1259
1260 if (!worker) return EINA_FALSE;
1261
1262#ifdef EFL_HAVE_THREADS
1263 if (!PHE(worker->self, PHS())) return EINA_FALSE;
1264#endif
1265
1266 worker->reschedule = EINA_TRUE;
1267 return EINA_TRUE;
1268}
1269
1270EAPI int
1271ecore_thread_active_get(void)
1272{
1273#ifdef EFL_HAVE_THREADS
1274 return _ecore_thread_count;
1275#else
1276 return 0;
1277#endif
1278}
1279
1280EAPI int
1281ecore_thread_pending_get(void)
1282{
1283#ifdef EFL_HAVE_THREADS
1284 int ret;
1285
1286 LKL(_ecore_pending_job_threads_mutex);
1287 ret = eina_list_count(_ecore_pending_job_threads);
1288 LKU(_ecore_pending_job_threads_mutex);
1289 return ret;
1290#else
1291 return 0;
1292#endif
1293}
1294
1295EAPI int
1296ecore_thread_pending_feedback_get(void)
1297{
1298#ifdef EFL_HAVE_THREADS
1299 int ret;
1300
1301 LKL(_ecore_pending_job_threads_mutex);
1302 ret = eina_list_count(_ecore_pending_job_threads_feedback);
1303 LKU(_ecore_pending_job_threads_mutex);
1304 return ret;
1305#else
1306 return 0;
1307#endif
1308}
1309
1310EAPI int
1311ecore_thread_pending_total_get(void)
1312{
1313#ifdef EFL_HAVE_THREADS
1314 int ret;
1315
1316 LKL(_ecore_pending_job_threads_mutex);
1317 ret = eina_list_count(_ecore_pending_job_threads) + eina_list_count(_ecore_pending_job_threads_feedback);
1318 LKU(_ecore_pending_job_threads_mutex);
1319 return ret;
1320#else
1321 return 0;
1322#endif
1323}
1324
1325EAPI int
1326ecore_thread_max_get(void)
1327{
1328 return _ecore_thread_count_max;
1329}
1330
1331EAPI void
1332ecore_thread_max_set(int num)
1333{
1334 if (num < 1) return;
1335 /* avoid doing something hilarious by blocking dumb users */
1336 if (num >= (2 * eina_cpu_count())) return;
1337
1338 _ecore_thread_count_max = num;
1339}
1340
1341EAPI void
1342ecore_thread_max_reset(void)
1343{
1344 _ecore_thread_count_max = eina_cpu_count();
1345}
1346
1347EAPI int
1348ecore_thread_available_get(void)
1349{
1350#ifdef EFL_HAVE_THREADS
1351 int ret;
1352
1353 LKL(_ecore_pending_job_threads_mutex);
1354 ret = _ecore_thread_count_max - _ecore_thread_count;
1355 LKU(_ecore_pending_job_threads_mutex);
1356 return ret;
1357#else
1358 return 0;
1359#endif
1360}
1361
1362EAPI Eina_Bool
1363ecore_thread_local_data_add(Ecore_Thread *thread,
1364 const char *key,
1365 void *value,
1366 Eina_Free_Cb cb,
1367 Eina_Bool direct)
1368{
1369#ifdef EFL_HAVE_THREADS
1370 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1371 Ecore_Thread_Data *d;
1372 Eina_Bool ret;
1373#endif
1374
1375 if ((!thread) || (!key) || (!value))
1376 return EINA_FALSE;
1377#ifdef EFL_HAVE_THREADS
1378 if (!PHE(worker->self, PHS())) return EINA_FALSE;
1379
1380 if (!worker->hash)
1381 worker->hash = eina_hash_string_small_new(_ecore_thread_data_free);
1382
1383 if (!worker->hash)
1384 return EINA_FALSE;
1385
1386 if (!(d = malloc(sizeof(Ecore_Thread_Data))))
1387 return EINA_FALSE;
1388
1389 d->data = value;
1390 d->cb = cb;
1391
1392 if (direct)
1393 ret = eina_hash_direct_add(worker->hash, key, d);
1394 else
1395 ret = eina_hash_add(worker->hash, key, d);
1396 CDB(worker->cond);
1397 return ret;
1398#else
1399 (void) cb;
1400 (void) direct;
1401 return EINA_FALSE;
1402#endif
1403}
1404
1405EAPI void *
1406ecore_thread_local_data_set(Ecore_Thread *thread,
1407 const char *key,
1408 void *value,
1409 Eina_Free_Cb cb)
1410{
1411#ifdef EFL_HAVE_THREADS
1412 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1413 Ecore_Thread_Data *d, *r;
1414 void *ret;
1415#endif
1416
1417 if ((!thread) || (!key) || (!value))
1418 return NULL;
1419#ifdef EFL_HAVE_THREADS
1420 if (!PHE(worker->self, PHS())) return NULL;
1421
1422 if (!worker->hash)
1423 worker->hash = eina_hash_string_small_new(_ecore_thread_data_free);
1424
1425 if (!worker->hash)
1426 return NULL;
1427
1428 if (!(d = malloc(sizeof(Ecore_Thread_Data))))
1429 return NULL;
1430
1431 d->data = value;
1432 d->cb = cb;
1433
1434 r = eina_hash_set(worker->hash, key, d);
1435 CDB(worker->cond);
1436 ret = r->data;
1437 free(r);
1438 return ret;
1439#else
1440 (void) cb;
1441 return NULL;
1442#endif
1443}
1444
1445EAPI void *
1446ecore_thread_local_data_find(Ecore_Thread *thread,
1447 const char *key)
1448{
1449#ifdef EFL_HAVE_THREADS
1450 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1451 Ecore_Thread_Data *d;
1452#endif
1453
1454 if ((!thread) || (!key))
1455 return NULL;
1456#ifdef EFL_HAVE_THREADS
1457 if (!PHE(worker->self, PHS())) return NULL;
1458
1459 if (!worker->hash)
1460 return NULL;
1461
1462 d = eina_hash_find(worker->hash, key);
1463 if (d)
1464 return d->data;
1465 return NULL;
1466#else
1467 return NULL;
1468#endif
1469}
1470
1471EAPI Eina_Bool
1472ecore_thread_local_data_del(Ecore_Thread *thread,
1473 const char *key)
1474{
1475#ifdef EFL_HAVE_THREADS
1476 Ecore_Pthread_Worker *worker = (Ecore_Pthread_Worker *)thread;
1477#endif
1478
1479 if ((!thread) || (!key))
1480 return EINA_FALSE;
1481#ifdef EFL_HAVE_THREADS
1482 if (!PHE(worker->self, PHS())) return EINA_FALSE;
1483
1484 if (!worker->hash)
1485 return EINA_FALSE;
1486 return eina_hash_del_by_key(worker->hash, key);
1487#else
1488 return EINA_TRUE;
1489#endif
1490}
1491
1492EAPI Eina_Bool
1493ecore_thread_global_data_add(const char *key,
1494 void *value,
1495 Eina_Free_Cb cb,
1496 Eina_Bool direct)
1497{
1498#ifdef EFL_HAVE_THREADS
1499 Ecore_Thread_Data *d;
1500 Eina_Bool ret;
1501#endif
1502
1503 if ((!key) || (!value))
1504 return EINA_FALSE;
1505#ifdef EFL_HAVE_THREADS
1506 LRWKWL(_ecore_thread_global_hash_lock);
1507 if (!_ecore_thread_global_hash)
1508 _ecore_thread_global_hash = eina_hash_string_small_new(_ecore_thread_data_free);
1509 LRWKU(_ecore_thread_global_hash_lock);
1510
1511 if (!(d = malloc(sizeof(Ecore_Thread_Data))))
1512 return EINA_FALSE;
1513
1514 d->data = value;
1515 d->cb = cb;
1516
1517 if (!_ecore_thread_global_hash)
1518 return EINA_FALSE;
1519 LRWKWL(_ecore_thread_global_hash_lock);
1520 if (direct)
1521 ret = eina_hash_direct_add(_ecore_thread_global_hash, key, d);
1522 else
1523 ret = eina_hash_add(_ecore_thread_global_hash, key, d);
1524 LRWKU(_ecore_thread_global_hash_lock);
1525 CDB(_ecore_thread_global_hash_cond);
1526 return ret;
1527#else
1528 (void) cb;
1529 (void) direct;
1530 return EINA_TRUE;
1531#endif
1532}
1533
1534EAPI void *
1535ecore_thread_global_data_set(const char *key,
1536 void *value,
1537 Eina_Free_Cb cb)
1538{
1539#ifdef EFL_HAVE_THREADS
1540 Ecore_Thread_Data *d, *r;
1541 void *ret;
1542#endif
1543
1544 if ((!key) || (!value))
1545 return NULL;
1546#ifdef EFL_HAVE_THREADS
1547 LRWKWL(_ecore_thread_global_hash_lock);
1548 if (!_ecore_thread_global_hash)
1549 _ecore_thread_global_hash = eina_hash_string_small_new(_ecore_thread_data_free);
1550 LRWKU(_ecore_thread_global_hash_lock);
1551
1552 if (!_ecore_thread_global_hash)
1553 return NULL;
1554
1555 if (!(d = malloc(sizeof(Ecore_Thread_Data))))
1556 return NULL;
1557
1558 d->data = value;
1559 d->cb = cb;
1560
1561 LRWKWL(_ecore_thread_global_hash_lock);
1562 r = eina_hash_set(_ecore_thread_global_hash, key, d);
1563 LRWKU(_ecore_thread_global_hash_lock);
1564 CDB(_ecore_thread_global_hash_cond);
1565
1566 ret = r->data;
1567 free(r);
1568 return ret;
1569#else
1570 (void) cb;
1571 return NULL;
1572#endif
1573}
1574
1575EAPI void *
1576ecore_thread_global_data_find(const char *key)
1577{
1578#ifdef EFL_HAVE_THREADS
1579 Ecore_Thread_Data *ret;
1580#endif
1581
1582 if (!key)
1583 return NULL;
1584#ifdef EFL_HAVE_THREADS
1585 if (!_ecore_thread_global_hash) return NULL;
1586
1587 LRWKRL(_ecore_thread_global_hash_lock);
1588 ret = eina_hash_find(_ecore_thread_global_hash, key);
1589 LRWKU(_ecore_thread_global_hash_lock);
1590 if (ret)
1591 return ret->data;
1592 return NULL;
1593#else
1594 return NULL;
1595#endif
1596}
1597
1598EAPI Eina_Bool
1599ecore_thread_global_data_del(const char *key)
1600{
1601#ifdef EFL_HAVE_THREADS
1602 Eina_Bool ret;
1603#endif
1604
1605 if (!key)
1606 return EINA_FALSE;
1607#ifdef EFL_HAVE_THREADS
1608 if (!_ecore_thread_global_hash)
1609 return EINA_FALSE;
1610
1611 LRWKWL(_ecore_thread_global_hash_lock);
1612 ret = eina_hash_del_by_key(_ecore_thread_global_hash, key);
1613 LRWKU(_ecore_thread_global_hash_lock);
1614 return ret;
1615#else
1616 return EINA_TRUE;
1617#endif
1618}
1619
1620EAPI void *
1621ecore_thread_global_data_wait(const char *key,
1622 double seconds)
1623{
1624#ifdef EFL_HAVE_THREADS
1625 double tm = 0;
1626 Ecore_Thread_Data *ret = NULL;
1627#endif
1628
1629 if (!key)
1630 return NULL;
1631#ifdef EFL_HAVE_THREADS
1632 if (!_ecore_thread_global_hash)
1633 return NULL;
1634 if (seconds > 0)
1635 tm = ecore_time_get() + seconds;
1636
1637 while (1)
1638 {
1639#ifndef _WIN32
1640 struct timespec t = { 0, 0 };
1641
1642 t.tv_sec = (long int)tm;
1643 t.tv_nsec = (long int)((tm - (double)t.tv_sec) * 1000000000);
1644#else
1645 struct timeval t = { 0, 0 };
1646
1647 t.tv_sec = (long int)tm;
1648 t.tv_usec = (long int)((tm - (double)t.tv_sec) * 1000000);
1649#endif
1650 LRWKRL(_ecore_thread_global_hash_lock);
1651 ret = eina_hash_find(_ecore_thread_global_hash, key);
1652 LRWKU(_ecore_thread_global_hash_lock);
1653 if ((ret) || (!seconds) || ((seconds > 0) && (tm <= ecore_time_get())))
1654 break;
1655 LKL(_ecore_thread_global_hash_mutex);
1656 CDW(_ecore_thread_global_hash_cond, _ecore_thread_global_hash_mutex, &t);
1657 LKU(_ecore_thread_global_hash_mutex);
1658 }
1659 if (ret) return ret->data;
1660 return NULL;
1661#else
1662 (void) seconds;
1663 return NULL;
1664#endif
1665}
1666
diff --git a/libraries/ecore/src/lib/ecore/ecore_throttle.c b/libraries/ecore/src/lib/ecore/ecore_throttle.c
new file mode 100644
index 0000000..b5e3133
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_throttle.c
@@ -0,0 +1,99 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <unistd.h>
7
8#include "Ecore.h"
9#include "ecore_private.h"
10
11static int throttle_val = 0;
12
13/**
14 * @addtogroup Ecore_Throttle_Group Ecore Throttle functions
15 *
16 * @{
17 */
18
19/**
20 * Increase throttle amount
21 *
22 * This will increase or decrease (if @p amount is positive or negative) the
23 * amount of "voluntary throttling" ecore will do to its main loop while
24 * running. This is intended to be used to limit animations and wakeups when
25 * in a strict power management state. The higher the current throttle value
26 * (which can be retrieved by ecore_throttle_get() ), the more throttling
27 * takes place. If the current throttle value is 0, then no throttling takes
28 * place at all.
29 *
30 * The value represents how long the ecore main loop will sleep (in seconds)
31 * before it goes into a fully idle state waiting for events, input or
32 * timing events to wake it up. For example, if the current throttle level
33 * is 0.5, then after every time the main loop cycles and goes into idle
34 * affter processing all events, the main loop will explicitly sleep for 0.5
35 * seconds before sitting and waiting for incoming events or timeouts, thus
36 * preventing animation, async IO and network handling etc. for that period
37 * of time. Of course these events, data and timeouts will be buffered,
38 * thus not losing anything, simply delaying when they get handled by the
39 * throttle value.
40 *
41 * Example:
42 * @code
43 * void enter_powersave(void) {
44 * ecore_throttle_adjust(0.2);
45 * printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
46 * }
47 *
48 * void enter_deep_powersave(void) {
49 * ecore_throttle_adjust(0.5);
50 * printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
51 * }
52 *
53 * void exit_powersave(void) {
54 * ecore_throttle_adjust(-0.2);
55 * printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
56 * }
57 *
58 * void exit_deep_powersave(void) {
59 * ecore_throttle_adjust(-0.5);
60 * printf("Now at throttle level: %1.3f\n", ecore_throttle_get());
61 * }
62 * @endcode
63 *
64 * @param amount Amount (in seconds) to adjust by
65 */
66EAPI void
67ecore_throttle_adjust(double amount)
68{
69 int adj = amount * 1000000.0;
70 throttle_val += adj;
71 if (throttle_val < 0) throttle_val = 0;
72}
73
74/**
75 * Get current throttle level
76 *
77 * This gets the current throttling level, which can be adjusted by
78 * ecore_throttle_adjust(). The value is in seconds. Please see
79 * ecore_throttle_adjust() for more information.
80 *
81 * @return The current throttle level
82 */
83EAPI double
84ecore_throttle_get(void)
85{
86 return (double)throttle_val / 1000000.0;
87}
88
89/**
90 * @}
91 */
92
93void
94_ecore_throttle(void)
95{
96 if (throttle_val <= 0) return;
97 usleep(throttle_val);
98}
99
diff --git a/libraries/ecore/src/lib/ecore/ecore_time.c b/libraries/ecore/src/lib/ecore/ecore_time.c
new file mode 100644
index 0000000..8e7611b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_time.c
@@ -0,0 +1,184 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#ifdef HAVE_SYS_TIME_H
8# include <sys/time.h>
9#endif
10
11#ifdef HAVE_EVIL
12# include <Evil.h>
13#endif
14
15#if defined(__APPLE__) && defined(__MACH__)
16# include <mach/mach_time.h>
17#endif
18
19#include "Ecore.h"
20#include "ecore_private.h"
21
22#include <time.h>
23
24#ifdef HAVE_CLOCK_GETTIME
25static clockid_t _ecore_time_clock_id = -1;
26#elif defined(__APPLE__) && defined(__MACH__)
27static double _ecore_time_clock_conversion = 1e-9;
28#endif
29double _ecore_time_loop_time = -1.0;
30
31/**
32 * @addtogroup Ecore_Time_Group
33 *
34 * @{
35 */
36
37/**
38 * Retrieves the current system time as a floating point value in seconds.
39 *
40 * This uses a monotonic clock and thus never goes back in time while
41 * machine is live (even if user changes time or timezone changes,
42 * however it may be reset whenever the machine is restarted).
43 *
44 * @see ecore_loop_time_get().
45 * @see ecore_time_unix_get().
46 *
47 * @return The number of seconds. Start time is not defined (it may be
48 * when the machine was booted, unix time, etc), all it is
49 * defined is that it never goes backwards (unless you got big critical
50 * messages when the application started).
51 */
52EAPI double
53ecore_time_get(void)
54{
55#ifdef HAVE_CLOCK_GETTIME
56 struct timespec t;
57
58 if (EINA_UNLIKELY(_ecore_time_clock_id < 0))
59 return ecore_time_unix_get();
60
61 if (EINA_UNLIKELY(clock_gettime(_ecore_time_clock_id, &t)))
62 {
63 CRIT("Cannot get current time.");
64 /* Try to at least return the latest value retrieved*/
65 return _ecore_time_loop_time;
66 }
67
68 return (double)t.tv_sec + (((double)t.tv_nsec) / 1000000000.0);
69#elif defined(HAVE_EVIL)
70 return evil_time_get();
71#elif defined(__APPLE__) && defined(__MACH__)
72 return _ecore_time_clock_conversion * (double)mach_absolute_time();
73#else
74 return ecore_time_unix_get();
75#endif
76}
77
78/**
79 * Retrieves the current UNIX time as a floating point value in seconds.
80 *
81 * @see ecore_time_get().
82 * @see ecore_loop_time_get().
83 *
84 * @return The number of seconds since 12.00AM 1st January 1970.
85 */
86EAPI double
87ecore_time_unix_get(void)
88{
89#ifdef HAVE_GETTIMEOFDAY
90 struct timeval timev;
91
92 gettimeofday(&timev, NULL);
93 return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
94#else
95# error "Your platform isn't supported yet"
96#endif
97}
98
99/**
100 * Retrieves the time at which the last loop stopped waiting for timeouts or
101 * events.
102 *
103 * This gets the time that the main loop ceased waiting for timouts and/or
104 * events to come in or for signals or any other interrupt source. This should
105 * be considered a reference point for all time based activity that should
106 * calculate its timepoint from the return of ecore_loop_time_get(). Use this
107 * UNLESS you absolutely must get the current actual timepoint - then use
108 * ecore_time_get(). Note that this time is meant to be used as relative to
109 * other times obtained on this run. If you need absolute time references, use
110 * ecore_time_unix_get() instead.
111 *
112 * This function can be called before any loop has ever been run, but either
113 * ecore_init() or ecore_time_get() must have been called once.
114 *
115 * @return The number of seconds. Start time is not defined (it may be
116 * when the machine was booted, unix time, etc), all it is
117 * defined is that it never goes backwards (unless you got big critical
118 * messages when the application started).
119 */
120EAPI double
121ecore_loop_time_get(void)
122{
123 return _ecore_time_loop_time;
124}
125
126/**
127 * @}
128 */
129
130/********************** Internal methods ********************************/
131
132/* TODO: Documentation says "All implementations support the system-wide
133 * real-time clock, which is identified by CLOCK_REALTIME. Check if the fallback
134 * to unix time (without specifying the resolution) might be removed
135 */
136void
137_ecore_time_init(void)
138{
139#ifdef HAVE_CLOCK_GETTIME
140 struct timespec t;
141
142 if (_ecore_time_clock_id != -1) return;
143
144 if (!clock_gettime(CLOCK_MONOTONIC, &t))
145 {
146 _ecore_time_clock_id = CLOCK_MONOTONIC;
147 DBG("using CLOCK_MONOTONIC.");
148 }
149 else if (!clock_gettime(CLOCK_REALTIME, &t))
150 {
151 /* may go backwards */
152 _ecore_time_clock_id = CLOCK_REALTIME;
153 WRN("CLOCK_MONOTONIC not available. Fallback to CLOCK_REALTIME.");
154 }
155 else
156 {
157 _ecore_time_clock_id = -2;
158 CRIT("Cannot get a valid clock_gettime() clock id! "
159 "Fallback to unix time.");
160 }
161#else
162# ifndef HAVE_EVIL
163# if defined(__APPLE__) && defined(__MACH__)
164 mach_timebase_info_data_t info;
165 kern_return_t err = mach_timebase_info(&info);
166 if (err == 0)
167 {
168 _ecore_time_clock_conversion = 1e-9 * (double)info.numer / (double)info.denom;
169 }
170 else
171 {
172 WRN("Unable to get timebase info. Fallback to nanoseconds.");
173 }
174# else
175# warning "Your platform isn't supported yet"
176 CRIT("Platform does not support clock_gettime. "
177 "Fallback to unix time.");
178# endif
179# endif
180#endif
181
182 _ecore_time_loop_time = ecore_time_get();
183}
184
diff --git a/libraries/ecore/src/lib/ecore/ecore_timer.c b/libraries/ecore/src/lib/ecore/ecore_timer.c
new file mode 100644
index 0000000..9c66545
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore/ecore_timer.c
@@ -0,0 +1,800 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7
8#include "Ecore.h"
9#include "ecore_private.h"
10
11#ifdef WANT_ECORE_TIMER_DUMP
12# include <string.h>
13# include <execinfo.h>
14# define ECORE_TIMER_DEBUG_BT_NUM 64
15typedef void (*Ecore_Timer_Bt_Func)();
16#endif
17
18struct _Ecore_Timer
19{
20 EINA_INLIST;
21 ECORE_MAGIC;
22 double in;
23 double at;
24 double pending;
25 Ecore_Task_Cb func;
26 void *data;
27
28#ifdef WANT_ECORE_TIMER_DUMP
29 Ecore_Timer_Bt_Func timer_bt[ECORE_TIMER_DEBUG_BT_NUM];
30 int timer_bt_num;
31#endif
32
33 int references;
34 unsigned char delete_me : 1;
35 unsigned char just_added : 1;
36 unsigned char frozen : 1;
37};
38
39static void _ecore_timer_set(Ecore_Timer *timer,
40 double at,
41 double in,
42 Ecore_Task_Cb func,
43 void *data);
44#ifdef WANT_ECORE_TIMER_DUMP
45static int _ecore_timer_cmp(const void *d1,
46 const void *d2);
47#endif
48
49static int timers_added = 0;
50static int timers_delete_me = 0;
51static Ecore_Timer *timers = NULL;
52static Ecore_Timer *timer_current = NULL;
53static Ecore_Timer *suspended = NULL;
54static double last_check = 0.0;
55static double precision = 10.0 / 1000000.0;
56
57/**
58 * @addtogroup Ecore_Time_Group
59 *
60 * @{
61 */
62
63/**
64 * Retrieves the current precision used by timer infrastructure.
65 *
66 * @see ecore_timer_precision_set()
67 */
68EAPI double
69ecore_timer_precision_get(void)
70{
71 return precision;
72}
73
74/**
75 * Sets the precision to be used by timer infrastructure.
76 *
77 * When system calculates time to expire the next timer we'll be able
78 * to delay the timer by the given amount so more timers will fit in
79 * the same dispatch, waking up the system less often and thus being
80 * able to save power.
81 *
82 * Be aware that kernel may delay delivery even further, these delays
83 * are always possible due other tasks having higher priorities or
84 * other scheduler policies.
85 *
86 * Example:
87 * We have 2 timers, one that expires in a 2.0s and another that
88 * expires in 2.1s, if precision is 0.1s, then the Ecore will request
89 * for the next expire to happen in 2.1s and not 2.0s and another one
90 * of 0.1 as it would before.
91 *
92 * @note Ecore is smart enough to see if there are timers in the
93 * precision range, if it does not, in our example if no second timer
94 * in (T + precision) existed, then it would use the minimum timeout.
95 *
96 * @param value allowed introduced timeout delay, in seconds.
97 */
98EAPI void
99ecore_timer_precision_set(double value)
100{
101 _ecore_lock();
102
103 if (value < 0.0)
104 {
105 ERR("Precision %f less than zero, ignored", value);
106 goto unlock;
107 }
108 precision = value;
109
110unlock:
111 _ecore_unlock();
112}
113
114/**
115 * Creates a timer to call the given function in the given period of time.
116 * @param in The interval in seconds.
117 * @param func The given function. If @p func returns 1, the timer is
118 * rescheduled for the next interval @p in.
119 * @param data Data to pass to @p func when it is called.
120 * @return A timer object on success. @c NULL on failure.
121 *
122 * This function adds a timer and returns its handle on success and NULL on
123 * failure. The function @p func will be called every @p in seconds. The
124 * function will be passed the @p data pointer as its parameter.
125 *
126 * When the timer @p func is called, it must return a value of either 1
127 * (or ECORE_CALLBACK_RENEW) or 0 (or ECORE_CALLBACK_CANCEL).
128 * If it returns 1, it will be called again at the next tick, or if it returns
129 * 0 it will be deleted automatically making any references/handles for it
130 * invalid.
131 */
132EAPI Ecore_Timer *
133ecore_timer_add(double in,
134 Ecore_Task_Cb func,
135 const void *data)
136{
137 double now;
138 Ecore_Timer *timer = NULL;
139
140 _ecore_lock();
141 if (!func) goto unlock;
142 if (in < 0.0) in = 0.0;
143 timer = calloc(1, sizeof(Ecore_Timer));
144 if (!timer) goto unlock;
145 ECORE_MAGIC_SET(timer, ECORE_MAGIC_TIMER);
146 now = ecore_time_get();
147
148#ifdef WANT_ECORE_TIMER_DUMP
149 timer->timer_bt_num = backtrace((void **)(timer->timer_bt),
150 ECORE_TIMER_DEBUG_BT_NUM);
151#endif
152
153 _ecore_timer_set(timer, now + in, in, func, (void *)data);
154unlock:
155 _ecore_unlock();
156 return timer;
157}
158
159/**
160 * Creates a timer to call the given function in the given period of time.
161 * @param in The interval in seconds from current loop time.
162 * @param func The given function. If @p func returns 1, the timer is
163 * rescheduled for the next interval @p in.
164 * @param data Data to pass to @p func when it is called.
165 * @return A timer object on success. @c NULL on failure.
166 *
167 * This is the same as ecore_timer_add(), but "now" is the time from
168 * ecore_loop_time_get() not ecore_time_get() as ecore_timer_add() uses. See
169 * ecore_timer_add() for more details.
170 */
171EAPI Ecore_Timer *
172ecore_timer_loop_add(double in,
173 Ecore_Task_Cb func,
174 const void *data)
175{
176 Ecore_Timer *timer;
177
178 _ecore_lock();
179 timer = _ecore_timer_loop_add(in, func, data);
180 _ecore_unlock();
181
182 return timer;
183}
184
185/**
186 * Delete the specified timer from the timer list.
187 * @param timer The timer to delete.
188 * @return The data pointer set for the timer when @ref ecore_timer_add was
189 * called. @c NULL is returned if the function is unsuccessful.
190 *
191 * Note: @p timer must be a valid handle. If the timer function has already
192 * returned 0, the handle is no longer valid (and does not need to be delete).
193 */
194EAPI void *
195ecore_timer_del(Ecore_Timer *timer)
196{
197 void *data = NULL;
198
199 _ecore_lock();
200
201 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
202 {
203 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
204 "ecore_timer_del");
205 goto unlock;
206 }
207
208 data = _ecore_timer_del(timer);
209
210unlock:
211 _ecore_unlock();
212 return data;
213}
214
215/**
216 * Change the interval the timer ticks of. If set during
217 * a timer call, this will affect the next interval.
218 *
219 * @param timer The timer to change.
220 * @param in The interval in seconds.
221 */
222EAPI void
223ecore_timer_interval_set(Ecore_Timer *timer,
224 double in)
225{
226 _ecore_lock();
227
228 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
229 {
230 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
231 "ecore_timer_interval_set");
232 goto unlock;
233 }
234 timer->in = in;
235unlock:
236 _ecore_unlock();
237}
238
239/**
240 * Get the interval the timer ticks on.
241 *
242 * @param timer The timer to retrieve the interval from
243 * @return The interval on success. -1 on failure.
244 */
245EAPI double
246ecore_timer_interval_get(Ecore_Timer *timer)
247{
248 double interval;
249
250 _ecore_lock();
251
252 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
253 {
254 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
255 "ecore_timer_interval_get");
256 interval = -1.0;
257 goto unlock;
258 }
259
260 interval = timer->in;
261unlock:
262 _ecore_unlock();
263 return interval;
264}
265
266/**
267 * Add some delay for the next occurrence of a timer.
268 * This doesn't affect the interval of a timer.
269 *
270 * @param timer The timer to change.
271 * @param add The dalay to add to the next iteration.
272 */
273EAPI void
274ecore_timer_delay(Ecore_Timer *timer,
275 double add)
276{
277 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
278 {
279 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
280 "ecore_timer_delay");
281 return;
282 }
283
284 _ecore_lock();
285 _ecore_timer_delay(timer, add);
286 _ecore_unlock();
287}
288
289/**
290 * Get the pending time regarding a timer.
291 *
292 * @param timer The timer to learn from.
293 * @ingroup Ecore_Time_Group
294 */
295EAPI double
296ecore_timer_pending_get(Ecore_Timer *timer)
297{
298 double now;
299 double ret = 0.0;
300
301 _ecore_lock();
302
303 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
304 {
305 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
306 "ecore_timer_pending_get");
307 goto unlock;
308 }
309
310 now = ecore_time_get();
311
312 if (timer->frozen)
313 ret = timer->pending;
314 else
315 ret = timer->at - now;
316unlock:
317 _ecore_unlock();
318 return ret;
319}
320
321/**
322 * Pauses a running timer.
323 *
324 * @param timer The timer to be paused.
325 *
326 * The timer callback won't be called while the timer is paused. The remaining
327 * time until the timer expires will be saved, so the timer can be resumed with
328 * that same remaining time to expire, instead of expiring instantly. Use
329 * ecore_timer_thaw() to resume it.
330 *
331 * @note Nothing happens if the timer was already paused.
332 *
333 * @see ecore_timer_thaw()
334 */
335EAPI void
336ecore_timer_freeze(Ecore_Timer *timer)
337{
338 double now;
339
340 _ecore_lock();
341
342 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
343 {
344 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
345 "ecore_timer_freeze");
346 goto unlock;
347 }
348
349 /* Timer already frozen */
350 if (timer->frozen)
351 goto unlock;
352
353 timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
354 suspended = (Ecore_Timer *)eina_inlist_prepend(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
355
356 now = ecore_time_get();
357
358 timer->pending = timer->at - now;
359 timer->at = 0.0;
360 timer->frozen = 1;
361unlock:
362 _ecore_unlock();
363}
364
365/**
366 * Resumes a frozen (paused) timer.
367 *
368 * @param timer The timer to be resumed.
369 *
370 * The timer will be resumed from its previous relative position in time. That
371 * means, if it had X seconds remaining until expire when it was paused, it will
372 * be started now with those same X seconds remaining to expire again. But
373 * notice that the interval time won't be touched by this call or by
374 * ecore_timer_freeze().
375 *
376 * @see ecore_timer_freeze()
377 */
378EAPI void
379ecore_timer_thaw(Ecore_Timer *timer)
380{
381 double now;
382
383 _ecore_lock();
384
385 if (!ECORE_MAGIC_CHECK(timer, ECORE_MAGIC_TIMER))
386 {
387 ECORE_MAGIC_FAIL(timer, ECORE_MAGIC_TIMER,
388 "ecore_timer_thaw");
389 goto unlock;
390 }
391
392 /* Timer not frozen */
393 if (!timer->frozen)
394 goto unlock;
395
396 suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
397 now = ecore_time_get();
398
399 _ecore_timer_set(timer, timer->pending + now, timer->in, timer->func, timer->data);
400unlock:
401 _ecore_unlock();
402}
403
404EAPI char *
405ecore_timer_dump(void)
406{
407#ifdef WANT_ECORE_TIMER_DUMP
408 Eina_Strbuf *result;
409 char *out;
410 Ecore_Timer *tm;
411 Eina_List *tmp = NULL;
412 int living_timer = 0;
413 int unknow_timer = 0;
414
415 _ecore_lock();
416 result = eina_strbuf_new();
417
418 EINA_INLIST_FOREACH(timers, tm)
419 tmp = eina_list_sorted_insert(tmp, _ecore_timer_cmp, tm);
420
421 EINA_LIST_FREE(tmp, tm)
422 {
423 char **strings;
424 int j;
425
426 if (!tm->frozen && !tm->delete_me)
427 living_timer++;
428
429 strings = backtrace_symbols((void **)tm->timer_bt, tm->timer_bt_num);
430 if (tm->timer_bt_num <= 0 || strings == NULL)
431 {
432 unknow_timer++;
433 continue;
434 }
435
436 eina_strbuf_append_printf(result, "*** timer: %f ***\n", tm->in);
437 if (tm->frozen)
438 eina_strbuf_append(result, "FROZEN\n");
439 if (tm->delete_me)
440 eina_strbuf_append(result, "DELETED\n");
441 for (j = 0; j < tm->timer_bt_num; j++)
442 eina_strbuf_append_printf(result, "%s\n", strings[j]);
443
444 free(strings);
445 }
446
447 eina_strbuf_append_printf(result, "\n***\nThere is %i living timer.\nWe did lost track of %i timers.\n", living_timer, unknow_timer);
448
449 out = eina_strbuf_string_steal(result);
450 eina_strbuf_free(result);
451 _ecore_unlock();
452
453 return out;
454#else
455 return NULL;
456#endif
457}
458
459/**
460 * @}
461 */
462
463Ecore_Timer *
464_ecore_timer_loop_add(double in,
465 Ecore_Task_Cb func,
466 const void *data)
467{
468 double now;
469 Ecore_Timer *timer = NULL;
470
471 if (!func) return timer;
472 if (in < 0.0) in = 0.0;
473 timer = calloc(1, sizeof(Ecore_Timer));
474 if (!timer) return timer;
475 ECORE_MAGIC_SET(timer, ECORE_MAGIC_TIMER);
476 now = ecore_loop_time_get();
477
478#ifdef WANT_ECORE_TIMER_DUMP
479 timer->timer_bt_num = backtrace((void **)(timer->timer_bt),
480 ECORE_TIMER_DEBUG_BT_NUM);
481#endif
482 _ecore_timer_set(timer, now + in, in, func, (void *)data);
483 return timer;
484}
485
486EAPI void
487_ecore_timer_delay(Ecore_Timer *timer,
488 double add)
489{
490 if (timer->frozen)
491 {
492 timer->pending += add;
493 }
494 else
495 {
496 timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
497 _ecore_timer_set(timer, timer->at + add, timer->in, timer->func, timer->data);
498 }
499}
500
501void *
502_ecore_timer_del(Ecore_Timer *timer)
503{
504 if (timer->frozen && !timer->references)
505 {
506 void *data = timer->data;
507
508 suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
509
510 if (timer->delete_me)
511 timers_delete_me--;
512
513 free(timer);
514 return data;
515 }
516
517 EINA_SAFETY_ON_TRUE_RETURN_VAL(timer->delete_me, NULL);
518 timer->delete_me = 1;
519 timers_delete_me++;
520 return timer->data;
521}
522
523void
524_ecore_timer_shutdown(void)
525{
526 Ecore_Timer *timer;
527
528 while ((timer = timers))
529 {
530 timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timers));
531 ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
532 free(timer);
533 }
534
535 while ((timer = suspended))
536 {
537 suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(suspended));
538 ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
539 free(timer);
540 }
541
542 timer_current = NULL;
543}
544
545void
546_ecore_timer_cleanup(void)
547{
548 Ecore_Timer *l;
549 int in_use = 0, todo = timers_delete_me, done = 0;
550
551 if (!timers_delete_me) return;
552 for (l = timers; l; )
553 {
554 Ecore_Timer *timer = l;
555
556 l = (Ecore_Timer *)EINA_INLIST_GET(l)->next;
557 if (timer->delete_me)
558 {
559 if (timer->references)
560 {
561 in_use++;
562 continue;
563 }
564 timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
565 ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
566 free(timer);
567 timers_delete_me--;
568 done++;
569 if (timers_delete_me == 0) return;
570 }
571 }
572 for (l = suspended; l; )
573 {
574 Ecore_Timer *timer = l;
575
576 l = (Ecore_Timer *)EINA_INLIST_GET(l)->next;
577 if (timer->delete_me)
578 {
579 if (timer->references)
580 {
581 in_use++;
582 continue;
583 }
584 suspended = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
585 ECORE_MAGIC_SET(timer, ECORE_MAGIC_NONE);
586 free(timer);
587 timers_delete_me--;
588 done++;
589 if (timers_delete_me == 0) return;
590 }
591 }
592
593 if ((!in_use) && (timers_delete_me))
594 {
595 ERR("%d timers to delete, but they were not found!"
596 "Stats: todo=%d, done=%d, pending=%d, in_use=%d. "
597 "reset counter.",
598 timers_delete_me, todo, done, todo - done, in_use);
599 timers_delete_me = 0;
600 }
601}
602
603void
604_ecore_timer_enable_new(void)
605{
606 Ecore_Timer *timer;
607
608 if (!timers_added) return;
609 timers_added = 0;
610 EINA_INLIST_FOREACH(timers, timer) timer->just_added = 0;
611}
612
613int
614_ecore_timers_exists(void)
615{
616 Ecore_Timer *timer = timers;
617
618 while ((timer) && (timer->delete_me))
619 timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next;
620
621 return !!timer;
622}
623
624static inline Ecore_Timer *
625_ecore_timer_first_get(void)
626{
627 Ecore_Timer *timer = timers;
628
629 while ((timer) && ((timer->delete_me) || (timer->just_added)))
630 timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next;
631
632 return timer;
633}
634
635static inline Ecore_Timer *
636_ecore_timer_after_get(Ecore_Timer *base)
637{
638 Ecore_Timer *timer = (Ecore_Timer *)EINA_INLIST_GET(base)->next;
639 Ecore_Timer *valid_timer = NULL;
640 double maxtime = base->at + precision;
641
642 while ((timer) && (timer->at < maxtime))
643 {
644 if (!((timer->delete_me) || (timer->just_added)))
645 valid_timer = timer;
646 timer = (Ecore_Timer *)EINA_INLIST_GET(timer)->next;
647 }
648
649 return valid_timer;
650}
651
652double
653_ecore_timer_next_get(void)
654{
655 double now;
656 double in;
657 Ecore_Timer *first, *second;
658
659 first = _ecore_timer_first_get();
660 if (!first) return -1;
661
662 second = _ecore_timer_after_get(first);
663 if (second) first = second;
664
665 now = ecore_loop_time_get();
666 in = first->at - now;
667 if (in < 0) in = 0;
668 return in;
669}
670
671static inline void
672_ecore_timer_reschedule(Ecore_Timer *timer,
673 double when)
674{
675 if ((timer->delete_me) || (timer->frozen)) return;
676
677 timers = (Ecore_Timer *)eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
678
679 /* if the timer would have gone off more than 15 seconds ago,
680 * assume that the system hung and set the timer to go off
681 * timer->in from now. this handles system hangs, suspends
682 * and more, so ecore will only "replay" the timers while
683 * the system is suspended if it is suspended for less than
684 * 15 seconds (basically). this also handles if the process
685 * is stopped in a debugger or IO and other handling gets
686 * really slow within the main loop.
687 */
688 if ((timer->at + timer->in) < (when - 15.0))
689 _ecore_timer_set(timer, when + timer->in, timer->in, timer->func, timer->data);
690 else
691 _ecore_timer_set(timer, timer->at + timer->in, timer->in, timer->func, timer->data);
692}
693
694/* assume that we hold the ecore lock when entering this function */
695void
696_ecore_timer_expired_timers_call(double when)
697{
698 /* call the first expired timer until no expired timers exist */
699 while (_ecore_timer_expired_call(when)) ;
700}
701
702/* assume that we hold the ecore lock when entering this function */
703int
704_ecore_timer_expired_call(double when)
705{
706 if (!timers) return 0;
707 if (last_check > when)
708 {
709 Ecore_Timer *timer;
710 /* User set time backwards */
711 EINA_INLIST_FOREACH(timers, timer) timer->at -= (last_check - when);
712 }
713 last_check = when;
714
715 if (!timer_current)
716 {
717 /* regular main loop, start from head */
718 timer_current = timers;
719 }
720 else
721 {
722 /* recursive main loop, continue from where we were */
723 Ecore_Timer *timer_old = timer_current;
724 timer_current = (Ecore_Timer *)EINA_INLIST_GET(timer_current)->next;
725 _ecore_timer_reschedule(timer_old, when);
726 }
727
728 while (timer_current)
729 {
730 Ecore_Timer *timer = timer_current;
731
732 if (timer->at > when)
733 {
734 timer_current = NULL; /* ended walk, next should restart. */
735 return 0;
736 }
737
738 if ((timer->just_added) || (timer->delete_me))
739 {
740 timer_current = (Ecore_Timer *)EINA_INLIST_GET(timer_current)->next;
741 continue;
742 }
743
744 timer->references++;
745 if (!_ecore_call_task_cb(timer->func, timer->data))
746 {
747 if (!timer->delete_me) _ecore_timer_del(timer);
748 }
749 timer->references--;
750
751 if (timer_current) /* may have changed in recursive main loops */
752 timer_current = (Ecore_Timer *)EINA_INLIST_GET(timer_current)->next;
753
754 _ecore_timer_reschedule(timer, when);
755 }
756 return 0;
757}
758
759static void
760_ecore_timer_set(Ecore_Timer *timer,
761 double at,
762 double in,
763 Ecore_Task_Cb func,
764 void *data)
765{
766 Ecore_Timer *t2;
767
768 timers_added = 1;
769 timer->at = at;
770 timer->in = in;
771 timer->func = func;
772 timer->data = data;
773 timer->just_added = 1;
774 timer->frozen = 0;
775 timer->pending = 0.0;
776 if (timers)
777 {
778 EINA_INLIST_REVERSE_FOREACH(EINA_INLIST_GET(timers), t2)
779 {
780 if (timer->at > t2->at)
781 {
782 timers = (Ecore_Timer *)eina_inlist_append_relative(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer), EINA_INLIST_GET(t2));
783 return;
784 }
785 }
786 }
787 timers = (Ecore_Timer *)eina_inlist_prepend(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
788}
789
790#ifdef WANT_ECORE_TIMER_DUMP
791static int
792_ecore_timer_cmp(const void *d1,
793 const void *d2)
794{
795 const Ecore_Timer *t1 = d1;
796 const Ecore_Timer *t2 = d2;
797
798 return (int)((t1->in - t2->in) * 100);
799}
800#endif
diff --git a/libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa.h b/libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa.h
new file mode 100644
index 0000000..51c8ead
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa.h
@@ -0,0 +1,147 @@
1#ifndef __ECORE_COCOA_H__
2#define __ECORE_COCOA_H__
3
4/*
5 * DO NOT USE THIS HEADER. IT IS WORK IN PROGRESS. IT IS NOT FINAL AND
6 * THE API MAY CHANGE.
7 */
8
9#ifndef ECORE_COCOA_WIP_GNSIDNQI
10# warning "You are using a work in progress API. This API is not stable"
11# warning "and is subject to change. You use this at your own risk."
12#endif
13
14#ifdef EAPI
15# undef EAPI
16#endif
17
18#ifdef __GNUC__
19# if __GNUC__ >= 4
20# define EAPI __attribute__ ((visibility("default")))
21# else
22# define EAPI
23# endif
24#else
25# define EAPI
26#endif
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32typedef struct _Ecore_Cocoa_Window Ecore_Cocoa_Window;
33
34EAPI extern int ECORE_COCOA_EVENT_GOT_FOCUS;
35EAPI extern int ECORE_COCOA_EVENT_LOST_FOCUS;
36EAPI extern int ECORE_COCOA_EVENT_RESIZE;
37EAPI extern int ECORE_COCOA_EVENT_EXPOSE;
38
39typedef struct _Ecore_Cocoa_Event_Video_Resize Ecore_Cocoa_Event_Video_Resize;
40struct _Ecore_Cocoa_Event_Video_Resize
41{
42 int w;
43 int h;
44};
45
46
47/* Core */
48
49EAPI int ecore_cocoa_init(void);
50EAPI int ecore_cocoa_shutdown(void);
51EAPI void ecore_cocoa_feed_events(void);
52
53/* Window */
54
55EAPI Ecore_Cocoa_Window *ecore_cocoa_window_new(int x,
56 int y,
57 int width,
58 int height);
59
60EAPI void ecore_cocoa_window_free(Ecore_Cocoa_Window *window);
61
62EAPI void *ecore_cocoa_window_hwnd_get(Ecore_Cocoa_Window *window);
63
64EAPI void ecore_cocoa_window_move(Ecore_Cocoa_Window *window,
65 int x,
66 int y);
67
68EAPI void ecore_cocoa_window_resize(Ecore_Cocoa_Window *window,
69 int width,
70 int height);
71
72EAPI void ecore_cocoa_window_move_resize(Ecore_Cocoa_Window *window,
73 int x,
74 int y,
75 int width,
76 int height);
77
78EAPI void ecore_cocoa_window_geometry_get(Ecore_Cocoa_Window *window,
79 int *x,
80 int *y,
81 int *width,
82 int *height);
83
84EAPI void ecore_cocoa_window_size_get(Ecore_Cocoa_Window *window,
85 int *width,
86 int *height);
87
88EAPI void ecore_cocoa_window_size_min_set(Ecore_Cocoa_Window *window,
89 unsigned int min_width,
90 unsigned int min_height);
91
92EAPI void ecore_cocoa_window_size_min_get(Ecore_Cocoa_Window *window,
93 unsigned int *min_width,
94 unsigned int *min_height);
95
96EAPI void ecore_cocoa_window_size_max_set(Ecore_Cocoa_Window *window,
97 unsigned int max_width,
98 unsigned int max_height);
99
100EAPI void ecore_cocoa_window_size_max_get(Ecore_Cocoa_Window *window,
101 unsigned int *max_width,
102 unsigned int *max_height);
103
104EAPI void ecore_cocoa_window_size_base_set(Ecore_Cocoa_Window *window,
105 unsigned int base_width,
106 unsigned int base_height);
107
108EAPI void ecore_cocoa_window_size_base_get(Ecore_Cocoa_Window *window,
109 unsigned int *base_width,
110 unsigned int *base_height);
111
112EAPI void ecore_cocoa_window_size_step_set(Ecore_Cocoa_Window *window,
113 unsigned int step_width,
114 unsigned int step_height);
115
116EAPI void ecore_cocoa_window_size_step_get(Ecore_Cocoa_Window *window,
117 unsigned int *step_width,
118 unsigned int *step_height);
119
120EAPI void ecore_cocoa_window_show(Ecore_Cocoa_Window *window);
121
122EAPI void ecore_cocoa_window_hide(Ecore_Cocoa_Window *window);
123
124EAPI void ecore_cocoa_window_raise(Ecore_Cocoa_Window *window);
125
126EAPI void ecore_cocoa_window_lower(Ecore_Cocoa_Window *window);
127
128EAPI void ecore_cocoa_window_title_set(Ecore_Cocoa_Window *window,
129 const char *title);
130
131EAPI void ecore_cocoa_window_focus_set(Ecore_Cocoa_Window *window);
132
133EAPI void ecore_cocoa_window_iconified_set(Ecore_Cocoa_Window *window,
134 int on);
135
136EAPI void ecore_cocoa_window_borderless_set(Ecore_Cocoa_Window *window,
137 int on);
138
139EAPI void ecore_cocoa_window_view_set(Ecore_Cocoa_Window *window,
140 void *view);
141
142
143#ifdef __cplusplus
144}
145#endif
146
147#endif
diff --git a/libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h b/libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h
new file mode 100644
index 0000000..7068bc2
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/Ecore_Cocoa_Keys.h
@@ -0,0 +1,285 @@
1#ifndef ECORE_COCOA_KEYS_H__
2#define ECORE_COCOA_KEYS_H__
3
4struct _ecore_cocoa_keys_s
5{
6 int code;
7 const char *name;
8 const char *compose;
9};
10
11static const struct _ecore_cocoa_keys_s keystable[] =
12{
13
14{ 0, "0x00", "" },
15{ 0, "First", "" },
16{ 3, "Return", "\015" },
17{ 8, "BackSpace", "\010" },
18{ 9, "Tab", "\011" },
19{ 12, "Clear", "" },
20{ 13, "Return", "\015" },
21{ 19, "Pause", "" },
22{ 25, "BackTab", ""},
23{ 27, "Escape", "" },
24{ 32, "space", " " },
25{ 33, "exclam", "!" },
26{ 34, "quotedbl", "\"" },
27{ 35, "numbersign", "#" },
28{ 36, "dollar", "$" },
29{ 37, "percent", "%%" },
30{ 38, "ampersand", "&" },
31{ 39, "apostrophe", "'" },
32{ 40, "parenleft", "(" },
33{ 41, "parenright", ")" },
34{ 42, "asterisk", "*" },
35{ 43, "plus", "+" },
36{ 44, "comma", "," },
37{ 45, "minus", "-" },
38{ 46, "period", "." },
39{ 47, "slash", "/" },
40{ 48, "0", "0" },
41{ 49, "1", "1" },
42{ 50, "2", "2" },
43{ 51, "3", "3" },
44{ 52, "4", "4" },
45{ 53, "5", "5" },
46{ 54, "6", "6" },
47{ 55, "7", "7" },
48{ 56, "8", "8" },
49{ 57, "9", "9" },
50{ 58, "colon", ";" },
51{ 59, "semicolon", ";" },
52{ 60, "less", "<" },
53{ 61, "equal", "=" },
54{ 62, "greater", ">" },
55{ 63, "question", "?" },
56{ 64, "at", "@" },
57
58{ 91, "bracketleft", "[" },
59{ 92, "backslash", "\\" },
60{ 93, "bracketright", "]" },
61{ 94, "asciicircumm", "^" },
62{ 95, "underscore", "_" },
63{ 96, "backquote", "`" },
64{ 97, "a", "a" },
65{ 98, "b", "b" },
66{ 99, "c", "c" },
67{ 100, "d", "d" },
68{ 101, "e", "e" },
69{ 102, "f", "f" },
70{ 103, "g", "g" },
71{ 104, "h", "h" },
72{ 105, "i", "i" },
73{ 106, "j", "j" },
74{ 107, "k", "k" },
75{ 108, "l", "l" },
76{ 109, "m", "m" },
77{ 110, "n", "n" },
78{ 111, "o", "o" },
79{ 112, "p", "p" },
80{ 113, "q", "q" },
81{ 114, "r", "r" },
82{ 115, "s", "s" },
83{ 116, "t", "t" },
84{ 117, "u", "u" },
85{ 118, "v", "v" },
86{ 119, "w", "w" },
87{ 120, "x", "x" },
88{ 121, "y", "y" },
89{ 122, "z", "z" },
90{ 123, "braceleft", "" },
91{ 124, "pipe", "" },
92{ 125, "braceright", "" },
93{ 127, "Delete", "\177" },
94{ 126, "asciitilde", "~" },
95
96{ 160, "w0", "" },
97{ 161, "w1", "" },
98{ 162, "w2", "" },
99{ 163, "w3", "" },
100{ 164, "w4", "" },
101{ 165, "w5", "" },
102{ 166, "w6", "" },
103{ 167, "w7", "" },
104{ 168, "w8", "" },
105{ 169, "w9", "" },
106{ 170, "w10", "" },
107{ 171, "w11", "" },
108{ 172, "w12", "" },
109{ 173, "w13", "" },
110{ 174, "w14", "" },
111{ 175, "w15", "" },
112{ 176, "w16", "" },
113{ 177, "w17", "" },
114{ 178, "w18", "" },
115{ 179, "w19", "" },
116{ 180, "w20", "" },
117{ 181, "w21", "" },
118{ 182, "w22", "" },
119{ 183, "w23", "" },
120{ 184, "w24", "" },
121{ 185, "w25", "" },
122{ 186, "w26", "" },
123{ 187, "w27", "" },
124{ 188, "w28", "" },
125{ 189, "w29", "" },
126{ 190, "w30", "" },
127{ 191, "w31", "" },
128{ 192, "w32", "" },
129{ 193, "w33", "" },
130{ 194, "w34", "" },
131{ 195, "w35", "" },
132{ 196, "w36", "" },
133{ 197, "w37", "" },
134{ 198, "w38", "" },
135{ 199, "w39", "" },
136{ 200, "w40", "" },
137{ 201, "w41", "" },
138{ 202, "w42", "" },
139{ 203, "w43", "" },
140{ 204, "w44", "" },
141{ 205, "w45", "" },
142{ 206, "w46", "" },
143{ 207, "w47", "" },
144{ 208, "w48", "" },
145{ 209, "w49", "" },
146{ 210, "w50", "" },
147{ 211, "w51", "" },
148{ 212, "w52", "" },
149{ 213, "w53", "" },
150{ 214, "w54", "" },
151{ 215, "w55", "" },
152{ 216, "w56", "" },
153{ 217, "w57", "" },
154{ 218, "w58", "" },
155{ 219, "w59", "" },
156{ 220, "w60", "" },
157{ 221, "w61", "" },
158{ 222, "w62", "" },
159{ 223, "w63", "" },
160{ 224, "w64", "" },
161{ 225, "w65", "" },
162{ 226, "w66", "" },
163{ 227, "w67", "" },
164{ 228, "w68", "" },
165{ 229, "w69", "" },
166{ 230, "w70", "" },
167{ 231, "w71", "" },
168{ 232, "w72", "" },
169{ 233, "w73", "" },
170{ 234, "w74", "" },
171{ 235, "w75", "" },
172{ 236, "w76", "" },
173{ 237, "w77", "" },
174{ 238, "w78", "" },
175{ 239, "w79", "" },
176{ 240, "w80", "" },
177{ 241, "w81", "" },
178{ 242, "w82", "" },
179{ 243, "w83", "" },
180{ 244, "w84", "" },
181{ 245, "w85", "" },
182{ 246, "w86", "" },
183{ 247, "w87", "" },
184{ 248, "w88", "" },
185{ 249, "w89", "" },
186{ 250, "w90", "" },
187{ 251, "w91", "" },
188{ 252, "w92", "" },
189{ 253, "w93", "" },
190{ 254, "w94", "" },
191{ 255, "w95", "" },
192
193{ 256, "KP0", "0" },
194{ 257, "KP1", "1" },
195{ 258, "KP2", "2" },
196{ 259, "KP3", "3" },
197{ 260, "KP4", "4" },
198{ 261, "KP5", "5" },
199{ 262, "KP6", "6" },
200{ 263, "KP7", "7" },
201{ 264, "KP8", "8" },
202{ 265, "KP9", "9" },
203{ 266, "period", "." },
204{ 267, "KP_Divide", "/" },
205{ 268, "KP_Multiply", "*" },
206{ 269, "KP_Minus", "-" },
207{ 270, "KP_Plus", "+" },
208{ 271, "KP_Enter", "\015" },
209{ 272, "KP_Equals", "=" },
210
211{ NSUpArrowFunctionKey, "Up", "" },
212{ NSDownArrowFunctionKey, "Down", "" },
213{ NSRightArrowFunctionKey, "Right", "" },
214{ NSLeftArrowFunctionKey, "Left", "" },
215{ NSInsertFunctionKey, "Insert", "" },
216{ NSHomeFunctionKey, "Home", "" },
217{ NSEndFunctionKey, "End", "" },
218{ NSPageUpFunctionKey, "Page_Up", "" },
219{ NSPageDownFunctionKey, "Page_Down", "" },
220
221{ NSF1FunctionKey, "F1", "" },
222{ NSF2FunctionKey, "F2", "" },
223{ NSF3FunctionKey, "F3", "" },
224{ NSF4FunctionKey, "F4", "" },
225{ NSF5FunctionKey, "F5", "" },
226{ NSF6FunctionKey, "F6", "" },
227{ NSF7FunctionKey, "F7", "" },
228{ NSF8FunctionKey, "F8", "" },
229{ NSF9FunctionKey, "F9", "" },
230{ NSF10FunctionKey, "F10", "" },
231{ NSF11FunctionKey, "F11", "" },
232{ NSF12FunctionKey, "F12", "" },
233{ NSF13FunctionKey, "F13", "" },
234{ NSF14FunctionKey, "F14", "" },
235{ NSF15FunctionKey, "F15", "" },
236{ NSF16FunctionKey, "F16", "" },
237{ NSF17FunctionKey, "F17", "" },
238{ NSF18FunctionKey, "F18", "" },
239{ NSF19FunctionKey, "F19", "" },
240{ NSF20FunctionKey, "F20", "" },
241{ NSF21FunctionKey, "F21", "" },
242{ NSF22FunctionKey, "F22", "" },
243{ NSF23FunctionKey, "F23", "" },
244{ NSF24FunctionKey, "F24", "" },
245{ NSF25FunctionKey, "F25", "" },
246{ NSF26FunctionKey, "F26", "" },
247{ NSF27FunctionKey, "F27", "" },
248{ NSF28FunctionKey, "F28", "" },
249{ NSF29FunctionKey, "F29", "" },
250{ NSF30FunctionKey, "F30", "" },
251{ NSF31FunctionKey, "F31", "" },
252{ NSF32FunctionKey, "F32", "" },
253{ NSF33FunctionKey, "F33", "" },
254{ NSF34FunctionKey, "F34", "" },
255{ NSF35FunctionKey, "F35", "" },
256
257{ NSClearLineFunctionKey, "Num_Lock", "" },
258{ 301, "Caps_Lock", "" },
259{ NSScrollLockFunctionKey, "Scroll_Lock", "" },
260{ 303, "Shift_R", "" },
261{ 304, "Shift_L", "" },
262{ 305, "Control_R", "" },
263{ 306, "Control_L", "" },
264{ 307, "Alt_R", "" },
265{ 308, "Alt_L", "" },
266{ 309, "Meta_R", "" },
267{ 310, "Meta_L", "" },
268{ 311, "Super_L", "" },
269{ 312, "Super_R", "" },
270
271{ NSModeSwitchFunctionKey, "Mode", "" },
272{ 314, "Compose", "" },
273
274{ NSHelpFunctionKey, "Help", "" },
275{ NSPrintFunctionKey, "Print", "" },
276{ NSSysReqFunctionKey, "SysReq", "" },
277{ NSBreakFunctionKey, "Break", "" },
278{ NSMenuFunctionKey, "Menu", "" },
279{ 320, "Power", "" },
280{ 321, "Euro", "" },
281{ NSUndoFunctionKey, "Undo", "" }
282
283};
284
285#endif /* ECORE_COCOA_KEYS_H__ */
diff --git a/libraries/ecore/src/lib/ecore_cocoa/Makefile.am b/libraries/ecore/src/lib/ecore_cocoa/Makefile.am
new file mode 100644
index 0000000..4ac7b11
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/Makefile.am
@@ -0,0 +1,29 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_input \
6-I$(top_builddir)/src/lib/ecore \
7-I$(top_builddir)/src/lib/ecore_input \
8@EVAS_CFLAGS@ \
9@EINA_CFLAGS@
10
11lib_LTLIBRARIES = libecore_cocoa.la
12includes_HEADERS = \
13Ecore_Cocoa.h \
14Ecore_Cocoa_Keys.h
15includesdir = $(includedir)/ecore-@VMAJ@
16
17libecore_cocoa_la_SOURCES = \
18ecore_cocoa.m \
19ecore_cocoa_window.m
20
21libecore_cocoa_la_LIBADD = \
22$(top_builddir)/src/lib/ecore/libecore.la \
23$(top_builddir)/src/lib/ecore_input/libecore_input.la \
24@EVAS_LIBS@ \
25@EINA_LIBS@
26
27libecore_cocoa_la_LDFLAGS = @cocoa_ldflags@ -version-info @version_info@ @release_info@
28
29EXTRA_DIST = ecore_cocoa_private.h
diff --git a/libraries/ecore/src/lib/ecore_cocoa/Makefile.in b/libraries/ecore/src/lib/ecore_cocoa/Makefile.in
new file mode 100644
index 0000000..ede48a2
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/Makefile.in
@@ -0,0 +1,823 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_cocoa
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_cocoa_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la \
91 $(top_builddir)/src/lib/ecore_input/libecore_input.la
92am_libecore_cocoa_la_OBJECTS = ecore_cocoa.lo ecore_cocoa_window.lo
93libecore_cocoa_la_OBJECTS = $(am_libecore_cocoa_la_OBJECTS)
94AM_V_lt = $(am__v_lt_$(V))
95am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
96am__v_lt_0 = --silent
97libecore_cocoa_la_LINK = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
98 $(LIBTOOLFLAGS) --mode=link $(OBJCLD) $(AM_OBJCFLAGS) \
99 $(OBJCFLAGS) $(libecore_cocoa_la_LDFLAGS) $(LDFLAGS) -o $@
100DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
101depcomp = $(SHELL) $(top_srcdir)/depcomp
102am__depfiles_maybe = depfiles
103am__mv = mv -f
104OBJCCOMPILE = $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
105 $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)
106LTOBJCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \
107 $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) \
108 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
109 $(AM_OBJCFLAGS) $(OBJCFLAGS)
110AM_V_OBJC = $(am__v_OBJC_$(V))
111am__v_OBJC_ = $(am__v_OBJC_$(AM_DEFAULT_VERBOSITY))
112am__v_OBJC_0 = @echo " OBJC " $@;
113AM_V_at = $(am__v_at_$(V))
114am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
115am__v_at_0 = @
116OBJCLD = $(OBJC)
117OBJCLINK = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
118 --mode=link $(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) \
119 $(AM_LDFLAGS) $(LDFLAGS) -o $@
120AM_V_OBJCLD = $(am__v_OBJCLD_$(V))
121am__v_OBJCLD_ = $(am__v_OBJCLD_$(AM_DEFAULT_VERBOSITY))
122am__v_OBJCLD_0 = @echo " OBJCLD" $@;
123AM_V_GEN = $(am__v_GEN_$(V))
124am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
125am__v_GEN_0 = @echo " GEN " $@;
126SOURCES = $(libecore_cocoa_la_SOURCES)
127DIST_SOURCES = $(libecore_cocoa_la_SOURCES)
128HEADERS = $(includes_HEADERS)
129ETAGS = etags
130CTAGS = ctags
131DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
132ACLOCAL = @ACLOCAL@
133ALLOCA = @ALLOCA@
134AMTAR = @AMTAR@
135AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
136AR = @AR@
137AS = @AS@
138AUTOCONF = @AUTOCONF@
139AUTOHEADER = @AUTOHEADER@
140AUTOMAKE = @AUTOMAKE@
141AWK = @AWK@
142CARES_CFLAGS = @CARES_CFLAGS@
143CARES_LIBS = @CARES_LIBS@
144CC = @CC@
145CCDEPMODE = @CCDEPMODE@
146CFLAGS = @CFLAGS@
147CHECK_CFLAGS = @CHECK_CFLAGS@
148CHECK_LIBS = @CHECK_LIBS@
149CPP = @CPP@
150CPPFLAGS = @CPPFLAGS@
151CURL_CFLAGS = @CURL_CFLAGS@
152CURL_LIBS = @CURL_LIBS@
153CXX = @CXX@
154CXXCPP = @CXXCPP@
155CXXDEPMODE = @CXXDEPMODE@
156CXXFLAGS = @CXXFLAGS@
157CYGPATH_W = @CYGPATH_W@
158DEFS = @DEFS@
159DEPDIR = @DEPDIR@
160DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
161DIRECTFB_LIBS = @DIRECTFB_LIBS@
162DLLTOOL = @DLLTOOL@
163DSYMUTIL = @DSYMUTIL@
164DUMPBIN = @DUMPBIN@
165ECHO_C = @ECHO_C@
166ECHO_N = @ECHO_N@
167ECHO_T = @ECHO_T@
168ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
169ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
170EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
171EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
172EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
173EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
174EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
175EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
176EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
177EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
178EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
179EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
180EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
181EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
182EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
183EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
184EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
185EGREP = @EGREP@
186EINA_CFLAGS = @EINA_CFLAGS@
187EINA_LIBS = @EINA_LIBS@
188ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
189ESCAPE_LIBS = @ESCAPE_LIBS@
190EVAS_CFLAGS = @EVAS_CFLAGS@
191EVAS_LIBS = @EVAS_LIBS@
192EVIL_CFLAGS = @EVIL_CFLAGS@
193EVIL_LIBS = @EVIL_LIBS@
194EXEEXT = @EXEEXT@
195FGREP = @FGREP@
196GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
197GLIB_CFLAGS = @GLIB_CFLAGS@
198GLIB_LIBS = @GLIB_LIBS@
199GMSGFMT = @GMSGFMT@
200GMSGFMT_015 = @GMSGFMT_015@
201GREP = @GREP@
202INSTALL = @INSTALL@
203INSTALL_DATA = @INSTALL_DATA@
204INSTALL_PROGRAM = @INSTALL_PROGRAM@
205INSTALL_SCRIPT = @INSTALL_SCRIPT@
206INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
207INTLLIBS = @INTLLIBS@
208INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
209KEYSYMDEFS = @KEYSYMDEFS@
210LD = @LD@
211LDFLAGS = @LDFLAGS@
212LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
213LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
214LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
215LIBICONV = @LIBICONV@
216LIBINTL = @LIBINTL@
217LIBOBJS = @LIBOBJS@
218LIBS = @LIBS@
219LIBTOOL = @LIBTOOL@
220LIPO = @LIPO@
221LN_S = @LN_S@
222LTLIBICONV = @LTLIBICONV@
223LTLIBINTL = @LTLIBINTL@
224LTLIBOBJS = @LTLIBOBJS@
225MAKEINFO = @MAKEINFO@
226MKDIR_P = @MKDIR_P@
227MSGFMT = @MSGFMT@
228MSGFMT_015 = @MSGFMT_015@
229MSGMERGE = @MSGMERGE@
230NM = @NM@
231NMEDIT = @NMEDIT@
232OBJC = @OBJC@
233OBJCDEPMODE = @OBJCDEPMODE@
234OBJCFLAGS = @OBJCFLAGS@
235OBJDUMP = @OBJDUMP@
236OBJEXT = @OBJEXT@
237OTOOL = @OTOOL@
238OTOOL64 = @OTOOL64@
239PACKAGE = @PACKAGE@
240PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
241PACKAGE_NAME = @PACKAGE_NAME@
242PACKAGE_STRING = @PACKAGE_STRING@
243PACKAGE_TARNAME = @PACKAGE_TARNAME@
244PACKAGE_URL = @PACKAGE_URL@
245PACKAGE_VERSION = @PACKAGE_VERSION@
246PATH_SEPARATOR = @PATH_SEPARATOR@
247PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
248PIXMAN_LIBS = @PIXMAN_LIBS@
249PKG_CONFIG = @PKG_CONFIG@
250PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
251PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
252POSUB = @POSUB@
253RANLIB = @RANLIB@
254SDL_CFLAGS = @SDL_CFLAGS@
255SDL_CONFIG = @SDL_CONFIG@
256SDL_LIBS = @SDL_LIBS@
257SED = @SED@
258SET_MAKE = @SET_MAKE@
259SHELL = @SHELL@
260SSL_CFLAGS = @SSL_CFLAGS@
261SSL_LIBS = @SSL_LIBS@
262STRIP = @STRIP@
263TLS2_CFLAGS = @TLS2_CFLAGS@
264TLS2_LIBS = @TLS2_LIBS@
265TLS_CFLAGS = @TLS_CFLAGS@
266TLS_LIBS = @TLS_LIBS@
267TSLIB_CFLAGS = @TSLIB_CFLAGS@
268TSLIB_LIBS = @TSLIB_LIBS@
269USE_NLS = @USE_NLS@
270VERSION = @VERSION@
271VMAJ = @VMAJ@
272WIN32_CFLAGS = @WIN32_CFLAGS@
273WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
274WIN32_LIBS = @WIN32_LIBS@
275XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
276XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
277XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
278XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
279XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
280XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
281XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
282XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
283XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
284XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
285XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
286XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
287XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
288XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
289XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
290XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
291XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
292XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
293XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
294XCB_X11_LIBS = @XCB_X11_LIBS@
295XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
296XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
297XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
298XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
299XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
300XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
301XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
302XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
303XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
304XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
305XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
306XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
307XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
308XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
309XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
310XDAMAGE_LIBS = @XDAMAGE_LIBS@
311XDPMS_CFLAGS = @XDPMS_CFLAGS@
312XDPMS_LIBS = @XDPMS_LIBS@
313XFIXES_CFLAGS = @XFIXES_CFLAGS@
314XFIXES_LIBS = @XFIXES_LIBS@
315XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
316XGESTURE_LIBS = @XGESTURE_LIBS@
317XGETTEXT = @XGETTEXT@
318XGETTEXT_015 = @XGETTEXT_015@
319XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
320XI2_CFLAGS = @XI2_CFLAGS@
321XI2_LIBS = @XI2_LIBS@
322XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
323XINERAMA_LIBS = @XINERAMA_LIBS@
324XKB_CFLAGS = @XKB_CFLAGS@
325XKB_LIBS = @XKB_LIBS@
326XMKMF = @XMKMF@
327XPRINT_CFLAGS = @XPRINT_CFLAGS@
328XPRINT_LIBS = @XPRINT_LIBS@
329XRANDR_CFLAGS = @XRANDR_CFLAGS@
330XRANDR_LIBS = @XRANDR_LIBS@
331XRENDER_CFLAGS = @XRENDER_CFLAGS@
332XRENDER_LIBS = @XRENDER_LIBS@
333XSS_CFLAGS = @XSS_CFLAGS@
334XSS_LIBS = @XSS_LIBS@
335XTEST_CFLAGS = @XTEST_CFLAGS@
336XTEST_LIBS = @XTEST_LIBS@
337X_CFLAGS = @X_CFLAGS@
338X_EXTRA_LIBS = @X_EXTRA_LIBS@
339X_LIBS = @X_LIBS@
340X_PRE_LIBS = @X_PRE_LIBS@
341Xcursor_cflags = @Xcursor_cflags@
342Xcursor_libs = @Xcursor_libs@
343abs_builddir = @abs_builddir@
344abs_srcdir = @abs_srcdir@
345abs_top_builddir = @abs_top_builddir@
346abs_top_srcdir = @abs_top_srcdir@
347ac_ct_CC = @ac_ct_CC@
348ac_ct_CXX = @ac_ct_CXX@
349ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
350ac_ct_OBJC = @ac_ct_OBJC@
351am__include = @am__include@
352am__leading_dot = @am__leading_dot@
353am__quote = @am__quote@
354am__tar = @am__tar@
355am__untar = @am__untar@
356bindir = @bindir@
357build = @build@
358build_alias = @build_alias@
359build_cpu = @build_cpu@
360build_os = @build_os@
361build_vendor = @build_vendor@
362builddir = @builddir@
363cocoa_ldflags = @cocoa_ldflags@
364datadir = @datadir@
365datarootdir = @datarootdir@
366dlopen_libs = @dlopen_libs@
367docdir = @docdir@
368dvidir = @dvidir@
369ecore_cocoa_cflags = @ecore_cocoa_cflags@
370ecore_cocoa_libs = @ecore_cocoa_libs@
371ecore_con_cflags = @ecore_con_cflags@
372ecore_con_libs = @ecore_con_libs@
373ecore_directfb_cflags = @ecore_directfb_cflags@
374ecore_directfb_libs = @ecore_directfb_libs@
375ecore_evas_cflags = @ecore_evas_cflags@
376ecore_evas_libs = @ecore_evas_libs@
377ecore_fb_cflags = @ecore_fb_cflags@
378ecore_fb_libs = @ecore_fb_libs@
379ecore_file_cflags = @ecore_file_cflags@
380ecore_file_libs = @ecore_file_libs@
381ecore_imf_cflags = @ecore_imf_cflags@
382ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
383ecore_imf_evas_libs = @ecore_imf_evas_libs@
384ecore_imf_libs = @ecore_imf_libs@
385ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
386ecore_imf_xim_libs = @ecore_imf_xim_libs@
387ecore_input_cflags = @ecore_input_cflags@
388ecore_input_evas_cflags = @ecore_input_evas_cflags@
389ecore_input_evas_libs = @ecore_input_evas_libs@
390ecore_input_libs = @ecore_input_libs@
391ecore_ipc_cflags = @ecore_ipc_cflags@
392ecore_ipc_libs = @ecore_ipc_libs@
393ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
394ecore_psl1ght_libs = @ecore_psl1ght_libs@
395ecore_sdl_cflags = @ecore_sdl_cflags@
396ecore_sdl_libs = @ecore_sdl_libs@
397ecore_win32_cflags = @ecore_win32_cflags@
398ecore_win32_libs = @ecore_win32_libs@
399ecore_wince_cflags = @ecore_wince_cflags@
400ecore_wince_libs = @ecore_wince_libs@
401ecore_x_cflags = @ecore_x_cflags@
402ecore_x_libs = @ecore_x_libs@
403ecore_x_libs_private = @ecore_x_libs_private@
404efl_doxygen = @efl_doxygen@
405efl_have_doxygen = @efl_have_doxygen@
406exec_prefix = @exec_prefix@
407have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
408host = @host@
409host_alias = @host_alias@
410host_cpu = @host_cpu@
411host_os = @host_os@
412host_vendor = @host_vendor@
413htmldir = @htmldir@
414includedir = @includedir@
415infodir = @infodir@
416install_sh = @install_sh@
417libdir = @libdir@
418libexecdir = @libexecdir@
419localedir = @localedir@
420localstatedir = @localstatedir@
421lt_ECHO = @lt_ECHO@
422lt_enable_auto_import = @lt_enable_auto_import@
423mandir = @mandir@
424mkdir_p = @mkdir_p@
425oldincludedir = @oldincludedir@
426pdfdir = @pdfdir@
427pkgconfig_requires_private = @pkgconfig_requires_private@
428prefix = @prefix@
429program_transform_name = @program_transform_name@
430psdir = @psdir@
431release_info = @release_info@
432requirements_ecore = @requirements_ecore@
433requirements_ecore_cocoa = @requirements_ecore_cocoa@
434requirements_ecore_con = @requirements_ecore_con@
435requirements_ecore_directfb = @requirements_ecore_directfb@
436requirements_ecore_evas = @requirements_ecore_evas@
437requirements_ecore_fb = @requirements_ecore_fb@
438requirements_ecore_file = @requirements_ecore_file@
439requirements_ecore_imf = @requirements_ecore_imf@
440requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
441requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
442requirements_ecore_input = @requirements_ecore_input@
443requirements_ecore_input_evas = @requirements_ecore_input_evas@
444requirements_ecore_ipc = @requirements_ecore_ipc@
445requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
446requirements_ecore_sdl = @requirements_ecore_sdl@
447requirements_ecore_win32 = @requirements_ecore_win32@
448requirements_ecore_wince = @requirements_ecore_wince@
449requirements_ecore_x = @requirements_ecore_x@
450rt_libs = @rt_libs@
451sbindir = @sbindir@
452sharedstatedir = @sharedstatedir@
453srcdir = @srcdir@
454sysconfdir = @sysconfdir@
455target_alias = @target_alias@
456top_build_prefix = @top_build_prefix@
457top_builddir = @top_builddir@
458top_srcdir = @top_srcdir@
459version_info = @version_info@
460x_cflags = @x_cflags@
461x_includes = @x_includes@
462x_libs = @x_libs@
463MAINTAINERCLEANFILES = Makefile.in
464AM_CPPFLAGS = \
465-I$(top_srcdir)/src/lib/ecore \
466-I$(top_srcdir)/src/lib/ecore_input \
467-I$(top_builddir)/src/lib/ecore \
468-I$(top_builddir)/src/lib/ecore_input \
469@EVAS_CFLAGS@ \
470@EINA_CFLAGS@
471
472lib_LTLIBRARIES = libecore_cocoa.la
473includes_HEADERS = \
474Ecore_Cocoa.h \
475Ecore_Cocoa_Keys.h
476
477includesdir = $(includedir)/ecore-@VMAJ@
478libecore_cocoa_la_SOURCES = \
479ecore_cocoa.m \
480ecore_cocoa_window.m
481
482libecore_cocoa_la_LIBADD = \
483$(top_builddir)/src/lib/ecore/libecore.la \
484$(top_builddir)/src/lib/ecore_input/libecore_input.la \
485@EVAS_LIBS@ \
486@EINA_LIBS@
487
488libecore_cocoa_la_LDFLAGS = @cocoa_ldflags@ -version-info @version_info@ @release_info@
489EXTRA_DIST = ecore_cocoa_private.h
490all: all-am
491
492.SUFFIXES:
493.SUFFIXES: .lo .m .o .obj
494$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
495 @for dep in $?; do \
496 case '$(am__configure_deps)' in \
497 *$$dep*) \
498 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
499 && { if test -f $@; then exit 0; else break; fi; }; \
500 exit 1;; \
501 esac; \
502 done; \
503 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_cocoa/Makefile'; \
504 $(am__cd) $(top_srcdir) && \
505 $(AUTOMAKE) --gnu src/lib/ecore_cocoa/Makefile
506.PRECIOUS: Makefile
507Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
508 @case '$?' in \
509 *config.status*) \
510 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
511 *) \
512 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
513 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
514 esac;
515
516$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
517 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
518
519$(top_srcdir)/configure: $(am__configure_deps)
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
521$(ACLOCAL_M4): $(am__aclocal_m4_deps)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523$(am__aclocal_m4_deps):
524install-libLTLIBRARIES: $(lib_LTLIBRARIES)
525 @$(NORMAL_INSTALL)
526 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
527 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
528 list2=; for p in $$list; do \
529 if test -f $$p; then \
530 list2="$$list2 $$p"; \
531 else :; fi; \
532 done; \
533 test -z "$$list2" || { \
534 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
535 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
536 }
537
538uninstall-libLTLIBRARIES:
539 @$(NORMAL_UNINSTALL)
540 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
541 for p in $$list; do \
542 $(am__strip_dir) \
543 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
544 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
545 done
546
547clean-libLTLIBRARIES:
548 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
549 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
550 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
551 test "$$dir" != "$$p" || dir=.; \
552 echo "rm -f \"$${dir}/so_locations\""; \
553 rm -f "$${dir}/so_locations"; \
554 done
555libecore_cocoa.la: $(libecore_cocoa_la_OBJECTS) $(libecore_cocoa_la_DEPENDENCIES)
556 $(AM_V_OBJCLD)$(libecore_cocoa_la_LINK) -rpath $(libdir) $(libecore_cocoa_la_OBJECTS) $(libecore_cocoa_la_LIBADD) $(LIBS)
557
558mostlyclean-compile:
559 -rm -f *.$(OBJEXT)
560
561distclean-compile:
562 -rm -f *.tab.c
563
564@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_cocoa.Plo@am__quote@
565@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_cocoa_window.Plo@am__quote@
566
567.m.o:
568@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
569@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
570@am__fastdepOBJC_FALSE@ $(AM_V_OBJC) @AM_BACKSLASH@
571@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
572@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
573@am__fastdepOBJC_FALSE@ $(OBJCCOMPILE) -c -o $@ $<
574
575.m.obj:
576@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(OBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
577@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
578@am__fastdepOBJC_FALSE@ $(AM_V_OBJC) @AM_BACKSLASH@
579@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
580@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
581@am__fastdepOBJC_FALSE@ $(OBJCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
582
583.m.lo:
584@am__fastdepOBJC_TRUE@ $(AM_V_OBJC)$(LTOBJCCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
585@am__fastdepOBJC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
586@am__fastdepOBJC_FALSE@ $(AM_V_OBJC) @AM_BACKSLASH@
587@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
588@AMDEP_TRUE@@am__fastdepOBJC_FALSE@ DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
589@am__fastdepOBJC_FALSE@ $(LTOBJCCOMPILE) -c -o $@ $<
590
591mostlyclean-libtool:
592 -rm -f *.lo
593
594clean-libtool:
595 -rm -rf .libs _libs
596install-includesHEADERS: $(includes_HEADERS)
597 @$(NORMAL_INSTALL)
598 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
599 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
600 for p in $$list; do \
601 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
602 echo "$$d$$p"; \
603 done | $(am__base_list) | \
604 while read files; do \
605 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
606 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
607 done
608
609uninstall-includesHEADERS:
610 @$(NORMAL_UNINSTALL)
611 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
612 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
613 test -n "$$files" || exit 0; \
614 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
615 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
616
617ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
618 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
619 unique=`for i in $$list; do \
620 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
621 done | \
622 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
623 END { if (nonempty) { for (i in files) print i; }; }'`; \
624 mkid -fID $$unique
625tags: TAGS
626
627TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
628 $(TAGS_FILES) $(LISP)
629 set x; \
630 here=`pwd`; \
631 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
632 unique=`for i in $$list; do \
633 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
634 done | \
635 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
636 END { if (nonempty) { for (i in files) print i; }; }'`; \
637 shift; \
638 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
639 test -n "$$unique" || unique=$$empty_fix; \
640 if test $$# -gt 0; then \
641 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
642 "$$@" $$unique; \
643 else \
644 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
645 $$unique; \
646 fi; \
647 fi
648ctags: CTAGS
649CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
650 $(TAGS_FILES) $(LISP)
651 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
652 unique=`for i in $$list; do \
653 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
654 done | \
655 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
656 END { if (nonempty) { for (i in files) print i; }; }'`; \
657 test -z "$(CTAGS_ARGS)$$unique" \
658 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
659 $$unique
660
661GTAGS:
662 here=`$(am__cd) $(top_builddir) && pwd` \
663 && $(am__cd) $(top_srcdir) \
664 && gtags -i $(GTAGS_ARGS) "$$here"
665
666distclean-tags:
667 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
668
669distdir: $(DISTFILES)
670 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
671 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
672 list='$(DISTFILES)'; \
673 dist_files=`for file in $$list; do echo $$file; done | \
674 sed -e "s|^$$srcdirstrip/||;t" \
675 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
676 case $$dist_files in \
677 */*) $(MKDIR_P) `echo "$$dist_files" | \
678 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
679 sort -u` ;; \
680 esac; \
681 for file in $$dist_files; do \
682 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
683 if test -d $$d/$$file; then \
684 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
685 if test -d "$(distdir)/$$file"; then \
686 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
687 fi; \
688 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
689 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
690 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
691 fi; \
692 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
693 else \
694 test -f "$(distdir)/$$file" \
695 || cp -p $$d/$$file "$(distdir)/$$file" \
696 || exit 1; \
697 fi; \
698 done
699check-am: all-am
700check: check-am
701all-am: Makefile $(LTLIBRARIES) $(HEADERS)
702installdirs:
703 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
704 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
705 done
706install: install-am
707install-exec: install-exec-am
708install-data: install-data-am
709uninstall: uninstall-am
710
711install-am: all-am
712 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
713
714installcheck: installcheck-am
715install-strip:
716 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
717 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
718 `test -z '$(STRIP)' || \
719 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
720mostlyclean-generic:
721
722clean-generic:
723
724distclean-generic:
725 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
726 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
727
728maintainer-clean-generic:
729 @echo "This command is intended for maintainers to use"
730 @echo "it deletes files that may require special tools to rebuild."
731 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
732clean: clean-am
733
734clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
735 mostlyclean-am
736
737distclean: distclean-am
738 -rm -rf ./$(DEPDIR)
739 -rm -f Makefile
740distclean-am: clean-am distclean-compile distclean-generic \
741 distclean-tags
742
743dvi: dvi-am
744
745dvi-am:
746
747html: html-am
748
749html-am:
750
751info: info-am
752
753info-am:
754
755install-data-am: install-includesHEADERS
756
757install-dvi: install-dvi-am
758
759install-dvi-am:
760
761install-exec-am: install-libLTLIBRARIES
762
763install-html: install-html-am
764
765install-html-am:
766
767install-info: install-info-am
768
769install-info-am:
770
771install-man:
772
773install-pdf: install-pdf-am
774
775install-pdf-am:
776
777install-ps: install-ps-am
778
779install-ps-am:
780
781installcheck-am:
782
783maintainer-clean: maintainer-clean-am
784 -rm -rf ./$(DEPDIR)
785 -rm -f Makefile
786maintainer-clean-am: distclean-am maintainer-clean-generic
787
788mostlyclean: mostlyclean-am
789
790mostlyclean-am: mostlyclean-compile mostlyclean-generic \
791 mostlyclean-libtool
792
793pdf: pdf-am
794
795pdf-am:
796
797ps: ps-am
798
799ps-am:
800
801uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
802
803.MAKE: install-am install-strip
804
805.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
806 clean-libLTLIBRARIES clean-libtool ctags distclean \
807 distclean-compile distclean-generic distclean-libtool \
808 distclean-tags distdir dvi dvi-am html html-am info info-am \
809 install install-am install-data install-data-am install-dvi \
810 install-dvi-am install-exec install-exec-am install-html \
811 install-html-am install-includesHEADERS install-info \
812 install-info-am install-libLTLIBRARIES install-man install-pdf \
813 install-pdf-am install-ps install-ps-am install-strip \
814 installcheck installcheck-am installdirs maintainer-clean \
815 maintainer-clean-generic mostlyclean mostlyclean-compile \
816 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
817 tags uninstall uninstall-am uninstall-includesHEADERS \
818 uninstall-libLTLIBRARIES
819
820
821# Tell versions [3.59,3.63) of GNU make to not export all variables.
822# Otherwise a system limit (for SysV at least) may be exceeded.
823.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa.m b/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa.m
new file mode 100644
index 0000000..3f6023a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa.m
@@ -0,0 +1,283 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <Cocoa/Cocoa.h>
6
7#include <Eina.h>
8
9#include <Ecore.h>
10#include <ecore_private.h>
11#include <Ecore_Input.h>
12
13#include "Ecore_Cocoa.h"
14#include "Ecore_Cocoa_Keys.h"
15
16
17EAPI int ECORE_COCOA_EVENT_GOT_FOCUS = 0;
18EAPI int ECORE_COCOA_EVENT_LOST_FOCUS = 0;
19EAPI int ECORE_COCOA_EVENT_RESIZE = 0;
20EAPI int ECORE_COCOA_EVENT_EXPOSE = 0;
21
22static int _ecore_cocoa_init_count = 0;
23
24static int old_flags;
25
26EAPI int
27ecore_cocoa_init(void)
28{
29 if (++_ecore_cocoa_init_count != 1)
30 return _ecore_cocoa_init_count;
31
32 if (!ecore_event_init())
33 return --_ecore_cocoa_init_count;
34
35 NSApplicationLoad();
36
37 ECORE_COCOA_EVENT_GOT_FOCUS = ecore_event_type_new();
38 ECORE_COCOA_EVENT_LOST_FOCUS = ecore_event_type_new();
39 ECORE_COCOA_EVENT_RESIZE = ecore_event_type_new();
40 ECORE_COCOA_EVENT_EXPOSE = ecore_event_type_new();
41
42 return _ecore_cocoa_init_count;
43}
44
45/**
46 * Shuts down the Ecore_Cocoa library.
47 * @return @c The number of times the system has been initialised without
48 * being shut down.
49 * @ingroup Ecore_Cocoa_Library_Group
50 */
51EAPI int
52ecore_cocoa_shutdown(void)
53{
54 if (--_ecore_cocoa_init_count != 0)
55 return _ecore_cocoa_init_count;
56
57 ecore_event_shutdown();
58
59 return _ecore_cocoa_init_count;
60}
61
62EAPI void
63ecore_cocoa_feed_events(void)
64{
65 NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.001];
66 NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
67 untilDate:date
68 inMode:NSDefaultRunLoopMode
69 dequeue:YES];
70 [date release];
71 if (!event) return; // SDL loops until null; maybe we should do that too. or not.
72
73 unsigned int time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
74
75 switch([event type])
76 {
77 case NSMouseMoved:
78 case NSLeftMouseDragged:
79 case NSRightMouseDragged:
80 case NSOtherMouseDragged:
81 {
82 Ecore_Event_Mouse_Move * ev = calloc(1, sizeof(Ecore_Event_Mouse_Move));
83 if (!ev) return;
84 ev->x = [event locationInWindow].x;
85 ev->y = [event locationInWindow].y;
86 ev->root.x = ev->x;
87 ev->root.y = ev->y;
88 ev->timestamp = time;
89 ev->window = [event window];
90 ev->modifiers = 0; /* FIXME: keep modifier around. */
91
92 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
93
94 [NSApp sendEvent:event]; // pass along mouse events, for window manager
95 break;
96 }
97 case NSLeftMouseDown:
98 case NSRightMouseDown:
99 case NSOtherMouseDown:
100 {
101 Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
102 if (!ev) return;
103 ev->x = [event locationInWindow].x;
104 ev->y = [event locationInWindow].y;
105 ev->root.x = ev->x;
106 ev->root.y = ev->y;
107 ev->timestamp = time;
108 ev->buttons = [event buttonNumber] + 1; // Apple indexes buttons from 0
109
110 if ([event clickCount] == 2)
111 ev->double_click = 1;
112 else
113 ev->double_click = 0;
114
115 if ([event clickCount] >= 3)
116 ev->triple_click = 1;
117 else
118 ev->triple_click = 0;
119
120 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
121
122 [NSApp sendEvent:event]; // pass along mouse events, for window manager
123 break;
124 }
125 case NSLeftMouseUp:
126 case NSRightMouseUp:
127 case NSOtherMouseUp:
128 {
129 Ecore_Event_Mouse_Button * ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
130 if (!ev) return;
131 ev->x = [event locationInWindow].x;
132 ev->y = [event locationInWindow].y;
133 ev->root.x = ev->x;
134 ev->root.y = ev->y;
135 ev->timestamp = time;
136 ev->buttons = [event buttonNumber] + 1; // Apple indexes buttons from 0
137
138 if ([event clickCount] == 2)
139 ev->double_click = 1;
140 else
141 ev->double_click = 0;
142
143 if ([event clickCount] >= 3)
144 ev->triple_click = 1;
145 else
146 ev->triple_click = 0;
147
148 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
149
150 [NSApp sendEvent:event]; // pass along mouse events, for window manager
151 break;
152 }
153 case NSKeyDown:
154 {
155 Ecore_Event_Key *ev;
156 unsigned int i;
157
158 ev = calloc(1, sizeof (Ecore_Event_Key));
159 if (!ev) return;
160 ev->timestamp = time;
161
162 for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_cocoa_keys_s); ++i)
163 {
164 if (keystable[i].code == tolower([[event charactersIgnoringModifiers] characterAtIndex:0]))
165 {
166 ev->keyname = keystable[i].name;
167 ev->string = keystable[i].compose;
168
169 ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
170 return;
171 }
172 }
173
174 break;
175 }
176 case NSKeyUp:
177 {
178 Ecore_Event_Key *ev;
179 unsigned int i;
180
181 ev = calloc(1, sizeof (Ecore_Event_Key));
182 if (!ev) return;
183 ev->timestamp = time;
184
185 for (i = 0; i < sizeof (keystable) / sizeof (struct _ecore_cocoa_keys_s); ++i)
186 {
187 if (keystable[i].code == tolower([[event charactersIgnoringModifiers] characterAtIndex:0]))
188 {
189 ev->keyname = keystable[i].name;
190 ev->string = keystable[i].compose;
191
192 ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
193 return;
194 }
195 }
196
197 break;
198 }
199 case NSFlagsChanged:
200 {
201 int flags = [event modifierFlags];
202
203 Ecore_Event_Key *evDown = NULL;
204 Ecore_Event_Key *evUp = NULL;
205
206 evDown = calloc(1, sizeof (Ecore_Event_Key));
207 if (!evDown) return;
208
209 evUp = calloc(1, sizeof (Ecore_Event_Key));
210 if (!evUp)
211 {
212 free(evDown);
213 return;
214 }
215
216 // Turn special key flags on
217 if (flags & NSShiftKeyMask)
218 evDown->keyname = "Shift_L";
219 else if (flags & NSControlKeyMask)
220 evDown->keyname = "Control_L";
221 else if (flags & NSAlternateKeyMask)
222 evDown->keyname = "Alt_L";
223 else if (flags & NSCommandKeyMask)
224 evDown->keyname = "Super_L";
225 else if (flags & NSAlphaShiftKeyMask)
226 evDown->keyname = "Caps_Lock";
227
228 if (evDown->keyname)
229 {
230 evDown->timestamp = time;
231 evDown->string = "";
232 ecore_event_add(ECORE_EVENT_KEY_DOWN, evDown, NULL, NULL);
233 old_flags = flags;
234 break;
235 }
236
237 int changed_flags = flags ^ old_flags;
238
239 // Turn special key flags off
240 if (changed_flags & NSShiftKeyMask)
241 evUp->keyname = "Shift_L";
242 else if (changed_flags & NSControlKeyMask)
243 evUp->keyname = "Control_L";
244 else if (changed_flags & NSAlternateKeyMask)
245 evUp->keyname = "Alt_L";
246 else if (changed_flags & NSCommandKeyMask)
247 evUp->keyname = "Super_L";
248 else if (changed_flags & NSAlphaShiftKeyMask)
249 evUp->keyname = "Caps_Lock";
250
251 if (evUp->keyname)
252 {
253 evUp->timestamp = time;
254 evUp->string = "";
255 ecore_event_add(ECORE_EVENT_KEY_UP, evUp, NULL, NULL);
256 old_flags = flags;
257 break;
258 }
259
260 break;
261 }
262 case NSAppKitDefined:
263 {
264 if ([event subtype] == NSApplicationActivatedEventType)
265 ecore_event_add(ECORE_COCOA_EVENT_GOT_FOCUS, NULL, NULL, NULL);
266 else if ([event subtype] == NSApplicationDeactivatedEventType)
267 ecore_event_add(ECORE_COCOA_EVENT_LOST_FOCUS, NULL, NULL, NULL);
268 [NSApp sendEvent:event]; // pass along AppKit events, for window manager
269 break;
270 }
271 case NSScrollWheel:
272 {
273 break;
274 }
275 default:
276 {
277 [NSApp sendEvent:event];
278 break;
279 }
280 }
281
282 [event release];
283}
diff --git a/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_private.h b/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_private.h
new file mode 100644
index 0000000..0b4cf31
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_private.h
@@ -0,0 +1,11 @@
1#ifndef _ECORE_COCOA_PRIVATE_H
2#define _ECORE_COCOA_PRIVATE_H
3
4struct _Ecore_Cocoa_Window
5{
6 NSWindow *window;
7 unsigned int borderless : 1;
8};
9
10
11#endif
diff --git a/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_window.m b/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_window.m
new file mode 100644
index 0000000..2091a69
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_cocoa/ecore_cocoa_window.m
@@ -0,0 +1,163 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <Cocoa/Cocoa.h>
6
7#include "Ecore_Cocoa.h"
8#include "ecore_cocoa_private.h"
9
10Ecore_Cocoa_Window *
11ecore_cocoa_window_new(int x,
12 int y,
13 int width,
14 int height)
15{
16 Ecore_Cocoa_Window *w;
17
18 NSWindow *window = [[NSWindow alloc]
19 initWithContentRect:NSMakeRect(x, y, width, height)
20 styleMask:(NSTitledWindowMask |
21 NSClosableWindowMask |
22 NSResizableWindowMask |
23 NSMiniaturizableWindowMask)
24 backing:NSBackingStoreBuffered
25 defer:NO
26 screen:nil
27 ];
28
29 if (!window)
30 return NULL;
31
32 [window setBackgroundColor:[NSColor whiteColor]];
33
34 w = calloc(1, sizeof(Ecore_Cocoa_Window));
35 w->window = window;
36 w->borderless = 0;
37
38 return w;
39}
40
41void
42ecore_cocoa_window_free(Ecore_Cocoa_Window *window)
43{
44 if (!window)
45 return;
46
47 [window->window release];
48 free(window);
49}
50
51void
52ecore_cocoa_window_move(Ecore_Cocoa_Window *window,
53 int x,
54 int y)
55{
56 NSRect win_frame;
57
58 if (!window)
59 return;
60
61 win_frame = [window->window frame];
62 win_frame.origin.x = x;
63 win_frame.origin.y = y;
64
65 [window->window setFrame:win_frame display:YES];
66}
67
68void
69ecore_cocoa_window_resize(Ecore_Cocoa_Window *window,
70 int width,
71 int height)
72{
73 if (!window)
74 return;
75
76 NSRect win_frame;
77
78 if (!window)
79 return;
80
81 win_frame = [window->window frame];
82 win_frame.size.height = height;
83 win_frame.size.width = width;
84
85 [window->window setFrame:win_frame display:YES];
86}
87
88void
89ecore_cocoa_window_move_resize(Ecore_Cocoa_Window *window,
90 int x,
91 int y,
92 int width,
93 int height)
94{
95 if (!window)
96 return;
97
98 NSRect win_frame;
99
100 if (!window)
101 return;
102
103 win_frame = [window->window frame];
104 win_frame.size.height = height;
105 win_frame.size.width = width;
106 win_frame.origin.x = x;
107 win_frame.origin.y = y;
108
109 [window->window setFrame:win_frame display:YES];
110}
111
112void
113ecore_cocoa_window_title_set(Ecore_Cocoa_Window *window, const char *title)
114{
115 if (!window || !title)
116 return;
117
118 [window->window setTitle:[NSString stringWithUTF8String:title]];
119}
120
121void
122ecore_cocoa_window_show(Ecore_Cocoa_Window *window)
123{
124 if (!window || [window->window isVisible])
125 {
126 printf("Window(%p) is not visible\n", window->window);
127 return;
128 }
129
130 [window->window makeKeyAndOrderFront:NSApp];
131}
132
133void
134ecore_cocoa_window_hide(Ecore_Cocoa_Window *window)
135{
136 if (!window || ![window->window isVisible])
137 return;
138
139 [window->window orderOut:NSApp];
140}
141
142void
143ecore_cocoa_window_borderless_set(Ecore_Cocoa_Window *window,
144 int on)
145{
146 if (!window)
147 return;
148
149 if (on)
150 [window->window setContentBorderThickness:0.0
151 forEdje:NSMinXEdge | NSMinYEdge | NSMaxXEdge | NSMaxYEdge];
152}
153
154void
155ecore_cocoa_window_view_set(Ecore_Cocoa_Window *window,
156 void *view)
157{
158 if (!window || !view)
159 return;
160
161 [[window->window contentView] addSubview:view];
162
163}
diff --git a/libraries/ecore/src/lib/ecore_con/Ecore_Con.h b/libraries/ecore/src/lib/ecore_con/Ecore_Con.h
new file mode 100644
index 0000000..e3b68c4
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/Ecore_Con.h
@@ -0,0 +1,1801 @@
1#ifndef _ECORE_CON_H
2#define _ECORE_CON_H
3
4#include <time.h>
5#include <libgen.h>
6#ifdef _WIN32
7# include <ws2tcpip.h>
8#else
9# include <netdb.h>
10#endif
11#include <Eina.h>
12
13#ifdef EAPI
14# undef EAPI
15#endif
16
17#ifdef _WIN32
18# ifdef EFL_ECORE_CON_BUILD
19# ifdef DLL_EXPORT
20# define EAPI __declspec(dllexport)
21# else
22# define EAPI
23# endif
24# else
25# define EAPI __declspec(dllimport)
26# endif
27#else
28# ifdef __GNUC__
29# if __GNUC__ >= 4
30# define EAPI __attribute__ ((visibility("default")))
31# else
32# define EAPI
33# endif
34# else
35# define EAPI
36# endif
37#endif
38
39/**
40 * @defgroup Ecore_Con_Group Ecore_Con - Connection functions
41 *
42 * The Ecore Connection Library ( @c Ecore_Con ) provides simple mechanisms
43 * for communications between programs using reliable sockets. It saves
44 * the programmer from having to worry about file descriptors and waiting
45 * for incoming connections.
46 *
47 * There are two main objects in the @c Ecore_Con library: the @c
48 * Ecore_Con_Server and the @c Ecore_Con_Client.
49 *
50 * The @c Ecore_Con_Server represents a server that can be connected to.
51 * It is used regardless of whether the program is acting as a server or
52 * client itself.
53 *
54 * To create a listening server call @c ecore_con_server_add(), optionally using
55 * an ECORE_CON_USE_* encryption type OR'ed with the type for encryption.
56 *
57 * To connect to a server, call @c ecore_con_server_connect(). Data can
58 * then be sent to the server using the @c ecore_con_server_send().
59 *
60 * Functions are described in the following groupings:
61 * @li @ref Ecore_Con_Lib_Group
62 * @li @ref Ecore_Con_Server_Group
63 * @li @ref Ecore_Con_Client_Group
64 * @li @ref Ecore_Con_Url_Group
65 *
66 * Events are described in @ref Ecore_Con_Events_Group.
67 */
68
69
70/**
71 * @defgroup Ecore_Con_Events_Group Events
72 *
73 * @li ECORE_CON_CLIENT_ADD: Whenever a client connection is made to an
74 * @c Ecore_Con_Server, an event of this type is emitted, allowing the
75 * retrieval of the client's ip with @ref ecore_con_client_ip_get and
76 * associating data with the client using ecore_con_client_data_set.
77 * @li ECORE_CON_EVENT_CLIENT_DEL: Whenever a client connection to an
78 * @c Ecore_Con_Server, an event of this type is emitted. The contents of
79 * the data with this event are variable, but if the client object in the data
80 * is non-null, it must be freed with @ref ecore_con_client_del.
81 * @li ECORE_CON_EVENT_SERVER_ADD: Whenever a server object is created
82 * with @ref ecore_con_server_connect, an event of this type is emitted,
83 * allowing for data to be serialized and sent to the server using
84 * @ref ecore_con_server_send. At this point, the http handshake has
85 * occurred.
86 * @li ECORE_CON_EVENT_SERVER_DEL: Whenever a server object is destroyed,
87 * usually by the server connection being refused or dropped, an event of this
88 * type is emitted. The contents of the data with this event are variable,
89 * but if the server object in the data is non-null, it must be freed
90 * with @ref ecore_con_server_del.
91 * @li ECORE_CON_EVENT_CLIENT_DATA: Whenever a client connects to your server
92 * object and sends data, an event of this type is emitted. The data will contain both
93 * the size and contents of the message sent by the client. It should be noted that
94 * data within this object is transient, so it must be duplicated in order to be
95 * retained. This event will continue to occur until the client has stopped sending its
96 * message, so a good option for storing this data is an Eina_Strbuf. Once the message has
97 * been received in full, the client object must be freed with ecore_con_client_free.
98 * @li ECORE_CON_EVENT_SERVER_DATA: Whenever your server object connects to its destination
99 * and receives data, an event of this type is emitted. The data will contain both
100 * the size and contents of the message sent by the server. It should be noted that
101 * data within this object is transient, so it must be duplicated in order to be
102 * retained. This event will continue to occur until the server has stopped sending its
103 * message, so a good option for storing this data is an Eina_Strbuf. Once the message has
104 * been received in full, the server object must be freed with ecore_con_server_free.
105 *
106 */
107
108/**
109 * @defgroup Ecore_Con_Buffer Buffering
110 *
111 * As Ecore_Con works on an event driven design, as data arrives, events will
112 * be produced containing the data that arrived. It is up to the user of
113 * Ecore_Con to either parse as they go, append to a file to later parse the
114 * whole file in one go, or append to memory to parse or handle leter.
115 *
116 * To help with this Eina has some handy API's. The Eina_Binbuf and
117 * Eina_Strbuf APIs, abstract dynamic buffer management and make it trivial
118 * to handle buffers at runtime, without having to manage them. Eina_Binbuf
119 * makes it possible to create, expand, reset and slice a blob of memory -
120 * all via API. No system calls, no pointer manipulations and no size
121 * calculation.
122 *
123 * Additional functions include adding content at specified byte positions in
124 * the buffer, escaping the inputs, find and replace strings. This provides
125 * extreme flexibility to play around, with a dynamic blob of memory.
126 *
127 * It is good to free it (using eina_binbuf_free()) after using it.
128 *
129 * Eina_Binbuf compliments Ecore_Con use cases, where dynamic sizes of data
130 * arrive from the network (think http download in chunks). Using
131 * Eina_Binbuf provides enough flexibility to handle data as it arrives and
132 * to defer its processing until desired, without having to think about
133 * where to store the temporary data and how to manage its size.
134 *
135 * An example of how to use these with Ecore_Con follows.
136 *
137 * @code
138 * #include <Eina.h>
139 * #include <Ecore.h>
140 * #include <Ecore_Con.h>
141 *
142 * static Eina_Bool
143 * data_callback(void *data, int type, void *event)
144 * {
145 * Ecore_Con_Event_Url_Data *url_data = event;
146 * if ( url_data->size > 0)
147 * {
148 * // append data as it arrives - don't worry where or how it gets stored.
149 * // Also don't worry about size, expanding, reallocing etc.
150 * // just keep appending - size is automatically handled.
151 *
152 * eina_binbuf_append_length(data, url_data->data, url_data->size);
153 *
154 * fprintf(stderr, "Appended %d \n", url_data->size);
155 * }
156 * return EINA_TRUE;
157 * }
158 *
159 *
160 *
161 * static Eina_Bool
162 * completion_callback(void *data, int type, void *event)
163 * {
164 * Ecore_Con_Event_Url_Complete *url_complete = event;
165 * printf("download completed with status code: %d\n", url_complete->status);
166 *
167 * // get the data back from Eina_Binbuf
168 * char *ptr = eina_binbuf_string_get(data);
169 * size_t size = eina_binbuf_length_get(data);
170 *
171 * // process data as required (write to file)
172 * fprintf(stderr, "Size of data = %d bytes\n", size);
173 * int fd = open("./elm.png", O_CREAT);
174 * write(fd, ptr, size);
175 * close(fd);
176 *
177 * // free it when done.
178 * eina_binbuf_free(data);
179 *
180 * ecore_main_loop_quit();
181 *
182 * return EINA_TRUE;
183 * }
184 *
185 *
186 * int
187 * main(int argc, char **argv)
188 * {
189 *
190 * const char *url = "http://www.enlightenment.org/p/index/d/logo.png";
191 *
192 * ecore_init();
193 * ecore_con_init();
194 * ecore_con_url_init();
195 *
196 *
197 * // This is single additional line to manage dynamic network data.
198 * Eina_Binbuf *data = eina_binbuf_new();
199 * Ecore_Con_Url *url_con = ecore_con_url_new(url);
200 *
201 * ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE,
202 * completion_callback,
203 * data);
204 * ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA,
205 * data_callback,
206 * data);
207 * ecore_con_url_get(url_con);
208 *
209 * ecore_main_loop_begin();
210 * return 0;
211 * }
212 * @endcode
213 */
214
215#ifdef __cplusplus
216extern "C" {
217#endif
218#define ECORE_CON_USE_SSL ECORE_CON_USE_SSL2
219#define ECORE_CON_REMOTE_SYSTEM ECORE_CON_REMOTE_TCP
220
221
222/**
223 * @typedef Ecore_Con_Server
224 * A connection handle to a server
225 * @ingroup Ecore_Con_Server_Group
226 */
227typedef struct _Ecore_Con_Server Ecore_Con_Server;
228
229/**
230 * @typedef Ecore_Con_Client
231 * A connection handle to a client
232 * @ingroup Ecore_Con_Client_Group
233 */
234typedef struct _Ecore_Con_Client Ecore_Con_Client;
235
236/**
237 * @typedef Ecore_Con_Url
238 * A handle to an http upload/download object
239 * @ingroup Ecore_Con_Url_Group
240 */
241typedef struct _Ecore_Con_Url Ecore_Con_Url;
242
243
244/**
245 * @addtogroup Ecore_Con_Events_Group Events
246 * @{
247 */
248
249/**
250 * @typedef Ecore_Con_Event_Client_Add
251 * Used as the @p data param for the corresponding event
252 */
253typedef struct _Ecore_Con_Event_Client_Add Ecore_Con_Event_Client_Add;
254
255/**
256 * @typedef Ecore_Con_Event_Client_Upgrade
257 * Used as the @p data param for the corresponding event
258 * @since 1.1
259 */
260typedef struct _Ecore_Con_Event_Client_Upgrade Ecore_Con_Event_Client_Upgrade;
261
262/**
263 * @typedef Ecore_Con_Event_Client_Del
264 * Used as the @p data param for the corresponding event
265 */
266typedef struct _Ecore_Con_Event_Client_Del Ecore_Con_Event_Client_Del;
267
268/**
269 * @typedef Ecore_Con_Event_Client_Error
270 * Used as the @p data param for the corresponding event
271 * @since 1.1
272 */
273typedef struct _Ecore_Con_Event_Client_Error Ecore_Con_Event_Client_Error;
274
275/**
276 * @typedef Ecore_Con_Event_Server_Add
277 * Used as the @p data param for the corresponding event
278 */
279typedef struct _Ecore_Con_Event_Server_Add Ecore_Con_Event_Server_Add;
280
281/**
282 * @typedef Ecore_Con_Event_Server_Upgrade
283 * Used as the @p data param for the corresponding event
284 * @since 1.1
285 */
286typedef struct _Ecore_Con_Event_Server_Upgrade Ecore_Con_Event_Server_Upgrade;
287
288/**
289 * @typedef Ecore_Con_Event_Server_Del
290 * Used as the @p data param for the corresponding event
291 */
292typedef struct _Ecore_Con_Event_Server_Del Ecore_Con_Event_Server_Del;
293
294/**
295 * @typedef Ecore_Con_Event_Server_Error
296 * Used as the @p data param for the corresponding event
297 * @since 1.1
298 */
299typedef struct _Ecore_Con_Event_Server_Error Ecore_Con_Event_Server_Error;
300
301/**
302 * @typedef Ecore_Con_Event_Client_Data
303 * Used as the @p data param for the corresponding event
304 */
305typedef struct _Ecore_Con_Event_Client_Data Ecore_Con_Event_Client_Data;
306
307/**
308 * @typedef Ecore_Con_Event_Server_Data
309 * Used as the @p data param for the corresponding event
310 */
311typedef struct _Ecore_Con_Event_Server_Data Ecore_Con_Event_Server_Data;
312
313/**
314 * @typedef Ecore_Con_Event_Client_Write
315 * Used as the @p data param for the corresponding event
316 * @since 1.1
317 */
318typedef struct _Ecore_Con_Event_Client_Write Ecore_Con_Event_Client_Write;
319
320/**
321 * @typedef Ecore_Con_Event_Server_Write
322 * Used as the @p data param for the corresponding event
323 * @since 1.1
324 */
325typedef struct _Ecore_Con_Event_Server_Write Ecore_Con_Event_Server_Write;
326
327/**
328 * @typedef Ecore_Con_Event_Url_Data
329 * Used as the @p data param for the corresponding event
330 * @ingroup Ecore_Con_Url_Group
331 */
332typedef struct _Ecore_Con_Event_Url_Data Ecore_Con_Event_Url_Data;
333
334/**
335 * @typedef Ecore_Con_Event_Url_Complete
336 * Used as the @p data param for the corresponding event
337 * @ingroup Ecore_Con_Url_Group
338 */
339typedef struct _Ecore_Con_Event_Url_Complete Ecore_Con_Event_Url_Complete;
340
341/**
342 * @typedef Ecore_Con_Event_Url_Progress
343 * Used as the @p data param for the corresponding event
344 * @ingroup Ecore_Con_Url_Group
345 */
346typedef struct _Ecore_Con_Event_Url_Progress Ecore_Con_Event_Url_Progress;
347
348/**
349 * @struct _Ecore_Con_Event_Client_Add
350 * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_ADD event
351 */
352struct _Ecore_Con_Event_Client_Add
353{
354 Ecore_Con_Client *client; /** the client that connected */
355};
356
357/**
358 * @struct _Ecore_Con_Event_Client_Upgrade
359 * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_UPGRADE event
360 * @since 1.1
361 */
362struct _Ecore_Con_Event_Client_Upgrade
363{
364 Ecore_Con_Client *client; /** the client that completed handshake */
365};
366
367/**
368 * @struct _Ecore_Con_Event_Client_Del
369 * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_DEL event
370 */
371struct _Ecore_Con_Event_Client_Del
372{
373 Ecore_Con_Client *client; /** the client that was lost */
374};
375
376/**
377 * @struct _Ecore_Con_Event_Client_Error
378 * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_ERROR event
379 */
380struct _Ecore_Con_Event_Client_Error
381{
382 Ecore_Con_Client *client; /** the client for which an error occurred */
383 char *error; /**< the error string describing what happened */
384};
385
386/**
387 * @struct _Ecore_Con_Event_Server_Add
388 * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_ADD event
389 */
390struct _Ecore_Con_Event_Server_Add
391{
392 Ecore_Con_Server *server; /** the server that was connected to */
393};
394
395/**
396 * @struct _Ecore_Con_Event_Server_Upgrade
397 * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_UPGRADE event
398 * @since 1.1
399 */
400struct _Ecore_Con_Event_Server_Upgrade
401{
402 Ecore_Con_Server *server; /** the server that was connected to */
403};
404
405/**
406 * @struct _Ecore_Con_Event_Server_Del
407 * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_DEL event
408 */
409struct _Ecore_Con_Event_Server_Del
410{
411 Ecore_Con_Server *server; /** the client that was lost */
412};
413
414/**
415 * @struct _Ecore_Con_Event_Server_Error
416 * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_ERROR event
417 */
418struct _Ecore_Con_Event_Server_Error
419{
420 Ecore_Con_Server *server; /** the server for which an error occurred */
421 char *error; /**< the error string describing what happened */
422};
423
424/**
425 * @struct _Ecore_Con_Event_Client_Data
426 * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_DATA event
427 */
428struct _Ecore_Con_Event_Client_Data
429{
430 Ecore_Con_Client *client; /**< the client that connected */
431 void *data; /**< the data that the client sent */
432 int size; /**< the length of the data sent */
433};
434
435/**
436 * @struct _Ecore_Con_Event_Server_Data
437 * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_DATA event
438 */
439struct _Ecore_Con_Event_Server_Data
440{
441 Ecore_Con_Server *server; /**< the server that was connected to */
442 void *data; /**< the data that the server sent */
443 int size; /**< the length of the data sent */
444};
445
446/**
447 * @struct _Ecore_Con_Event_Client_Write
448 * Used as the @p data param for the @ref ECORE_CON_EVENT_CLIENT_WRITE event
449 */
450struct _Ecore_Con_Event_Client_Write
451{
452 Ecore_Con_Client *client; /**< the client that connected */
453 int size; /**< the length of the data sent */
454};
455
456/**
457 * @struct _Ecore_Con_Event_Server_Write
458 * Used as the @p data param for the @ref ECORE_CON_EVENT_SERVER_WRITE event
459 */
460struct _Ecore_Con_Event_Server_Write
461{
462 Ecore_Con_Server *server; /**< the server that was connected to */
463 int size; /**< the length of the data sent */
464};
465
466/**
467 * @struct _Ecore_Con_Event_Url_Data
468 * Used as the @p data param for the @ref ECORE_CON_EVENT_URL_DATA event
469 * @ingroup Ecore_Con_Url_Group
470 */
471struct _Ecore_Con_Event_Url_Data
472{
473 Ecore_Con_Url *url_con; /**< a pointer to the connection object */
474 int size; /**< the size of the current received data (in bytes) */
475 unsigned char data[1]; /**< the data received on this event */
476};
477
478/**
479 * @struct _Ecore_Con_Event_Url_Complete
480 * Used as the @p data param for the @ref ECORE_CON_EVENT_URL_COMPLETE event
481 * @ingroup Ecore_Con_Url_Group
482 */
483struct _Ecore_Con_Event_Url_Complete
484{
485 Ecore_Con_Url *url_con; /**< a pointer to the connection object */
486 int status; /**< HTTP status code of the operation (200, 404, 401, etc.) */
487};
488
489/**
490 * @struct _Ecore_Con_Event_Url_Progress
491 * Used as the @p data param for the @ref ECORE_CON_EVENT_URL_PROGRESS event
492 * @ingroup Ecore_Con_Url_Group
493 */
494struct _Ecore_Con_Event_Url_Progress
495{
496 Ecore_Con_Url *url_con; /**< a pointer to the connection object */
497 struct
498 {
499 double total; /**< total size of the downloading data (in bytes) */
500 double now; /**< current size of the downloading data (in bytes) */
501 } down; /**< download info */
502 struct
503 {
504 double total; /**< total size of the uploading data (in bytes) */
505 double now; /**< current size of the uploading data (in bytes) */
506 } up; /**< upload info */
507};
508
509/** A client has connected to the server */
510EAPI extern int ECORE_CON_EVENT_CLIENT_ADD;
511/** A client has disconnected from the server */
512EAPI extern int ECORE_CON_EVENT_CLIENT_DEL;
513/** A client experienced an error
514 * @since 1.1
515 */
516EAPI extern int ECORE_CON_EVENT_CLIENT_ERROR;
517/** A client connection has been upgraded to SSL
518 * @since 1.1
519 */
520EAPI extern int ECORE_CON_EVENT_CLIENT_UPGRADE;
521/** A server was created */
522EAPI extern int ECORE_CON_EVENT_SERVER_ADD;
523/** A server connection was lost */
524EAPI extern int ECORE_CON_EVENT_SERVER_DEL;
525/** A server experienced an error
526 * @since 1.1
527 */
528EAPI extern int ECORE_CON_EVENT_SERVER_ERROR;
529/** A server connection has been upgraded to SSL
530 * @since 1.1
531 */
532EAPI extern int ECORE_CON_EVENT_SERVER_UPGRADE;
533/** A server connection has sent data to its client
534 * @since 1.1
535 */
536EAPI extern int ECORE_CON_EVENT_CLIENT_WRITE;
537/** A server connection object has sent data
538 * @since 1.1
539 */
540EAPI extern int ECORE_CON_EVENT_SERVER_WRITE;
541/** A client connected to the server has sent data */
542EAPI extern int ECORE_CON_EVENT_CLIENT_DATA;
543/** A server connection object has data */
544EAPI extern int ECORE_CON_EVENT_SERVER_DATA;
545/** A URL object has data */
546EAPI extern int ECORE_CON_EVENT_URL_DATA;
547/** A URL object has completed its transfer to and from the server and can be reused */
548EAPI extern int ECORE_CON_EVENT_URL_COMPLETE;
549/** A URL object has made progress in its transfer */
550EAPI extern int ECORE_CON_EVENT_URL_PROGRESS;
551
552/**
553 * @}
554 */
555
556/**
557 * @defgroup Ecore_Con_Lib_Group Ecore Connection Library Functions
558 *
559 * Utility functions that set up and shut down the Ecore Connection
560 * library.
561 *
562 * There's also ecore_con_lookup() that can be used to make simple asynchronous
563 * DNS lookups.
564 *
565 * A simple example of how to use these functions:
566 * @li @ref ecore_con_lookup_example_c
567 *
568 * @{
569 */
570
571/**
572 * @typedef Ecore_Con_Dns_Cb
573 * A callback type for use with @ref ecore_con_lookup.
574 */
575typedef void (*Ecore_Con_Dns_Cb)(const char *canonname,
576 const char *ip,
577 struct sockaddr *addr,
578 int addrlen,
579 void *data);
580
581/**
582 * @typedef Ecore_Con_Type
583 * @enum _Ecore_Con_Type
584 * Types for an ecore_con client/server object. A correct way to set this type is
585 * with an ECORE_CON_$TYPE, optionally OR'ed with an ECORE_CON_$USE if encryption is desired,
586 * and LOAD_CERT if the previously loaded certificate should be used.
587 * @code
588 * ECORE_CON_REMOTE_TCP | ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT
589 * @endcode
590 * @ingroup Ecore_Con_Server_Group
591 */
592typedef enum _Ecore_Con_Type
593{
594 /** Socket in ~/.ecore */
595 ECORE_CON_LOCAL_USER = 0,
596 /** Socket in /tmp */
597 ECORE_CON_LOCAL_SYSTEM = 1,
598 /** Abstract socket */
599 ECORE_CON_LOCAL_ABSTRACT = 2,
600 /** Remote server using TCP */
601 ECORE_CON_REMOTE_TCP = 3,
602 /** Remote multicast server */
603 ECORE_CON_REMOTE_MCAST = 4,
604 /** Remote server using UDP */
605 ECORE_CON_REMOTE_UDP = 5,
606 /** Remote broadcast using UDP */
607 ECORE_CON_REMOTE_BROADCAST = 6,
608 ECORE_CON_REMOTE_NODELAY = 7,
609 /** Use SSL2: UNSUPPORTED. **/
610 ECORE_CON_USE_SSL2 = (1 << 4),
611 /** Use SSL3 */
612 ECORE_CON_USE_SSL3 = (1 << 5),
613 /** Use TLS */
614 ECORE_CON_USE_TLS = (1 << 6),
615 /** Use both TLS and SSL3 */
616 ECORE_CON_USE_MIXED = ECORE_CON_USE_SSL3 | ECORE_CON_USE_TLS,
617 /** Attempt to use the loaded certificate */
618 ECORE_CON_LOAD_CERT = (1 << 7)
619} Ecore_Con_Type;
620
621/**
622 * Initialises the Ecore_Con library.
623 * @return Number of times the library has been initialised without being
624 * shut down.
625 *
626 * @note This function already calls ecore_init() internally, so you don't need
627 * to call it explicitly.
628 */
629EAPI int ecore_con_init(void);
630
631/**
632 * Shuts down the Ecore_Con library.
633 * @return Number of times the library has been initialised without being
634 * shut down.
635 * @note This function already calls ecore_shutdown() internally, so you don't
636 * need to call it explicitly unless you called ecore_init() explicitly too.
637 */
638EAPI int ecore_con_shutdown(void);
639
640/**
641 * Do an asynchronous DNS lookup.
642 *
643 * @param name IP address or server name to translate.
644 * @param done_cb Callback to notify when done.
645 * @param data User data to be given to done_cb.
646 * @return EINA_TRUE if the request did not fail to be set up, EINA_FALSE if it
647 * failed.
648 *
649 * This function performs a DNS lookup on the hostname specified by @p name,
650 * then calls @p done_cb with the result and the @p data given as parameter.
651 * The result will be given to the @p done_cb as follows:
652 * @li @c canonname - the canonical name of the address
653 * @li @c ip - the resolved ip address
654 * @li @c addr - a pointer to the socket address
655 * @li @c addrlen - the length of the socket address, in bytes
656 * @li @c data - the data pointer given as parameter to ecore_con_lookup()
657 */
658EAPI Eina_Bool ecore_con_lookup(const char *name,
659 Ecore_Con_Dns_Cb done_cb,
660 const void *data);
661
662/**
663 * @}
664 */
665
666/**
667 * @defgroup Ecore_Con_SSL_Group Ecore Connection SSL Functions
668 *
669 * @{
670 */
671EAPI int ecore_con_ssl_available_get(void);
672EAPI Eina_Bool ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, const char *cert);
673EAPI Eina_Bool ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, const char *key_file);
674EAPI Eina_Bool ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr, const char *crl_file);
675EAPI Eina_Bool ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, const char *ca_file);
676EAPI void ecore_con_ssl_server_verify(Ecore_Con_Server *svr);
677EAPI void ecore_con_ssl_server_verify_basic(Ecore_Con_Server *svr);
678EAPI Eina_Bool ecore_con_ssl_server_upgrade(Ecore_Con_Server *svr, Ecore_Con_Type compl_type);
679EAPI Eina_Bool ecore_con_ssl_client_upgrade(Ecore_Con_Client *cl, Ecore_Con_Type compl_type);
680
681/**
682 * @}
683 */
684
685/**
686 * @defgroup Ecore_Con_Server_Group Ecore Connection Server Functions
687 *
688 * This group of functions is applied to an @ref Ecore_Con_Server object. It
689 * doesn't mean that they should be used in the server application, but on the
690 * server object. In fact, most of them should be used in the client
691 * application, when retrieving information or sending data.
692 *
693 * Setting up a server is very simple: you just need to start it with
694 * ecore_con_server_add() and setup some callbacks to the events
695 * #ECORE_CON_EVENT_CLIENT_ADD, #ECORE_CON_EVENT_CLIENT_DEL and
696 * #ECORE_CON_EVENT_CLIENT_DATA, that will be called when a client is
697 * communicating with the server:
698 *
699 * @code
700 * if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
701 * exit(1);
702 *
703 * ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, _add_cb, NULL);
704 * ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, _del_cb, NULL);
705 * ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA, _data_cb, NULL);
706 *
707 * ecore_main_loop_begin();
708 * @endcode
709 *
710 * The function ecore_con_server_connect() can be used to write a client that
711 * connects to a server. The resulting code will be very similar to the server
712 * code:
713 *
714 * @code
715 * if (!(svr = ecore_con_server_connect(ECORE_CON_REMOTE_TCP, "127.0.0.1", 8080, NULL)))
716 * exit(1);
717 *
718 * ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, _add_cb, NULL);
719 * ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL, _del_cb, NULL);
720 * ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _data_cb, NULL);
721 *
722 * ecore_main_loop_begin();
723 * @endcode
724 *
725 * After these two pieces of code are executed, respectively, in the server and
726 * client code, the server will be up and running and the client will try to
727 * connect to it. The connection, with its subsequent messages being sent from
728 * server to client and client to server, can be represented in the following
729 * sequence diagram:
730 *
731 * @htmlonly
732 * <img src="ecore_con-client-server.png" style="max-width: 400px"/>
733 * <a href="ecore_con-client-server.png">Full size</a>
734 * @endhtmlonly
735 *
736 * @image rtf ecore_con-client-server.png
737 * @image latex ecore_con-client-server.eps width=\textwidth
738 *
739 * Please notice the important difference between these two codes: the first is
740 * used for writing a @b server, while the second should be used for writing a
741 * @b client.
742 *
743 * A reference for the @c client functions can be found at @ref
744 * Ecore_Con_Client_Group.
745 *
746 * Examples of usage for this API can be found here:
747 * @li @ref ecore_con_server_simple_example_c
748 * @li @ref ecore_con_client_simple_example_c
749 *
750 * @{
751 */
752
753/**
754 * Creates a server to listen for connections.
755 *
756 * @param type The connection type.
757 * @param name Name to associate with the socket. It is used when
758 * generating the socket name of a Unix socket, or for
759 * determining what host to listen on for TCP sockets.
760 * @c NULL will not be accepted.
761 * @param port Number to identify socket. When a Unix socket is used,
762 * it becomes part of the socket name. When a TCP socket
763 * is used, it is used as the TCP port.
764 * @param data Data to associate with the created Ecore_Con_Server
765 * object.
766 * @return A new Ecore_Con_Server.
767 *
768 * The socket on which the server listens depends on the connection
769 * type:
770 * @li If @a type is @c ECORE_CON_LOCAL_USER, the server will listen on
771 * the Unix socket "~/.ecore/[name]/[port]".
772 * @li If @a type is @c ECORE_CON_LOCAL_SYSTEM, the server will listen
773 * on Unix socket "/tmp/.ecore_service|[name]|[port]".
774 * @li If @a type is @c ECORE_CON_REMOTE_TCP, the server will listen
775 * on TCP port @c port.
776 *
777 * More information about the @p type can be found at @ref _Ecore_Con_Type.
778 *
779 * The @p data parameter can be fetched later using ecore_con_server_data_get()
780 * or changed with ecore_con_server_data_set().
781 */
782EAPI Ecore_Con_Server *ecore_con_server_add(Ecore_Con_Type type,
783 const char *name, int port,
784 const void *data);
785
786/**
787 * Creates a connection to the specified server and returns an associated object.
788 *
789 * @param type The connection type.
790 * @param name Name used when determining what socket to connect to.
791 * It is used to generate the socket name when the socket
792 * is a Unix socket. It is used as the hostname when
793 * connecting with a TCP socket.
794 * @param port Number to identify the socket to connect to. Used when
795 * generating the socket name for a Unix socket, or as the
796 * TCP port when connecting to a TCP socket.
797 * @param data Data to associate with the created Ecore_Con_Server
798 * object.
799 * @return A new Ecore_Con_Server.
800 *
801 * The socket to which the connection is made depends on the connection type:
802 * @li If @a type is @c ECORE_CON_LOCAL_USER, the function will
803 * connect to the server at the Unix socket
804 * "~/.ecore/[name]/[port]".
805 * @li If @a type is @c ECORE_CON_LOCAL_SYSTEM, the function will
806 * connect to the server at the Unix socket
807 * "/tmp/.ecore_service|[name]|[port]".
808 * @li If @a type is @c ECORE_CON_REMOTE_TCP, the function will
809 * connect to the server at the TCP port "[name]:[port]".
810 *
811 * More information about the @p type can be found at @ref _Ecore_Con_Type.
812 *
813 * This function won't block. It will either succeed, or fail due to invalid
814 * parameters, failed memory allocation, etc., returning @c NULL on that case.
815 *
816 * However, even if this call returns a valid @ref Ecore_Con_Server, the
817 * connection will only be successfully completed if an event of type
818 * #ECORE_CON_EVENT_SERVER_ADD is received. If it fails to complete, an
819 * #ECORE_CON_EVENT_SERVER_DEL will be received.
820 *
821 * The @p data parameter can be fetched later using ecore_con_server_data_get()
822 * or changed with ecore_con_server_data_set().
823 */
824EAPI Ecore_Con_Server *ecore_con_server_connect(Ecore_Con_Type type,
825 const char *name, int port,
826 const void *data);
827/**
828 * Closes the connection and frees the given server.
829 *
830 * @param svr The given server.
831 * @return Data associated with the server when it was created.
832 *
833 * All the clients connected to this server will be disconnected.
834 *
835 * @see ecore_con_server_add, ecore_con_server_connect
836 */
837EAPI void * ecore_con_server_del(Ecore_Con_Server *svr);
838
839/**
840 * Retrieves the data associated with the given server.
841 *
842 * @param svr The given server.
843 * @return The associated data.
844 *
845 * @see ecore_con_server_data_set()
846 */
847EAPI void * ecore_con_server_data_get(Ecore_Con_Server *svr);
848/**
849 * Sets the data associated with the given server.
850 *
851 * @param svr The given server.
852 * @param data The data to associate with @p svr
853 * @return The previously associated data, if any.
854 *
855 * @see ecore_con_server_data_get()
856 */
857EAPI void * ecore_con_server_data_set(Ecore_Con_Server *svr,
858 void *data);
859/**
860 * Retrieves whether the given server is currently connected.
861 *
862 * @param svr The given server.
863 * @return #EINA_TRUE if the server is connected. #EINA_FALSE otherwise.
864 */
865EAPI Eina_Bool ecore_con_server_connected_get(Ecore_Con_Server *svr);
866/**
867 * Retrieves the current list of clients.
868 *
869 * @param svr The given server.
870 * @return The list of clients on this server.
871 *
872 * Each node in the returned list points to an @ref Ecore_Con_Client. This list
873 * cannot be modified or freed. It can also change if new clients are connected
874 * or disconnected, and will become invalid when the server is deleted/freed.
875 */
876EAPI const Eina_List * ecore_con_server_clients_get(Ecore_Con_Server *svr);
877
878/**
879 * Retrieves the name of server.
880 *
881 * @param svr The given server.
882 * @return The name of the server.
883 *
884 * The name returned is the name used to connect on this server.
885 */
886EAPI const char * ecore_con_server_name_get(Ecore_Con_Server *svr);
887
888/**
889 * Retrieves the server port in use.
890 *
891 * @param svr The given server.
892 * @return The server port in use.
893 *
894 * The port where the server is listening for connections.
895 */
896EAPI int ecore_con_server_port_get(Ecore_Con_Server *svr);
897/**
898 * @brief Check how long a server has been connected
899 *
900 * @param svr The server to check
901 * @return The total time, in seconds, that the server has been
902 * connected/running
903 *
904 * This function is used to find out the time that has been elapsed since
905 * ecore_con_server_add() succeeded.
906 */
907EAPI double ecore_con_server_uptime_get(Ecore_Con_Server *svr);
908/**
909 * Sends the given data to the given server.
910 *
911 * @param svr The given server.
912 * @param data The given data.
913 * @param size Length of the data, in bytes, to send.
914 * @return The number of bytes sent. @c 0 will be returned if there is an
915 * error.
916 *
917 * This function will send the given data to the server as soon as the program
918 * is back to the main loop. Thus, this function returns immediately
919 * (non-blocking). If the data needs to be sent @b now, call
920 * ecore_con_server_flush() after this one.
921 *
922 * @see ecore_con_client_send()
923 * @see ecore_con_server_flush()
924 */
925EAPI int ecore_con_server_send(Ecore_Con_Server *svr,
926 const void *data,
927 int size);
928/**
929 * Sets a limit on the number of clients that can be handled concurrently
930 * by the given server, and a policy on what to do if excess clients try to
931 * connect.
932 *
933 * @param svr The given server.
934 * @param client_limit The maximum number of clients to handle
935 * concurrently. -1 means unlimited (default). 0
936 * effectively disables the server.
937 * @param reject_excess_clients Set to 1 to automatically disconnect
938 * excess clients as soon as they connect if you are
939 * already handling client_limit clients. Set to 0
940 * (default) to just hold off on the "accept()"
941 * system call until the number of active clients
942 * drops. This causes the kernel to queue up to 4096
943 * connections (or your kernel's limit, whichever is
944 * lower).
945 *
946 * Beware that if you set this once ecore is already running, you may
947 * already have pending CLIENT_ADD events in your event queue. Those
948 * clients have already connected and will not be affected by this call.
949 * Only clients subsequently trying to connect will be affected.
950 */
951EAPI void ecore_con_server_client_limit_set(Ecore_Con_Server *svr,
952 int client_limit,
953 char reject_excess_clients);
954/**
955 * Gets the IP address of a server that has been connected to.
956 *
957 * @param svr The given server.
958 * @return A pointer to an internal string that contains the IP address of
959 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
960 * This string should not be modified or trusted to stay valid after
961 * deletion for the @p svr object. If no IP is known NULL is returned.
962 */
963EAPI const char * ecore_con_server_ip_get(Ecore_Con_Server *svr);
964/**
965 * Flushes all pending data to the given server.
966 *
967 * @param svr The given server.
968 *
969 * This function will block until all data is sent to the server.
970 *
971 * @see ecore_con_server_send()
972 * @see ecore_con_client_flush()
973 */
974EAPI void ecore_con_server_flush(Ecore_Con_Server *svr);
975/**
976 * Set the default time after which an inactive client will be disconnected
977 *
978 * @param svr The server object
979 * @param timeout The timeout, in seconds, to disconnect after
980 *
981 * This function is used by the server to set the default idle timeout on
982 * clients. If the any of the clients becomes idle for a time higher than this
983 * value, it will be disconnected. A value of < 1 disables the idle timeout.
984 *
985 * This timeout is not affected by the one set by
986 * ecore_con_client_timeout_set(). A client will be disconnected whenever the
987 * client or the server timeout is reached. That means, the lower timeout value
988 * will be used for that client if ecore_con_client_timeout_set() is used on it.
989 *
990 * @see ecore_con_server_timeout_get()
991 * @see ecore_con_client_timeout_set()
992 */
993EAPI void ecore_con_server_timeout_set(Ecore_Con_Server *svr, double timeout);
994/**
995 * Get the default time after which an inactive client will be disconnected
996 *
997 * @param svr The server object
998 * @return The timeout, in seconds, to disconnect after
999 *
1000 * This function is used to get the idle timeout for clients. A value of < 1
1001 * means the idle timeout is disabled.
1002 *
1003 * @see ecore_con_server_timeout_set()
1004 * @see ecore_con_client_timeout_get()
1005 */
1006EAPI double ecore_con_server_timeout_get(Ecore_Con_Server *svr);
1007
1008/**
1009 * Get the fd that the server is connected to
1010 *
1011 * @param svr The server object
1012 * @return The fd, or -1 on failure
1013 *
1014 * This function returns the fd which is used by the underlying server connection.
1015 * It should not be tampered with unless you REALLY know what you are doing.
1016 * @note This function is only valid for servers created with ecore_con_server_connect()
1017 * @warning Seriously. Don't use this unless you know what you are doing.
1018 * @since 1.1
1019 */
1020EAPI int ecore_con_server_fd_get(Ecore_Con_Server *svr);
1021
1022/**
1023 * Get the fd that the client is connected to
1024 *
1025 * @param cl The client object
1026 * @return The fd, or -1 on failure
1027 *
1028 * This function returns the fd which is used by the underlying client connection.
1029 * It should not be tampered with unless you REALLY know what you are doing.
1030 * @since 1.1
1031 */
1032EAPI int ecore_con_client_fd_get(Ecore_Con_Client *cl);
1033/**
1034 * @}
1035 */
1036
1037/**
1038 * @defgroup Ecore_Con_Client_Group Ecore Connection Client Functions
1039 *
1040 * Functions to communicate with and/or set options on a client.
1041 *
1042 * This set of functions, as explained in @ref Ecore_Con_Server_Group, is used
1043 * to send data to a client, or to set options and get information about this
1044 * client. Most of them should be used on the server, applied on the client
1045 * object.
1046 *
1047 * If you need to implement a client, the way to connect to a server is
1048 * described in @ref Ecore_Con_Server_Group.
1049 *
1050 * An example of usage of these functions can be found at:
1051 * @li @ref ecore_con_client_simple_example_c
1052 *
1053 * @{
1054 */
1055
1056/**
1057 * Sends the given data to the given client.
1058 *
1059 * @param cl The given client.
1060 * @param data The given data.
1061 * @param size Length of the data, in bytes, to send.
1062 * @return The number of bytes sent. @c 0 will be returned if there is an
1063 * error.
1064 *
1065 * This function will send the given data to the client as soon as the program
1066 * is back to the main loop. Thus, this function returns immediately
1067 * (non-blocking). If the data needs to be sent @b now, call
1068 * ecore_con_client_flush() after this one.
1069 *
1070 * @see ecore_con_server_send()
1071 * @see ecore_con_client_flush()
1072 */
1073EAPI int ecore_con_client_send(Ecore_Con_Client *cl,
1074 const void *data,
1075 int size);
1076/**
1077 * Retrieves the server representing the socket the client has
1078 * connected to.
1079 *
1080 * @param cl The given client.
1081 * @return The server that the client connected to.
1082 */
1083EAPI Ecore_Con_Server *ecore_con_client_server_get(Ecore_Con_Client *cl);
1084/**
1085 * Closes the connection and frees memory allocated to the given client.
1086 *
1087 * @param cl The given client.
1088 * @return Data associated with the client.
1089 */
1090EAPI void * ecore_con_client_del(Ecore_Con_Client *cl);
1091/**
1092 * Sets the data associated with the given client to @p data.
1093 *
1094 * @param cl The given client.
1095 * @param data What to set the data to.
1096 */
1097EAPI void ecore_con_client_data_set(Ecore_Con_Client *cl,
1098 const void *data);
1099/**
1100 * Retrieves the data associated with the given client.
1101 *
1102 * @param cl The given client.
1103 * @return The data associated with @p cl.
1104 */
1105EAPI void * ecore_con_client_data_get(Ecore_Con_Client *cl);
1106
1107/**
1108 * Gets the IP address of a client that has connected.
1109 *
1110 * @param cl The given client.
1111 * @return A pointer to an internal string that contains the IP address of
1112 * the connected client in the form "XXX.YYY.ZZZ.AAA" IP notation.
1113 *
1114 * The returned string should not be modified, freed or trusted to stay valid
1115 * after deletion for the @p cl object. If no IP is known NULL is returned.
1116 */
1117EAPI const char * ecore_con_client_ip_get(Ecore_Con_Client *cl);
1118/**
1119 * Flushes all pending data to the given client.
1120 *
1121 * @param cl The given client.
1122 *
1123 * This function will block until all data is sent to the server.
1124 *
1125 * @see ecore_con_client_send()
1126 * @see ecore_con_server_flush()
1127 */
1128EAPI void ecore_con_client_flush(Ecore_Con_Client *cl);
1129/**
1130 * @brief Check how long a client has been connected
1131 *
1132 * @param cl The client to check
1133 * @return The total time, in seconds, that the client has been connected to
1134 * the server
1135 *
1136 * This function is used to find out how long a client has been connected for.
1137 */
1138EAPI double ecore_con_client_uptime_get(Ecore_Con_Client *cl);
1139/**
1140 * Get the default time after which the client will be disconnected when
1141 * inactive
1142 *
1143 * @param cl The client object
1144 * @return The timeout, in seconds, to disconnect after
1145 *
1146 * This function is used to get the idle timeout for a client. A value of < 1
1147 * means the idle timeout is disabled.
1148 *
1149 * @see ecore_con_client_timeout_set()
1150 */
1151EAPI double ecore_con_client_timeout_get(Ecore_Con_Client *cl);
1152/**
1153 * Set the time after which the client will be disconnected when inactive
1154 *
1155 * @param cl The client object
1156 * @param timeout The timeout, in seconds, to disconnect after
1157 *
1158 * This function is used by the server to set the idle timeout on a specific
1159 * client. If the client becomes idle for a time higher than this value, it will
1160 * be disconnected. A value of < 1 disables the idle timeout.
1161 *
1162 * This timeout is not affected by the one set by
1163 * ecore_con_server_timeout_set(). A client will be disconnected whenever the
1164 * client or the server timeout is reached. That means, the lower timeout value
1165 * will be used for that client if ecore_con_server_timeout_set() is used on the
1166 * server.
1167 *
1168 * @see ecore_con_client_timeout_get()
1169 * @see ecore_con_server_timeout_set()
1170 */
1171EAPI void ecore_con_client_timeout_set(Ecore_Con_Client *cl, double timeout);
1172/**
1173 * Returns whether the client is still connected
1174 *
1175 * @param cl The given client.
1176 * @return #EINA_TRUE if connected, else EINA_FALSE
1177 */
1178EAPI Eina_Bool ecore_con_client_connected_get(Ecore_Con_Client *cl);
1179/**
1180 * @brief Return the port that the client has connected to
1181 *
1182 * @param cl The client
1183 * @return The port that @p cl has connected to, or -1 on error
1184 * Use this function to return the port on which a given client has connected.
1185 */
1186EAPI int ecore_con_client_port_get(Ecore_Con_Client *cl);
1187
1188/**
1189 * @}
1190 */
1191
1192/**
1193 * @defgroup Ecore_Con_Url_Group Ecore URL Connection Functions
1194 *
1195 * Utility functions that set up, use and shut down the Ecore URL
1196 * Connection library.
1197 *
1198 * These functions are a shortcut to make it easy to perform http requests
1199 * (POST, GET, etc).
1200 *
1201 * Brief usage:
1202 * 1. Create an Ecore_Con_Url object with ecore_con_url_new(url);
1203 * 2. Register to receive the #ECORE_CON_EVENT_URL_COMPLETE event
1204 * (and optionally the #ECORE_CON_EVENT_URL_DATA and
1205 * #ECORE_CON_EVENT_URL_PROGRESS event to receive
1206 * the response, e.g. for HTTP/FTP downloads)
1207 * 3. Perform the operation with ecore_con_url_get(...);
1208 *
1209 * Note that it is good to reuse @ref Ecore_Con_Url objects wherever possible,
1210 * but bear in mind that each one can only perform one operation at a time. You
1211 * need to wait for the #ECORE_CON_EVENT_URL_COMPLETE event before re-using or
1212 * destroying the object.
1213 *
1214 * If it's necessary to change the @ref Ecore_Con_Url object url, use
1215 * ecore_con_url_url_set().
1216 *
1217 * Simple Usage 1 (HTTP GET):
1218 * @code
1219 * ecore_con_url_url_set(url_con, "http://www.google.com");
1220 * ecore_con_url_get(url_con);
1221 * @endcode
1222 *
1223 * Simple usage 2 (HTTP POST):
1224 * @code
1225 * ecore_con_url_url_set(url_con, "http://www.example.com/post_handler.cgi");
1226 * ecore_con_url_post(url_con, data, data_length, "multipart/form-data");
1227 * @endcode
1228 *
1229 * Simple Usage 3 (FTP download):
1230 * @code
1231 * fd = creat(filename, 0644)
1232 * ecore_con_url_url_set(url_con, "ftp://ftp.example.com/pub/myfile");
1233 * ecore_con_url_fd_set(url_con, fd);
1234 * ecore_con_url_get(url_con);
1235 * @endcode
1236 *
1237 * Simple Usage 4 (FTP upload as ftp://ftp.example.com/file):
1238 * @code
1239 * ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
1240 * ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass", NULL);
1241 * @endcode
1242 *
1243 * Simple Usage 5 (FTP upload as ftp://ftp.example.com/dir/file):
1244 * @code
1245 * ecore_con_url_url_set(url_con, "ftp://ftp.example.com");
1246 * ecore_con_url_ftp_upload(url_con, "/tmp/file", "user", "pass","dir");
1247 * @endcode
1248 *
1249 * These are complete examples for the API:
1250 * @li @ref ecore_con_url_download_example.c "Downloading a file"
1251 * @li @ref ecore_con_url_headers_example.c "Setting many options for the
1252 * connection"
1253 *
1254 * @{
1255 */
1256
1257/**
1258 * @typedef Ecore_Con_Url_Time
1259 * @enum _Ecore_Con_Url_Time
1260 * The type of condition to use when making an HTTP request dependent on time,
1261 * so that headers such as "If-Modified-Since" are used.
1262 */
1263typedef enum _Ecore_Con_Url_Time
1264{
1265 /**
1266 * Do not place time restrictions on the HTTP requests.
1267 */
1268 ECORE_CON_URL_TIME_NONE = 0,
1269 /**
1270 * Add the "If-Modified-Since" HTTP header, so that the request is performed
1271 * by the server only if the target has been modified since the time value
1272 * passed to it in the request.
1273 */
1274 ECORE_CON_URL_TIME_IFMODSINCE,
1275 /**
1276 * Add the "If-Unmodified-Since" HTTP header, so that the request is
1277 * performed by the server only if the target has NOT been modified since
1278 * the time value passed to it in the request.
1279 */
1280 ECORE_CON_URL_TIME_IFUNMODSINCE
1281} Ecore_Con_Url_Time;
1282
1283/**
1284 * Initialises the Ecore_Con_Url library.
1285 * @return Number of times the library has been initialised without being
1286 * shut down.
1287 *
1288 * @note This function doesn't call ecore_con_init(). You still need to call it
1289 * explicitly before calling this one.
1290 */
1291EAPI int ecore_con_url_init(void);
1292
1293/**
1294 * Shuts down the Ecore_Con_Url library.
1295 * @return Number of calls that still uses Ecore_Con_Url
1296 *
1297 * @note This function doesn't call ecore_con_shutdown(). You still need to call
1298 * it explicitly after calling this one.
1299 */
1300EAPI int ecore_con_url_shutdown(void);
1301
1302/**
1303 * Enable or disable HTTP 1.1 pipelining.
1304 * @param enable EINA_TRUE will turn it on, EINA_FALSE will disable it.
1305 *
1306 * Pipelining allows to send one request after another one, without having to
1307 * wait for the reply of the first request. The respective replies are received
1308 * in the order that the requests were sent.
1309 *
1310 * Enabling this feature will be valid for all requests done using @c
1311 * ecore_con_url.
1312 *
1313 * See http://en.wikipedia.org/wiki/HTTP_pipelining for more info.
1314 *
1315 * @see ecore_con_url_pipeline_get()
1316 */
1317EAPI void ecore_con_url_pipeline_set(Eina_Bool enable);
1318/**
1319 * Is HTTP 1.1 pipelining enable ?
1320 * @return EINA_TRUE if it is enable.
1321 *
1322 * @see ecore_con_url_pipeline_set()
1323 */
1324EAPI Eina_Bool ecore_con_url_pipeline_get(void);
1325
1326/**
1327 * Creates and initializes a new Ecore_Con_Url connection object.
1328 *
1329 * @param url URL that will receive requests. Can be changed using
1330 * ecore_con_url_url_set.
1331 *
1332 * @return NULL on error, a new Ecore_Con_Url on success.
1333 *
1334 * Creates and initializes a new Ecore_Con_Url connection object that can be
1335 * used for sending requests.
1336 *
1337 * @see ecore_con_url_custom_new()
1338 * @see ecore_con_url_url_set()
1339 */
1340EAPI Ecore_Con_Url * ecore_con_url_new(const char *url);
1341/**
1342 * Creates a custom connection object.
1343 *
1344 * @param url URL that will receive requests
1345 * @param custom_request Custom request (e.g. GET, POST, HEAD, PUT, etc)
1346 *
1347 * @return NULL on error, a new Ecore_Con_Url on success.
1348 *
1349 * Creates and initializes a new Ecore_Con_Url for a custom request (e.g. HEAD,
1350 * SUBSCRIBE and other obscure HTTP requests). This object should be used like
1351 * one created with ecore_con_url_new().
1352 *
1353 * @see ecore_con_url_new()
1354 * @see ecore_con_url_url_set()
1355 */
1356EAPI Ecore_Con_Url * ecore_con_url_custom_new(const char *url,
1357 const char *custom_request);
1358/**
1359 * Destroys a Ecore_Con_Url connection object.
1360 *
1361 * @param url_con Connection object to free.
1362 *
1363 * @see ecore_con_url_new()
1364 */
1365EAPI void ecore_con_url_free(Ecore_Con_Url *url_con);
1366/**
1367 * Sets the URL to send the request to.
1368 *
1369 * @param url_con Connection object through which the request will be sent.
1370 * @param url URL that will receive the request
1371 *
1372 * @return EINA_TRUE on success, EINA_FALSE on error.
1373 *
1374 */
1375EAPI Eina_Bool ecore_con_url_url_set(Ecore_Con_Url *url_con,
1376 const char *url);
1377/**
1378 * Gets the URL to send the request to.
1379 *
1380 * @param url_con Connection object through which the request will be sent.
1381 * @return URL that will receive the request, NULL on failure. URL is stringshared.
1382 * @since 1.1
1383 */
1384EAPI const char *ecore_con_url_url_get(Ecore_Con_Url *url_con);
1385/**
1386 * Associates data with a connection object.
1387 *
1388 * @param url_con Connection object to associate data.
1389 * @param data Data to be set.
1390 *
1391 * Associates data with a connection object, which can be retrieved later with
1392 * ecore_con_url_data_get()).
1393 *
1394 * @see ecore_con_url_data_get()
1395 */
1396EAPI void ecore_con_url_data_set(Ecore_Con_Url *url_con,
1397 void *data);
1398/**
1399 * Retrieves data associated with a Ecore_Con_Url connection object.
1400 *
1401 * @param url_con Connection object to retrieve data from.
1402 *
1403 * @return Data associated with the given object.
1404 *
1405 * Retrieves data associated with a Ecore_Con_Url connection object (previously
1406 * set with ecore_con_url_data_set()).
1407 *
1408 * @see ecore_con_url_data_set()
1409 */
1410EAPI void * ecore_con_url_data_get(Ecore_Con_Url *url_con);
1411/**
1412 * Adds an additional header to the request connection object.
1413 *
1414 * @param url_con Connection object
1415 * @param key Header key
1416 * @param value Header value
1417 *
1418 * Adds an additional header (User-Agent, Content-Type, etc.) to the request
1419 * connection object. This addition will be valid for only one
1420 * ecore_con_url_get() or ecore_con_url_post() call.
1421 *
1422 * Some functions like ecore_con_url_time() also add headers to the request.
1423 *
1424 * @see ecore_con_url_get()
1425 * @see ecore_con_url_post()
1426 * @see ecore_con_url_additional_headers_clear()
1427 */
1428EAPI void ecore_con_url_additional_header_add(Ecore_Con_Url *url_con,
1429 const char *key,
1430 const char *value);
1431/**
1432 * Cleans additional headers.
1433 *
1434 * @param url_con Connection object to clean additional headers.
1435 *
1436 * Cleans additional headers associated with a connection object (previously
1437 * added with ecore_con_url_additional_header_add()).
1438 *
1439 * @see ecore_con_url_additional_header_add()
1440 * @see ecore_con_url_get()
1441 * @see ecore_con_url_post()
1442 */
1443EAPI void ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con);
1444/**
1445 * Retrieves headers from last request sent.
1446 *
1447 * @param url_con Connection object to retrieve response headers from.
1448 *
1449 * Retrieves a list containing the response headers. This function should be
1450 * used after an ECORE_CON_EVENT_URL_COMPLETE event (headers should normally be
1451 * ready at that time).
1452 *
1453 * @return List of response headers. This list must not be modified by the user.
1454 */
1455EAPI const Eina_List * ecore_con_url_response_headers_get(Ecore_Con_Url *url_con);
1456/**
1457 * Setup a file for receiving response data.
1458 *
1459 * @param url_con Connection object to set file
1460 * @param fd File descriptor associated with the file. A negative value will
1461 * unset any previously set fd.
1462 *
1463 * Sets up a file to have response data written into. Note that
1464 * ECORE_CON_EVENT_URL_DATA events will not be emitted if a file has been set to
1465 * receive the response data.
1466 *
1467 * This call can be used to easily setup a file where the downloaded data will
1468 * be saved.
1469 */
1470EAPI void ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd);
1471/**
1472 * Retrieves the number of bytes received.
1473 *
1474 * Retrieves the number of bytes received on the last request of the given
1475 * connection object.
1476 *
1477 * @param url_con Connection object which the request was sent on.
1478 *
1479 * @return Number of bytes received on request.
1480 *
1481 * @see ecore_con_url_get()
1482 * @see ecore_con_url_post()
1483 */
1484EAPI int ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con);
1485/**
1486 * Sets url_con to use http auth, with given username and password, "safely" or not.
1487 *
1488 * @param url_con Connection object to perform a request on, previously created
1489 * with ecore_con_url_new() or ecore_con_url_custom_new().
1490 * @param username Username to use in authentication
1491 * @param password Password to use in authentication
1492 * @param safe Whether to use "safer" methods (eg, NOT http basic auth)
1493 *
1494 * @return #EINA_TRUE on success, #EINA_FALSE on error.
1495 *
1496 * ATTENTION: requires libcurl >= 7.19.1 to work, otherwise will always return 0.
1497 */
1498EAPI Eina_Bool ecore_con_url_httpauth_set(Ecore_Con_Url *url_con,
1499 const char *username,
1500 const char *password,
1501 Eina_Bool safe);
1502/**
1503 * Sends a request.
1504 *
1505 * @param url_con Connection object to perform a request on, previously created
1506 * with ecore_con_url_new() or ecore_con_url_custom_new().
1507 * @param data Payload (data sent on the request)
1508 * @param length Payload length. If @c -1, rely on automatic length
1509 * calculation via @c strlen() on @p data.
1510 * @param content_type Content type of the payload (e.g. text/xml)
1511 *
1512 * @return #EINA_TRUE on success, #EINA_FALSE on error.
1513 *
1514 * @see ecore_con_url_custom_new()
1515 * @see ecore_con_url_additional_headers_clear()
1516 * @see ecore_con_url_additional_header_add()
1517 * @see ecore_con_url_data_set()
1518 * @see ecore_con_url_data_get()
1519 * @see ecore_con_url_response_headers_get()
1520 * @see ecore_con_url_time()
1521 * @see ecore_con_url_get()
1522 * @see ecore_con_url_post()
1523 *
1524 * @deprecated Use ecore_con_url_post() instead of this.
1525 */
1526EINA_DEPRECATED EAPI Eina_Bool ecore_con_url_send(Ecore_Con_Url *url_con,
1527 const void *data, long length,
1528 const char *content_type);
1529/**
1530 * Sends a get request.
1531 *
1532 * @param url_con Connection object to perform a request on, previously created
1533 *
1534 * @return #EINA_TRUE on success, #EINA_FALSE on error.
1535 *
1536 * The request is performed immediately, but you need to setup event handlers
1537 * for #ECORE_CON_EVENT_URL_DATA, #ECORE_CON_EVENT_URL_COMPLETE or
1538 * #ECORE_CON_EVENT_URL_PROGRESS to get more information about its result.
1539 *
1540 * @see ecore_con_url_custom_new()
1541 * @see ecore_con_url_additional_headers_clear()
1542 * @see ecore_con_url_additional_header_add()
1543 * @see ecore_con_url_data_set()
1544 * @see ecore_con_url_data_get()
1545 * @see ecore_con_url_response_headers_get()
1546 * @see ecore_con_url_time()
1547 * @see ecore_con_url_post()
1548 */
1549EAPI Eina_Bool ecore_con_url_get(Ecore_Con_Url *url_con);
1550/**
1551 * Sends a post request.
1552 *
1553 * @param url_con Connection object to perform a request on, previously created
1554 * with ecore_con_url_new() or ecore_con_url_custom_new().
1555 * @param data Payload (data sent on the request). Can be @c NULL.
1556 * @param length Payload length. If @c -1, rely on automatic length
1557 * calculation via @c strlen() on @p data.
1558 * @param content_type Content type of the payload (e.g. text/xml). Can be @c
1559 * NULL.
1560 *
1561 * @return #EINA_TRUE on success, #EINA_FALSE on error.
1562 *
1563 * The request starts immediately, but you need to setup event handlers
1564 * for #ECORE_CON_EVENT_URL_DATA, #ECORE_CON_EVENT_URL_COMPLETE or
1565 * #ECORE_CON_EVENT_URL_PROGRESS to get more information about its result.
1566 *
1567 * This call won't block your main loop.
1568 *
1569 * @see ecore_con_url_custom_new()
1570 * @see ecore_con_url_additional_headers_clear()
1571 * @see ecore_con_url_additional_header_add()
1572 * @see ecore_con_url_data_set()
1573 * @see ecore_con_url_data_get()
1574 * @see ecore_con_url_response_headers_get()
1575 * @see ecore_con_url_time()
1576 * @see ecore_con_url_get()
1577 */
1578EAPI Eina_Bool ecore_con_url_post(Ecore_Con_Url *url_con,
1579 const void *data, long length,
1580 const char *content_type);
1581/**
1582 * Sets whether HTTP requests should be conditional, dependent on
1583 * modification time.
1584 *
1585 * @param url_con Ecore_Con_Url to act upon.
1586 * @param condition Condition to use for HTTP requests.
1587 * @param timestamp Time since 1 Jan 1970 to use in the condition.
1588 *
1589 * This function may set the header "If-Modified-Since" or
1590 * "If-Unmodified-Since", depending on the value of @p time_condition, with the
1591 * value @p timestamp.
1592 *
1593 * @sa ecore_con_url_get()
1594 * @sa ecore_con_url_post()
1595 */
1596EAPI void ecore_con_url_time(Ecore_Con_Url *url_con,
1597 Ecore_Con_Url_Time time_condition,
1598 double timestamp);
1599
1600/**
1601 * @brief Uploads a file to an ftp site.
1602 * @param url_con The Ecore_Con_Url object to send with
1603 * @param filename The path to the file to send
1604 * @param user The username to log in with
1605 * @param pass The password to log in with
1606 * @param upload_dir The directory to which the file should be uploaded
1607 * @return #EINA_TRUE on success, else #EINA_FALSE.
1608 * Upload @p filename to an ftp server set in @p url_con using @p user
1609 * and @p pass to directory @p upload_dir
1610 */
1611EAPI Eina_Bool ecore_con_url_ftp_upload(Ecore_Con_Url *url_con,
1612 const char *filename,
1613 const char *user,
1614 const char *pass,
1615 const char *upload_dir);
1616/**
1617 * Toggle libcurl's verbose output.
1618 *
1619 * @param url_con Ecore_Con_Url instance which will be acted upon.
1620 * @param verbose Whether or not to enable libcurl's verbose output.
1621 *
1622 * If @p verbose is @c EINA_TRUE, libcurl will output a lot of verbose
1623 * information about its operations, which is useful for
1624 * debugging. The verbose information will be sent to stderr.
1625 */
1626EAPI void ecore_con_url_verbose_set(Ecore_Con_Url *url_con,
1627 Eina_Bool verbose);
1628/**
1629 * Enable or disable EPSV extension
1630 * @return FIXME: To be more documented.
1631 */
1632EAPI void ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con,
1633 Eina_Bool use_epsv);
1634
1635/**
1636 * Enables the cookie engine for subsequent HTTP requests.
1637 *
1638 * @param url_con Ecore_Con_Url instance which will be acted upon.
1639 *
1640 * After this function is called, cookies set by the server in HTTP responses
1641 * will be parsed and stored, as well as sent back to the server in new HTTP
1642 * requests.
1643 *
1644 * @note Even though this function is called @c ecore_con_url_cookies_init(),
1645 * there is no symmetrical shutdown operation.
1646 */
1647EAPI void ecore_con_url_cookies_init(Ecore_Con_Url *url_con);
1648/**
1649 * Controls whether session cookies from previous sessions shall be loaded.
1650 *
1651 * @param url_con Ecore_Con_Url instance which will be acted upon.
1652 * @param ignore If @c EINA_TRUE, ignore session cookies when loading cookies
1653 * from files. If @c EINA_FALSE, all cookies will be loaded.
1654 *
1655 * Session cookies are cookies with no expire date set, which usually means
1656 * they are removed after the current session is closed.
1657 *
1658 * By default, when Ecore_Con_Url loads cookies from a file, all cookies are
1659 * loaded, including session cookies, which, most of the time, were supposed
1660 * to be loaded and valid only for that session.
1661 *
1662 * If @p ignore is set to @c EINA_TRUE, when Ecore_Con_Url loads cookies from
1663 * the files passed to @c ecore_con_url_cookies_file_add(), session cookies
1664 * will not be loaded.
1665 *
1666 * @see ecore_con_url_cookies_file_add()
1667 */
1668EAPI void ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con,
1669 Eina_Bool ignore);
1670/**
1671 * Clears currently loaded cookies.
1672 * @param url_con Ecore_Con_Url instance which will be acted upon.
1673 *
1674 * The cleared cookies are removed and will not be sent in subsequent HTTP
1675 * requests, nor will they be written to the cookiejar file set via
1676 * @c ecore_con_url_cookies_jar_file_set().
1677 *
1678 * @note This function will initialize the cookie engine if it has not been
1679 * initialized yet.
1680 * @note The cookie files set by ecore_con_url_cookies_file_add() aren't loaded
1681 * immediately, just when the request is started. Thus, if you ask to
1682 * clear the cookies, but has a file already set by that function, the
1683 * cookies will then be loaded and you will have old cookies set. In order
1684 * to don't have any old cookie set, you need to don't call
1685 * ecore_con_url_cookies_file_add() ever on the @p url_con handler, and
1686 * call this function to clear any cookie set by a previous request on
1687 * this handler.
1688 *
1689 * @see ecore_con_url_cookies_session_clear()
1690 * @see ecore_con_url_cookies_ignore_old_session_set()
1691 */
1692EAPI void ecore_con_url_cookies_clear(Ecore_Con_Url *url_con);
1693/**
1694 * Clears currently loaded session cookies.
1695 *
1696 * @param url_con Ecore_Con_Url instance which will be acted upon.
1697 *
1698 * Session cookies are cookies with no expire date set, which usually means
1699 * they are removed after the current session is closed.
1700 *
1701 * The cleared cookies are removed and will not be sent in subsequent HTTP
1702 * requests, nor will they be written to the cookiejar file set via
1703 * @c ecore_con_url_cookies_jar_file_set().
1704 *
1705 * @note This function will initialize the cookie engine if it has not been
1706 * initialized yet.
1707 * @note The cookie files set by ecore_con_url_cookies_file_add() aren't loaded
1708 * immediately, just when the request is started. Thus, if you ask to
1709 * clear the session cookies, but has a file already set by that function,
1710 * the session cookies will then be loaded and you will have old cookies
1711 * set. In order to don't have any old session cookie set, you need to
1712 * don't call ecore_con_url_cookies_file_add() ever on the @p url_con
1713 * handler, and call this function to clear any session cookie set by a
1714 * previous request on this handler. An easier way to don't use old
1715 * session cookies is by using the function
1716 * ecore_con_url_cookies_ignore_old_session_set().
1717 *
1718 * @see ecore_con_url_cookies_clear()
1719 * @see ecore_con_url_cookies_ignore_old_session_set()
1720 */
1721EAPI void ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con);
1722/**
1723 * Adds a file to the list of files from which to load cookies.
1724 *
1725 * @param url_con Ecore_Con_Url instance which will be acted upon.
1726 * @param file_name Name of the file that will be added to the list.
1727 *
1728 * Files must contain cookies defined according to two possible formats:
1729 *
1730 * @li HTTP-style header ("Set-Cookie: ...").
1731 * @li <a href="http://www.cookiecentral.com/faq/#3.5">Netscape/Mozilla cookie data format.</a>
1732 *
1733 * Cookies will only be @b read from this file. If you want to save cookies to a
1734 * file, use ecore_con_url_cookies_jar_file_set(). Also notice that this
1735 * function supports the both types of cookie file cited above, while
1736 * ecore_con_url_cookies_jar_file_set() will save only in the Netscape/Mozilla's
1737 * format.
1738 *
1739 * Please notice that the file will not be read immediately, but rather added
1740 * to a list of files that will be loaded and parsed at a later time.
1741 *
1742 * @note This function will initialize the cookie engine if it has not been
1743 * initialized yet.
1744 *
1745 * @see ecore_con_url_cookies_ignore_old_session_set()
1746 * @see ecore_con_url_cookies_jar_file_set()
1747 */
1748EAPI void ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con,
1749 const char * const file_name);
1750/**
1751 * Sets the name of the file to which all current cookies will be written when
1752 * either cookies are flushed or Ecore_Con is shut down.
1753 *
1754 * @param url_con Ecore_Con_Url instance which will be acted upon.
1755 * @param cookiejar_file File to which the cookies will be written.
1756 *
1757 * @return @c EINA_TRUE is the file name has been set successfully,
1758 * @c EINA_FALSE otherwise.
1759 *
1760 * Cookies are written following Netscape/Mozilla's data format, also known as
1761 * cookie-jar.
1762 *
1763 * Cookies will only be @b saved to this file. If you need to read cookies from
1764 * a file, use ecore_con_url_cookies_file_add() instead.
1765 *
1766 * @note This function will initialize the cookie engine if it has not been
1767 * initialized yet.
1768 *
1769 * @see ecore_con_url_cookies_jar_write()
1770 */
1771EAPI Eina_Bool ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con,
1772 const char * const cookiejar_file);
1773/**
1774 * Writes all current cookies to the cookie jar immediately.
1775 *
1776 * @param url_con Ecore_Con_Url instance which will be acted upon.
1777 *
1778 * A cookie-jar file must have been previously set by
1779 * @c ecore_con_url_jar_file_set, otherwise nothing will be done.
1780 *
1781 * @note This function will initialize the cookie engine if it has not been
1782 * initialized yet.
1783 *
1784 * @see ecore_con_url_cookies_jar_file_set()
1785 */
1786EAPI void ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con);
1787
1788EAPI void ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con,
1789 Eina_Bool verify);
1790EAPI int ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con,
1791 const char *ca_path);
1792
1793/**
1794 * @}
1795 */
1796
1797#ifdef __cplusplus
1798}
1799#endif
1800
1801#endif
diff --git a/libraries/ecore/src/lib/ecore_con/Makefile.am b/libraries/ecore/src/lib/ecore_con/Makefile.am
new file mode 100644
index 0000000..300586d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/Makefile.am
@@ -0,0 +1,45 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_builddir)/src/lib/ecore \
5-I$(top_builddir)/src/lib/ecore_con \
6-I$(top_srcdir)/src/lib/ecore \
7-I$(top_srcdir)/src/lib/ecore_con \
8@EFL_ECORE_CON_BUILD@ \
9@SSL_CFLAGS@ \
10@CURL_CFLAGS@ \
11@EINA_CFLAGS@ \
12@TLS_CFLAGS@ \
13@CARES_CFLAGS@ \
14@WIN32_CPPFLAGS@
15
16lib_LTLIBRARIES = libecore_con.la
17includes_HEADERS = Ecore_Con.h
18includesdir = $(includedir)/ecore-@VMAJ@
19
20libecore_con_la_SOURCES = \
21ecore_con.c \
22ecore_con_ssl.c \
23ecore_con_url.c \
24ecore_con_alloc.c
25
26if ECORE_HAVE_WIN32
27libecore_con_la_SOURCES += ecore_con_local_win32.c
28else
29libecore_con_la_SOURCES += ecore_con_local.c
30endif
31
32if HAVE_CARES
33libecore_con_la_SOURCES += ecore_con_ares.c
34else
35libecore_con_la_SOURCES += ecore_con_info.c
36endif
37
38libecore_con_la_CFLAGS = @WIN32_CFLAGS@
39libecore_con_la_LIBADD = \
40$(top_builddir)/src/lib/ecore/libecore.la \
41@SSL_LIBS@ @CURL_LIBS@ @EINA_LIBS@ @TLS_LIBS@ @CARES_LIBS@ @WIN32_LIBS@
42
43libecore_con_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
44
45EXTRA_DIST = ecore_con_private.h
diff --git a/libraries/ecore/src/lib/ecore_con/Makefile.in b/libraries/ecore/src/lib/ecore_con/Makefile.in
new file mode 100644
index 0000000..5940a83
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/Makefile.in
@@ -0,0 +1,909 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38@ECORE_HAVE_WIN32_TRUE@am__append_1 = ecore_con_local_win32.c
39@ECORE_HAVE_WIN32_FALSE@am__append_2 = ecore_con_local.c
40@HAVE_CARES_TRUE@am__append_3 = ecore_con_ares.c
41@HAVE_CARES_FALSE@am__append_4 = ecore_con_info.c
42subdir = src/lib/ecore_con
43DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
44 $(srcdir)/Makefile.in
45ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
46am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
47 $(top_srcdir)/m4/ac_path_generic.m4 \
48 $(top_srcdir)/m4/check_x_extension.m4 \
49 $(top_srcdir)/m4/ecore_check_module.m4 \
50 $(top_srcdir)/m4/ecore_check_options.m4 \
51 $(top_srcdir)/m4/efl_compiler_flag.m4 \
52 $(top_srcdir)/m4/efl_doxygen.m4 \
53 $(top_srcdir)/m4/efl_examples.m4 \
54 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
55 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
56 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
57 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
58 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
59 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
60 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
61 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
62 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
63 $(top_srcdir)/configure.ac
64am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
65 $(ACLOCAL_M4)
66mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
67CONFIG_HEADER = $(top_builddir)/config.h
68CONFIG_CLEAN_FILES =
69CONFIG_CLEAN_VPATH_FILES =
70am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
71am__vpath_adj = case $$p in \
72 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
73 *) f=$$p;; \
74 esac;
75am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
76am__install_max = 40
77am__nobase_strip_setup = \
78 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
79am__nobase_strip = \
80 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
81am__nobase_list = $(am__nobase_strip_setup); \
82 for p in $$list; do echo "$$p $$p"; done | \
83 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
84 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
85 if (++n[$$2] == $(am__install_max)) \
86 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
87 END { for (dir in files) print dir, files[dir] }'
88am__base_list = \
89 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
90 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
91am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
92LTLIBRARIES = $(lib_LTLIBRARIES)
93libecore_con_la_DEPENDENCIES = \
94 $(top_builddir)/src/lib/ecore/libecore.la
95am__libecore_con_la_SOURCES_DIST = ecore_con.c ecore_con_ssl.c \
96 ecore_con_url.c ecore_con_alloc.c ecore_con_local_win32.c \
97 ecore_con_local.c ecore_con_ares.c ecore_con_info.c
98@ECORE_HAVE_WIN32_TRUE@am__objects_1 = libecore_con_la-ecore_con_local_win32.lo
99@ECORE_HAVE_WIN32_FALSE@am__objects_2 = \
100@ECORE_HAVE_WIN32_FALSE@ libecore_con_la-ecore_con_local.lo
101@HAVE_CARES_TRUE@am__objects_3 = libecore_con_la-ecore_con_ares.lo
102@HAVE_CARES_FALSE@am__objects_4 = libecore_con_la-ecore_con_info.lo
103am_libecore_con_la_OBJECTS = libecore_con_la-ecore_con.lo \
104 libecore_con_la-ecore_con_ssl.lo \
105 libecore_con_la-ecore_con_url.lo \
106 libecore_con_la-ecore_con_alloc.lo $(am__objects_1) \
107 $(am__objects_2) $(am__objects_3) $(am__objects_4)
108libecore_con_la_OBJECTS = $(am_libecore_con_la_OBJECTS)
109AM_V_lt = $(am__v_lt_$(V))
110am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
111am__v_lt_0 = --silent
112libecore_con_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
113 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
114 $(libecore_con_la_CFLAGS) $(CFLAGS) $(libecore_con_la_LDFLAGS) \
115 $(LDFLAGS) -o $@
116DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
117depcomp = $(SHELL) $(top_srcdir)/depcomp
118am__depfiles_maybe = depfiles
119am__mv = mv -f
120COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
121 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
122LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
123 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
124 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
125 $(AM_CFLAGS) $(CFLAGS)
126AM_V_CC = $(am__v_CC_$(V))
127am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
128am__v_CC_0 = @echo " CC " $@;
129AM_V_at = $(am__v_at_$(V))
130am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
131am__v_at_0 = @
132CCLD = $(CC)
133LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
134 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
135 $(AM_LDFLAGS) $(LDFLAGS) -o $@
136AM_V_CCLD = $(am__v_CCLD_$(V))
137am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
138am__v_CCLD_0 = @echo " CCLD " $@;
139AM_V_GEN = $(am__v_GEN_$(V))
140am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
141am__v_GEN_0 = @echo " GEN " $@;
142SOURCES = $(libecore_con_la_SOURCES)
143DIST_SOURCES = $(am__libecore_con_la_SOURCES_DIST)
144HEADERS = $(includes_HEADERS)
145ETAGS = etags
146CTAGS = ctags
147DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
148ACLOCAL = @ACLOCAL@
149ALLOCA = @ALLOCA@
150AMTAR = @AMTAR@
151AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
152AR = @AR@
153AS = @AS@
154AUTOCONF = @AUTOCONF@
155AUTOHEADER = @AUTOHEADER@
156AUTOMAKE = @AUTOMAKE@
157AWK = @AWK@
158CARES_CFLAGS = @CARES_CFLAGS@
159CARES_LIBS = @CARES_LIBS@
160CC = @CC@
161CCDEPMODE = @CCDEPMODE@
162CFLAGS = @CFLAGS@
163CHECK_CFLAGS = @CHECK_CFLAGS@
164CHECK_LIBS = @CHECK_LIBS@
165CPP = @CPP@
166CPPFLAGS = @CPPFLAGS@
167CURL_CFLAGS = @CURL_CFLAGS@
168CURL_LIBS = @CURL_LIBS@
169CXX = @CXX@
170CXXCPP = @CXXCPP@
171CXXDEPMODE = @CXXDEPMODE@
172CXXFLAGS = @CXXFLAGS@
173CYGPATH_W = @CYGPATH_W@
174DEFS = @DEFS@
175DEPDIR = @DEPDIR@
176DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
177DIRECTFB_LIBS = @DIRECTFB_LIBS@
178DLLTOOL = @DLLTOOL@
179DSYMUTIL = @DSYMUTIL@
180DUMPBIN = @DUMPBIN@
181ECHO_C = @ECHO_C@
182ECHO_N = @ECHO_N@
183ECHO_T = @ECHO_T@
184ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
185ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
186EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
187EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
188EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
189EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
190EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
191EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
192EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
193EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
194EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
195EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
196EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
197EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
198EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
199EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
200EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
201EGREP = @EGREP@
202EINA_CFLAGS = @EINA_CFLAGS@
203EINA_LIBS = @EINA_LIBS@
204ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
205ESCAPE_LIBS = @ESCAPE_LIBS@
206EVAS_CFLAGS = @EVAS_CFLAGS@
207EVAS_LIBS = @EVAS_LIBS@
208EVIL_CFLAGS = @EVIL_CFLAGS@
209EVIL_LIBS = @EVIL_LIBS@
210EXEEXT = @EXEEXT@
211FGREP = @FGREP@
212GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
213GLIB_CFLAGS = @GLIB_CFLAGS@
214GLIB_LIBS = @GLIB_LIBS@
215GMSGFMT = @GMSGFMT@
216GMSGFMT_015 = @GMSGFMT_015@
217GREP = @GREP@
218INSTALL = @INSTALL@
219INSTALL_DATA = @INSTALL_DATA@
220INSTALL_PROGRAM = @INSTALL_PROGRAM@
221INSTALL_SCRIPT = @INSTALL_SCRIPT@
222INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
223INTLLIBS = @INTLLIBS@
224INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
225KEYSYMDEFS = @KEYSYMDEFS@
226LD = @LD@
227LDFLAGS = @LDFLAGS@
228LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
229LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
230LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
231LIBICONV = @LIBICONV@
232LIBINTL = @LIBINTL@
233LIBOBJS = @LIBOBJS@
234LIBS = @LIBS@
235LIBTOOL = @LIBTOOL@
236LIPO = @LIPO@
237LN_S = @LN_S@
238LTLIBICONV = @LTLIBICONV@
239LTLIBINTL = @LTLIBINTL@
240LTLIBOBJS = @LTLIBOBJS@
241MAKEINFO = @MAKEINFO@
242MKDIR_P = @MKDIR_P@
243MSGFMT = @MSGFMT@
244MSGFMT_015 = @MSGFMT_015@
245MSGMERGE = @MSGMERGE@
246NM = @NM@
247NMEDIT = @NMEDIT@
248OBJC = @OBJC@
249OBJCDEPMODE = @OBJCDEPMODE@
250OBJCFLAGS = @OBJCFLAGS@
251OBJDUMP = @OBJDUMP@
252OBJEXT = @OBJEXT@
253OTOOL = @OTOOL@
254OTOOL64 = @OTOOL64@
255PACKAGE = @PACKAGE@
256PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
257PACKAGE_NAME = @PACKAGE_NAME@
258PACKAGE_STRING = @PACKAGE_STRING@
259PACKAGE_TARNAME = @PACKAGE_TARNAME@
260PACKAGE_URL = @PACKAGE_URL@
261PACKAGE_VERSION = @PACKAGE_VERSION@
262PATH_SEPARATOR = @PATH_SEPARATOR@
263PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
264PIXMAN_LIBS = @PIXMAN_LIBS@
265PKG_CONFIG = @PKG_CONFIG@
266PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
267PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
268POSUB = @POSUB@
269RANLIB = @RANLIB@
270SDL_CFLAGS = @SDL_CFLAGS@
271SDL_CONFIG = @SDL_CONFIG@
272SDL_LIBS = @SDL_LIBS@
273SED = @SED@
274SET_MAKE = @SET_MAKE@
275SHELL = @SHELL@
276SSL_CFLAGS = @SSL_CFLAGS@
277SSL_LIBS = @SSL_LIBS@
278STRIP = @STRIP@
279TLS2_CFLAGS = @TLS2_CFLAGS@
280TLS2_LIBS = @TLS2_LIBS@
281TLS_CFLAGS = @TLS_CFLAGS@
282TLS_LIBS = @TLS_LIBS@
283TSLIB_CFLAGS = @TSLIB_CFLAGS@
284TSLIB_LIBS = @TSLIB_LIBS@
285USE_NLS = @USE_NLS@
286VERSION = @VERSION@
287VMAJ = @VMAJ@
288WIN32_CFLAGS = @WIN32_CFLAGS@
289WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
290WIN32_LIBS = @WIN32_LIBS@
291XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
292XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
293XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
294XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
295XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
296XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
297XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
298XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
299XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
300XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
301XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
302XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
303XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
304XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
305XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
306XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
307XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
308XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
309XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
310XCB_X11_LIBS = @XCB_X11_LIBS@
311XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
312XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
313XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
314XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
315XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
316XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
317XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
318XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
319XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
320XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
321XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
322XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
323XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
324XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
325XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
326XDAMAGE_LIBS = @XDAMAGE_LIBS@
327XDPMS_CFLAGS = @XDPMS_CFLAGS@
328XDPMS_LIBS = @XDPMS_LIBS@
329XFIXES_CFLAGS = @XFIXES_CFLAGS@
330XFIXES_LIBS = @XFIXES_LIBS@
331XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
332XGESTURE_LIBS = @XGESTURE_LIBS@
333XGETTEXT = @XGETTEXT@
334XGETTEXT_015 = @XGETTEXT_015@
335XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
336XI2_CFLAGS = @XI2_CFLAGS@
337XI2_LIBS = @XI2_LIBS@
338XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
339XINERAMA_LIBS = @XINERAMA_LIBS@
340XKB_CFLAGS = @XKB_CFLAGS@
341XKB_LIBS = @XKB_LIBS@
342XMKMF = @XMKMF@
343XPRINT_CFLAGS = @XPRINT_CFLAGS@
344XPRINT_LIBS = @XPRINT_LIBS@
345XRANDR_CFLAGS = @XRANDR_CFLAGS@
346XRANDR_LIBS = @XRANDR_LIBS@
347XRENDER_CFLAGS = @XRENDER_CFLAGS@
348XRENDER_LIBS = @XRENDER_LIBS@
349XSS_CFLAGS = @XSS_CFLAGS@
350XSS_LIBS = @XSS_LIBS@
351XTEST_CFLAGS = @XTEST_CFLAGS@
352XTEST_LIBS = @XTEST_LIBS@
353X_CFLAGS = @X_CFLAGS@
354X_EXTRA_LIBS = @X_EXTRA_LIBS@
355X_LIBS = @X_LIBS@
356X_PRE_LIBS = @X_PRE_LIBS@
357Xcursor_cflags = @Xcursor_cflags@
358Xcursor_libs = @Xcursor_libs@
359abs_builddir = @abs_builddir@
360abs_srcdir = @abs_srcdir@
361abs_top_builddir = @abs_top_builddir@
362abs_top_srcdir = @abs_top_srcdir@
363ac_ct_CC = @ac_ct_CC@
364ac_ct_CXX = @ac_ct_CXX@
365ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
366ac_ct_OBJC = @ac_ct_OBJC@
367am__include = @am__include@
368am__leading_dot = @am__leading_dot@
369am__quote = @am__quote@
370am__tar = @am__tar@
371am__untar = @am__untar@
372bindir = @bindir@
373build = @build@
374build_alias = @build_alias@
375build_cpu = @build_cpu@
376build_os = @build_os@
377build_vendor = @build_vendor@
378builddir = @builddir@
379cocoa_ldflags = @cocoa_ldflags@
380datadir = @datadir@
381datarootdir = @datarootdir@
382dlopen_libs = @dlopen_libs@
383docdir = @docdir@
384dvidir = @dvidir@
385ecore_cocoa_cflags = @ecore_cocoa_cflags@
386ecore_cocoa_libs = @ecore_cocoa_libs@
387ecore_con_cflags = @ecore_con_cflags@
388ecore_con_libs = @ecore_con_libs@
389ecore_directfb_cflags = @ecore_directfb_cflags@
390ecore_directfb_libs = @ecore_directfb_libs@
391ecore_evas_cflags = @ecore_evas_cflags@
392ecore_evas_libs = @ecore_evas_libs@
393ecore_fb_cflags = @ecore_fb_cflags@
394ecore_fb_libs = @ecore_fb_libs@
395ecore_file_cflags = @ecore_file_cflags@
396ecore_file_libs = @ecore_file_libs@
397ecore_imf_cflags = @ecore_imf_cflags@
398ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
399ecore_imf_evas_libs = @ecore_imf_evas_libs@
400ecore_imf_libs = @ecore_imf_libs@
401ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
402ecore_imf_xim_libs = @ecore_imf_xim_libs@
403ecore_input_cflags = @ecore_input_cflags@
404ecore_input_evas_cflags = @ecore_input_evas_cflags@
405ecore_input_evas_libs = @ecore_input_evas_libs@
406ecore_input_libs = @ecore_input_libs@
407ecore_ipc_cflags = @ecore_ipc_cflags@
408ecore_ipc_libs = @ecore_ipc_libs@
409ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
410ecore_psl1ght_libs = @ecore_psl1ght_libs@
411ecore_sdl_cflags = @ecore_sdl_cflags@
412ecore_sdl_libs = @ecore_sdl_libs@
413ecore_win32_cflags = @ecore_win32_cflags@
414ecore_win32_libs = @ecore_win32_libs@
415ecore_wince_cflags = @ecore_wince_cflags@
416ecore_wince_libs = @ecore_wince_libs@
417ecore_x_cflags = @ecore_x_cflags@
418ecore_x_libs = @ecore_x_libs@
419ecore_x_libs_private = @ecore_x_libs_private@
420efl_doxygen = @efl_doxygen@
421efl_have_doxygen = @efl_have_doxygen@
422exec_prefix = @exec_prefix@
423have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
424host = @host@
425host_alias = @host_alias@
426host_cpu = @host_cpu@
427host_os = @host_os@
428host_vendor = @host_vendor@
429htmldir = @htmldir@
430includedir = @includedir@
431infodir = @infodir@
432install_sh = @install_sh@
433libdir = @libdir@
434libexecdir = @libexecdir@
435localedir = @localedir@
436localstatedir = @localstatedir@
437lt_ECHO = @lt_ECHO@
438lt_enable_auto_import = @lt_enable_auto_import@
439mandir = @mandir@
440mkdir_p = @mkdir_p@
441oldincludedir = @oldincludedir@
442pdfdir = @pdfdir@
443pkgconfig_requires_private = @pkgconfig_requires_private@
444prefix = @prefix@
445program_transform_name = @program_transform_name@
446psdir = @psdir@
447release_info = @release_info@
448requirements_ecore = @requirements_ecore@
449requirements_ecore_cocoa = @requirements_ecore_cocoa@
450requirements_ecore_con = @requirements_ecore_con@
451requirements_ecore_directfb = @requirements_ecore_directfb@
452requirements_ecore_evas = @requirements_ecore_evas@
453requirements_ecore_fb = @requirements_ecore_fb@
454requirements_ecore_file = @requirements_ecore_file@
455requirements_ecore_imf = @requirements_ecore_imf@
456requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
457requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
458requirements_ecore_input = @requirements_ecore_input@
459requirements_ecore_input_evas = @requirements_ecore_input_evas@
460requirements_ecore_ipc = @requirements_ecore_ipc@
461requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
462requirements_ecore_sdl = @requirements_ecore_sdl@
463requirements_ecore_win32 = @requirements_ecore_win32@
464requirements_ecore_wince = @requirements_ecore_wince@
465requirements_ecore_x = @requirements_ecore_x@
466rt_libs = @rt_libs@
467sbindir = @sbindir@
468sharedstatedir = @sharedstatedir@
469srcdir = @srcdir@
470sysconfdir = @sysconfdir@
471target_alias = @target_alias@
472top_build_prefix = @top_build_prefix@
473top_builddir = @top_builddir@
474top_srcdir = @top_srcdir@
475version_info = @version_info@
476x_cflags = @x_cflags@
477x_includes = @x_includes@
478x_libs = @x_libs@
479MAINTAINERCLEANFILES = Makefile.in
480AM_CPPFLAGS = \
481-I$(top_builddir)/src/lib/ecore \
482-I$(top_builddir)/src/lib/ecore_con \
483-I$(top_srcdir)/src/lib/ecore \
484-I$(top_srcdir)/src/lib/ecore_con \
485@EFL_ECORE_CON_BUILD@ \
486@SSL_CFLAGS@ \
487@CURL_CFLAGS@ \
488@EINA_CFLAGS@ \
489@TLS_CFLAGS@ \
490@CARES_CFLAGS@ \
491@WIN32_CPPFLAGS@
492
493lib_LTLIBRARIES = libecore_con.la
494includes_HEADERS = Ecore_Con.h
495includesdir = $(includedir)/ecore-@VMAJ@
496libecore_con_la_SOURCES = ecore_con.c ecore_con_ssl.c ecore_con_url.c \
497 ecore_con_alloc.c $(am__append_1) $(am__append_2) \
498 $(am__append_3) $(am__append_4)
499libecore_con_la_CFLAGS = @WIN32_CFLAGS@
500libecore_con_la_LIBADD = \
501$(top_builddir)/src/lib/ecore/libecore.la \
502@SSL_LIBS@ @CURL_LIBS@ @EINA_LIBS@ @TLS_LIBS@ @CARES_LIBS@ @WIN32_LIBS@
503
504libecore_con_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
505EXTRA_DIST = ecore_con_private.h
506all: all-am
507
508.SUFFIXES:
509.SUFFIXES: .c .lo .o .obj
510$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
511 @for dep in $?; do \
512 case '$(am__configure_deps)' in \
513 *$$dep*) \
514 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
515 && { if test -f $@; then exit 0; else break; fi; }; \
516 exit 1;; \
517 esac; \
518 done; \
519 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_con/Makefile'; \
520 $(am__cd) $(top_srcdir) && \
521 $(AUTOMAKE) --gnu src/lib/ecore_con/Makefile
522.PRECIOUS: Makefile
523Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
524 @case '$?' in \
525 *config.status*) \
526 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
527 *) \
528 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
529 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
530 esac;
531
532$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
533 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
534
535$(top_srcdir)/configure: $(am__configure_deps)
536 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
537$(ACLOCAL_M4): $(am__aclocal_m4_deps)
538 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
539$(am__aclocal_m4_deps):
540install-libLTLIBRARIES: $(lib_LTLIBRARIES)
541 @$(NORMAL_INSTALL)
542 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
543 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
544 list2=; for p in $$list; do \
545 if test -f $$p; then \
546 list2="$$list2 $$p"; \
547 else :; fi; \
548 done; \
549 test -z "$$list2" || { \
550 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
551 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
552 }
553
554uninstall-libLTLIBRARIES:
555 @$(NORMAL_UNINSTALL)
556 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
557 for p in $$list; do \
558 $(am__strip_dir) \
559 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
560 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
561 done
562
563clean-libLTLIBRARIES:
564 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
565 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
566 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
567 test "$$dir" != "$$p" || dir=.; \
568 echo "rm -f \"$${dir}/so_locations\""; \
569 rm -f "$${dir}/so_locations"; \
570 done
571libecore_con.la: $(libecore_con_la_OBJECTS) $(libecore_con_la_DEPENDENCIES)
572 $(AM_V_CCLD)$(libecore_con_la_LINK) -rpath $(libdir) $(libecore_con_la_OBJECTS) $(libecore_con_la_LIBADD) $(LIBS)
573
574mostlyclean-compile:
575 -rm -f *.$(OBJEXT)
576
577distclean-compile:
578 -rm -f *.tab.c
579
580@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con.Plo@am__quote@
581@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_alloc.Plo@am__quote@
582@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_ares.Plo@am__quote@
583@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_info.Plo@am__quote@
584@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_local.Plo@am__quote@
585@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_local_win32.Plo@am__quote@
586@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_ssl.Plo@am__quote@
587@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libecore_con_la-ecore_con_url.Plo@am__quote@
588
589.c.o:
590@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
591@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
592@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
593@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
594@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
595@am__fastdepCC_FALSE@ $(COMPILE) -c $<
596
597.c.obj:
598@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
599@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
600@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
601@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
602@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
603@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
604
605.c.lo:
606@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
607@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
608@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
609@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
610@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
611@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
612
613libecore_con_la-ecore_con.lo: ecore_con.c
614@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con.Tpo -c -o libecore_con_la-ecore_con.lo `test -f 'ecore_con.c' || echo '$(srcdir)/'`ecore_con.c
615@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con.Tpo $(DEPDIR)/libecore_con_la-ecore_con.Plo
616@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
617@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con.c' object='libecore_con_la-ecore_con.lo' libtool=yes @AMDEPBACKSLASH@
618@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
619@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con.lo `test -f 'ecore_con.c' || echo '$(srcdir)/'`ecore_con.c
620
621libecore_con_la-ecore_con_ssl.lo: ecore_con_ssl.c
622@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_ssl.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_ssl.Tpo -c -o libecore_con_la-ecore_con_ssl.lo `test -f 'ecore_con_ssl.c' || echo '$(srcdir)/'`ecore_con_ssl.c
623@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_ssl.Tpo $(DEPDIR)/libecore_con_la-ecore_con_ssl.Plo
624@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
625@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_ssl.c' object='libecore_con_la-ecore_con_ssl.lo' libtool=yes @AMDEPBACKSLASH@
626@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
627@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_ssl.lo `test -f 'ecore_con_ssl.c' || echo '$(srcdir)/'`ecore_con_ssl.c
628
629libecore_con_la-ecore_con_url.lo: ecore_con_url.c
630@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_url.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_url.Tpo -c -o libecore_con_la-ecore_con_url.lo `test -f 'ecore_con_url.c' || echo '$(srcdir)/'`ecore_con_url.c
631@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_url.Tpo $(DEPDIR)/libecore_con_la-ecore_con_url.Plo
632@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
633@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_url.c' object='libecore_con_la-ecore_con_url.lo' libtool=yes @AMDEPBACKSLASH@
634@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
635@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_url.lo `test -f 'ecore_con_url.c' || echo '$(srcdir)/'`ecore_con_url.c
636
637libecore_con_la-ecore_con_alloc.lo: ecore_con_alloc.c
638@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_alloc.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_alloc.Tpo -c -o libecore_con_la-ecore_con_alloc.lo `test -f 'ecore_con_alloc.c' || echo '$(srcdir)/'`ecore_con_alloc.c
639@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_alloc.Tpo $(DEPDIR)/libecore_con_la-ecore_con_alloc.Plo
640@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
641@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_alloc.c' object='libecore_con_la-ecore_con_alloc.lo' libtool=yes @AMDEPBACKSLASH@
642@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
643@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_alloc.lo `test -f 'ecore_con_alloc.c' || echo '$(srcdir)/'`ecore_con_alloc.c
644
645libecore_con_la-ecore_con_local_win32.lo: ecore_con_local_win32.c
646@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_local_win32.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_local_win32.Tpo -c -o libecore_con_la-ecore_con_local_win32.lo `test -f 'ecore_con_local_win32.c' || echo '$(srcdir)/'`ecore_con_local_win32.c
647@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_local_win32.Tpo $(DEPDIR)/libecore_con_la-ecore_con_local_win32.Plo
648@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
649@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_local_win32.c' object='libecore_con_la-ecore_con_local_win32.lo' libtool=yes @AMDEPBACKSLASH@
650@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
651@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_local_win32.lo `test -f 'ecore_con_local_win32.c' || echo '$(srcdir)/'`ecore_con_local_win32.c
652
653libecore_con_la-ecore_con_local.lo: ecore_con_local.c
654@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_local.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_local.Tpo -c -o libecore_con_la-ecore_con_local.lo `test -f 'ecore_con_local.c' || echo '$(srcdir)/'`ecore_con_local.c
655@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_local.Tpo $(DEPDIR)/libecore_con_la-ecore_con_local.Plo
656@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
657@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_local.c' object='libecore_con_la-ecore_con_local.lo' libtool=yes @AMDEPBACKSLASH@
658@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
659@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_local.lo `test -f 'ecore_con_local.c' || echo '$(srcdir)/'`ecore_con_local.c
660
661libecore_con_la-ecore_con_ares.lo: ecore_con_ares.c
662@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_ares.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_ares.Tpo -c -o libecore_con_la-ecore_con_ares.lo `test -f 'ecore_con_ares.c' || echo '$(srcdir)/'`ecore_con_ares.c
663@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_ares.Tpo $(DEPDIR)/libecore_con_la-ecore_con_ares.Plo
664@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
665@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_ares.c' object='libecore_con_la-ecore_con_ares.lo' libtool=yes @AMDEPBACKSLASH@
666@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
667@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_ares.lo `test -f 'ecore_con_ares.c' || echo '$(srcdir)/'`ecore_con_ares.c
668
669libecore_con_la-ecore_con_info.lo: ecore_con_info.c
670@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -MT libecore_con_la-ecore_con_info.lo -MD -MP -MF $(DEPDIR)/libecore_con_la-ecore_con_info.Tpo -c -o libecore_con_la-ecore_con_info.lo `test -f 'ecore_con_info.c' || echo '$(srcdir)/'`ecore_con_info.c
671@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libecore_con_la-ecore_con_info.Tpo $(DEPDIR)/libecore_con_la-ecore_con_info.Plo
672@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
673@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ecore_con_info.c' object='libecore_con_la-ecore_con_info.lo' libtool=yes @AMDEPBACKSLASH@
674@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
675@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libecore_con_la_CFLAGS) $(CFLAGS) -c -o libecore_con_la-ecore_con_info.lo `test -f 'ecore_con_info.c' || echo '$(srcdir)/'`ecore_con_info.c
676
677mostlyclean-libtool:
678 -rm -f *.lo
679
680clean-libtool:
681 -rm -rf .libs _libs
682install-includesHEADERS: $(includes_HEADERS)
683 @$(NORMAL_INSTALL)
684 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
685 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
686 for p in $$list; do \
687 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
688 echo "$$d$$p"; \
689 done | $(am__base_list) | \
690 while read files; do \
691 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
692 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
693 done
694
695uninstall-includesHEADERS:
696 @$(NORMAL_UNINSTALL)
697 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
698 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
699 test -n "$$files" || exit 0; \
700 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
701 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
702
703ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
704 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
705 unique=`for i in $$list; do \
706 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
707 done | \
708 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
709 END { if (nonempty) { for (i in files) print i; }; }'`; \
710 mkid -fID $$unique
711tags: TAGS
712
713TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
714 $(TAGS_FILES) $(LISP)
715 set x; \
716 here=`pwd`; \
717 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
718 unique=`for i in $$list; do \
719 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
720 done | \
721 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
722 END { if (nonempty) { for (i in files) print i; }; }'`; \
723 shift; \
724 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
725 test -n "$$unique" || unique=$$empty_fix; \
726 if test $$# -gt 0; then \
727 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
728 "$$@" $$unique; \
729 else \
730 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
731 $$unique; \
732 fi; \
733 fi
734ctags: CTAGS
735CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
736 $(TAGS_FILES) $(LISP)
737 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
738 unique=`for i in $$list; do \
739 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
740 done | \
741 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
742 END { if (nonempty) { for (i in files) print i; }; }'`; \
743 test -z "$(CTAGS_ARGS)$$unique" \
744 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
745 $$unique
746
747GTAGS:
748 here=`$(am__cd) $(top_builddir) && pwd` \
749 && $(am__cd) $(top_srcdir) \
750 && gtags -i $(GTAGS_ARGS) "$$here"
751
752distclean-tags:
753 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
754
755distdir: $(DISTFILES)
756 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
757 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
758 list='$(DISTFILES)'; \
759 dist_files=`for file in $$list; do echo $$file; done | \
760 sed -e "s|^$$srcdirstrip/||;t" \
761 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
762 case $$dist_files in \
763 */*) $(MKDIR_P) `echo "$$dist_files" | \
764 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
765 sort -u` ;; \
766 esac; \
767 for file in $$dist_files; do \
768 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
769 if test -d $$d/$$file; then \
770 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
771 if test -d "$(distdir)/$$file"; then \
772 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
773 fi; \
774 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
775 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
776 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
777 fi; \
778 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
779 else \
780 test -f "$(distdir)/$$file" \
781 || cp -p $$d/$$file "$(distdir)/$$file" \
782 || exit 1; \
783 fi; \
784 done
785check-am: all-am
786check: check-am
787all-am: Makefile $(LTLIBRARIES) $(HEADERS)
788installdirs:
789 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
790 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
791 done
792install: install-am
793install-exec: install-exec-am
794install-data: install-data-am
795uninstall: uninstall-am
796
797install-am: all-am
798 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
799
800installcheck: installcheck-am
801install-strip:
802 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
803 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
804 `test -z '$(STRIP)' || \
805 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
806mostlyclean-generic:
807
808clean-generic:
809
810distclean-generic:
811 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
812 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
813
814maintainer-clean-generic:
815 @echo "This command is intended for maintainers to use"
816 @echo "it deletes files that may require special tools to rebuild."
817 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
818clean: clean-am
819
820clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
821 mostlyclean-am
822
823distclean: distclean-am
824 -rm -rf ./$(DEPDIR)
825 -rm -f Makefile
826distclean-am: clean-am distclean-compile distclean-generic \
827 distclean-tags
828
829dvi: dvi-am
830
831dvi-am:
832
833html: html-am
834
835html-am:
836
837info: info-am
838
839info-am:
840
841install-data-am: install-includesHEADERS
842
843install-dvi: install-dvi-am
844
845install-dvi-am:
846
847install-exec-am: install-libLTLIBRARIES
848
849install-html: install-html-am
850
851install-html-am:
852
853install-info: install-info-am
854
855install-info-am:
856
857install-man:
858
859install-pdf: install-pdf-am
860
861install-pdf-am:
862
863install-ps: install-ps-am
864
865install-ps-am:
866
867installcheck-am:
868
869maintainer-clean: maintainer-clean-am
870 -rm -rf ./$(DEPDIR)
871 -rm -f Makefile
872maintainer-clean-am: distclean-am maintainer-clean-generic
873
874mostlyclean: mostlyclean-am
875
876mostlyclean-am: mostlyclean-compile mostlyclean-generic \
877 mostlyclean-libtool
878
879pdf: pdf-am
880
881pdf-am:
882
883ps: ps-am
884
885ps-am:
886
887uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
888
889.MAKE: install-am install-strip
890
891.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
892 clean-libLTLIBRARIES clean-libtool ctags distclean \
893 distclean-compile distclean-generic distclean-libtool \
894 distclean-tags distdir dvi dvi-am html html-am info info-am \
895 install install-am install-data install-data-am install-dvi \
896 install-dvi-am install-exec install-exec-am install-html \
897 install-html-am install-includesHEADERS install-info \
898 install-info-am install-libLTLIBRARIES install-man install-pdf \
899 install-pdf-am install-ps install-ps-am install-strip \
900 installcheck installcheck-am installdirs maintainer-clean \
901 maintainer-clean-generic mostlyclean mostlyclean-compile \
902 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
903 tags uninstall uninstall-am uninstall-includesHEADERS \
904 uninstall-libLTLIBRARIES
905
906
907# Tell versions [3.59,3.63) of GNU make to not export all variables.
908# Otherwise a system limit (for SysV at least) may be exceeded.
909.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con.c b/libraries/ecore/src/lib/ecore_con/ecore_con.c
new file mode 100644
index 0000000..7bd0358
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con.c
@@ -0,0 +1,2600 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7#include <sys/types.h>
8#include <sys/stat.h>
9#include <errno.h>
10#include <unistd.h>
11#include <fcntl.h>
12
13#ifdef HAVE_NETINET_TCP_H
14# include <netinet/tcp.h>
15#endif
16
17#ifdef HAVE_NETINET_IN_H
18# include <netinet/in.h>
19#endif
20
21#ifdef HAVE_ARPA_INET_H
22# include <arpa/inet.h>
23#endif
24
25#ifdef HAVE_SYS_SOCKET_H
26# include <sys/socket.h>
27#endif
28
29#ifdef HAVE_SYS_UN_H
30# include <sys/un.h>
31#endif
32
33#ifdef HAVE_WS2TCPIP_H
34# include <ws2tcpip.h>
35#endif
36
37#ifdef HAVE_EVIL
38# include <Evil.h>
39#endif
40
41#include "Ecore.h"
42#include "ecore_private.h"
43#include "Ecore_Con.h"
44#include "ecore_con_private.h"
45
46static Eina_Bool _ecore_con_client_timer(Ecore_Con_Client *cl);
47static void _ecore_con_cl_timer_update(Ecore_Con_Client *cl);
48
49static Eina_Bool _ecore_con_server_timer(Ecore_Con_Server *svr);
50static void _ecore_con_server_timer_update(Ecore_Con_Server *svr);
51
52static void _ecore_con_cb_tcp_connect(void *data,
53 Ecore_Con_Info *info);
54static void _ecore_con_cb_udp_connect(void *data,
55 Ecore_Con_Info *info);
56static void _ecore_con_cb_tcp_listen(void *data,
57 Ecore_Con_Info *info);
58static void _ecore_con_cb_udp_listen(void *data,
59 Ecore_Con_Info *info);
60
61static void _ecore_con_server_free(Ecore_Con_Server *svr);
62static void _ecore_con_client_free(Ecore_Con_Client *cl);
63
64static void _ecore_con_cl_read(Ecore_Con_Server *svr);
65static Eina_Bool _ecore_con_svr_tcp_handler(void *data,
66 Ecore_Fd_Handler *fd_handler);
67static Eina_Bool _ecore_con_cl_handler(void *data,
68 Ecore_Fd_Handler *fd_handler);
69static Eina_Bool _ecore_con_cl_udp_handler(void *data,
70 Ecore_Fd_Handler *fd_handler);
71static Eina_Bool _ecore_con_svr_udp_handler(void *data,
72 Ecore_Fd_Handler *fd_handler);
73
74static void _ecore_con_svr_cl_read(Ecore_Con_Client *cl);
75static Eina_Bool _ecore_con_svr_cl_handler(void *data,
76 Ecore_Fd_Handler *fd_handler);
77
78static void _ecore_con_server_flush(Ecore_Con_Server *svr);
79static void _ecore_con_client_flush(Ecore_Con_Client *cl);
80
81static void _ecore_con_event_client_add_free(Ecore_Con_Server *svr,
82 void *ev);
83static void _ecore_con_event_client_del_free(Ecore_Con_Server *svr,
84 void *ev);
85static void _ecore_con_event_client_data_free(Ecore_Con_Server *svr,
86 void *ev);
87static void _ecore_con_event_server_add_free(void *data,
88 void *ev);
89static void _ecore_con_event_server_del_free(void *data,
90 void *ev);
91static void _ecore_con_event_server_data_free(void *data,
92 void *ev);
93static void _ecore_con_event_server_error_free(void *data,
94 Ecore_Con_Event_Server_Error *e);
95static void _ecore_con_event_client_error_free(Ecore_Con_Server *svr,
96 Ecore_Con_Event_Client_Error *e);
97static void _ecore_con_event_server_write_free(void *data,
98 Ecore_Con_Event_Server_Write *e);
99static void _ecore_con_event_client_write_free(Ecore_Con_Server *svr,
100 Ecore_Con_Event_Client_Write *e);
101
102static void _ecore_con_lookup_done(void *data,
103 Ecore_Con_Info *infos);
104
105static const char * _ecore_con_pretty_ip(struct sockaddr *client_addr);
106
107EAPI int ECORE_CON_EVENT_CLIENT_ADD = 0;
108EAPI int ECORE_CON_EVENT_CLIENT_DEL = 0;
109EAPI int ECORE_CON_EVENT_SERVER_ADD = 0;
110EAPI int ECORE_CON_EVENT_SERVER_DEL = 0;
111EAPI int ECORE_CON_EVENT_CLIENT_DATA = 0;
112EAPI int ECORE_CON_EVENT_SERVER_DATA = 0;
113EAPI int ECORE_CON_EVENT_CLIENT_WRITE = 0;
114EAPI int ECORE_CON_EVENT_SERVER_WRITE = 0;
115EAPI int ECORE_CON_EVENT_CLIENT_ERROR = 0;
116EAPI int ECORE_CON_EVENT_SERVER_ERROR = 0;
117
118static Eina_List *servers = NULL;
119static int _ecore_con_init_count = 0;
120static int _ecore_con_event_count = 0;
121int _ecore_con_log_dom = -1;
122
123EAPI int
124ecore_con_init(void)
125{
126 if (++_ecore_con_init_count != 1)
127 return _ecore_con_init_count;
128
129#ifdef HAVE_EVIL
130 if (!evil_init())
131 return --_ecore_con_init_count;
132
133#endif
134
135 if (!ecore_init())
136 return --_ecore_con_init_count;
137
138 _ecore_con_log_dom = eina_log_domain_register
139 ("ecore_con", ECORE_CON_DEFAULT_LOG_COLOR);
140 if (_ecore_con_log_dom < 0)
141 {
142 EINA_LOG_ERR("Impossible to create a log domain for Ecore Con.");
143 ecore_shutdown();
144 return --_ecore_con_init_count;
145 }
146
147 ecore_con_mempool_init();
148
149 ECORE_CON_EVENT_CLIENT_ADD = ecore_event_type_new();
150 ECORE_CON_EVENT_CLIENT_DEL = ecore_event_type_new();
151 ECORE_CON_EVENT_SERVER_ADD = ecore_event_type_new();
152 ECORE_CON_EVENT_SERVER_DEL = ecore_event_type_new();
153 ECORE_CON_EVENT_CLIENT_DATA = ecore_event_type_new();
154 ECORE_CON_EVENT_SERVER_DATA = ecore_event_type_new();
155 ECORE_CON_EVENT_CLIENT_WRITE = ecore_event_type_new();
156 ECORE_CON_EVENT_SERVER_WRITE = ecore_event_type_new();
157 ECORE_CON_EVENT_CLIENT_ERROR = ecore_event_type_new();
158 ECORE_CON_EVENT_SERVER_ERROR = ecore_event_type_new();
159
160
161 eina_magic_string_set(ECORE_MAGIC_CON_SERVER, "Ecore_Con_Server");
162 eina_magic_string_set(ECORE_MAGIC_CON_CLIENT, "Ecore_Con_Server");
163 eina_magic_string_set(ECORE_MAGIC_CON_URL, "Ecore_Con_Url");
164
165 /* TODO Remember return value, if it fails, use gethostbyname() */
166 ecore_con_ssl_init();
167 ecore_con_info_init();
168
169 return _ecore_con_init_count;
170}
171
172EAPI int
173ecore_con_shutdown(void)
174{
175 Eina_List *l, *l2;
176 Ecore_Con_Server *svr;
177
178 if (--_ecore_con_init_count != 0)
179 return _ecore_con_init_count;
180
181 EINA_LIST_FOREACH_SAFE(servers, l, l2, svr)
182 {
183 Ecore_Con_Event_Server_Add *ev;
184
185 svr->delete_me = svr->dead = EINA_TRUE;
186 /* some pointer hacks here to prevent double frees if people are being stupid */
187 EINA_LIST_FREE(svr->event_count, ev)
188 ev->server = NULL;
189 _ecore_con_server_free(svr);
190 }
191
192 if (!_ecore_con_event_count) ecore_con_mempool_shutdown();
193
194 ecore_con_info_shutdown();
195 ecore_con_ssl_shutdown();
196 eina_log_domain_unregister(_ecore_con_log_dom);
197 _ecore_con_log_dom = -1;
198 ecore_shutdown();
199#ifdef HAVE_EVIL
200 evil_shutdown();
201#endif
202
203 return _ecore_con_init_count;
204}
205
206EAPI Eina_Bool
207ecore_con_lookup(const char *name,
208 Ecore_Con_Dns_Cb done_cb,
209 const void *data)
210{
211 Ecore_Con_Server *svr;
212 Ecore_Con_Lookup *lk;
213 struct addrinfo hints;
214
215 if (!name || !done_cb)
216 return EINA_FALSE;
217
218 svr = calloc(1, sizeof(Ecore_Con_Server));
219 if (!svr)
220 return EINA_FALSE;
221
222 lk = malloc(sizeof (Ecore_Con_Lookup));
223 if (!lk)
224 {
225 free(svr);
226 return EINA_FALSE;
227 }
228
229 lk->done_cb = done_cb;
230 lk->data = data;
231
232 svr->name = strdup(name);
233 if (!svr->name)
234 goto on_error;
235
236 svr->type = ECORE_CON_REMOTE_TCP;
237 svr->port = 1025;
238 svr->data = lk;
239 svr->created = EINA_TRUE;
240 svr->reject_excess_clients = EINA_FALSE;
241 svr->client_limit = -1;
242 svr->clients = NULL;
243 svr->ppid = getpid();
244
245 memset(&hints, 0, sizeof(struct addrinfo));
246 hints.ai_family = AF_UNSPEC;
247 hints.ai_socktype = SOCK_STREAM;
248 hints.ai_flags = AI_CANONNAME;
249 hints.ai_protocol = IPPROTO_TCP;
250 hints.ai_canonname = NULL;
251 hints.ai_next = NULL;
252 hints.ai_addr = NULL;
253
254 if (ecore_con_info_get(svr, _ecore_con_lookup_done, svr,
255 &hints))
256 return EINA_TRUE;
257
258 free(svr->name);
259on_error:
260 free(lk);
261 free(svr);
262 return EINA_FALSE;
263}
264
265/**
266 * @addtogroup Ecore_Con_Server_Group Ecore Connection Server Functions
267 *
268 * Functions that operate on Ecore server objects.
269 *
270 * @{
271 */
272
273/**
274 * @example ecore_con_server_example.c
275 * Shows how to write a simple server using the Ecore_Con library.
276 */
277
278EAPI Ecore_Con_Server *
279ecore_con_server_add(Ecore_Con_Type compl_type,
280 const char *name,
281 int port,
282 const void *data)
283{
284 Ecore_Con_Server *svr;
285 Ecore_Con_Type type;
286
287 if (port < 0 || !name)
288 return NULL; /* local user socket: FILE: ~/.ecore/[name]/[port] */
289
290 /* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */
291 /* remote system socket: TCP/IP: [name]:[port] */
292 svr = calloc(1, sizeof(Ecore_Con_Server));
293 if (!svr)
294 return NULL;
295
296 svr->name = strdup(name);
297 if (!svr->name)
298 goto error;
299
300 svr->type = compl_type;
301 svr->port = port;
302 svr->data = (void *)data;
303 svr->created = EINA_TRUE;
304 if (compl_type & ECORE_CON_LOAD_CERT)
305 svr->use_cert = EINA_TRUE;
306 svr->reject_excess_clients = EINA_FALSE;
307 svr->client_limit = -1;
308 svr->clients = NULL;
309 svr->ppid = getpid();
310 if (ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL))
311 goto error;
312
313 type = compl_type & ECORE_CON_TYPE;
314
315 if ((type == ECORE_CON_LOCAL_USER) ||
316 (type == ECORE_CON_LOCAL_SYSTEM) ||
317 (type == ECORE_CON_LOCAL_ABSTRACT))
318 /* Local */
319#ifdef _WIN32
320 if (!ecore_con_local_listen(svr))
321 goto error;
322#else
323 if (!ecore_con_local_listen(svr, _ecore_con_svr_tcp_handler, svr))
324 goto error;
325#endif
326
327 if ((type == ECORE_CON_REMOTE_TCP) ||
328 (type == ECORE_CON_REMOTE_NODELAY))
329 {
330 /* TCP */
331 if (!ecore_con_info_tcp_listen(svr, _ecore_con_cb_tcp_listen,
332 svr))
333 goto error;
334 }
335 else if ((type == ECORE_CON_REMOTE_MCAST) ||
336 (type == ECORE_CON_REMOTE_UDP))
337 /* UDP and MCAST */
338 if (!ecore_con_info_udp_listen(svr, _ecore_con_cb_udp_listen,
339 svr))
340 goto error;
341
342 servers = eina_list_append(servers, svr);
343 ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
344
345 return svr;
346
347error:
348 if (svr->name)
349 free(svr->name);
350
351 if (svr->path)
352 free(svr->path);
353
354
355 if (svr->fd_handler)
356 ecore_main_fd_handler_del(svr->fd_handler);
357
358 if (svr->fd > 0)
359 close(svr->fd);
360
361 if (svr->buf)
362 eina_binbuf_free(svr->buf);
363
364 if (svr->ip)
365 eina_stringshare_del(svr->ip);
366
367 ecore_con_ssl_server_shutdown(svr);
368 free(svr);
369 return NULL;
370}
371
372EAPI Ecore_Con_Server *
373ecore_con_server_connect(Ecore_Con_Type compl_type,
374 const char *name,
375 int port,
376 const void *data)
377{
378 Ecore_Con_Server *svr;
379 Ecore_Con_Type type;
380
381 if ((!name) || (!name[0]))
382 return NULL;
383 /* local user socket: FILE: ~/.ecore/[name]/[port] */
384 /* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */
385 /* remote system socket: TCP/IP: [name]:[port] */
386 svr = calloc(1, sizeof(Ecore_Con_Server));
387 if (!svr)
388 return NULL;
389
390 svr->name = strdup(name);
391 if (!svr->name)
392 goto error;
393
394 svr->type = compl_type;
395 svr->port = port;
396 svr->data = (void *)data;
397 svr->created = EINA_FALSE;
398 svr->use_cert = (compl_type & ECORE_CON_LOAD_CERT);
399 svr->reject_excess_clients = EINA_FALSE;
400 svr->clients = NULL;
401 svr->client_limit = -1;
402 if (ecore_con_ssl_server_prepare(svr, compl_type & ECORE_CON_SSL))
403 goto error;
404
405 type = compl_type & ECORE_CON_TYPE;
406
407 if (((type == ECORE_CON_REMOTE_TCP) ||
408 (type == ECORE_CON_REMOTE_NODELAY) ||
409 (type == ECORE_CON_REMOTE_UDP) ||
410 (type == ECORE_CON_REMOTE_BROADCAST)) &&
411 (port < 0))
412 goto error;
413
414 if ((type == ECORE_CON_LOCAL_USER) ||
415 (type == ECORE_CON_LOCAL_SYSTEM) ||
416 (type == ECORE_CON_LOCAL_ABSTRACT))
417 /* Local */
418#ifdef _WIN32
419 if (!ecore_con_local_connect(svr, _ecore_con_cl_handler))
420 goto error;
421#else
422 if (!ecore_con_local_connect(svr, _ecore_con_cl_handler, svr))
423 goto error;
424#endif
425
426 if ((type == ECORE_CON_REMOTE_TCP) ||
427 (type == ECORE_CON_REMOTE_NODELAY))
428 {
429 /* TCP */
430 if (!ecore_con_info_tcp_connect(svr, _ecore_con_cb_tcp_connect,
431 svr))
432 goto error;
433 }
434 else if ((type == ECORE_CON_REMOTE_UDP) ||
435 (type == ECORE_CON_REMOTE_BROADCAST))
436 /* UDP and MCAST */
437 if (!ecore_con_info_udp_connect(svr, _ecore_con_cb_udp_connect,
438 svr))
439 goto error;
440
441 servers = eina_list_append(servers, svr);
442 ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER);
443
444 return svr;
445
446error:
447 if (svr->name)
448 free(svr->name);
449
450 if (svr->path)
451 free(svr->path);
452
453 if (svr->fd_handler)
454 ecore_main_fd_handler_del(svr->fd_handler);
455
456 if (svr->fd > 0)
457 close(svr->fd);
458
459 ecore_con_ssl_server_shutdown(svr);
460 free(svr);
461 return NULL;
462}
463
464EAPI void
465ecore_con_server_timeout_set(Ecore_Con_Server *svr,
466 double timeout)
467{
468 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
469 {
470 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_set");
471 return;
472 }
473
474 if (svr->created)
475 svr->client_disconnect_time = timeout;
476 else
477 svr->disconnect_time = timeout;
478}
479
480EAPI double
481ecore_con_server_timeout_get(Ecore_Con_Server *svr)
482{
483 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
484 {
485 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_timeout_get");
486 return 0;
487 }
488
489 return svr->created ? svr->client_disconnect_time : svr->disconnect_time;
490}
491
492EAPI void *
493ecore_con_server_del(Ecore_Con_Server *svr)
494{
495 void *data;
496
497 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
498 {
499 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_del");
500 return NULL;
501 }
502
503 if (svr->delete_me)
504 return NULL;
505
506 data = svr->data;
507 svr->delete_me = EINA_TRUE;
508 if (svr->event_count)
509 {
510 if (svr->fd_handler)
511 {
512 ecore_main_fd_handler_del(svr->fd_handler);
513 svr->fd_handler = NULL;
514 }
515 }
516 else
517 _ecore_con_server_free(svr);
518
519 return data;
520}
521
522EAPI void *
523ecore_con_server_data_get(Ecore_Con_Server *svr)
524{
525 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
526 {
527 ECORE_MAGIC_FAIL(svr,
528 ECORE_MAGIC_CON_SERVER,
529 "ecore_con_server_data_get");
530 return NULL;
531 }
532
533 return svr->data;
534}
535
536EAPI void *
537ecore_con_server_data_set(Ecore_Con_Server *svr,
538 void *data)
539{
540 void *ret = NULL;
541
542 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
543 {
544 ECORE_MAGIC_FAIL(svr,
545 ECORE_MAGIC_CON_SERVER,
546 "ecore_con_server_data_get");
547 return NULL;
548 }
549
550 ret = svr->data;
551 svr->data = data;
552 return ret;
553}
554
555EAPI Eina_Bool
556ecore_con_server_connected_get(Ecore_Con_Server *svr)
557{
558 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
559 {
560 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
561 "ecore_con_server_connected_get");
562 return EINA_FALSE;
563 }
564
565 if (svr->connecting)
566 return EINA_FALSE;
567
568 return EINA_TRUE;
569}
570
571EAPI const Eina_List *
572ecore_con_server_clients_get(Ecore_Con_Server *svr)
573{
574 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
575 {
576 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
577 "ecore_con_server_clients_get");
578 return NULL;
579 }
580
581 return svr->clients;
582}
583
584EAPI const char *
585ecore_con_server_name_get(Ecore_Con_Server *svr)
586{
587 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
588 {
589 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
590 "ecore_con_server_name_get");
591 return NULL;
592 }
593
594 return svr->name;
595}
596
597EAPI int
598ecore_con_server_port_get(Ecore_Con_Server *svr)
599{
600 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
601 {
602 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
603 "ecore_con_server_port_get");
604 return -1;
605 }
606 return svr->port;
607}
608
609EAPI int
610ecore_con_server_send(Ecore_Con_Server *svr,
611 const void *data,
612 int size)
613{
614 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
615 {
616 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_send");
617 return 0;
618 }
619
620 EINA_SAFETY_ON_TRUE_RETURN_VAL(svr->dead, 0);
621
622 EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0);
623
624 EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0);
625
626 if (svr->fd_handler)
627 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
628
629 if (!svr->buf)
630 {
631 svr->buf = eina_binbuf_new();
632 EINA_SAFETY_ON_NULL_RETURN_VAL(svr->buf, 0);
633 }
634 eina_binbuf_append_length(svr->buf, data, size);
635
636 return size;
637}
638
639EAPI void
640ecore_con_server_client_limit_set(Ecore_Con_Server *svr,
641 int client_limit,
642 char reject_excess_clients)
643{
644 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
645 {
646 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER,
647 "ecore_con_server_client_limit_set");
648 return;
649 }
650
651 svr->client_limit = client_limit;
652 svr->reject_excess_clients = reject_excess_clients;
653}
654
655EAPI const char *
656ecore_con_server_ip_get(Ecore_Con_Server *svr)
657{
658 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
659 {
660 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_ip_get");
661 return NULL;
662 }
663
664 return svr->ip;
665}
666
667EAPI double
668ecore_con_server_uptime_get(Ecore_Con_Server *svr)
669{
670 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
671 {
672 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_uptime_get");
673 return -1;
674 }
675
676 return ecore_time_get() - svr->start_time;
677}
678
679EAPI void
680ecore_con_server_flush(Ecore_Con_Server *svr)
681{
682 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
683 {
684 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_server_flush");
685 return;
686 }
687
688 _ecore_con_server_flush(svr);
689}
690
691/**
692 * @}
693 */
694
695/**
696 * @addtogroup Ecore_Con_Client_Group Ecore Connection Client Functions
697 *
698 * Functions that operate on Ecore connection client objects.
699 *
700 * @{
701 */
702
703/**
704 * @example ecore_con_client_example.c
705 * Shows how to write a simple client that connects to the example server.
706 */
707
708EAPI int
709ecore_con_client_send(Ecore_Con_Client *cl,
710 const void *data,
711 int size)
712{
713 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
714 {
715 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_send");
716 return 0;
717 }
718
719 EINA_SAFETY_ON_TRUE_RETURN_VAL(cl->dead, 0);
720
721 EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0);
722
723 EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0);
724
725 if (cl->fd_handler)
726 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE);
727
728 if (cl->host_server && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP))
729 sendto(cl->host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr,
730 cl->client_addr_len);
731 else if (!cl->buf)
732 {
733 cl->buf = eina_binbuf_new();
734 EINA_SAFETY_ON_NULL_RETURN_VAL(cl->buf, 0);
735 }
736 eina_binbuf_append_length(cl->buf, data, size);
737
738 return size;
739}
740
741EAPI Ecore_Con_Server *
742ecore_con_client_server_get(Ecore_Con_Client *cl)
743{
744 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
745 {
746 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
747 "ecore_con_client_server_get");
748 return NULL;
749 }
750
751 return cl->host_server;
752}
753
754EAPI Eina_Bool
755ecore_con_client_connected_get(Ecore_Con_Client *cl)
756{
757 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
758 {
759 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
760 "ecore_con_client_connected_get");
761 return EINA_FALSE;
762 }
763
764 return !cl->dead;
765}
766
767EAPI void
768ecore_con_client_timeout_set(Ecore_Con_Client *cl,
769 double timeout)
770{
771 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
772 {
773 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT,
774 "ecore_con_client_timeout_set");
775 return;
776 }
777
778 cl->disconnect_time = timeout;
779
780 _ecore_con_cl_timer_update(cl);
781}
782
783EAPI double
784ecore_con_client_timeout_get(Ecore_Con_Client *cl)
785{
786 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
787 {
788 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_timeout_get");
789 return 0;
790 }
791
792 return cl->disconnect_time;
793}
794
795EAPI void *
796ecore_con_client_del(Ecore_Con_Client *cl)
797{
798 void *data = NULL;
799
800 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
801 {
802 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_del");
803 return NULL;
804 }
805
806 data = cl->data;
807 cl->delete_me = EINA_TRUE;
808 if (cl->event_count)
809 {
810 if (cl->fd_handler)
811 {
812 ecore_main_fd_handler_del(cl->fd_handler);
813 cl->fd_handler = NULL;
814 }
815 }
816 else
817 {
818 if (cl->host_server)
819 {
820 cl->host_server->clients = eina_list_remove(cl->host_server->clients, cl);
821 --cl->host_server->client_count;
822 }
823
824 _ecore_con_client_free(cl);
825 }
826
827 return data;
828}
829
830EAPI void
831ecore_con_client_data_set(Ecore_Con_Client *cl,
832 const void *data)
833{
834 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
835 {
836 ECORE_MAGIC_FAIL(cl,
837 ECORE_MAGIC_CON_CLIENT,
838 "ecore_con_client_data_set");
839 return;
840 }
841
842 cl->data = (void *)data;
843}
844
845EAPI void *
846ecore_con_client_data_get(Ecore_Con_Client *cl)
847{
848 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
849 {
850 ECORE_MAGIC_FAIL(cl,
851 ECORE_MAGIC_CON_CLIENT,
852 "ecore_con_client_data_get");
853 return NULL;
854 }
855
856 return cl->data;
857}
858
859EAPI const char *
860ecore_con_client_ip_get(Ecore_Con_Client *cl)
861{
862 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
863 {
864 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_ip_get");
865 return NULL;
866 }
867 if (!cl->ip)
868 cl->ip = _ecore_con_pretty_ip(cl->client_addr);
869
870 return cl->ip;
871}
872
873EAPI int
874ecore_con_client_port_get(Ecore_Con_Client *cl)
875{
876 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
877 {
878 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_port_get");
879 return -1;
880 }
881 if (cl->client_addr->sa_family == AF_INET)
882 return ((struct sockaddr_in*)cl->client_addr)->sin_port;
883#ifdef HAVE_IPV6
884 return ((struct sockaddr_in6*)cl->client_addr)->sin6_port;
885#else
886 return -1;
887#endif
888}
889
890EAPI double
891ecore_con_client_uptime_get(Ecore_Con_Client *cl)
892{
893 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
894 {
895 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_uptime_get");
896 return -1;
897 }
898
899 return ecore_time_get() - cl->start_time;
900}
901
902EAPI void
903ecore_con_client_flush(Ecore_Con_Client *cl)
904{
905 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
906 {
907 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_flush");
908 return;
909 }
910
911 _ecore_con_client_flush(cl);
912}
913
914EAPI int
915ecore_con_server_fd_get(Ecore_Con_Server *svr)
916{
917 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
918 {
919 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
920 return -1;
921 }
922 if (svr->created) return -1;
923 return ecore_main_fd_handler_fd_get(svr->fd_handler);
924}
925
926EAPI int
927ecore_con_client_fd_get(Ecore_Con_Client *cl)
928{
929 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
930 {
931 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, __func__);
932 return -1;
933 }
934 return ecore_main_fd_handler_fd_get(cl->fd_handler);
935}
936
937/**
938 * @}
939 */
940
941void
942ecore_con_event_server_add(Ecore_Con_Server *svr)
943{
944 /* we got our server! */
945 Ecore_Con_Event_Server_Add *e;
946 int ev = ECORE_CON_EVENT_SERVER_ADD;
947
948 e = ecore_con_event_server_add_alloc();
949 EINA_SAFETY_ON_NULL_RETURN(e);
950
951 svr->event_count = eina_list_append(svr->event_count, e);
952 _ecore_con_server_timer_update(svr);
953 e->server = svr;
954 if (svr->upgrade) ev = ECORE_CON_EVENT_SERVER_UPGRADE;
955 ecore_event_add(ev, e,
956 _ecore_con_event_server_add_free, NULL);
957 _ecore_con_event_count++;
958}
959
960void
961ecore_con_event_server_del(Ecore_Con_Server *svr)
962{
963 Ecore_Con_Event_Server_Del *e;
964
965 e = ecore_con_event_server_del_alloc();
966 EINA_SAFETY_ON_NULL_RETURN(e);
967
968 svr->event_count = eina_list_append(svr->event_count, e);
969 _ecore_con_server_timer_update(svr);
970 e->server = svr;
971 ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e,
972 _ecore_con_event_server_del_free, NULL);
973 _ecore_con_event_count++;
974}
975
976void
977ecore_con_event_server_write(Ecore_Con_Server *svr, int num)
978{
979 Ecore_Con_Event_Server_Write *e;
980
981 e = ecore_con_event_server_write_alloc();
982 EINA_SAFETY_ON_NULL_RETURN(e);
983
984 svr->event_count = eina_list_append(svr->event_count, e);
985 e->server = svr;
986 e->size = num;
987 ecore_event_add(ECORE_CON_EVENT_SERVER_WRITE, e,
988 (Ecore_End_Cb)_ecore_con_event_server_write_free, NULL);
989 _ecore_con_event_count++;
990}
991
992void
993ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate)
994{
995 Ecore_Con_Event_Server_Data *e;
996
997 e = ecore_con_event_server_data_alloc();
998 EINA_SAFETY_ON_NULL_RETURN(e);
999
1000 svr->event_count = eina_list_append(svr->event_count, e);
1001 _ecore_con_server_timer_update(svr);
1002 e->server = svr;
1003 if (duplicate)
1004 {
1005 e->data = malloc(num);
1006 if (!e->data)
1007 {
1008 ERR("server data allocation failure !");
1009 _ecore_con_event_server_data_free(NULL, e);
1010 return;
1011 }
1012 memcpy(e->data, buf, num);
1013 }
1014 else
1015 e->data = buf;
1016 e->size = num;
1017 ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e,
1018 _ecore_con_event_server_data_free, NULL);
1019 _ecore_con_event_count++;
1020}
1021
1022void
1023ecore_con_event_client_add(Ecore_Con_Client *cl)
1024{
1025 Ecore_Con_Event_Client_Add *e;
1026 int ev = ECORE_CON_EVENT_CLIENT_ADD;
1027
1028 e = ecore_con_event_client_add_alloc();
1029 EINA_SAFETY_ON_NULL_RETURN(e);
1030
1031 cl->event_count = eina_list_append(cl->event_count, e);
1032 cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
1033 _ecore_con_cl_timer_update(cl);
1034 e->client = cl;
1035 if (cl->upgrade) ev = ECORE_CON_EVENT_CLIENT_UPGRADE;
1036 ecore_event_add(ev, e,
1037 (Ecore_End_Cb)_ecore_con_event_client_add_free, cl->host_server);
1038 _ecore_con_event_count++;
1039}
1040
1041void
1042ecore_con_event_client_del(Ecore_Con_Client *cl)
1043{
1044 Ecore_Con_Event_Client_Del *e;
1045
1046 if (!cl) return;
1047 e = ecore_con_event_client_del_alloc();
1048 EINA_SAFETY_ON_NULL_RETURN(e);
1049 cl->event_count = eina_list_append(cl->event_count, e);
1050
1051 cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
1052 _ecore_con_cl_timer_update(cl);
1053 e->client = cl;
1054 ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e,
1055 (Ecore_End_Cb)_ecore_con_event_client_del_free, cl->host_server);
1056 _ecore_con_event_count++;
1057}
1058
1059void
1060ecore_con_event_client_write(Ecore_Con_Client *cl, int num)
1061{
1062 Ecore_Con_Event_Client_Write *e;
1063
1064 e = ecore_con_event_client_write_alloc();
1065 EINA_SAFETY_ON_NULL_RETURN(e);
1066
1067 cl->event_count = eina_list_append(cl->event_count, e);
1068 cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
1069 e->client = cl;
1070 e->size = num;
1071 ecore_event_add(ECORE_CON_EVENT_CLIENT_WRITE, e,
1072 (Ecore_End_Cb)_ecore_con_event_client_write_free, cl->host_server);
1073 _ecore_con_event_count++;
1074}
1075
1076void
1077ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate)
1078{
1079 Ecore_Con_Event_Client_Data *e;
1080
1081 e = ecore_con_event_client_data_alloc();
1082 EINA_SAFETY_ON_NULL_RETURN(e);
1083
1084 cl->event_count = eina_list_append(cl->event_count, e);
1085 cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
1086 _ecore_con_cl_timer_update(cl);
1087 e->client = cl;
1088 if (duplicate)
1089 {
1090 e->data = malloc(num);
1091 if (!e->data)
1092 {
1093 ERR("client data allocation failure !");
1094 _ecore_con_event_client_data_free(cl->host_server, e);
1095 return;
1096 }
1097 memcpy(e->data, buf, num);
1098 }
1099 else
1100 e->data = buf;
1101 e->size = num;
1102 ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e,
1103 (Ecore_End_Cb)_ecore_con_event_client_data_free, cl->host_server);
1104 _ecore_con_event_count++;
1105}
1106
1107
1108void
1109ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info)
1110{
1111 svr->infos = eina_list_remove(svr->infos, info);
1112}
1113
1114void
1115ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error)
1116{
1117 Ecore_Con_Event_Server_Error *e;
1118
1119 e = ecore_con_event_server_error_alloc();
1120 EINA_SAFETY_ON_NULL_RETURN(e);
1121
1122 e->server = svr;
1123 e->error = strdup(error);
1124 ERR("%s", error);
1125 svr->event_count = eina_list_append(svr->event_count, e);
1126 ecore_event_add(ECORE_CON_EVENT_SERVER_ERROR, e, (Ecore_End_Cb)_ecore_con_event_server_error_free, NULL);
1127 _ecore_con_event_count++;
1128}
1129
1130void
1131ecore_con_event_client_error(Ecore_Con_Client *cl, const char *error)
1132{
1133 Ecore_Con_Event_Client_Error *e;
1134
1135 e = ecore_con_event_client_error_alloc();
1136 EINA_SAFETY_ON_NULL_RETURN(e);
1137
1138 e->client = cl;
1139 e->error = strdup(error);
1140 ERR("%s", error);
1141 cl->event_count = eina_list_append(cl->event_count, e);
1142 cl->host_server->event_count = eina_list_append(cl->host_server->event_count, e);
1143 ecore_event_add(ECORE_CON_EVENT_CLIENT_ERROR, e, (Ecore_End_Cb)_ecore_con_event_client_error_free, cl->host_server);
1144 _ecore_con_event_count++;
1145}
1146
1147static void
1148_ecore_con_server_free(Ecore_Con_Server *svr)
1149{
1150 Ecore_Con_Client *cl;
1151 double t_start, t;
1152
1153 if (svr->event_count) return;
1154
1155 while (svr->infos)
1156 {
1157 ecore_con_info_data_clear(svr->infos->data);
1158 svr->infos = eina_list_remove_list(svr->infos, svr->infos);
1159 }
1160 if ((!svr->buf) && svr->delete_me && (!svr->dead) && (!svr->event_count))
1161 {
1162 /* this is a catch-all for cases when a server is not properly killed. */
1163 svr->dead = EINA_TRUE;
1164 ecore_con_event_server_del(svr);
1165 return;
1166 }
1167
1168 t_start = ecore_time_get();
1169 while (svr->buf && (!svr->dead))
1170 {
1171 _ecore_con_server_flush(svr);
1172 t = ecore_time_get();
1173 if ((t - t_start) > 0.5)
1174 {
1175 WRN("ECORE_CON: EEK - stuck in _ecore_con_server_free() trying\n"
1176 " to flush data out from the server, and have been for\n"
1177 " %1.1f seconds. This is taking too long. Aborting flush.",
1178 (t - t_start));
1179 break;
1180 }
1181 }
1182
1183#ifdef _WIN32
1184 ecore_con_local_win32_server_del(svr);
1185#endif
1186 if (svr->event_count) return;
1187 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
1188
1189 if (svr->buf)
1190 eina_binbuf_free(svr->buf);
1191
1192 EINA_LIST_FREE(svr->clients, cl)
1193 {
1194 Ecore_Con_Event_Server_Add *ev;
1195
1196 /* some pointer hacks here to prevent double frees if people are being stupid */
1197 EINA_LIST_FREE(cl->event_count, ev)
1198 ev->server = NULL;
1199 cl->delete_me = cl->dead = EINA_TRUE;
1200 _ecore_con_client_free(cl);
1201 }
1202 if ((svr->created) && (svr->path) && (svr->ppid == getpid()))
1203 unlink(svr->path);
1204
1205 ecore_con_ssl_server_shutdown(svr);
1206 free(svr->name);
1207
1208 free(svr->path);
1209
1210 eina_stringshare_del(svr->ip);
1211
1212 if (svr->fd_handler)
1213 ecore_main_fd_handler_del(svr->fd_handler);
1214
1215 if (svr->fd > 0)
1216 close(svr->fd);
1217
1218 if (svr->until_deletion)
1219 ecore_timer_del(svr->until_deletion);
1220
1221 servers = eina_list_remove(servers, svr);
1222 svr->data = NULL;
1223 free(svr);
1224}
1225
1226static void
1227_ecore_con_client_free(Ecore_Con_Client *cl)
1228{
1229 double t_start, t;
1230
1231 if (cl->event_count) return;
1232
1233 if (cl->delete_me && (!cl->dead) && (!cl->event_count))
1234 {
1235 /* this is a catch-all for cases when a client is not properly killed. */
1236 cl->dead = EINA_TRUE;
1237 ecore_con_event_client_del(cl);
1238 return;
1239 }
1240
1241
1242 t_start = ecore_time_get();
1243 while ((cl->buf) && (!cl->dead))
1244 {
1245 _ecore_con_client_flush(cl);
1246 t = ecore_time_get();
1247 if ((t - t_start) > 0.5)
1248 {
1249 WRN("EEK - stuck in _ecore_con_client_free() trying\n"
1250 " to flush data out from the client, and have been for\n"
1251 " %1.1f seconds. This is taking too long. Aborting flush.",
1252 (t - t_start));
1253 break;
1254 }
1255 }
1256
1257#ifdef _WIN32
1258 ecore_con_local_win32_client_del(cl);
1259#endif
1260
1261 if (cl->event_count) return;
1262 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
1263
1264 free(cl->buf);
1265
1266 if (cl->host_server->type & ECORE_CON_SSL)
1267 ecore_con_ssl_client_shutdown(cl);
1268
1269 if (cl->fd_handler)
1270 ecore_main_fd_handler_del(cl->fd_handler);
1271
1272 if (cl->fd > 0)
1273 close(cl->fd);
1274
1275 free(cl->client_addr);
1276 cl->client_addr = NULL;
1277
1278 if (cl->until_deletion)
1279 ecore_timer_del(cl->until_deletion);
1280
1281 eina_stringshare_del(cl->ip);
1282 cl->data = NULL;
1283 free(cl);
1284 return;
1285}
1286
1287static void
1288_ecore_con_server_kill(Ecore_Con_Server *svr)
1289{
1290 if (!svr->delete_me)
1291 ecore_con_event_server_del(svr);
1292
1293 svr->dead = EINA_TRUE;
1294 if (svr->fd_handler)
1295 ecore_main_fd_handler_del(svr->fd_handler);
1296
1297 svr->fd_handler = NULL;
1298}
1299
1300static Eina_Bool
1301_ecore_con_server_timer(Ecore_Con_Server *svr)
1302{
1303 ecore_con_server_del(svr);
1304
1305 svr->until_deletion = NULL;
1306 return ECORE_CALLBACK_CANCEL;
1307}
1308
1309static void
1310_ecore_con_server_timer_update(Ecore_Con_Server *svr)
1311{
1312 if (svr->disconnect_time)
1313 {
1314 if (svr->disconnect_time > 0)
1315 {
1316 if (svr->until_deletion)
1317 ecore_timer_interval_set(svr->until_deletion, svr->disconnect_time);
1318 else
1319 svr->until_deletion = ecore_timer_add(svr->disconnect_time, (Ecore_Task_Cb)_ecore_con_server_timer, svr);
1320 }
1321 else if (svr->until_deletion)
1322 {
1323 ecore_timer_del(svr->until_deletion);
1324 svr->until_deletion = NULL;
1325 }
1326 }
1327 else
1328 {
1329 if (svr->until_deletion)
1330 {
1331 ecore_timer_del(svr->until_deletion);
1332 svr->until_deletion = NULL;
1333 }
1334 }
1335}
1336
1337static Eina_Bool
1338_ecore_con_client_timer(Ecore_Con_Client *cl)
1339{
1340 ecore_con_client_del(cl);
1341
1342 cl->until_deletion = NULL;
1343 return ECORE_CALLBACK_CANCEL;
1344}
1345
1346static void
1347_ecore_con_cl_timer_update(Ecore_Con_Client *cl)
1348{
1349 if (cl->disconnect_time)
1350 {
1351 if (cl->disconnect_time > 0)
1352 {
1353 if (cl->until_deletion)
1354 ecore_timer_interval_set(cl->until_deletion, cl->disconnect_time);
1355 else
1356 cl->until_deletion = ecore_timer_add(cl->disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl);
1357 }
1358 else if (cl->until_deletion)
1359 {
1360 ecore_timer_del(cl->until_deletion);
1361 cl->until_deletion = NULL;
1362 }
1363 }
1364 else
1365 {
1366 if (cl->host_server->client_disconnect_time > 0)
1367 {
1368 if (cl->until_deletion)
1369 ecore_timer_interval_set(cl->until_deletion, cl->host_server->client_disconnect_time);
1370 else
1371 cl->until_deletion = ecore_timer_add(cl->host_server->client_disconnect_time, (Ecore_Task_Cb)_ecore_con_client_timer, cl);
1372 }
1373 else if (cl->until_deletion)
1374 {
1375 ecore_timer_del(cl->until_deletion);
1376 cl->until_deletion = NULL;
1377 }
1378 }
1379}
1380
1381static void
1382_ecore_con_cb_tcp_listen(void *data,
1383 Ecore_Con_Info *net_info)
1384{
1385 Ecore_Con_Server *svr;
1386 struct linger lin;
1387
1388 svr = data;
1389
1390 if (!net_info) /* error message has already been handled */
1391 goto error;
1392
1393 svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
1394 net_info->info.ai_protocol);
1395 if (svr->fd < 0)
1396 {
1397 ecore_con_event_server_error(svr, strerror(errno));
1398 goto error;
1399 }
1400
1401 if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
1402 {
1403 ecore_con_event_server_error(svr, strerror(errno));
1404 goto error;
1405 }
1406
1407 if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
1408 {
1409 ecore_con_event_server_error(svr, strerror(errno));
1410 goto error;
1411 }
1412
1413 lin.l_onoff = 1;
1414 lin.l_linger = 0;
1415 if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
1416 sizeof(struct linger)) < 0)
1417 {
1418 ecore_con_event_server_error(svr, strerror(errno));
1419 goto error;
1420 }
1421
1422 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY)
1423 {
1424#ifdef HAVE_NETINET_TCP_H
1425 int flag = 1;
1426
1427 if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag,
1428 sizeof(int)) < 0)
1429#endif
1430 {
1431 ecore_con_event_server_error(svr, strerror(errno));
1432 goto error;
1433 }
1434 }
1435
1436 if (bind(svr->fd, net_info->info.ai_addr,
1437 net_info->info.ai_addrlen) < 0)
1438 {
1439 ecore_con_event_server_error(svr, strerror(errno));
1440 goto error;
1441 }
1442 if (listen(svr->fd, 4096) < 0)
1443 {
1444 ecore_con_event_server_error(svr, strerror(errno));
1445 goto error;
1446 }
1447
1448 svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
1449 _ecore_con_svr_tcp_handler, svr, NULL, NULL);
1450 if (!svr->fd_handler)
1451 {
1452 ecore_con_event_server_error(svr, "Memory allocation failure");
1453 goto error;
1454 }
1455
1456 return;
1457
1458error:
1459 ecore_con_ssl_server_shutdown(svr);
1460 _ecore_con_server_kill(svr);
1461}
1462
1463static void
1464_ecore_con_cb_udp_listen(void *data,
1465 Ecore_Con_Info *net_info)
1466{
1467 Ecore_Con_Server *svr;
1468 Ecore_Con_Type type;
1469 struct ip_mreq mreq;
1470#ifdef HAVE_IPV6
1471 struct ipv6_mreq mreq6;
1472#endif
1473 const int on = 1;
1474
1475 svr = data;
1476 type = svr->type;
1477 type &= ECORE_CON_TYPE;
1478
1479 if (!net_info) /* error message has already been handled */
1480 goto error;
1481
1482 svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
1483 net_info->info.ai_protocol);
1484 if (svr->fd < 0)
1485 {
1486 ecore_con_event_server_error(svr, strerror(errno));
1487 goto error;
1488 }
1489
1490 if (type == ECORE_CON_REMOTE_MCAST)
1491 {
1492 if (net_info->info.ai_family == AF_INET)
1493 {
1494 if (!inet_pton(net_info->info.ai_family, net_info->ip,
1495 &mreq.imr_multiaddr))
1496 {
1497 ecore_con_event_server_error(svr, strerror(errno));
1498 goto error;
1499 }
1500
1501 mreq.imr_interface.s_addr = htonl(INADDR_ANY);
1502 if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1503 (const void *)&mreq, sizeof(mreq)) != 0)
1504 {
1505 ecore_con_event_server_error(svr, strerror(errno));
1506 goto error;
1507 }
1508 }
1509#ifdef HAVE_IPV6
1510 else if (net_info->info.ai_family == AF_INET6)
1511 {
1512 if (!inet_pton(net_info->info.ai_family, net_info->ip,
1513 &mreq6.ipv6mr_multiaddr))
1514 {
1515 ecore_con_event_server_error(svr, strerror(errno));
1516 goto error;
1517 }
1518 mreq6.ipv6mr_interface = htonl(INADDR_ANY);
1519 if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1520 (const void *)&mreq6, sizeof(mreq6)) != 0)
1521 {
1522 ecore_con_event_server_error(svr, strerror(errno));
1523 goto error;
1524 }
1525 }
1526#endif
1527 }
1528
1529 if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0)
1530 {
1531 ecore_con_event_server_error(svr, strerror(errno));
1532 goto error;
1533 }
1534
1535 if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
1536 {
1537 ecore_con_event_server_error(svr, strerror(errno));
1538 goto error;
1539 }
1540
1541 if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
1542 {
1543 ecore_con_event_server_error(svr, strerror(errno));
1544 goto error;
1545 }
1546
1547 if (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0)
1548 {
1549 ecore_con_event_server_error(svr, strerror(errno));
1550 goto error;
1551 }
1552
1553 svr->fd_handler =
1554 ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
1555 _ecore_con_svr_udp_handler, svr, NULL, NULL);
1556 if (!svr->fd_handler)
1557 {
1558 ecore_con_event_server_error(svr, "Memory allocation failure");
1559 goto error;
1560 }
1561
1562 svr->ip = eina_stringshare_add(net_info->ip);
1563
1564 return;
1565
1566error:
1567 ecore_con_ssl_server_shutdown(svr);
1568 _ecore_con_server_kill(svr);
1569}
1570
1571static void
1572_ecore_con_cb_tcp_connect(void *data,
1573 Ecore_Con_Info *net_info)
1574{
1575 Ecore_Con_Server *svr;
1576 int res;
1577 int curstate = 0;
1578
1579 svr = data;
1580
1581 if (!net_info) /* error message has already been handled */
1582 goto error;
1583
1584 svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
1585 net_info->info.ai_protocol);
1586 if (svr->fd < 0)
1587 {
1588 ecore_con_event_server_error(svr, strerror(errno));
1589 goto error;
1590 }
1591
1592 if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
1593 {
1594 ecore_con_event_server_error(svr, strerror(errno));
1595 goto error;
1596 }
1597
1598 if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
1599 {
1600 ecore_con_event_server_error(svr, strerror(errno));
1601 goto error;
1602 }
1603
1604 if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0)
1605 {
1606 ecore_con_event_server_error(svr, strerror(errno));
1607 goto error;
1608 }
1609
1610 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY)
1611 {
1612#ifdef HAVE_NETINET_TCP_H
1613 int flag = 1;
1614
1615 if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0)
1616#endif
1617 {
1618 ecore_con_event_server_error(svr, strerror(errno));
1619 goto error;
1620 }
1621 }
1622
1623 res = connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen);
1624#ifdef _WIN32
1625 if (res == SOCKET_ERROR)
1626 {
1627 if (WSAGetLastError() != WSAEINPROGRESS)
1628 goto error; /* FIXME: strerror on windows? */
1629
1630#else
1631 if (res < 0)
1632 {
1633 if (errno != EINPROGRESS)
1634 {
1635 ecore_con_event_server_error(svr, strerror(errno));
1636 goto error;
1637 }
1638
1639#endif
1640 svr->connecting = EINA_TRUE;
1641 svr->fd_handler =
1642 ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
1643 _ecore_con_cl_handler, svr, NULL, NULL);
1644 }
1645 else
1646 svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
1647 _ecore_con_cl_handler, svr, NULL, NULL);
1648
1649 if (svr->type & ECORE_CON_SSL)
1650 {
1651 svr->handshaking = EINA_TRUE;
1652 svr->ssl_state = ECORE_CON_SSL_STATE_INIT;
1653 DBG("beginning ssl handshake");
1654 if (ecore_con_ssl_server_init(svr))
1655 goto error;
1656 }
1657
1658 if (!svr->fd_handler)
1659 {
1660 ecore_con_event_server_error(svr, "Memory allocation failure");
1661 goto error;
1662 }
1663
1664 svr->ip = eina_stringshare_add(net_info->ip);
1665
1666 return;
1667
1668error:
1669 ecore_con_ssl_server_shutdown(svr);
1670 _ecore_con_server_kill(svr);
1671}
1672
1673static void
1674_ecore_con_cb_udp_connect(void *data,
1675 Ecore_Con_Info *net_info)
1676{
1677 Ecore_Con_Server *svr;
1678 int curstate = 0;
1679 int broadcast = 1;
1680 svr = data;
1681
1682 if (!net_info) /* error message has already been handled */
1683 goto error;
1684
1685 svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype,
1686 net_info->info.ai_protocol);
1687 if (svr->fd < 0)
1688 {
1689 ecore_con_event_server_error(svr, strerror(errno));
1690 goto error;
1691 }
1692
1693 if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
1694 {
1695 ecore_con_event_server_error(svr, strerror(errno));
1696 goto error;
1697 }
1698
1699 if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
1700 {
1701 ecore_con_event_server_error(svr, strerror(errno));
1702 goto error;
1703 }
1704
1705 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_BROADCAST)
1706 {
1707 if (setsockopt(svr->fd, SOL_SOCKET, SO_BROADCAST,
1708 (const void *)&broadcast,
1709 sizeof(broadcast)) < 0)
1710 {
1711 ecore_con_event_server_error(svr, strerror(errno));
1712 goto error;
1713 }
1714 }
1715 else if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR,
1716 (const void *)&curstate, sizeof(curstate)) < 0)
1717 {
1718 ecore_con_event_server_error(svr, strerror(errno));
1719 goto error;
1720 }
1721
1722 if (connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0)
1723 {
1724 ecore_con_event_server_error(svr, strerror(errno));
1725 goto error;
1726 }
1727
1728 svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE,
1729 _ecore_con_cl_udp_handler, svr, NULL, NULL);
1730
1731 if (!svr->fd_handler)
1732 {
1733 ecore_con_event_server_error(svr, "Memory allocation failure");
1734 goto error;
1735 }
1736
1737 svr->ip = eina_stringshare_add(net_info->ip);
1738
1739 return;
1740
1741error:
1742 ecore_con_ssl_server_shutdown(svr);
1743 _ecore_con_server_kill(svr);
1744}
1745
1746static Ecore_Con_State
1747svr_try_connect_plain(Ecore_Con_Server *svr)
1748{
1749 int res;
1750 int so_err = 0;
1751 socklen_t size = sizeof(int);
1752
1753 res = getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, (void *)&so_err, &size);
1754#ifdef _WIN32
1755 if (res == SOCKET_ERROR)
1756 so_err = WSAGetLastError();
1757
1758 if ((so_err == WSAEINPROGRESS) && !svr->dead)
1759 return ECORE_CON_INPROGRESS;
1760
1761#else
1762 if (res < 0)
1763 so_err = errno;
1764
1765 if ((so_err == EINPROGRESS) && !svr->dead)
1766 return ECORE_CON_INPROGRESS;
1767
1768#endif
1769
1770 if (so_err)
1771 {
1772 /* we lost our server! */
1773 ecore_con_event_server_error(svr, strerror(errno));
1774 ERR("Connection lost: %s", strerror(so_err));
1775 _ecore_con_server_kill(svr);
1776 return ECORE_CON_DISCONNECTED;
1777 }
1778
1779 if ((!svr->delete_me) && (!svr->handshaking) && svr->connecting)
1780 {
1781 svr->connecting = EINA_FALSE;
1782 svr->start_time = ecore_time_get();
1783 ecore_con_event_server_add(svr);
1784 }
1785
1786 if (svr->fd_handler && (!svr->buf))
1787 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
1788
1789 if (!svr->dead)
1790 return ECORE_CON_CONNECTED;
1791 else
1792 return ECORE_CON_DISCONNECTED;
1793}
1794
1795static const char *
1796_ecore_con_pretty_ip(struct sockaddr *client_addr)
1797{
1798#ifndef HAVE_IPV6
1799 char ipbuf[INET_ADDRSTRLEN + 1];
1800#else
1801 char ipbuf[INET6_ADDRSTRLEN + 1];
1802#endif
1803 int family = client_addr->sa_family;
1804 void *src;
1805
1806 switch(family)
1807 {
1808 case AF_INET:
1809 src = &(((struct sockaddr_in *)client_addr)->sin_addr);
1810 break;
1811#ifdef HAVE_IPV6
1812 case AF_INET6:
1813 src = &(((struct sockaddr_in6 *)client_addr)->sin6_addr);
1814
1815 if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)src))
1816 {
1817 family = AF_INET;
1818 src = (char*)src + 12;
1819 }
1820 break;
1821#endif
1822 default:
1823 return eina_stringshare_add("0.0.0.0");
1824 }
1825
1826 if (!inet_ntop(family, src, ipbuf, sizeof(ipbuf)))
1827 return eina_stringshare_add("0.0.0.0");
1828
1829 ipbuf[sizeof(ipbuf) - 1] = 0;
1830 return eina_stringshare_add(ipbuf);
1831}
1832
1833static Eina_Bool
1834_ecore_con_svr_tcp_handler(void *data,
1835 Ecore_Fd_Handler *fd_handler __UNUSED__)
1836{
1837 Ecore_Con_Server *svr;
1838 Ecore_Con_Client *cl = NULL;
1839 unsigned char client_addr[256];
1840 unsigned int client_addr_len;
1841
1842 svr = data;
1843 if (svr->dead)
1844 return ECORE_CALLBACK_RENEW;
1845
1846 if (svr->delete_me)
1847 return ECORE_CALLBACK_RENEW;
1848
1849 if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) &&
1850 (svr->client_count >= (unsigned int)svr->client_limit))
1851 return ECORE_CALLBACK_RENEW;
1852
1853 /* a new client */
1854
1855 cl = calloc(1, sizeof(Ecore_Con_Client));
1856 if (!cl)
1857 {
1858 ecore_con_event_server_error(svr, "Memory allocation failure when attempting to add a new client");
1859 return ECORE_CALLBACK_RENEW;
1860 }
1861 cl->host_server = svr;
1862
1863 client_addr_len = sizeof(client_addr);
1864 memset(&client_addr, 0, client_addr_len);
1865 cl->fd = accept(svr->fd, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr_len);
1866 if (cl->fd < 0)
1867 {
1868 ecore_con_event_server_error(svr, strerror(errno));
1869 goto free_cl;
1870 }
1871
1872 if ((svr->client_limit >= 0) && (svr->reject_excess_clients) &&
1873 (svr->client_count >= (unsigned int)svr->client_limit))
1874 {
1875 ecore_con_event_server_error(svr, "Maximum client limit reached");
1876 goto close_fd;
1877 }
1878
1879 if (fcntl(cl->fd, F_SETFL, O_NONBLOCK) < 0)
1880 {
1881 ecore_con_event_server_error(svr, strerror(errno));
1882 goto close_fd;
1883 }
1884 if (fcntl(cl->fd, F_SETFD, FD_CLOEXEC) < 0)
1885 {
1886 ecore_con_event_server_error(svr, strerror(errno));
1887 goto close_fd;
1888 }
1889 cl->fd_handler = ecore_main_fd_handler_add(cl->fd, ECORE_FD_READ,
1890 _ecore_con_svr_cl_handler, cl, NULL, NULL);
1891 if (!cl->fd_handler)
1892 goto close_fd;
1893
1894 ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
1895
1896 if ((!svr->upgrade) && (svr->type & ECORE_CON_SSL))
1897 {
1898 cl->handshaking = EINA_TRUE;
1899 cl->ssl_state = ECORE_CON_SSL_STATE_INIT;
1900 if (ecore_con_ssl_client_init(cl))
1901 goto del_handler;
1902 }
1903
1904 cl->client_addr = malloc(client_addr_len);
1905 if (!cl->client_addr)
1906 {
1907 ecore_con_event_server_error(svr, "Memory allocation failure when attempting to add a new client");
1908 goto del_handler;
1909 }
1910 cl->client_addr_len = client_addr_len;
1911 memcpy(cl->client_addr, &client_addr, client_addr_len);
1912
1913 svr->clients = eina_list_append(svr->clients, cl);
1914 svr->client_count++;
1915
1916 if ((!cl->delete_me) && (!cl->handshaking))
1917 ecore_con_event_client_add(cl);
1918
1919 return ECORE_CALLBACK_RENEW;
1920
1921 del_handler:
1922 ecore_main_fd_handler_del(cl->fd_handler);
1923 close_fd:
1924 close(cl->fd);
1925 free_cl:
1926 free(cl);
1927
1928 return ECORE_CALLBACK_RENEW;
1929}
1930
1931static void
1932_ecore_con_cl_read(Ecore_Con_Server *svr)
1933{
1934 DBG("svr=%p", svr);
1935 int num = 0;
1936 Eina_Bool lost_server = EINA_TRUE;
1937 unsigned char buf[READBUFSIZ];
1938
1939 /* only possible with non-ssl connections */
1940 if (svr->connecting && (svr_try_connect_plain(svr) != ECORE_CON_CONNECTED))
1941 return;
1942
1943 if (svr->handshaking)
1944 {
1945 DBG("Continuing ssl handshake");
1946 if (!ecore_con_ssl_server_init(svr))
1947 lost_server = EINA_FALSE;
1948 _ecore_con_server_timer_update(svr);
1949 }
1950
1951 if (!(svr->type & ECORE_CON_SSL))
1952 {
1953 num = read(svr->fd, buf, sizeof(buf));
1954 /* 0 is not a valid return value for a tcp socket */
1955 if ((num > 0) || ((num < 0) && (errno == EAGAIN)))
1956 lost_server = EINA_FALSE;
1957 else if (num < 0)
1958 ecore_con_event_server_error(svr, strerror(errno));
1959 }
1960 else
1961 {
1962 num = ecore_con_ssl_server_read(svr, buf, sizeof(buf));
1963 /* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
1964 if (num >= 0)
1965 lost_server = EINA_FALSE;
1966 }
1967
1968 if ((!svr->delete_me) && (num > 0))
1969 ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
1970
1971 if (lost_server)
1972 _ecore_con_server_kill(svr);
1973}
1974
1975static Eina_Bool
1976_ecore_con_cl_handler(void *data,
1977 Ecore_Fd_Handler *fd_handler)
1978{
1979 Ecore_Con_Server *svr;
1980 Eina_Bool want_read, want_write;
1981
1982 svr = data;
1983 if (svr->dead)
1984 return ECORE_CALLBACK_RENEW;
1985
1986 if (svr->delete_me)
1987 return ECORE_CALLBACK_RENEW;
1988
1989 want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
1990 want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE);
1991
1992 if (svr->handshaking && (want_read || want_write))
1993 {
1994 DBG("Continuing ssl handshake: preparing to %s...", want_read ? "read" : "write");
1995#ifdef ISCOMFITOR
1996 if (want_read)
1997 {
1998 char buf[READBUFSIZ];
1999 ssize_t len;
2000 len = recv(svr->fd, buf, sizeof(buf), MSG_DONTWAIT | MSG_PEEK);
2001 DBG("%zu bytes in buffer", len);
2002 }
2003#endif
2004 if (ecore_con_ssl_server_init(svr))
2005 {
2006 ERR("ssl handshaking failed!");
2007 svr->handshaking = EINA_FALSE;
2008
2009 }
2010 else if (!svr->ssl_state)
2011 {
2012 svr->connecting = EINA_FALSE;
2013 svr->start_time = ecore_time_get();
2014 ecore_con_event_server_add(svr);
2015 }
2016 }
2017 else if (want_read)
2018 _ecore_con_cl_read(svr);
2019 else if (want_write) /* only possible with non-ssl connections */
2020 {
2021 if (svr->connecting && (!svr_try_connect_plain(svr)))
2022 return ECORE_CALLBACK_RENEW;
2023
2024 _ecore_con_server_flush(svr);
2025 }
2026
2027 return ECORE_CALLBACK_RENEW;
2028}
2029
2030static Eina_Bool
2031_ecore_con_cl_udp_handler(void *data,
2032 Ecore_Fd_Handler *fd_handler)
2033{
2034 unsigned char buf[READBUFSIZ];
2035 int num;
2036 Ecore_Con_Server *svr;
2037 Eina_Bool want_read, want_write;
2038
2039 want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ);
2040 want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE);
2041
2042 svr = data;
2043 if (svr->dead || svr->delete_me || ((!want_read) && (!want_write)))
2044 return ECORE_CALLBACK_RENEW;
2045
2046 if (want_write)
2047 {
2048 _ecore_con_server_flush(svr);
2049 return ECORE_CALLBACK_RENEW;
2050 }
2051
2052 num = read(svr->fd, buf, READBUFSIZ);
2053
2054 if ((!svr->delete_me) && (num > 0))
2055 ecore_con_event_server_data(svr, buf, num, EINA_TRUE);
2056
2057 if (num < 0 && (errno != EAGAIN) && (errno != EINTR))
2058 {
2059 ecore_con_event_server_error(svr, strerror(errno));
2060 _ecore_con_server_kill(svr);
2061 }
2062
2063 return ECORE_CALLBACK_RENEW;
2064}
2065
2066static Eina_Bool
2067_ecore_con_svr_udp_handler(void *data,
2068 Ecore_Fd_Handler *fd_handler)
2069{
2070 unsigned char buf[READBUFSIZ];
2071 unsigned char client_addr[256];
2072 socklen_t client_addr_len = sizeof(client_addr);
2073 int num;
2074 Ecore_Con_Server *svr;
2075 Ecore_Con_Client *cl = NULL;
2076
2077 svr = data;
2078
2079 if (svr->delete_me || svr->dead)
2080 return ECORE_CALLBACK_RENEW;
2081
2082 if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
2083 {
2084 _ecore_con_client_flush(cl);
2085 return ECORE_CALLBACK_RENEW;
2086 }
2087
2088 if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
2089 return ECORE_CALLBACK_RENEW;
2090
2091#ifdef _WIN32
2092 num = fcntl(svr->fd, F_SETFL, O_NONBLOCK);
2093 if (num >= 0)
2094 num = recvfrom(svr->fd, (char *)buf, sizeof(buf), 0,
2095 (struct sockaddr *)&client_addr,
2096 &client_addr_len);
2097
2098#else
2099 num = recvfrom(svr->fd, buf, sizeof(buf), MSG_DONTWAIT,
2100 (struct sockaddr *)&client_addr,
2101 &client_addr_len);
2102#endif
2103
2104 if (num < 0 && (errno != EAGAIN) && (errno != EINTR))
2105 {
2106 ecore_con_event_server_error(svr, strerror(errno));
2107 if (!svr->delete_me)
2108 ecore_con_event_client_del(NULL);
2109
2110 svr->dead = EINA_TRUE;
2111 svr->fd_handler = NULL;
2112 return ECORE_CALLBACK_CANCEL;
2113 }
2114
2115
2116/* Create a new client for use in the client data event */
2117 cl = calloc(1, sizeof(Ecore_Con_Client));
2118 EINA_SAFETY_ON_NULL_RETURN_VAL(cl, ECORE_CALLBACK_RENEW);
2119
2120 cl->host_server = svr;
2121 cl->client_addr = malloc(client_addr_len);
2122 if (!cl->client_addr)
2123 {
2124 free(cl);
2125 return ECORE_CALLBACK_RENEW;
2126 }
2127 cl->client_addr_len = client_addr_len;
2128
2129 memcpy(cl->client_addr, &client_addr, client_addr_len);
2130 ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
2131 svr->clients = eina_list_append(svr->clients, cl);
2132 svr->client_count++;
2133
2134 ecore_con_event_client_add(cl);
2135 ecore_con_event_client_data(cl, buf, num, EINA_TRUE);
2136
2137 return ECORE_CALLBACK_RENEW;
2138}
2139
2140static void
2141_ecore_con_svr_cl_read(Ecore_Con_Client *cl)
2142{
2143 int num = 0;
2144 Eina_Bool lost_client = EINA_TRUE;
2145 unsigned char buf[READBUFSIZ];
2146
2147 DBG("cl=%p", cl);
2148
2149 if (cl->handshaking)
2150 {
2151 /* add an extra handshake attempt just before read, even though
2152 * read also attempts to handshake, to try to finish sooner
2153 */
2154 if (ecore_con_ssl_client_init(cl))
2155 lost_client = EINA_FALSE;
2156
2157 _ecore_con_cl_timer_update(cl);
2158 }
2159
2160 if (!(cl->host_server->type & ECORE_CON_SSL) || (!cl->upgrade))
2161 {
2162 num = read(cl->fd, buf, sizeof(buf));
2163 /* 0 is not a valid return value for a tcp socket */
2164 if ((num > 0) || ((num < 0) && ((errno == EAGAIN) || (errno == EINTR))))
2165 lost_client = EINA_FALSE;
2166 else if (num < 0)
2167 ecore_con_event_client_error(cl, strerror(errno));
2168 }
2169 else
2170 {
2171 num = ecore_con_ssl_client_read(cl, buf, sizeof(buf));
2172 /* this is not an actual 0 return, 0 here just means non-fatal error such as EAGAIN */
2173 if (num >= 0)
2174 lost_client = EINA_FALSE;
2175 }
2176
2177 if ((!cl->delete_me) && (num > 0))
2178 ecore_con_event_client_data(cl, buf, num, EINA_TRUE);
2179
2180 if (lost_client)
2181 {
2182 if (!cl->delete_me)
2183 ecore_con_event_client_del(cl);
2184 INF("Lost client %s", (cl->ip) ? cl->ip : "");
2185 cl->dead = EINA_TRUE;
2186 if (cl->fd_handler)
2187 ecore_main_fd_handler_del(cl->fd_handler);
2188
2189 cl->fd_handler = NULL;
2190 return;
2191 }
2192}
2193
2194static Eina_Bool
2195_ecore_con_svr_cl_handler(void *data,
2196 Ecore_Fd_Handler *fd_handler)
2197{
2198 Ecore_Con_Client *cl;
2199
2200 cl = data;
2201 if (cl->dead)
2202 return ECORE_CALLBACK_RENEW;
2203
2204 if (cl->delete_me)
2205 return ECORE_CALLBACK_RENEW;
2206
2207 if (cl->handshaking && ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ | ECORE_FD_WRITE))
2208 {
2209 if (ecore_con_ssl_client_init(cl))
2210 {
2211 ERR("ssl handshaking failed!");
2212 cl->handshaking = EINA_FALSE;
2213 cl->dead = EINA_TRUE;
2214 INF("Lost client %s", (cl->ip) ? cl->ip : "");
2215 ecore_con_event_client_del(cl);
2216 }
2217 else if (!cl->ssl_state)
2218 ecore_con_event_client_add(cl);
2219 }
2220 else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
2221 _ecore_con_svr_cl_read(cl);
2222
2223 else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
2224 _ecore_con_client_flush(cl);
2225
2226 return ECORE_CALLBACK_RENEW;
2227}
2228
2229static void
2230_ecore_con_server_flush(Ecore_Con_Server *svr)
2231{
2232 int count, num;
2233
2234#ifdef _WIN32
2235 if (ecore_con_local_win32_server_flush(svr))
2236 return;
2237#endif
2238
2239 if ((!svr->buf) && svr->fd_handler)
2240 {
2241 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
2242 return;
2243 }
2244
2245 num = eina_binbuf_length_get(svr->buf) - svr->write_buf_offset;
2246
2247 /* check whether we need to write anything at all.
2248 * we must not write zero bytes with SSL_write() since it
2249 * causes undefined behaviour
2250 */
2251 /* we thank Tommy[D] for needing to check negative buffer sizes
2252 * here because his system is amazing.
2253 */
2254 if (num <= 0) return;
2255
2256 if (svr->handshaking)
2257 {
2258 DBG("Continuing ssl handshake");
2259 if (ecore_con_ssl_server_init(svr))
2260 _ecore_con_server_kill(svr);
2261 _ecore_con_server_timer_update(svr);
2262 return;
2263 }
2264
2265 if (!(svr->type & ECORE_CON_SSL))
2266 count = write(svr->fd, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num);
2267 else
2268 count = ecore_con_ssl_server_write(svr, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num);
2269
2270 if (count < 0)
2271 {
2272 if ((errno != EAGAIN) && (errno != EINTR))
2273 {
2274 ecore_con_event_server_error(svr, strerror(errno));
2275 _ecore_con_server_kill(svr);
2276 }
2277 return;
2278 }
2279
2280 if (count) ecore_con_event_server_write(svr, count);
2281 svr->write_buf_offset += count;
2282 if (svr->write_buf_offset >= eina_binbuf_length_get(svr->buf))
2283 {
2284 svr->write_buf_offset = 0;
2285 eina_binbuf_free(svr->buf);
2286 svr->buf = NULL;
2287 if (svr->fd_handler)
2288 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
2289 }
2290 else if ((count < num) && svr->fd_handler)
2291 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
2292}
2293
2294static void
2295_ecore_con_client_flush(Ecore_Con_Client *cl)
2296{
2297 int num, count = 0;
2298
2299#ifdef _WIN32
2300 if (ecore_con_local_win32_client_flush(cl))
2301 return;
2302#endif
2303
2304 if (!cl->buf && cl->fd_handler)
2305 {
2306 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
2307 return;
2308 }
2309
2310 if (cl->handshaking)
2311 {
2312 if (ecore_con_ssl_client_init(cl))
2313 count = -1;
2314
2315 _ecore_con_cl_timer_update(cl);
2316 }
2317
2318 if (!count)
2319 {
2320 num = eina_binbuf_length_get(cl->buf) - cl->buf_offset;
2321 if (num <= 0) return;
2322 if (!(cl->host_server->type & ECORE_CON_SSL) || (!cl->upgrade))
2323 count = write(cl->fd, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num);
2324 else
2325 count = ecore_con_ssl_client_write(cl, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num);
2326 }
2327
2328 if (count < 0)
2329 {
2330 if ((errno != EAGAIN) && (errno != EINTR) && (!cl->delete_me))
2331 {
2332 ecore_con_event_client_error(cl, strerror(errno));
2333 ecore_con_event_client_del(cl);
2334 cl->dead = EINA_TRUE;
2335 INF("Lost client %s", (cl->ip) ? cl->ip : "");
2336 if (cl->fd_handler)
2337 ecore_main_fd_handler_del(cl->fd_handler);
2338
2339 cl->fd_handler = NULL;
2340 }
2341
2342 return;
2343 }
2344
2345 if (count) ecore_con_event_client_write(cl, count);
2346 cl->buf_offset += count;
2347 if (cl->buf_offset >= eina_binbuf_length_get(cl->buf))
2348 {
2349 cl->buf_offset = 0;
2350 eina_binbuf_free(cl->buf);
2351 cl->buf = NULL;
2352 if (cl->fd_handler)
2353 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
2354 }
2355 else if ((count < num) && cl->fd_handler)
2356 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
2357}
2358
2359static void
2360_ecore_con_event_client_add_free(Ecore_Con_Server *svr,
2361 void *ev)
2362{
2363 Ecore_Con_Event_Client_Add *e;
2364
2365 e = ev;
2366 if (e->client)
2367 {
2368 e->client->event_count = eina_list_remove(e->client->event_count, e);
2369 if (e->client->host_server)
2370 {
2371 e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
2372 if ((!svr->event_count) && (svr->delete_me))
2373 _ecore_con_server_free(svr);
2374 }
2375 if ((!e->client->event_count) && (e->client->delete_me))
2376 ecore_con_client_del(e->client);
2377 }
2378
2379 ecore_con_event_client_add_free(e);
2380 _ecore_con_event_count--;
2381 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2382 ecore_con_mempool_shutdown();
2383}
2384
2385static void
2386_ecore_con_event_client_del_free(Ecore_Con_Server *svr,
2387 void *ev)
2388{
2389 Ecore_Con_Event_Client_Del *e;
2390
2391 e = ev;
2392 if (e->client)
2393 {
2394 e->client->event_count = eina_list_remove(e->client->event_count, e);
2395 if (e->client->host_server)
2396 {
2397 e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
2398 if ((!svr->event_count) && (svr->delete_me))
2399 _ecore_con_server_free(svr);
2400 }
2401 if ((!e->client->event_count) && (e->client->delete_me))
2402 ecore_con_client_del(e->client);
2403 }
2404 ecore_con_event_client_del_free(e);
2405 _ecore_con_event_count--;
2406 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2407 ecore_con_mempool_shutdown();
2408}
2409
2410static void
2411_ecore_con_event_client_write_free(Ecore_Con_Server *svr,
2412 Ecore_Con_Event_Client_Write *e)
2413{
2414 if (e->client)
2415 {
2416 e->client->event_count = eina_list_remove(e->client->event_count, e);
2417 if (e->client->host_server)
2418 {
2419 e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
2420 if ((!svr->event_count) && (svr->delete_me))
2421 _ecore_con_server_free(svr);
2422 }
2423 if (((!e->client->event_count) && (e->client->delete_me)) ||
2424 ((e->client->host_server &&
2425 ((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP ||
2426 (e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))))
2427 ecore_con_client_del(e->client);
2428 }
2429 ecore_con_event_client_write_free(e);
2430 _ecore_con_event_count--;
2431 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2432 ecore_con_mempool_shutdown();
2433}
2434
2435static void
2436_ecore_con_event_client_data_free(Ecore_Con_Server *svr,
2437 void *ev)
2438{
2439 Ecore_Con_Event_Client_Data *e;
2440
2441 e = ev;
2442 if (e->client)
2443 {
2444 e->client->event_count = eina_list_remove(e->client->event_count, e);
2445 if (e->client->host_server)
2446 {
2447 e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, ev);
2448 }
2449 if ((!svr->event_count) && (svr->delete_me))
2450 _ecore_con_server_free(svr);
2451 if (((!e->client->event_count) && (e->client->delete_me)) ||
2452 ((e->client->host_server &&
2453 ((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP ||
2454 (e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))))
2455 ecore_con_client_del(e->client);
2456 }
2457 free(e->data);
2458 ecore_con_event_client_data_free(e);
2459 _ecore_con_event_count--;
2460 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2461 ecore_con_mempool_shutdown();
2462}
2463
2464static void
2465_ecore_con_event_server_add_free(void *data __UNUSED__,
2466 void *ev)
2467{
2468 Ecore_Con_Event_Server_Add *e;
2469
2470 e = ev;
2471 if (e->server)
2472 {
2473 e->server->event_count = eina_list_remove(e->server->event_count, ev);
2474 if ((!e->server->event_count) && (e->server->delete_me))
2475 _ecore_con_server_free(e->server);
2476 }
2477 ecore_con_event_server_add_free(e);
2478 _ecore_con_event_count--;
2479 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2480 ecore_con_mempool_shutdown();
2481}
2482
2483static void
2484_ecore_con_event_server_del_free(void *data __UNUSED__,
2485 void *ev)
2486{
2487 Ecore_Con_Event_Server_Del *e;
2488
2489 e = ev;
2490 if (e->server)
2491 {
2492 e->server->event_count = eina_list_remove(e->server->event_count, ev);
2493 if ((!e->server->event_count) && (e->server->delete_me))
2494 _ecore_con_server_free(e->server);
2495 }
2496 ecore_con_event_server_del_free(e);
2497 _ecore_con_event_count--;
2498 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2499 ecore_con_mempool_shutdown();
2500}
2501
2502static void
2503_ecore_con_event_server_write_free(void *data __UNUSED__,
2504 Ecore_Con_Event_Server_Write *e)
2505{
2506 if (e->server)
2507 {
2508 e->server->event_count = eina_list_remove(e->server->event_count, e);
2509 if ((!e->server->event_count) && (e->server->delete_me))
2510 _ecore_con_server_free(e->server);
2511 }
2512
2513 ecore_con_event_server_write_free(e);
2514 _ecore_con_event_count--;
2515 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2516 ecore_con_mempool_shutdown();
2517}
2518
2519static void
2520_ecore_con_event_server_data_free(void *data __UNUSED__,
2521 void *ev)
2522{
2523 Ecore_Con_Event_Server_Data *e;
2524
2525 e = ev;
2526 if (e->server)
2527 {
2528 e->server->event_count = eina_list_remove(e->server->event_count, ev);
2529 if ((!e->server->event_count) && (e->server->delete_me))
2530 _ecore_con_server_free(e->server);
2531 }
2532
2533 free(e->data);
2534 ecore_con_event_server_data_free(e);
2535 _ecore_con_event_count--;
2536 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2537 ecore_con_mempool_shutdown();
2538}
2539
2540
2541static void
2542_ecore_con_event_server_error_free(void *data __UNUSED__, Ecore_Con_Event_Server_Error *e)
2543{
2544 if (e->server)
2545 {
2546 e->server->event_count = eina_list_remove(e->server->event_count, e);
2547 if ((!e->server->event_count) && (e->server->delete_me))
2548 _ecore_con_server_free(e->server);
2549 }
2550 free(e->error);
2551 ecore_con_event_server_error_free(e);
2552 _ecore_con_event_count--;
2553 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2554 ecore_con_mempool_shutdown();
2555}
2556
2557static void
2558_ecore_con_event_client_error_free(Ecore_Con_Server *svr, Ecore_Con_Event_Client_Error *e)
2559{
2560 if (e->client)
2561 {
2562 e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
2563 if ((!e->client->event_count) && (e->client->delete_me))
2564 _ecore_con_client_free(e->client);
2565 if (e->client->host_server)
2566 {
2567 e->client->host_server->event_count = eina_list_remove(e->client->host_server->event_count, e);
2568 if ((!svr->event_count) && (svr->delete_me))
2569 _ecore_con_server_free(svr);
2570 }
2571 }
2572 free(e->error);
2573 ecore_con_event_client_error_free(e);
2574 _ecore_con_event_count--;
2575 if ((!_ecore_con_event_count) && (!_ecore_con_init_count))
2576 ecore_con_mempool_shutdown();
2577}
2578
2579static void
2580_ecore_con_lookup_done(void *data,
2581 Ecore_Con_Info *infos)
2582{
2583 Ecore_Con_Server *svr;
2584 Ecore_Con_Lookup *lk;
2585
2586 svr = data;
2587 lk = svr->data;
2588
2589 if (infos)
2590 lk->done_cb(infos->info.ai_canonname, infos->ip,
2591 infos->info.ai_addr, infos->info.ai_addrlen,
2592 (void *)lk->data);
2593 else
2594 lk->done_cb(NULL, NULL, NULL, 0, (void *)lk->data);
2595
2596 free(svr->name);
2597 free(lk);
2598 free(svr);
2599}
2600
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_alloc.c b/libraries/ecore/src/lib/ecore_con/ecore_con_alloc.c
new file mode 100644
index 0000000..206948b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_alloc.c
@@ -0,0 +1,99 @@
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include "Ecore.h"
6#include "ecore_private.h"
7#include "Ecore_Con.h"
8#include "ecore_con_private.h"
9
10typedef struct _Ecore_Con_Mempool Ecore_Con_Mempool;
11struct _Ecore_Con_Mempool
12{
13 const char *name;
14 Eina_Mempool *mp;
15 size_t size;
16};
17
18#define GENERIC_ALLOC_FREE(TYPE, Type) \
19 Ecore_Con_Mempool Type##_mp = { #TYPE, NULL, sizeof (TYPE) }; \
20 \
21 TYPE * \
22 Type##_alloc(void) \
23 { \
24 return eina_mempool_malloc(Type##_mp.mp, sizeof (TYPE)); \
25 } \
26 \
27 void \
28 Type##_free(TYPE *e) \
29 { \
30 eina_mempool_free(Type##_mp.mp, e); \
31 }
32
33GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Add, ecore_con_event_client_add);
34GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Del, ecore_con_event_client_del);
35GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Write, ecore_con_event_client_write);
36GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Data, ecore_con_event_client_data);
37GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Error, ecore_con_event_server_error);
38GENERIC_ALLOC_FREE(Ecore_Con_Event_Client_Error, ecore_con_event_client_error);
39GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Add, ecore_con_event_server_add);
40GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Del, ecore_con_event_server_del);
41GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Write, ecore_con_event_server_write);
42GENERIC_ALLOC_FREE(Ecore_Con_Event_Server_Data, ecore_con_event_server_data);
43
44static Ecore_Con_Mempool *mempool_array[] = {
45 &ecore_con_event_client_add_mp,
46 &ecore_con_event_client_del_mp,
47 &ecore_con_event_client_write_mp,
48 &ecore_con_event_client_data_mp,
49 &ecore_con_event_server_error_mp,
50 &ecore_con_event_client_error_mp,
51 &ecore_con_event_server_add_mp,
52 &ecore_con_event_server_del_mp,
53 &ecore_con_event_server_write_mp,
54 &ecore_con_event_server_data_mp
55};
56
57void
58ecore_con_mempool_init(void)
59{
60 const char *choice;
61 unsigned int i;
62
63 choice = getenv("EINA_MEMPOOL");
64 if (!choice || !choice[0])
65 choice = "chained_mempool";
66
67 for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
68 {
69 retry:
70 mempool_array[i]->mp = eina_mempool_add(choice, mempool_array[i]->name, NULL, mempool_array[i]->size, 64);
71 if (!mempool_array[i]->mp)
72 {
73 if (strcmp(choice, "pass_through") != 0)
74 {
75 ERR("Falling back to pass through ! Previously tried '%s' mempool.", choice);
76 choice = "pass_through";
77 goto retry;
78 }
79 else
80 {
81 ERR("Impossible to allocate mempool '%s' !", choice);
82 return ;
83 }
84 }
85 }
86}
87
88void
89ecore_con_mempool_shutdown(void)
90{
91 unsigned int i;
92
93 for (i = 0; i < sizeof (mempool_array) / sizeof (mempool_array[0]); ++i)
94 {
95 eina_mempool_del(mempool_array[i]->mp);
96 mempool_array[i]->mp = NULL;
97 }
98}
99
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_ares.c b/libraries/ecore/src/lib/ecore_con/ecore_con_ares.c
new file mode 100644
index 0000000..dd5a212
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_ares.c
@@ -0,0 +1,628 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5/*
6 * This version of ecore_con_info use c-ares to provide asynchronous dns lookup.
7 *
8 * Note: It doesn't fork nor does it use libc getaddrinfo.
9 * http://c-ares.haxx.se/docs.html
10 */
11
12#include <string.h>
13#include <sys/types.h>
14
15#ifdef HAVE_NETINET_IN_H
16# include <netinet/in.h>
17#endif
18
19#ifdef HAVE_ARPA_INET_H
20# include <arpa/inet.h>
21#endif
22
23#include <ares.h>
24
25#include "Ecore.h"
26#include "Ecore_Con.h"
27#include "ecore_con_private.h"
28
29typedef struct _Ecore_Con_FD Ecore_Con_FD;
30typedef struct _Ecore_Con_CAres Ecore_Con_CAres;
31
32struct _Ecore_Con_FD
33{
34 Ecore_Fd_Handler *handler;
35 Ecore_Timer *timer;
36 int fd;
37};
38
39struct _Ecore_Con_CAres
40{
41 Ecore_Con_Server *svr;
42 Ecore_Con_Info_Cb done_cb;
43 void *data;
44 struct addrinfo hints;
45 Ecore_Con_Info *result;
46
47 union {
48 struct in_addr v4;
49#ifdef HAVE_IPV6
50 struct in6_addr v6;
51#endif
52 } addr;
53
54 Eina_Bool byaddr : 1;
55 Eina_Bool isv6 : 1;
56};
57
58static ares_channel info_channel;
59static int info_init = 0;
60static Eina_List *info_fds = NULL;
61
62static void _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
63 int status,
64 int timeouts,
65 char *node,
66 char *service);
67static void _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
68 int status,
69 int timeouts,
70 struct hostent *hostent);
71static Eina_Bool _ecore_con_info_cares_fd_cb(Ecore_Con_FD *ecf,
72 Ecore_Fd_Handler *fd_handler);
73static Eina_Bool _ecore_con_info_cares_timeout_cb(void *data);
74
75static void
76_ecore_con_info_cares_state_cb(void *data,
77 ares_socket_t fd,
78 int readable,
79 int writable);
80static int
81_ecore_con_info_fds_search(const Ecore_Con_FD *fd1,
82 const Ecore_Con_FD *fd2);
83
84int
85ecore_con_info_init(void)
86{
87 struct ares_options opts;
88
89 if (!info_init)
90 {
91 if (ares_library_init(ARES_LIB_INIT_ALL))
92 return 0;
93
94 opts.lookups = "fb"; /* hosts file then dns */
95 opts.sock_state_cb = _ecore_con_info_cares_state_cb;
96
97 if (ares_init_options(&info_channel, &opts,
98 ARES_OPT_LOOKUPS | ARES_OPT_SOCK_STATE_CB) != ARES_SUCCESS)
99 {
100 ares_library_cleanup();
101 return 0;
102 }
103 }
104
105 info_init++;
106 return info_init;
107}
108
109int
110ecore_con_info_shutdown(void)
111{
112 info_init--;
113 if (info_init == 0)
114 {
115 /* Cancel all ongoing request */
116 ares_cancel(info_channel);
117 ares_destroy(info_channel);
118
119 /* Shutdown ares */
120 ares_library_cleanup();
121 }
122
123 return info_init;
124}
125
126int
127ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
128 Ecore_Con_Info_Cb done_cb,
129 void *data)
130{
131 struct addrinfo hints;
132
133 memset(&hints, 0, sizeof(struct addrinfo));
134#ifdef HAVE_IPV6
135 hints.ai_family = AF_INET6;
136#else
137 hints.ai_family = AF_INET;
138#endif
139 hints.ai_socktype = SOCK_STREAM;
140 hints.ai_flags = AI_CANONNAME;
141 hints.ai_protocol = IPPROTO_TCP;
142 hints.ai_canonname = NULL;
143 hints.ai_next = NULL;
144 hints.ai_addr = NULL;
145
146 return ecore_con_info_get(svr, done_cb, data, &hints);
147}
148
149int
150ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
151 Ecore_Con_Info_Cb done_cb,
152 void *data)
153{
154 struct addrinfo hints;
155
156 memset(&hints, 0, sizeof(struct addrinfo));
157#ifdef HAVE_IPV6
158 hints.ai_family = AF_INET6;
159#else
160 hints.ai_family = AF_INET;
161#endif
162 hints.ai_socktype = SOCK_STREAM;
163 hints.ai_flags = AI_PASSIVE;
164 hints.ai_protocol = IPPROTO_TCP;
165 hints.ai_canonname = NULL;
166 hints.ai_next = NULL;
167 hints.ai_addr = NULL;
168
169 return ecore_con_info_get(svr, done_cb, data, &hints);
170}
171
172int
173ecore_con_info_udp_connect(Ecore_Con_Server *svr,
174 Ecore_Con_Info_Cb done_cb,
175 void *data)
176{
177 struct addrinfo hints;
178
179 memset(&hints, 0, sizeof(struct addrinfo));
180#ifdef HAVE_IPV6
181 hints.ai_family = AF_INET6;
182#else
183 hints.ai_family = AF_INET;
184#endif
185 hints.ai_socktype = SOCK_DGRAM;
186 hints.ai_flags = AI_CANONNAME;
187 hints.ai_protocol = IPPROTO_UDP;
188 hints.ai_canonname = NULL;
189 hints.ai_next = NULL;
190 hints.ai_addr = NULL;
191
192 return ecore_con_info_get(svr, done_cb, data, &hints);
193}
194
195int
196ecore_con_info_udp_listen(Ecore_Con_Server *svr,
197 Ecore_Con_Info_Cb done_cb,
198 void *data)
199{
200 struct addrinfo hints;
201
202 memset(&hints, 0, sizeof(struct addrinfo));
203#ifdef HAVE_IPV6
204 hints.ai_family = AF_INET6;
205#else
206 hints.ai_family = AF_INET;
207#endif
208 hints.ai_socktype = SOCK_DGRAM;
209 hints.ai_flags = AI_PASSIVE;
210 hints.ai_protocol = IPPROTO_UDP;
211 hints.ai_canonname = NULL;
212 hints.ai_next = NULL;
213 hints.ai_addr = NULL;
214
215 return ecore_con_info_get(svr, done_cb, data, &hints);
216}
217
218int
219ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
220 Ecore_Con_Info_Cb done_cb,
221 void *data)
222{
223 struct addrinfo hints;
224
225 memset(&hints, 0, sizeof(struct addrinfo));
226#ifdef HAVE_IPV6
227 hints.ai_family = AF_INET6;
228#else
229 hints.ai_family = AF_INET;
230#endif
231 hints.ai_socktype = SOCK_DGRAM;
232 hints.ai_flags = 0;
233 hints.ai_protocol = IPPROTO_UDP;
234 hints.ai_canonname = NULL;
235 hints.ai_next = NULL;
236 hints.ai_addr = NULL;
237
238 return ecore_con_info_get(svr, done_cb, data, &hints);
239}
240
241static Eina_Bool
242_ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg,
243 int addrtype,
244 const char *name,
245 struct sockaddr *addr,
246 int addrlen)
247{
248 int length = 0;
249
250 if (name)
251 length = strlen(name) + 1;
252 else
253 length = 1;
254
255 arg->result = malloc(sizeof(Ecore_Con_Info) + length);
256 if (!arg->result)
257 return EINA_FALSE;
258
259 /* FIXME: What to do when hint is not set ? */
260 arg->result->info.ai_flags = arg->hints.ai_flags;
261 arg->result->info.ai_socktype = arg->hints.ai_socktype;
262 arg->result->info.ai_protocol = arg->hints.ai_protocol;
263
264 arg->result->info.ai_family = addrtype;
265 arg->result->info.ai_addrlen = addrlen;
266 arg->result->info.ai_addr = addr;
267 arg->result->info.ai_canonname = (char *)(arg->result + 1);
268
269 if (!name)
270 *arg->result->info.ai_canonname = '\0';
271 else
272 strcpy(arg->result->info.ai_canonname, name);
273
274 arg->result->info.ai_next = NULL;
275
276 ares_getnameinfo(
277 info_channel, addr, addrlen,
278 ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST |
279 ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST,
280 (ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg);
281
282 return EINA_TRUE;
283}
284
285EAPI int
286ecore_con_info_get(Ecore_Con_Server *svr,
287 Ecore_Con_Info_Cb done_cb,
288 void *data,
289 struct addrinfo *hints)
290{
291 Ecore_Con_CAres *cares;
292#ifdef HAVE_IPV6
293 int ai_family = AF_INET6;
294#else
295 int ai_family = AF_INET;
296#endif
297
298 cares = calloc(1, sizeof(Ecore_Con_CAres));
299 if (!cares)
300 return 0;
301
302 cares->svr = svr;
303 cares->done_cb = done_cb;
304 cares->data = data;
305
306 if (hints)
307 {
308 ai_family = hints->ai_family;
309 memcpy(&cares->hints, hints, sizeof(struct addrinfo));
310 }
311
312 if (inet_pton(AF_INET, svr->name, &cares->addr.v4) == 1)
313 {
314 cares->byaddr = EINA_TRUE;
315 cares->isv6 = EINA_FALSE;
316 ares_gethostbyaddr(info_channel, &cares->addr.v4,
317 sizeof(cares->addr.v4),
318 AF_INET,
319 (ares_host_callback)_ecore_con_info_ares_host_cb,
320 cares);
321 }
322#ifdef HAVE_IPV6
323 else if (inet_pton(AF_INET6, svr->name, &cares->addr.v6) == 1)
324 {
325 cares->byaddr = EINA_TRUE;
326 cares->isv6 = EINA_TRUE;
327 ares_gethostbyaddr(info_channel, &cares->addr.v6,
328 sizeof(cares->addr.v6),
329 AF_INET6,
330 (ares_host_callback)_ecore_con_info_ares_host_cb,
331 cares);
332 }
333#endif
334 else
335 {
336 cares->byaddr = EINA_FALSE;
337 ares_gethostbyname(info_channel, svr->name, ai_family,
338 (ares_host_callback)_ecore_con_info_ares_host_cb,
339 cares);
340 }
341
342 svr->infos = eina_list_append(svr->infos, cares);
343 return 1;
344}
345
346void
347ecore_con_info_data_clear(void *info)
348{
349 Ecore_Con_CAres *cares = info;
350 if (cares) cares->data = NULL;
351}
352
353static Eina_Bool
354_ecore_con_info_cares_timeout_cb(void *data __UNUSED__)
355{
356 ares_process_fd(info_channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
357 return ECORE_CALLBACK_RENEW;
358}
359
360static Eina_Bool
361_ecore_con_info_cares_fd_cb(Ecore_Con_FD *ecf,
362 Ecore_Fd_Handler *fd_handler)
363{
364 ares_socket_t read_fd, write_fd;
365
366 read_fd = write_fd = ARES_SOCKET_BAD;
367
368 if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
369 read_fd = ecf->fd;
370 if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE))
371 write_fd = ecf->fd;
372
373 ares_process_fd(info_channel, read_fd, write_fd);
374
375 return ECORE_CALLBACK_RENEW;
376}
377
378static int
379_ecore_con_info_fds_search(const Ecore_Con_FD *fd1,
380 const Ecore_Con_FD *fd2)
381{
382 return fd1->fd - fd2->fd;
383}
384
385static void
386_ecore_con_info_cares_state_cb(void *data __UNUSED__,
387 ares_socket_t fd,
388 int readable,
389 int writable)
390{
391 int flags = 0;
392 Ecore_Con_FD *search = NULL, *ecf = NULL;
393
394 search = eina_list_search_unsorted(info_fds,
395 (Eina_Compare_Cb)_ecore_con_info_fds_search, &ecf);
396
397 if (!(readable | writable))
398 {
399 ares_process_fd(info_channel, ARES_SOCKET_BAD, ARES_SOCKET_BAD);
400 if (search)
401 {
402 info_fds = eina_list_remove(info_fds, search);
403 ecore_timer_del(search->timer);
404 ecore_main_fd_handler_del(search->handler);
405 free(search);
406 }
407 return;
408 }
409
410 if (!search)
411 {
412 search = malloc(sizeof(Ecore_Con_FD));
413 EINA_SAFETY_ON_NULL_RETURN(search);
414
415 search->fd = fd;
416 search->handler = ecore_main_fd_handler_add(fd, ECORE_FD_WRITE | ECORE_FD_READ,
417 (Ecore_Fd_Cb)_ecore_con_info_cares_fd_cb, search, NULL, NULL);
418 /* c-ares default timeout is 5 seconds */
419 search->timer = ecore_timer_add(5, _ecore_con_info_cares_timeout_cb, NULL);
420 info_fds = eina_list_append(info_fds, search);
421 }
422
423 if (readable) flags |= ECORE_FD_READ;
424 if (writable) flags |= ECORE_FD_WRITE;
425 ecore_main_fd_handler_active_set(search->handler, flags);
426}
427
428static void
429_ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg,
430 int status,
431 int timeouts __UNUSED__,
432 struct hostent *hostent)
433{
434 struct sockaddr *addr;
435 int addrlen;
436
437 /* Found something ? */
438 switch (status)
439 {
440 case ARES_SUCCESS:
441 if (!hostent->h_addr_list[0])
442 {
443 ERR("No IP found");
444 goto on_error;
445 }
446
447 switch (hostent->h_addrtype)
448 {
449 case AF_INET:
450 {
451 struct sockaddr_in *addri;
452
453 addrlen = sizeof(struct sockaddr_in);
454 addri = malloc(addrlen);
455
456 if (!addri)
457 goto on_mem_error;
458
459 addri->sin_family = AF_INET;
460 addri->sin_port = htons(arg->svr->port);
461
462 memcpy(&addri->sin_addr.s_addr,
463 hostent->h_addr_list[0], sizeof(struct in_addr));
464
465 addr = (struct sockaddr *)addri;
466 break;
467 }
468#ifdef HAVE_IPV6
469 case AF_INET6:
470 {
471 struct sockaddr_in6 *addri6;
472
473 addrlen = sizeof(struct sockaddr_in6);
474 addri6 = malloc(addrlen);
475
476 if (!addri6)
477 goto on_mem_error;
478
479 addri6->sin6_family = AF_INET6;
480 addri6->sin6_port = htons(arg->svr->port);
481 addri6->sin6_flowinfo = 0;
482 addri6->sin6_scope_id = 0;
483
484 memcpy(&addri6->sin6_addr.s6_addr,
485 hostent->h_addr_list[0], sizeof(struct in6_addr));
486
487 addr = (struct sockaddr *)addri6;
488 break;
489 }
490#endif
491 default:
492 ERR("Unknown addrtype %i", hostent->h_addrtype);
493 goto on_error;
494 }
495
496 if (!_ecore_con_info_ares_getnameinfo(arg, hostent->h_addrtype,
497 hostent->h_name,
498 addr, addrlen))
499 goto on_error;
500
501 break;
502
503 case ARES_ENOTFOUND: /* address notfound */
504 if (arg->byaddr)
505 {
506#ifdef HAVE_IPV6
507 /* This happen when host doesn't have a reverse. */
508 if (arg->isv6)
509 {
510 struct sockaddr_in6 *addri6;
511
512 addrlen = sizeof(struct sockaddr_in6);
513 addri6 = malloc(addrlen);
514
515 if (!addri6)
516 goto on_mem_error;
517
518 addri6->sin6_family = AF_INET6;
519 addri6->sin6_port = htons(arg->svr->port);
520 addri6->sin6_flowinfo = 0;
521 addri6->sin6_scope_id = 0;
522
523 memcpy(&addri6->sin6_addr.s6_addr,
524 &arg->addr.v6, sizeof(struct in6_addr));
525
526 addr = (struct sockaddr *)addri6;
527 }
528 else
529#endif
530 {
531 struct sockaddr_in *addri;
532
533 addrlen = sizeof(struct sockaddr_in);
534 addri = malloc(addrlen);
535
536 if (!addri)
537 goto on_mem_error;
538
539 addri->sin_family = AF_INET;
540 addri->sin_port = htons(arg->svr->port);
541
542 memcpy(&addri->sin_addr.s_addr,
543 &arg->addr.v4, sizeof(struct in_addr));
544
545 addr = (struct sockaddr *)addri;
546 }
547
548 if (!_ecore_con_info_ares_getnameinfo(arg,
549#ifdef HAVE_IPV6
550 arg->isv6 ? AF_INET6 :
551#endif
552 AF_INET,
553 NULL, addr,
554 addrlen))
555 goto on_error;
556
557 break;
558 }
559
560 case ARES_ENOTIMP: /* unknown family */
561 case ARES_EBADNAME: /* not a valid internet address */
562 case ARES_ENOMEM: /* not enough memory */
563 case ARES_EDESTRUCTION: /* request canceled, shuting down */
564 case ARES_ENODATA: /* no data returned */
565 case ARES_ECONNREFUSED: /* connection refused */
566 case ARES_ETIMEOUT: /* connection timed out */
567 ecore_con_event_server_error(arg->svr, ares_strerror(status));
568 goto on_error;
569
570 default:
571 ERR("Unknown status returned by c-ares: %i assuming error", status);
572 ecore_con_event_server_error(arg->svr, ares_strerror(status));
573 goto on_error;
574 }
575
576 return;
577
578on_mem_error:
579 ERR("Not enough memory");
580
581on_error:
582 if (arg->data)
583 {
584 ecore_con_server_infos_del(arg->data, arg);
585 arg->done_cb(arg->data, NULL);
586 }
587 free(arg);
588}
589
590static void
591_ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg,
592 int status,
593 int timeouts __UNUSED__,
594 char *node,
595 char *service)
596{
597 switch (status)
598 {
599 case ARES_SUCCESS:
600 if (node)
601 strcpy(arg->result->ip, node);
602 else
603 *arg->result->ip = '\0';
604
605 if (service)
606 strcpy(arg->result->service, service);
607 else
608 *arg->result->service = '\0';
609
610 if (arg->data) arg->done_cb(arg->data, arg->result);
611 break;
612
613 case ARES_ENOTIMP:
614 case ARES_ENOTFOUND:
615 case ARES_ENOMEM:
616 case ARES_EDESTRUCTION:
617 case ARES_EBADFLAGS:
618 ecore_con_event_server_error(arg->svr, ares_strerror(status));
619 if (arg->data) arg->done_cb(arg->data, NULL);
620 break;
621 }
622
623 free(arg->result->info.ai_addr);
624 free(arg->result);
625 if (arg->data) ecore_con_server_infos_del(arg->data, arg);
626 free(arg);
627}
628
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_info.c b/libraries/ecore/src/lib/ecore_con/ecore_con_info.c
new file mode 100644
index 0000000..4ece6b0
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_info.c
@@ -0,0 +1,450 @@
1/*
2 * getaddrinfo with callback
3 *
4 * man getaddrinfo
5 *
6 */
7
8#ifdef HAVE_CONFIG_H
9# include <config.h>
10#endif
11
12#ifdef HAVE_ALLOCA_H
13# include <alloca.h>
14#elif defined __GNUC__
15# define alloca __builtin_alloca
16#elif defined _AIX
17# define alloca __alloca
18#elif defined _MSC_VER
19# include <malloc.h>
20# define alloca _alloca
21#else
22# include <stddef.h>
23# ifdef __cplusplus
24extern "C"
25# endif
26void *alloca(size_t);
27#endif
28
29#include <string.h>
30#include <sys/types.h>
31#include <unistd.h>
32#include <ctype.h>
33#ifdef __OpenBSD__
34# include <sys/types.h>
35#endif
36
37#ifdef HAVE_NETINET_IN_H
38# include <netinet/in.h>
39#endif
40
41#ifdef HAVE_ARPA_INET_H
42# include <arpa/inet.h>
43#endif
44
45#ifdef HAVE_ARPA_NAMESER_H
46# include <arpa/nameser.h>
47#endif
48
49#ifdef HAVE_SYS_SOCKET_H
50# include <sys/socket.h>
51#endif
52
53#ifdef HAVE_NETDB_H
54# include <netdb.h>
55#endif
56
57#include <errno.h>
58
59#include "Ecore.h"
60#include "ecore_private.h"
61#include "ecore_con_private.h"
62
63typedef struct _CB_Data CB_Data;
64
65struct _CB_Data
66{
67 EINA_INLIST;
68 Ecore_Con_Info_Cb cb_done;
69 void *data;
70 Ecore_Fd_Handler *fdh;
71 pid_t pid;
72 Ecore_Event_Handler *handler;
73 int fd2;
74};
75
76static void _ecore_con_info_readdata(CB_Data *cbdata);
77static void _ecore_con_info_slave_free(CB_Data *cbdata);
78static Eina_Bool _ecore_con_info_data_handler(void *data,
79 Ecore_Fd_Handler *fd_handler);
80static Eina_Bool _ecore_con_info_exit_handler(void *data,
81 int type __UNUSED__,
82 void *event);
83
84static int info_init = 0;
85static CB_Data *info_slaves = NULL;
86
87int
88ecore_con_info_init(void)
89{
90 info_init++;
91 return info_init;
92}
93
94int
95ecore_con_info_shutdown(void)
96{
97 info_init--;
98 if (info_init == 0)
99 while (info_slaves) _ecore_con_info_slave_free(info_slaves);
100
101 return info_init;
102}
103
104int
105ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
106 Ecore_Con_Info_Cb done_cb,
107 void *data)
108{
109 struct addrinfo hints;
110
111 memset(&hints, 0, sizeof(struct addrinfo));
112 hints.ai_family = AF_UNSPEC;
113 hints.ai_socktype = SOCK_STREAM;
114 hints.ai_flags = AI_CANONNAME;
115 hints.ai_protocol = IPPROTO_TCP;
116 hints.ai_canonname = NULL;
117 hints.ai_next = NULL;
118 hints.ai_addr = NULL;
119
120 return ecore_con_info_get(svr, done_cb, data, &hints);
121}
122
123int
124ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
125 Ecore_Con_Info_Cb done_cb,
126 void *data)
127{
128 struct addrinfo hints;
129
130 memset(&hints, 0, sizeof(struct addrinfo));
131 hints.ai_family = AF_UNSPEC;
132 hints.ai_socktype = SOCK_STREAM;
133 hints.ai_flags = AI_PASSIVE;
134 hints.ai_protocol = IPPROTO_TCP;
135 hints.ai_canonname = NULL;
136 hints.ai_next = NULL;
137 hints.ai_addr = NULL;
138
139 return ecore_con_info_get(svr, done_cb, data, &hints);
140}
141
142int
143ecore_con_info_udp_connect(Ecore_Con_Server *svr,
144 Ecore_Con_Info_Cb done_cb,
145 void *data)
146{
147 struct addrinfo hints;
148
149 memset(&hints, 0, sizeof(struct addrinfo));
150 hints.ai_family = AF_UNSPEC;
151 hints.ai_socktype = SOCK_DGRAM;
152 hints.ai_flags = AI_CANONNAME;
153 hints.ai_protocol = IPPROTO_UDP;
154 hints.ai_canonname = NULL;
155 hints.ai_next = NULL;
156 hints.ai_addr = NULL;
157
158 return ecore_con_info_get(svr, done_cb, data, &hints);
159}
160
161int
162ecore_con_info_udp_listen(Ecore_Con_Server *svr,
163 Ecore_Con_Info_Cb done_cb,
164 void *data)
165{
166 struct addrinfo hints;
167
168 memset(&hints, 0, sizeof(struct addrinfo));
169 hints.ai_family = AF_UNSPEC;
170 hints.ai_socktype = SOCK_DGRAM;
171 hints.ai_flags = AI_PASSIVE;
172 hints.ai_protocol = IPPROTO_UDP;
173 hints.ai_canonname = NULL;
174 hints.ai_next = NULL;
175 hints.ai_addr = NULL;
176
177 return ecore_con_info_get(svr, done_cb, data, &hints);
178}
179
180int
181ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
182 Ecore_Con_Info_Cb done_cb,
183 void *data)
184{
185 struct addrinfo hints;
186
187 memset(&hints, 0, sizeof(struct addrinfo));
188 hints.ai_family = AF_UNSPEC;
189 hints.ai_socktype = SOCK_DGRAM;
190 hints.ai_flags = 0;
191 hints.ai_protocol = IPPROTO_UDP;
192 hints.ai_canonname = NULL;
193 hints.ai_next = NULL;
194 hints.ai_addr = NULL;
195
196 return ecore_con_info_get(svr, done_cb, data, &hints);
197}
198
199EAPI int
200ecore_con_info_get(Ecore_Con_Server *svr,
201 Ecore_Con_Info_Cb done_cb,
202 void *data,
203 struct addrinfo *hints)
204{
205 CB_Data *cbdata;
206 int fd[2];
207
208 if (pipe(fd) < 0)
209 {
210 ecore_con_event_server_error(svr, strerror(errno));
211 return 0;
212 }
213
214 cbdata = calloc(1, sizeof(CB_Data));
215 if (!cbdata)
216 {
217 close(fd[0]);
218 close(fd[1]);
219 return 0;
220 }
221
222 cbdata->cb_done = done_cb;
223 cbdata->data = data;
224 cbdata->fd2 = fd[1];
225 if (!(cbdata->fdh = ecore_main_fd_handler_add(fd[0], ECORE_FD_READ,
226 _ecore_con_info_data_handler,
227 cbdata,
228 NULL, NULL)))
229 {
230 ecore_con_event_server_error(svr, "Memory allocation failure");
231 free(cbdata);
232 close(fd[0]);
233 close(fd[1]);
234 return 0;
235 }
236
237 if ((cbdata->pid = fork()) == 0)
238 {
239 Ecore_Con_Info *container;
240 struct addrinfo *result = NULL;
241 char service[NI_MAXSERV] = {0};
242 char hbuf[NI_MAXHOST] = {0};
243 char sbuf[NI_MAXSERV] = {0};
244 unsigned char *tosend = NULL;
245 int tosend_len;
246 int canonname_len = 0;
247 int err;
248
249 eina_convert_itoa(svr->port, service);
250 /* CHILD */
251 if (!getaddrinfo(svr->name, service, hints, &result) && result)
252 {
253 if (result->ai_canonname)
254 canonname_len = strlen(result->ai_canonname) + 1;
255
256 tosend_len = sizeof(Ecore_Con_Info) + result->ai_addrlen +
257 canonname_len;
258
259 tosend = alloca(tosend_len);
260 memset(tosend, 0, tosend_len);
261
262 container = (Ecore_Con_Info *)tosend;
263 container->size = tosend_len;
264
265 memcpy(&container->info,
266 result,
267 sizeof(struct addrinfo));
268 memcpy(tosend + sizeof(Ecore_Con_Info),
269 result->ai_addr,
270 result->ai_addrlen);
271 if (result->ai_canonname) /* FIXME: else... */
272 memcpy(tosend + sizeof(Ecore_Con_Info) + result->ai_addrlen,
273 result->ai_canonname,
274 canonname_len);
275
276 if (!getnameinfo(result->ai_addr, result->ai_addrlen,
277 hbuf, sizeof(hbuf), sbuf, sizeof(sbuf),
278 NI_NUMERICHOST | NI_NUMERICSERV))
279 {
280 memcpy(container->ip, hbuf, sizeof(container->ip));
281 memcpy(container->service, sbuf, sizeof(container->service));
282 }
283
284 err = write(fd[1], tosend, tosend_len);
285 }
286
287 if (result)
288 freeaddrinfo(result);
289
290 err = write(fd[1], "", 1);
291 close(fd[1]);
292#if defined(__USE_ISOC99) && !defined(__UCLIBC__)
293 _Exit(0);
294#else
295 _exit(0);
296#endif
297 }
298
299 /* PARENT */
300 cbdata->handler =
301 ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_info_exit_handler,
302 cbdata);
303 close(fd[1]);
304 if (!cbdata->handler)
305 {
306 ecore_main_fd_handler_del(cbdata->fdh);
307 free(cbdata);
308 close(fd[0]);
309 return 0;
310 }
311
312 info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET(
313 info_slaves),
314 EINA_INLIST_GET(cbdata));
315 svr->infos = eina_list_append(svr->infos, cbdata);
316 return 1;
317}
318
319void
320ecore_con_info_data_clear(void *info)
321{
322 CB_Data *cbdata = info;
323 cbdata->data = NULL;
324}
325
326static void
327_ecore_con_info_readdata(CB_Data *cbdata)
328{
329 Ecore_Con_Info container;
330 Ecore_Con_Info *recv_info;
331 unsigned char *torecv;
332 int torecv_len;
333
334 ssize_t size;
335
336 size = read(ecore_main_fd_handler_fd_get(cbdata->fdh), &container,
337 sizeof(Ecore_Con_Info));
338 if (size == sizeof(Ecore_Con_Info))
339 {
340 torecv_len = container.size;
341 torecv = malloc(torecv_len);
342
343 memcpy(torecv, &container, sizeof(Ecore_Con_Info));
344
345 size = read(ecore_main_fd_handler_fd_get(cbdata->fdh),
346 torecv + sizeof(Ecore_Con_Info),
347 torecv_len - sizeof(Ecore_Con_Info));
348 if ((size > 0) &&
349 ((size_t)size == torecv_len - sizeof(Ecore_Con_Info)))
350 {
351 recv_info = (Ecore_Con_Info *)torecv;
352
353 recv_info->info.ai_addr =
354 (struct sockaddr *)(torecv + sizeof(Ecore_Con_Info));
355 if ((size_t)torecv_len !=
356 (sizeof(Ecore_Con_Info) + recv_info->info.ai_addrlen))
357 recv_info->info.ai_canonname = (char *)
358 (torecv + sizeof(Ecore_Con_Info) + recv_info->info.ai_addrlen);
359 else
360 recv_info->info.ai_canonname = NULL;
361
362 recv_info->info.ai_next = NULL;
363
364 if (cbdata->data)
365 {
366 cbdata->cb_done(cbdata->data, recv_info);
367 ecore_con_server_infos_del(cbdata->data, cbdata);
368 }
369
370 free(torecv);
371 }
372 else
373 {
374 if (cbdata->data)
375 {
376 cbdata->cb_done(cbdata->data, NULL);
377 ecore_con_server_infos_del(cbdata->data, cbdata);
378 }
379 }
380 }
381 else
382 {
383 if (cbdata->data)
384 {
385 ecore_con_event_server_error(cbdata->data, strerror(errno));
386 cbdata->cb_done(cbdata->data, NULL);
387 ecore_con_server_infos_del(cbdata->data, cbdata);
388 }
389 }
390
391 cbdata->cb_done = NULL;
392}
393
394static void
395_ecore_con_info_slave_free(CB_Data *cbdata)
396{
397 info_slaves = (CB_Data *)eina_inlist_remove(EINA_INLIST_GET(info_slaves),
398 EINA_INLIST_GET(cbdata));
399 ecore_main_fd_handler_del(cbdata->fdh);
400 ecore_event_handler_del(cbdata->handler);
401 close(ecore_main_fd_handler_fd_get(cbdata->fdh));
402 if (cbdata->data) ecore_con_server_infos_del(cbdata->data, cbdata);
403 free(cbdata);
404}
405
406static Eina_Bool
407_ecore_con_info_data_handler(void *data,
408 Ecore_Fd_Handler *fd_handler)
409{
410 CB_Data *cbdata;
411
412 cbdata = data;
413 if (cbdata->cb_done)
414 {
415 if (ecore_main_fd_handler_active_get(fd_handler,
416 ECORE_FD_READ))
417 _ecore_con_info_readdata(cbdata);
418 else
419 {
420 if (cbdata->data)
421 {
422 cbdata->cb_done(cbdata->data, NULL);
423 cbdata->cb_done = NULL;
424 ecore_con_server_infos_del(cbdata->data, cbdata);
425 }
426 }
427 }
428
429 _ecore_con_info_slave_free(cbdata);
430 return ECORE_CALLBACK_CANCEL;
431}
432
433static Eina_Bool
434_ecore_con_info_exit_handler(void *data,
435 int type __UNUSED__,
436 void *event)
437{
438 CB_Data *cbdata;
439 Ecore_Exe_Event_Del *ev;
440
441 ev = event;
442 cbdata = data;
443 if (cbdata->pid != ev->pid)
444 return ECORE_CALLBACK_RENEW;
445
446 return ECORE_CALLBACK_CANCEL; /* FIXME: Woot ??? */
447 _ecore_con_info_slave_free(cbdata);
448 return ECORE_CALLBACK_CANCEL;
449}
450
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_local.c b/libraries/ecore/src/lib/ecore_con/ecore_con_local.c
new file mode 100644
index 0000000..f02cc1f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_local.c
@@ -0,0 +1,317 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7#include <unistd.h>
8#include <time.h>
9#include <fcntl.h>
10#include <sys/stat.h>
11
12#ifdef HAVE_SYS_SOCKET_H
13# include <sys/socket.h>
14#endif
15
16#ifdef HAVE_SYS_UN_H
17# include <sys/un.h>
18#endif
19
20#ifdef HAVE_WS2TCPIP_H
21# include <ws2tcpip.h>
22#endif
23
24#include <Ecore.h>
25#include <ecore_private.h>
26
27#include "Ecore_Con.h"
28#include "ecore_con_private.h"
29
30#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + \
31 (size_t)(((struct sockaddr_un *)NULL)-> \
32 sun_path))
33#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + \
34 (size_t)(((struct sockaddr_un \
35 *)NULL)->sun_path))
36
37static int _ecore_con_local_init_count = 0;
38
39int
40ecore_con_local_init(void)
41{
42 if (++_ecore_con_local_init_count != 1)
43 return _ecore_con_local_init_count;
44
45 return _ecore_con_local_init_count;
46}
47
48int
49ecore_con_local_shutdown(void)
50{
51 if (--_ecore_con_local_init_count != 0)
52 return _ecore_con_local_init_count;
53
54 return _ecore_con_local_init_count;
55}
56
57int
58ecore_con_local_connect(Ecore_Con_Server *svr,
59 Eina_Bool (*cb_done)(void *data, Ecore_Fd_Handler *fd_handler),
60 void *data __UNUSED__)
61{
62#ifndef HAVE_LOCAL_SOCKETS
63 return 0;
64#else
65 char buf[4096];
66 struct sockaddr_un socket_unix;
67 int curstate = 0;
68 const char *homedir;
69 int socket_unix_len;
70
71 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
72 {
73 homedir = getenv("HOME");
74 if (!homedir)
75 homedir = getenv("TMP");
76
77 if (!homedir)
78 homedir = "/tmp";
79
80 snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, svr->name,
81 svr->port);
82 }
83 else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
84 {
85 if (svr->port < 0)
86 {
87 if (svr->name[0] == '/')
88 strncpy(buf, svr->name, sizeof(buf));
89 else
90 snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", svr->name);
91 }
92 else
93 {
94 if (svr->name[0] ==
95 '/')
96 snprintf(buf, sizeof(buf), "%s|%i", svr->name,
97 svr->port);
98 else
99 snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i",
100 svr->name,
101 svr->port);
102 }
103 }
104 else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
105 strncpy(buf, svr->name,
106 sizeof(buf));
107
108 svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
109 if (svr->fd < 0)
110 return 0;
111
112 if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
113 return 0;
114
115 if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
116 return 0;
117
118 if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate,
119 sizeof(curstate)) < 0)
120 return 0;
121
122 socket_unix.sun_family = AF_UNIX;
123
124 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
125 {
126#ifdef HAVE_ABSTRACT_SOCKETS
127 /* copy name insto sun_path, prefixed by null to indicate abstract namespace */
128 snprintf(socket_unix.sun_path, sizeof(socket_unix.sun_path), ".%s",
129 svr->name);
130 socket_unix.sun_path[0] = '\0';
131 socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix,
132 svr->name);
133#else
134 WRN("Your system does not support abstract sockets!");
135 return 0;
136#endif
137 }
138 else
139 {
140 strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
141 socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
142 }
143
144 if (connect(svr->fd, (struct sockaddr *)&socket_unix,
145 socket_unix_len) < 0)
146 return 0;
147
148 svr->path = strdup(buf);
149 if (!svr->path)
150 return 0;
151
152 if (svr->type & ECORE_CON_SSL)
153 ecore_con_ssl_server_init(svr);
154
155 svr->fd_handler =
156 ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
157 cb_done, svr, NULL, NULL);
158 if (!svr->fd_handler)
159 return 0;
160
161 if (!svr->delete_me) ecore_con_event_server_add(svr);
162
163 return 1;
164#endif
165}
166
167int
168ecore_con_local_listen(
169 Ecore_Con_Server *svr,
170 Eina_Bool (*
171 cb_listen)(void *data,
172 Ecore_Fd_Handler *
173 fd_handler),
174 void *data
175 __UNUSED__)
176{
177#ifdef HAVE_LOCAL_SOCKETS
178 char buf[4096];
179 struct sockaddr_un socket_unix;
180 struct linger lin;
181 mode_t pmode;
182 const char *homedir;
183 struct stat st;
184 mode_t mask;
185 int socket_unix_len;
186
187 mask = S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH;
188
189 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
190 {
191 homedir = getenv("HOME");
192 if (!homedir)
193 homedir = getenv("TMP");
194
195 if (!homedir)
196 homedir = "/tmp";
197
198 mask = S_IRUSR | S_IWUSR | S_IXUSR;
199 snprintf(buf, sizeof(buf), "%s/.ecore", homedir);
200 if (stat(buf, &st) < 0)
201 mkdir(buf, mask);
202
203 snprintf(buf, sizeof(buf), "%s/.ecore/%s", homedir, svr->name);
204 if (stat(buf, &st) < 0)
205 mkdir(buf, mask);
206
207 snprintf(buf,
208 sizeof(buf),
209 "%s/.ecore/%s/%i",
210 homedir,
211 svr->name,
212 svr->port);
213 mask = S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH;
214 }
215 else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
216 {
217 mask = 0;
218 if (svr->name[0] == '/')
219 {
220 if (svr->port >= 0)
221 snprintf(buf,
222 sizeof(buf),
223 "%s|%i",
224 svr->name,
225 svr->port);
226 else
227 snprintf(buf,
228 sizeof(buf),
229 "%s",
230 svr->name);
231 }
232 else
233 snprintf(buf,
234 sizeof(buf),
235 "/tmp/.ecore_service|%s|%i",
236 svr->name,
237 svr->port);
238 }
239 else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
240 strncpy(buf, svr->name,
241 sizeof(buf));
242
243 pmode = umask(mask);
244start:
245 svr->fd = socket(AF_UNIX, SOCK_STREAM, 0);
246 if (svr->fd < 0)
247 goto error_umask;
248
249 if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
250 goto error_umask;
251
252 if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
253 goto error_umask;
254
255 lin.l_onoff = 1;
256 lin.l_linger = 0;
257 if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
258 sizeof(struct linger)) < 0)
259 goto error_umask;
260
261 socket_unix.sun_family = AF_UNIX;
262 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
263 {
264#ifdef HAVE_ABSTRACT_SOCKETS
265 /* . is a placeholder */
266 snprintf(socket_unix.sun_path, sizeof(socket_unix.sun_path), ".%s",
267 svr->name);
268 /* first char null indicates abstract namespace */
269 socket_unix.sun_path[0] = '\0';
270 socket_unix_len = LENGTH_OF_ABSTRACT_SOCKADDR_UN(&socket_unix,
271 svr->name);
272#else
273 ERR("Your system does not support abstract sockets!");
274 goto error_umask;
275#endif
276 }
277 else
278 {
279 strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
280 socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
281 }
282
283 if (bind(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
284 {
285 if ((((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER) ||
286 ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)) &&
287 (connect(svr->fd, (struct sockaddr *)&socket_unix,
288 socket_unix_len) < 0) &&
289 (unlink(buf) >= 0))
290 goto start;
291 else
292 goto error_umask;
293 }
294
295 if (listen(svr->fd, 4096) < 0)
296 goto error_umask;
297
298 svr->path = strdup(buf);
299 if (!svr->path)
300 goto error_umask;
301
302 svr->fd_handler =
303 ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ,
304 cb_listen, svr, NULL, NULL);
305 umask(pmode);
306 if (!svr->fd_handler)
307 goto error;
308
309 return 1;
310
311error_umask:
312 umask(pmode);
313error:
314#endif /* HAVE_LOCAL_SOCKETS */
315 return 0;
316}
317
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_local_win32.c b/libraries/ecore/src/lib/ecore_con/ecore_con_local_win32.c
new file mode 100644
index 0000000..858daa5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_local_win32.c
@@ -0,0 +1,769 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <process.h>
6
7#include <Evil.h>
8#include <Ecore.h>
9
10#include "Ecore_Con.h"
11#include "ecore_con_private.h"
12
13#define BUFSIZE 512
14
15
16static int _ecore_con_local_init_count = 0;
17
18int
19ecore_con_local_init(void)
20{
21 if (++_ecore_con_local_init_count != 1)
22 return _ecore_con_local_init_count;
23
24 return _ecore_con_local_init_count;
25}
26
27int
28ecore_con_local_shutdown(void)
29{
30 if (--_ecore_con_local_init_count != 0)
31 return _ecore_con_local_init_count;
32
33 return _ecore_con_local_init_count;
34}
35
36
37static Eina_Bool
38_ecore_con_local_win32_server_read_client_handler(void *data, Ecore_Win32_Handler *wh)
39{
40 Ecore_Con_Client *cl;
41 void *buf;
42 DWORD n;
43 Eina_Bool broken_pipe = EINA_FALSE;
44
45 cl = (Ecore_Con_Client *)data;
46
47 if (!ResetEvent(cl->host_server->event_read))
48 return ECORE_CALLBACK_RENEW;
49
50 buf = malloc(cl->host_server->nbr_bytes);
51 if (!buf)
52 return ECORE_CALLBACK_RENEW;
53
54 if (ReadFile(cl->host_server->pipe, buf, cl->host_server->nbr_bytes, &n, NULL))
55 {
56 if (!cl->delete_me)
57 ecore_con_event_client_data(cl, buf, cl->host_server->nbr_bytes, EINA_FALSE);
58 cl->host_server->want_write = 1;
59 }
60 else
61 {
62 if (GetLastError() == ERROR_BROKEN_PIPE)
63 broken_pipe = EINA_TRUE;
64 }
65
66 if (broken_pipe)
67 {
68#if 0
69 char *msg;
70
71 msg = evil_last_error_get();
72 if (msg)
73 {
74 ecore_con_event_client_error(cl, msg);
75 free(msg);
76 }
77#endif
78 if (!cl->delete_me)
79 ecore_con_event_client_del(cl);
80 cl->dead = EINA_TRUE;
81 return ECORE_CALLBACK_CANCEL;
82 }
83
84 if (cl->host_server->want_write)
85 ecore_con_local_win32_client_flush(cl);
86
87 ecore_main_win32_handler_del(wh);
88
89 return ECORE_CALLBACK_DONE;
90}
91
92static Eina_Bool
93_ecore_con_local_win32_server_peek_client_handler(void *data, Ecore_Win32_Handler *wh)
94{
95 Ecore_Con_Client *cl;
96#if 0
97 char *msg;
98#endif
99
100 cl = (Ecore_Con_Client *)data;
101
102 if (!ResetEvent(cl->host_server->event_peek))
103 return ECORE_CALLBACK_RENEW;
104
105#if 0
106 msg = evil_last_error_get();
107 if (msg)
108 {
109 ecore_con_event_server_error(cl->host_server, msg);
110 free(msg);
111 }
112#endif
113 if (!cl->host_server->delete_me)
114 ecore_con_event_server_del(cl->host_server);
115 cl->host_server->dead = EINA_TRUE;
116 return ECORE_CALLBACK_CANCEL;
117
118 ecore_main_win32_handler_del(wh);
119
120 return ECORE_CALLBACK_DONE;
121}
122
123static Eina_Bool
124_ecore_con_local_win32_client_peek_server_handler(void *data, Ecore_Win32_Handler *wh)
125{
126 Ecore_Con_Server *svr;
127#if 0
128 char *msg;
129#endif
130
131 svr = (Ecore_Con_Server *)data;
132
133 if (!ResetEvent(svr->event_peek))
134 return ECORE_CALLBACK_RENEW;
135#if 0
136 msg = evil_last_error_get();
137 if (msg)
138 {
139 ecore_con_event_server_error(svr, msg);
140 free(msg);
141 }
142#endif
143 if (!svr->delete_me)
144 ecore_con_event_server_del(svr);
145 svr->dead = EINA_TRUE;
146 return ECORE_CALLBACK_CANCEL;
147
148 ecore_main_win32_handler_del(wh);
149
150 return ECORE_CALLBACK_DONE;
151}
152
153static Eina_Bool
154_ecore_con_local_win32_client_read_server_handler(void *data, Ecore_Win32_Handler *wh)
155{
156 Ecore_Con_Server *svr;
157 void *buf;
158 DWORD n;
159 Eina_Bool broken_pipe = EINA_FALSE;
160
161 svr = (Ecore_Con_Server *)data;
162
163 if (!ResetEvent(svr->event_read))
164 return ECORE_CALLBACK_RENEW;
165
166 buf = malloc(svr->nbr_bytes);
167 if (!buf)
168 return ECORE_CALLBACK_RENEW;
169
170 if (ReadFile(svr->pipe, buf, svr->nbr_bytes, &n, NULL))
171 {
172 if (!svr->delete_me)
173 ecore_con_event_server_data(svr, buf, svr->nbr_bytes, EINA_FALSE);
174 svr->want_write = 1;
175 }
176 else
177 {
178 if (GetLastError() == ERROR_BROKEN_PIPE)
179 broken_pipe = EINA_TRUE;
180 }
181
182 if (broken_pipe)
183 {
184#if 0
185 char *msg;
186
187 msg = evil_last_error_get();
188 if (msg)
189 {
190 ecore_con_event_server_error(svr, msg);
191 free(msg);
192 }
193#endif
194 if (!svr->delete_me)
195 ecore_con_event_server_del(svr);
196 svr->dead = EINA_TRUE;
197 return ECORE_CALLBACK_CANCEL;
198 }
199
200 if (svr->want_write)
201 ecore_con_local_win32_server_flush(svr);
202
203 ecore_main_win32_handler_del(wh);
204
205 return ECORE_CALLBACK_DONE;
206}
207
208/* thread to read data sent by the server to the client */
209static unsigned int __stdcall
210_ecore_con_local_win32_client_read_server_thread(void *data)
211{
212 Ecore_Con_Server *svr;
213 DWORD nbr_bytes = 0;
214
215 svr = (Ecore_Con_Server *)data;
216
217 svr->read_stopped = EINA_FALSE;
218
219 while (!svr->read_stop)
220 {
221 if (PeekNamedPipe(svr->pipe, NULL, 0, NULL, &nbr_bytes, NULL))
222 {
223 if (nbr_bytes <= 0)
224 continue;
225
226 svr->nbr_bytes = nbr_bytes;
227 if (!SetEvent(svr->event_read))
228 continue;
229 }
230 else
231 {
232 if (GetLastError() == ERROR_BROKEN_PIPE)
233 {
234 if (!SetEvent(svr->event_peek))
235 continue;
236 break;
237 }
238 }
239 }
240
241 printf(" ### %s\n", __FUNCTION__);
242 svr->read_stopped = EINA_TRUE;
243 _endthreadex(0);
244 return 0;
245}
246
247/* thread to read data sent by the client to the server */
248static unsigned int __stdcall
249_ecore_con_local_win32_server_read_client_thread(void *data)
250{
251 Ecore_Con_Client *cl;
252 DWORD nbr_bytes = 0;
253
254 cl = (Ecore_Con_Client *)data;
255
256 cl->host_server->read_stopped = EINA_FALSE;
257
258 while (!cl->host_server->read_stop)
259 {
260 if (PeekNamedPipe(cl->host_server->pipe, NULL, 0, NULL, &nbr_bytes, NULL))
261 {
262 if (nbr_bytes <= 0)
263 continue;
264
265 cl->host_server->nbr_bytes = nbr_bytes;
266 if (!SetEvent(cl->host_server->event_read))
267 continue;
268 }
269 else
270 {
271 if (GetLastError() == ERROR_BROKEN_PIPE)
272 {
273 if (!SetEvent(cl->host_server->event_peek))
274 continue;
275 break;
276 }
277 }
278 }
279
280 printf(" ### %s\n", __FUNCTION__);
281 cl->host_server->read_stopped = EINA_TRUE;
282 _endthreadex(0);
283 return 0;
284}
285
286static Eina_Bool
287_ecore_con_local_win32_client_add(void *data, Ecore_Win32_Handler *wh)
288{
289 Ecore_Con_Client *cl = NULL;
290 Ecore_Con_Server *svr;
291 Ecore_Win32_Handler *handler_read;
292 Ecore_Win32_Handler *handler_peek;
293
294 svr = (Ecore_Con_Server *)data;
295
296 if (!svr->pipe)
297 return ECORE_CALLBACK_CANCEL;
298
299 if (svr->dead)
300 return ECORE_CALLBACK_CANCEL;
301
302 if (svr->delete_me)
303 return ECORE_CALLBACK_CANCEL;
304
305 if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) &&
306 (svr->client_count >= (unsigned int)svr->client_limit))
307 return ECORE_CALLBACK_CANCEL;
308
309 cl = calloc(1, sizeof(Ecore_Con_Client));
310 if (!cl)
311 {
312 ERR("allocation failed");
313 return ECORE_CALLBACK_CANCEL;
314 }
315
316 cl->host_server = svr;
317 ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT);
318
319 cl->host_server->event_read = CreateEvent(NULL, TRUE, FALSE, NULL);
320 if (!cl->host_server->event_read)
321 {
322 ERR("Can not create event read");
323 goto free_cl;
324 }
325
326 handler_read = ecore_main_win32_handler_add(cl->host_server->event_read,
327 _ecore_con_local_win32_server_read_client_handler,
328 cl);
329 if (!handler_read)
330 {
331 ERR("Can not create handler read");
332 goto close_event_read;
333 }
334
335 cl->host_server->event_peek = CreateEvent(NULL, TRUE, FALSE, NULL);
336 if (!cl->host_server->event_peek)
337 {
338 ERR("Can not create event peek");
339 goto del_handler_read;
340 }
341
342 handler_peek = ecore_main_win32_handler_add(cl->host_server->event_peek,
343 _ecore_con_local_win32_server_peek_client_handler,
344 cl);
345 if (!handler_peek)
346 {
347 ERR("Can not create handler peek");
348 goto close_event_peek;
349 }
350
351 cl->host_server->read_stopped = EINA_TRUE;
352 cl->host_server->thread_read = (HANDLE)_beginthreadex(NULL, 0, _ecore_con_local_win32_server_read_client_thread, cl, CREATE_SUSPENDED, NULL);
353 if (!cl->host_server->thread_read)
354 {
355 ERR("Can not launch thread");
356 goto del_handler_peek;
357 }
358
359 svr->clients = eina_list_append(svr->clients, cl);
360 svr->client_count++;
361
362 if (!cl->delete_me)
363 ecore_con_event_client_add(cl);
364
365 ecore_main_win32_handler_del(wh);
366
367 ResumeThread(cl->host_server->thread_read);
368 return ECORE_CALLBACK_DONE;
369
370 del_handler_peek:
371 ecore_main_win32_handler_del(handler_peek);
372 close_event_peek:
373 CloseHandle(cl->host_server->event_peek);
374 del_handler_read:
375 ecore_main_win32_handler_del(handler_read);
376 close_event_read:
377 CloseHandle(cl->host_server->event_read);
378 free_cl:
379 free(cl);
380
381 return ECORE_CALLBACK_CANCEL;
382}
383
384static unsigned int __stdcall
385_ecore_con_local_win32_listening(void *data)
386{
387 Ecore_Con_Server *svr;
388 BOOL res;
389
390 svr = (Ecore_Con_Server *)data;
391
392 while (1)
393 {
394 res = ConnectNamedPipe(svr->pipe, NULL);
395 if (!res)
396 {
397 ERR("Opening the connection to the client failed");
398 CloseHandle(svr->pipe);
399 svr->pipe = NULL;
400 }
401 break;
402 }
403
404 DBG("Client connected");
405
406 printf(" ### %s\n", __FUNCTION__);
407 _endthreadex(0);
408 return 0;
409}
410
411Eina_Bool
412ecore_con_local_listen(Ecore_Con_Server *svr)
413{
414 char buf[256];
415 HANDLE thread_listening;
416 Ecore_Win32_Handler *handler;
417
418 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
419 {
420 ERR("Your system does not support abstract sockets!");
421 return EINA_FALSE;
422 }
423
424 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
425 snprintf(buf, sizeof(buf), "\\\\.\\pipe\\%s", svr->name);
426 else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
427 {
428 const char *computername;
429
430 computername = getenv("CoMPUTERNAME");
431 snprintf(buf, sizeof(buf), "\\\\%s\\pipe\\%s", computername, svr->name);
432 }
433
434 svr->path = strdup(buf);
435 if (!svr->path)
436 {
437 ERR("Allocation failed");
438 return EINA_FALSE;
439 }
440
441 /*
442 * synchronuous
443 * block mode
444 * wait mode
445 */
446 svr->pipe = CreateNamedPipe(svr->path,
447 PIPE_ACCESS_DUPLEX,
448 PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
449 PIPE_UNLIMITED_INSTANCES,
450 BUFSIZE,
451 BUFSIZE,
452 5000,
453 NULL);
454 if (svr->pipe == INVALID_HANDLE_VALUE)
455 {
456 ERR("Creation of the named pipe failed");
457 goto free_path;
458 }
459
460 /*
461 * We use ConnectNamedPipe() to wait for a client to connect.
462 * As the function is blocking, to let the main loop continuing
463 * its iterations, we call ConnectNamedPipe() in a thread
464 */
465 thread_listening = (HANDLE)_beginthreadex(NULL, 0, _ecore_con_local_win32_listening, svr, CREATE_SUSPENDED, NULL);
466 if (!thread_listening)
467 {
468 ERR("Creation of the listening thread failed");
469 goto close_pipe;
470 }
471
472 handler = ecore_main_win32_handler_add(thread_listening,
473 _ecore_con_local_win32_client_add,
474 svr);
475 if (!handler)
476 {
477 ERR("Creation of the client add handler failed");
478 goto del_handler;
479 }
480
481 svr->read_stopped = EINA_TRUE;
482 ResumeThread(thread_listening);
483
484 return EINA_TRUE;
485
486 del_handler:
487 ecore_main_win32_handler_del(handler);
488 close_pipe:
489 CloseHandle(svr->pipe);
490 free_path:
491 free(svr->path);
492 svr->path = NULL;
493
494 return EINA_FALSE;
495}
496
497void
498ecore_con_local_win32_server_del(Ecore_Con_Server *svr)
499{
500 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
501 return;
502
503 if (((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_USER) &&
504 ((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_SYSTEM))
505 return;
506
507 svr->read_stop = 1;
508 while (!svr->read_stopped)
509 Sleep(100);
510
511 if (svr->event_peek)
512 CloseHandle(svr->event_peek);
513 svr->event_peek = NULL;
514 if (svr->event_read)
515 CloseHandle(svr->event_read);
516 svr->event_read = NULL;
517 free(svr->path);
518 svr->path = NULL;
519 if (svr->pipe)
520 CloseHandle(svr->pipe);
521 svr->pipe = NULL;
522}
523
524void
525ecore_con_local_win32_client_del(Ecore_Con_Client *cl)
526{
527 if ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
528 return;
529
530 if (((cl->host_server->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_USER) &&
531 ((cl->host_server->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_SYSTEM))
532 return;
533
534 cl->host_server->read_stop = 1;
535 while (!cl->host_server->read_stopped)
536 Sleep(100);
537
538 if (cl->host_server->event_peek)
539 CloseHandle(cl->host_server->event_peek);
540 cl->host_server->event_peek = NULL;
541 if (cl->host_server->event_read)
542 CloseHandle(cl->host_server->event_read);
543 cl->host_server->event_read = NULL;
544 free(cl->host_server->path);
545 cl->host_server->path = NULL;
546 if (cl->host_server->pipe)
547 CloseHandle(cl->host_server->pipe);
548 cl->host_server->pipe = NULL;
549}
550
551Eina_Bool
552ecore_con_local_connect(Ecore_Con_Server *svr,
553 Eina_Bool (*cb_done)(void *data,
554 Ecore_Fd_Handler *fd_handler))
555{
556 char buf[256];
557 Ecore_Win32_Handler *handler_read;
558 Ecore_Win32_Handler *handler_peek;
559
560 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
561 {
562 ERR("Your system does not support abstract sockets!");
563 return EINA_FALSE;
564 }
565
566 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_USER)
567 snprintf(buf, sizeof(buf), "\\\\.\\pipe\\%s", svr->name);
568 else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_SYSTEM)
569 {
570 const char *computername;
571
572 computername = getenv("COMPUTERNAME");
573 snprintf(buf, sizeof(buf), "\\\\%s\\pipe\\%s", computername, svr->name);
574 }
575
576 while (1)
577 {
578 svr->pipe = CreateFile(buf,
579 GENERIC_READ | GENERIC_WRITE,
580 0,
581 NULL,
582 OPEN_EXISTING,
583 0,
584 NULL);
585 if (svr->pipe != INVALID_HANDLE_VALUE)
586 break;
587
588 /* if pipe not busy, we exit */
589 if (GetLastError() != ERROR_PIPE_BUSY)
590 {
591 ERR("Connection to a server failed");
592 return EINA_FALSE;
593 }
594
595 /* pipe busy, so we wait for it */
596 if (!WaitNamedPipe(buf, NMPWAIT_WAIT_FOREVER))
597 {
598 ERR("Can not wait for a server");
599 goto close_pipe;
600 }
601 }
602
603 svr->path = strdup(buf);
604 if (!svr->path)
605 {
606 ERR("Allocation failed");
607 goto close_pipe;
608 }
609
610 svr->event_read = CreateEvent(NULL, TRUE, FALSE, NULL);
611 if (!svr->event_read)
612 {
613 ERR("Can not create event read");
614 goto free_path;
615 }
616
617 handler_read = ecore_main_win32_handler_add(svr->event_read,
618 _ecore_con_local_win32_client_read_server_handler,
619 svr);
620 if (!handler_read)
621 {
622 ERR("Can not create handler read");
623 goto close_event_read;
624 }
625
626 svr->event_peek = CreateEvent(NULL, TRUE, FALSE, NULL);
627 if (!svr->event_peek)
628 {
629 ERR("Can not create event peek");
630 goto del_handler_read;
631 }
632
633 handler_peek = ecore_main_win32_handler_add(svr->event_peek,
634 _ecore_con_local_win32_client_peek_server_handler,
635 svr);
636 if (!handler_peek)
637 {
638 ERR("Can not create handler peek");
639 goto close_event_peek;
640 }
641
642 svr->thread_read = (HANDLE)_beginthreadex(NULL, 0, _ecore_con_local_win32_client_read_server_thread, svr, CREATE_SUSPENDED, NULL);
643 if (!svr->thread_read)
644 {
645 ERR("Can not launch thread");
646 goto del_handler_peek;
647 }
648
649 if (!svr->delete_me) ecore_con_event_server_add(svr);
650
651 ResumeThread(svr->thread_read);
652
653 return EINA_TRUE;
654
655 del_handler_peek:
656 ecore_main_win32_handler_del(handler_peek);
657 close_event_peek:
658 CloseHandle(svr->event_peek);
659 del_handler_read:
660 ecore_main_win32_handler_del(handler_read);
661 close_event_read:
662 CloseHandle(svr->event_read);
663 free_path:
664 free(svr->path);
665 svr->path = NULL;
666 close_pipe:
667 CloseHandle(svr->pipe);
668
669 return EINA_FALSE;
670}
671
672Eina_Bool
673ecore_con_local_win32_server_flush(Ecore_Con_Server *svr)
674{
675 int num;
676 BOOL res;
677 DWORD written;
678
679 /* This check should never be true */
680 if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT)
681 return EINA_TRUE;
682
683 if (((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_USER) &&
684 ((svr->type & ECORE_CON_TYPE) != ECORE_CON_LOCAL_SYSTEM))
685 return EINA_FALSE;
686
687 num = eina_binbuf_length_get(svr->buf) - svr->write_buf_offset;
688 if (num <= 0) return EINA_TRUE;
689
690 res = WriteFile(svr->pipe, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num, &written, NULL);
691 if (!res)
692 {
693 char *msg;
694
695 msg = evil_last_error_get();
696 if (msg)
697 {
698 ecore_con_event_server_error(svr, msg);
699 free(msg);
700 }
701 if (!svr->delete_me)
702 ecore_con_event_server_del(svr);
703 svr->dead = EINA_TRUE;
704 }
705
706 svr->write_buf_offset += written;
707 if (svr->write_buf_offset >= eina_binbuf_length_get(svr->buf))
708 {
709 svr->write_buf_offset = 0;
710 eina_binbuf_free(svr->buf);
711 svr->buf = NULL;
712 svr->want_write = 0;
713 }
714 else if (written < (DWORD)num)
715 svr->want_write = 1;
716
717 return EINA_TRUE;
718}
719
720Eina_Bool
721ecore_con_local_win32_client_flush(Ecore_Con_Client *cl)
722{
723 Ecore_Con_Type type;
724 int num;
725 BOOL res;
726 DWORD written;
727
728 type = cl->host_server->type & ECORE_CON_TYPE;
729
730 /* This check should never be true */
731 if (type == ECORE_CON_LOCAL_ABSTRACT)
732 return EINA_TRUE;
733
734 if ((type != ECORE_CON_LOCAL_USER) &&
735 (type != ECORE_CON_LOCAL_SYSTEM))
736 return EINA_FALSE;
737
738 num = eina_binbuf_length_get(cl->buf) - cl->buf_offset;
739 if (num <= 0) return EINA_TRUE;
740
741 res = WriteFile(cl->host_server->pipe, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num, &written, NULL);
742 if (!res)
743 {
744 char *msg;
745
746 msg = evil_last_error_get();
747 if (msg)
748 {
749 ecore_con_event_client_error(cl, msg);
750 free(msg);
751 }
752 if (!cl->delete_me)
753 ecore_con_event_client_del(cl);
754 cl->dead = EINA_TRUE;
755 }
756
757 cl->buf_offset += written;
758 if (cl->buf_offset >= eina_binbuf_length_get(cl->buf))
759 {
760 cl->buf_offset = 0;
761 eina_binbuf_free(cl->buf);
762 cl->buf = NULL;
763 cl->host_server->want_write = 0;
764 }
765 else if (written < (DWORD)num)
766 cl->host_server->want_write = 1;
767
768 return EINA_TRUE;
769}
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_private.h b/libraries/ecore/src/lib/ecore_con/ecore_con_private.h
new file mode 100644
index 0000000..f601465
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_private.h
@@ -0,0 +1,321 @@
1#ifndef _ECORE_CON_PRIVATE_H
2#define _ECORE_CON_PRIVATE_H
3
4#include "ecore_private.h"
5#include "Ecore_Con.h"
6
7#define ECORE_MAGIC_CON_SERVER 0x77665544
8#define ECORE_MAGIC_CON_CLIENT 0x77556677
9#define ECORE_MAGIC_CON_URL 0x77074255
10
11#define ECORE_CON_TYPE 0x0f
12#define ECORE_CON_SSL 0xf0
13
14#if USE_GNUTLS
15# include <gnutls/gnutls.h>
16#elif USE_OPENSSL
17# include <openssl/ssl.h>
18#endif
19#ifdef HAVE_CURL
20#include <curl/curl.h>
21#endif
22
23#define READBUFSIZ 65536
24
25extern int _ecore_con_log_dom;
26
27#ifdef ECORE_CON_DEFAULT_LOG_COLOR
28#undef ECORE_LOG_DEFAULT_LOG_COLOR
29#endif
30#define ECORE_CON_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
31
32#ifdef ERR
33# undef ERR
34#endif
35#define ERR(...) EINA_LOG_DOM_ERR(_ecore_con_log_dom, __VA_ARGS__)
36
37#ifdef DBG
38# undef DBG
39#endif
40#define DBG(...) EINA_LOG_DOM_DBG(_ecore_con_log_dom, __VA_ARGS__)
41
42#ifdef INF
43# undef INF
44#endif
45#define INF(...) EINA_LOG_DOM_INFO(_ecore_con_log_dom, __VA_ARGS__)
46
47#ifdef WRN
48# undef WRN
49#endif
50#define WRN(...) EINA_LOG_DOM_WARN(_ecore_con_log_dom, __VA_ARGS__)
51
52#ifdef CRIT
53# undef CRIT
54#endif
55#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_con_log_dom, __VA_ARGS__)
56
57typedef struct _Ecore_Con_Lookup Ecore_Con_Lookup;
58typedef struct _Ecore_Con_Info Ecore_Con_Info;
59
60typedef void (*Ecore_Con_Info_Cb)(void *data, Ecore_Con_Info *infos);
61
62typedef enum _Ecore_Con_State
63{
64 ECORE_CON_CONNECTED,
65 ECORE_CON_DISCONNECTED,
66 ECORE_CON_INPROGRESS
67} Ecore_Con_State;
68
69typedef enum _Ecore_Con_Ssl_Error
70{
71 ECORE_CON_SSL_ERROR_NONE = 0,
72 ECORE_CON_SSL_ERROR_NOT_SUPPORTED,
73 ECORE_CON_SSL_ERROR_INIT_FAILED,
74 ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED,
75 ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED
76} Ecore_Con_Ssl_Error;
77
78typedef enum _Ecore_Con_Ssl_Handshake
79{
80 ECORE_CON_SSL_STATE_DONE = 0,
81 ECORE_CON_SSL_STATE_HANDSHAKING,
82 ECORE_CON_SSL_STATE_INIT
83} Ecore_Con_Ssl_State;
84
85struct _Ecore_Con_Client
86{
87 ECORE_MAGIC;
88 int fd;
89 Ecore_Con_Server *host_server;
90 void *data;
91 Ecore_Fd_Handler *fd_handler;
92 unsigned int buf_offset;
93 Eina_Binbuf *buf;
94 const char *ip;
95 Eina_List *event_count;
96 struct sockaddr *client_addr;
97 int client_addr_len;
98 double start_time;
99 Ecore_Timer *until_deletion;
100 double disconnect_time;
101#if USE_GNUTLS
102 gnutls_datum_t session_ticket;
103 gnutls_session_t session;
104#elif USE_OPENSSL
105 SSL *ssl;
106 int ssl_err;
107#endif
108 Ecore_Con_Ssl_State ssl_state;
109 Eina_Bool handshaking : 1;
110 Eina_Bool upgrade : 1;
111 Eina_Bool dead : 1;
112 Eina_Bool delete_me : 1;
113};
114
115struct _Ecore_Con_Server
116{
117 ECORE_MAGIC;
118 int fd;
119 Ecore_Con_Type type;
120 char *name;
121 int port;
122 char *path;
123 void *data;
124 Ecore_Fd_Handler *fd_handler;
125 Eina_List *clients;
126 unsigned int client_count;
127 Eina_Binbuf *buf;
128 unsigned int write_buf_offset;
129 Eina_List *infos;
130 Eina_List *event_count;
131 int client_limit;
132 pid_t ppid;
133#if USE_GNUTLS
134 gnutls_session_t session;
135 gnutls_anon_client_credentials_t anoncred_c;
136 gnutls_anon_server_credentials_t anoncred_s;
137 gnutls_psk_client_credentials_t pskcred_c;
138 gnutls_psk_server_credentials_t pskcred_s;
139 gnutls_certificate_credentials_t cert;
140 char *cert_file;
141 gnutls_dh_params_t dh_params;
142#elif USE_OPENSSL
143 SSL_CTX *ssl_ctx;
144 SSL *ssl;
145 int ssl_err;
146#endif
147 double start_time;
148 Ecore_Timer *until_deletion;
149 double disconnect_time;
150 double client_disconnect_time;
151 const char *ip;
152 Eina_Bool dead : 1;
153 Eina_Bool created : 1; /* EINA_TRUE if server is our listening server */
154 Eina_Bool connecting : 1; /* EINA_FALSE if just initialized or connected */
155 Eina_Bool handshaking : 1; /* EINA_TRUE if server is ssl handshaking */
156 Eina_Bool upgrade : 1;
157 Eina_Bool ssl_prepared : 1;
158 Eina_Bool use_cert : 1; /* EINA_TRUE if using certificate auth */
159 Ecore_Con_Ssl_State ssl_state; /* current state of ssl handshake on the server */
160 Eina_Bool verify : 1; /* EINA_TRUE if certificates will be verified */
161 Eina_Bool verify_basic : 1; /* EINA_TRUE if certificates will be verified only against the hostname */
162 Eina_Bool reject_excess_clients : 1;
163 Eina_Bool delete_me : 1;
164#ifdef _WIN32
165 Eina_Bool want_write : 1;
166 Eina_Bool read_stop : 1;
167 Eina_Bool read_stopped : 1;
168 HANDLE pipe;
169 HANDLE thread_read;
170 HANDLE event_read;
171 HANDLE event_peek;
172 DWORD nbr_bytes;
173#endif
174};
175
176#ifdef HAVE_CURL
177struct _Ecore_Con_Url
178{
179 ECORE_MAGIC;
180 CURL *curl_easy;
181 struct curl_slist *headers;
182 Eina_List *additional_headers;
183 Eina_List *response_headers;
184 const char *url;
185
186 Ecore_Con_Url_Time time_condition;
187 double timestamp;
188 void *data;
189
190 Ecore_Fd_Handler *fd_handler;
191 int fd;
192 int flags;
193
194 int received;
195 int write_fd;
196
197 Eina_Bool active : 1;
198};
199#endif
200
201struct _Ecore_Con_Info
202{
203 unsigned int size;
204 struct addrinfo info;
205 char ip[NI_MAXHOST];
206 char service[NI_MAXSERV];
207};
208
209struct _Ecore_Con_Lookup
210{
211 Ecore_Con_Dns_Cb done_cb;
212 const void *data;
213};
214
215/* from ecore_con.c */
216void ecore_con_server_infos_del(Ecore_Con_Server *svr, void *info);
217void ecore_con_event_server_data(Ecore_Con_Server *svr, unsigned char *buf, int num, Eina_Bool duplicate);
218void ecore_con_event_server_del(Ecore_Con_Server *svr);
219void ecore_con_event_server_error(Ecore_Con_Server *svr, const char *error);
220void ecore_con_event_client_add(Ecore_Con_Client *cl);
221void ecore_con_event_client_data(Ecore_Con_Client *cl, unsigned char *buf, int num, Eina_Bool duplicate);
222void ecore_con_event_client_del(Ecore_Con_Client *cl);
223void ecore_con_event_client_error(Ecore_Con_Client *cl, const char *error);
224
225/* from ecore_local_win32.c */
226#ifdef _WIN32
227Eina_Bool ecore_con_local_listen(Ecore_Con_Server *svr);
228Eina_Bool ecore_con_local_connect(Ecore_Con_Server *svr,
229 Eina_Bool (*cb_done)(void *data,
230 Ecore_Fd_Handler *fd_handler));
231Eina_Bool ecore_con_local_win32_server_flush(Ecore_Con_Server *svr);
232Eina_Bool ecore_con_local_win32_client_flush(Ecore_Con_Client *cl);
233void ecore_con_local_win32_server_del(Ecore_Con_Server *svr);
234void ecore_con_local_win32_client_del(Ecore_Con_Client *cl);
235#else
236/* from ecore_local.c */
237int ecore_con_local_init(void);
238int ecore_con_local_shutdown(void);
239int ecore_con_local_connect(Ecore_Con_Server *svr,
240 Eina_Bool (*cb_done)(
241 void *data,
242 Ecore_Fd_Handler *fd_handler),
243 void *data);
244int ecore_con_local_listen(Ecore_Con_Server *svr,
245 Eina_Bool (*cb_listen)(
246 void *data,
247 Ecore_Fd_Handler *fd_handler),
248 void *data);
249#endif
250
251/* from ecore_con_info.c */
252int ecore_con_info_init(void);
253int ecore_con_info_shutdown(void);
254int ecore_con_info_tcp_connect(Ecore_Con_Server *svr,
255 Ecore_Con_Info_Cb done_cb,
256 void *data);
257int ecore_con_info_tcp_listen(Ecore_Con_Server *svr,
258 Ecore_Con_Info_Cb done_cb,
259 void *data);
260int ecore_con_info_udp_connect(Ecore_Con_Server *svr,
261 Ecore_Con_Info_Cb done_cb,
262 void *data);
263int ecore_con_info_udp_listen(Ecore_Con_Server *svr,
264 Ecore_Con_Info_Cb done_cb,
265 void *data);
266int ecore_con_info_mcast_listen(Ecore_Con_Server *svr,
267 Ecore_Con_Info_Cb done_cb,
268 void *data);
269void ecore_con_info_data_clear(void *info);
270
271void ecore_con_event_server_add(Ecore_Con_Server *svr);
272
273
274/* from ecore_con_ssl.c */
275Ecore_Con_Ssl_Error ecore_con_ssl_init(void);
276Ecore_Con_Ssl_Error ecore_con_ssl_shutdown(void);
277Ecore_Con_Ssl_Error ecore_con_ssl_server_prepare(Ecore_Con_Server *svr, int ssl_type);
278Ecore_Con_Ssl_Error ecore_con_ssl_server_init(Ecore_Con_Server *svr);
279Ecore_Con_Ssl_Error ecore_con_ssl_server_shutdown(Ecore_Con_Server *svr);
280int ecore_con_ssl_server_read(Ecore_Con_Server *svr,
281 unsigned char *buf,
282 int size);
283int ecore_con_ssl_server_write(Ecore_Con_Server *svr,
284 const unsigned char *buf,
285 int size);
286Ecore_Con_Ssl_Error ecore_con_ssl_client_init(Ecore_Con_Client *svr);
287Ecore_Con_Ssl_Error ecore_con_ssl_client_shutdown(Ecore_Con_Client *svr);
288int ecore_con_ssl_client_read(Ecore_Con_Client *svr,
289 unsigned char *buf,
290 int size);
291int ecore_con_ssl_client_write(Ecore_Con_Client *svr,
292 const unsigned char *buf,
293 int size);
294
295int ecore_con_info_get(Ecore_Con_Server *svr,
296 Ecore_Con_Info_Cb done_cb,
297 void *data,
298 struct addrinfo *hints);
299
300
301#define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \
302 TYPE *Type##_alloc(void); \
303 void Type##_free(TYPE *e);
304
305GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Add, ecore_con_event_client_add);
306GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Del, ecore_con_event_client_del);
307GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Write, ecore_con_event_client_write);
308GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Data, ecore_con_event_client_data);
309GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Error, ecore_con_event_server_error);
310GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Client_Error, ecore_con_event_client_error);
311GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Add, ecore_con_event_server_add);
312GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Del, ecore_con_event_server_del);
313GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Write, ecore_con_event_server_write);
314GENERIC_ALLOC_FREE_HEADER(Ecore_Con_Event_Server_Data, ecore_con_event_server_data);
315
316void ecore_con_mempool_init(void);
317void ecore_con_mempool_shutdown(void);
318
319#undef GENERIC_ALLOC_FREE_HEADER
320
321#endif
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_ssl.c b/libraries/ecore/src/lib/ecore_con/ecore_con_ssl.c
new file mode 100644
index 0000000..c352e94
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_ssl.c
@@ -0,0 +1,1777 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#if USE_GNUTLS
6# include <gnutls/gnutls.h>
7# include <gnutls/x509.h>
8# include <gcrypt.h>
9#elif USE_OPENSSL
10# include <openssl/ssl.h>
11# include <openssl/err.h>
12# include <openssl/dh.h>
13#endif
14
15#ifdef HAVE_WS2TCPIP_H
16# include <ws2tcpip.h>
17#endif
18
19#include "Ecore.h"
20#include "ecore_con_private.h"
21
22EAPI int ECORE_CON_EVENT_CLIENT_UPGRADE = 0;
23EAPI int ECORE_CON_EVENT_SERVER_UPGRADE = 0;
24
25static int _init_con_ssl_init_count = 0;
26
27#ifdef USE_GNUTLS
28# ifdef EINA_HAVE_THREADS
29GCRY_THREAD_OPTION_PTHREAD_IMPL;
30# endif
31
32static int _client_connected = 0;
33
34# define SSL_SUFFIX(ssl_func) ssl_func ## _gnutls
35# define _ECORE_CON_SSL_AVAILABLE 1
36
37#elif USE_OPENSSL
38
39# define SSL_SUFFIX(ssl_func) ssl_func ## _openssl
40# define _ECORE_CON_SSL_AVAILABLE 2
41
42#else
43# define SSL_SUFFIX(ssl_func) ssl_func ## _none
44# define _ECORE_CON_SSL_AVAILABLE 0
45
46#endif
47
48#if USE_GNUTLS
49static void
50_gnutls_print_errors(void *conn, int type, int ret)
51{
52 char buf[1024];
53
54 if (!ret) return;
55
56 snprintf(buf, sizeof(buf), "GNUTLS error: %s - %s", gnutls_strerror_name(ret), gnutls_strerror(ret));
57 if (type == ECORE_CON_EVENT_CLIENT_ERROR)
58 ecore_con_event_client_error(conn, buf);
59 else
60 ecore_con_event_server_error(conn, buf);
61}
62
63#ifdef ISCOMFITOR
64static void
65_gnutls_log_func(int level,
66 const char *str)
67{
68 DBG("|<%d>| %s", level, str);
69}
70#endif
71
72static const char *
73SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_description_t status)
74{
75 switch (status)
76 {
77 case GNUTLS_HANDSHAKE_HELLO_REQUEST:
78 return "Hello request";
79
80 case GNUTLS_HANDSHAKE_CLIENT_HELLO:
81 return "Client hello";
82
83 case GNUTLS_HANDSHAKE_SERVER_HELLO:
84 return "Server hello";
85
86 case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET:
87 return "New session ticket";
88
89 case GNUTLS_HANDSHAKE_CERTIFICATE_PKT:
90 return "Certificate packet";
91
92 case GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE:
93 return "Server key exchange";
94
95 case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST:
96 return "Certificate request";
97
98 case GNUTLS_HANDSHAKE_SERVER_HELLO_DONE:
99 return "Server hello done";
100
101 case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY:
102 return "Certificate verify";
103
104 case GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE:
105 return "Client key exchange";
106
107 case GNUTLS_HANDSHAKE_FINISHED:
108 return "Finished";
109
110 case GNUTLS_HANDSHAKE_SUPPLEMENTAL:
111 return "Supplemental";
112 }
113 return NULL;
114}
115
116#elif USE_OPENSSL
117
118static void
119_openssl_print_errors(void *conn, int type)
120{
121 char buf[1024];
122 do
123 {
124 unsigned long err;
125
126 err = ERR_get_error();
127 if (!err) break;
128 snprintf(buf, sizeof(buf), "OpenSSL error: %s", ERR_reason_error_string(err));
129 if (type == ECORE_CON_EVENT_CLIENT_ERROR)
130 ecore_con_event_client_error(conn, buf);
131 else
132 ecore_con_event_server_error(conn, buf);
133
134 } while (1);
135}
136
137static Eina_Bool
138_openssl_name_verify(const char *name, const char *svrname)
139{
140 if (name[0] == '*')
141 {
142 /* we allow *.domain.TLD with a wildcard, but nothing else */
143 const char *p, *s;
144
145 EINA_SAFETY_ON_TRUE_RETURN_VAL((name[1] != '.') || (!name[2]), EINA_FALSE);
146 p = strchr(name + 1, '*');
147 EINA_SAFETY_ON_TRUE_RETURN_VAL(!!p, EINA_FALSE);
148 /* verify that we have a domain of at least *.X.TLD and not *.TLD */
149 p = strchr(name + 2, '.');
150 EINA_SAFETY_ON_TRUE_RETURN_VAL(!p, EINA_FALSE);
151 s = strchr(svrname, '.');
152 EINA_SAFETY_ON_TRUE_RETURN_VAL(!s, EINA_FALSE);
153 /* same as above for the stored name */
154 EINA_SAFETY_ON_TRUE_RETURN_VAL(!strchr(s + 1, '.'), EINA_FALSE);
155 EINA_SAFETY_ON_TRUE_RETURN_VAL(strcasecmp(s, name + 1), EINA_FALSE);
156 }
157 else
158 EINA_SAFETY_ON_TRUE_RETURN_VAL(strcasecmp(name, svrname), EINA_FALSE);
159 return EINA_TRUE;
160}
161
162#endif
163
164#define SSL_ERROR_CHECK_GOTO_ERROR(X) \
165 do \
166 { \
167 if ((X)) \
168 { \
169 ERR("Error at %s:%s:%d!", __FILE__, __PRETTY_FUNCTION__, __LINE__); \
170 goto error; \
171 } \
172 } \
173 while (0)
174
175static Ecore_Con_Ssl_Error
176 SSL_SUFFIX(_ecore_con_ssl_init) (void);
177static Ecore_Con_Ssl_Error
178 SSL_SUFFIX(_ecore_con_ssl_shutdown) (void);
179
180static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (Ecore_Con_Server * svr, const char *ca_file);
181static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (Ecore_Con_Server * svr, const char *crl_file);
182static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (Ecore_Con_Server * svr, const char *cert);
183static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (Ecore_Con_Server * svr, const char *key_file);
184
185static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_prepare) (Ecore_Con_Server * svr, int ssl_type);
186static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_init) (Ecore_Con_Server * svr);
187static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (Ecore_Con_Server *svr);
188static int SSL_SUFFIX(_ecore_con_ssl_server_read) (Ecore_Con_Server *svr, unsigned char *buf, int size);
189static int SSL_SUFFIX(_ecore_con_ssl_server_write) (Ecore_Con_Server *svr, const unsigned char *buf, int size);
190
191static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_client_init) (Ecore_Con_Client * cl);
192static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (Ecore_Con_Client *cl);
193static int SSL_SUFFIX(_ecore_con_ssl_client_read) (Ecore_Con_Client * cl,
194 unsigned char *buf, int size);
195static int SSL_SUFFIX(_ecore_con_ssl_client_write) (Ecore_Con_Client * cl,
196 const unsigned char *buf, int size);
197
198/*
199 * General SSL API
200 */
201
202Ecore_Con_Ssl_Error
203ecore_con_ssl_init(void)
204{
205 if (!_init_con_ssl_init_count++)
206 {
207 SSL_SUFFIX(_ecore_con_ssl_init) ();
208#if _ECORE_CON_SSL_AVAILABLE != 0
209 ECORE_CON_EVENT_CLIENT_UPGRADE = ecore_event_type_new();
210 ECORE_CON_EVENT_SERVER_UPGRADE = ecore_event_type_new();
211#endif
212 }
213
214 return _init_con_ssl_init_count;
215}
216
217Ecore_Con_Ssl_Error
218ecore_con_ssl_shutdown(void)
219{
220 if (!--_init_con_ssl_init_count)
221 SSL_SUFFIX(_ecore_con_ssl_shutdown) ();
222
223 return _init_con_ssl_init_count;
224}
225
226Ecore_Con_Ssl_Error
227ecore_con_ssl_server_prepare(Ecore_Con_Server *svr,
228 int ssl_type)
229{
230 if (!ssl_type)
231 return ECORE_CON_SSL_ERROR_NONE;
232 return SSL_SUFFIX(_ecore_con_ssl_server_prepare) (svr, ssl_type);
233}
234
235Ecore_Con_Ssl_Error
236ecore_con_ssl_server_init(Ecore_Con_Server *svr)
237{
238 if (!(svr->type & ECORE_CON_SSL))
239 return ECORE_CON_SSL_ERROR_NONE;
240 return SSL_SUFFIX(_ecore_con_ssl_server_init) (svr);
241}
242
243Ecore_Con_Ssl_Error
244ecore_con_ssl_server_shutdown(Ecore_Con_Server *svr)
245{
246 if (!(svr->type & ECORE_CON_SSL))
247 return ECORE_CON_SSL_ERROR_NONE;
248 return SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (svr);
249}
250
251int
252ecore_con_ssl_server_read(Ecore_Con_Server *svr,
253 unsigned char *buf,
254 int size)
255{
256 return SSL_SUFFIX(_ecore_con_ssl_server_read) (svr, buf, size);
257}
258
259int
260ecore_con_ssl_server_write(Ecore_Con_Server *svr,
261 const unsigned char *buf,
262 int size)
263{
264 return SSL_SUFFIX(_ecore_con_ssl_server_write) (svr, buf, size);
265}
266
267Ecore_Con_Ssl_Error
268ecore_con_ssl_client_init(Ecore_Con_Client *cl)
269{
270 if (!(cl->host_server->type & ECORE_CON_SSL))
271 return ECORE_CON_SSL_ERROR_NONE;
272 return SSL_SUFFIX(_ecore_con_ssl_client_init) (cl);
273}
274
275Ecore_Con_Ssl_Error
276ecore_con_ssl_client_shutdown(Ecore_Con_Client *cl)
277{
278 if (!(cl->host_server->type & ECORE_CON_SSL))
279 return ECORE_CON_SSL_ERROR_NONE;
280 return SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (cl);
281}
282
283int
284ecore_con_ssl_client_read(Ecore_Con_Client *cl,
285 unsigned char *buf,
286 int size)
287{
288 return SSL_SUFFIX(_ecore_con_ssl_client_read) (cl, buf, size);
289}
290
291int
292ecore_con_ssl_client_write(Ecore_Con_Client *cl,
293 const unsigned char *buf,
294 int size)
295{
296 return SSL_SUFFIX(_ecore_con_ssl_client_write) (cl, buf, size);
297}
298
299/**
300 * Returns if SSL support is available
301 * @return 1 if SSL is available and provided by gnutls, 2 if provided by openssl,
302 * 0 if it is not available.
303 * @ingroup Ecore_Con_Client_Group
304 */
305EAPI int
306ecore_con_ssl_available_get(void)
307{
308 return _ECORE_CON_SSL_AVAILABLE;
309}
310
311/**
312 * @addtogroup Ecore_Con_SSL_Group Ecore Connection SSL Functions
313 *
314 * Functions that operate on Ecore connection objects pertaining to SSL.
315 *
316 * @{
317 */
318
319/**
320 * @brief Enable certificate verification on a server object
321 *
322 * Call this function on a server object before main loop has started
323 * to enable verification of certificates against loaded certificates.
324 * @param svr The server object
325 */
326EAPI void
327ecore_con_ssl_server_verify(Ecore_Con_Server *svr)
328{
329 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
330 {
331 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_verify");
332 return;
333 }
334 svr->verify = EINA_TRUE;
335}
336
337/**
338 * @brief Enable hostname-based certificate verification on a server object
339 *
340 * Call this function on a server object before main loop has started
341 * to enable verification of certificates using ONLY their hostnames.
342 * @param svr The server object
343 * @note This function has no effect when used on a listening server created by
344 * ecore_con_server_add
345 * @since 1.1
346 */
347EAPI void
348ecore_con_ssl_server_verify_basic(Ecore_Con_Server *svr)
349{
350 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
351 {
352 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
353 return;
354 }
355 svr->verify_basic = EINA_TRUE;
356}
357
358/**
359 * @brief Add an ssl certificate for use in ecore_con functions.
360 *
361 * Use this function to add a SSL PEM certificate.
362 * Simply specify the cert here to use it in the server object for connecting or listening.
363 * If there is an error loading the certificate, an error will automatically be logged.
364 * @param cert The path to the certificate.
365 * @return EINA_FALSE if the file cannot be loaded, otherwise EINA_TRUE.
366 */
367
368EAPI Eina_Bool
369ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr,
370 const char *cert)
371{
372 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
373 {
374 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_cert_add");
375 return EINA_FALSE;
376 }
377
378 return SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (svr, cert);
379}
380
381/**
382 * @brief Add an ssl CA file for use in ecore_con functions.
383 *
384 * Use this function to add a SSL PEM CA file.
385 * Simply specify the file here to use it in the server object for connecting or listening.
386 * If there is an error loading the CAs, an error will automatically be logged.
387 * @param ca_file The path to the CA file.
388 * @return EINA_FALSE if the file cannot be loaded, otherwise EINA_TRUE.
389 */
390
391EAPI Eina_Bool
392ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr,
393 const char *ca_file)
394{
395 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
396 {
397 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_cafile_add");
398 return EINA_FALSE;
399 }
400
401 return SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (svr, ca_file);
402}
403
404/**
405 * @brief Add an ssl private key for use in ecore_con functions.
406 *
407 * Use this function to add a SSL PEM private key
408 * Simply specify the key file here to use it in the server object for connecting or listening.
409 * If there is an error loading the key, an error will automatically be logged.
410 * @param key_file The path to the key file.
411 * @return EINA_FALSE if the file cannot be loaded,
412 * otherwise EINA_TRUE.
413 */
414
415EAPI Eina_Bool
416ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr,
417 const char *key_file)
418{
419 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
420 {
421 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_privkey_add");
422 return EINA_FALSE;
423 }
424
425 return SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (svr, key_file);
426}
427
428/**
429 * @brief Add an ssl CRL for use in ecore_con functions.
430 *
431 * Use this function to add a SSL PEM CRL file
432 * Simply specify the CRL file here to use it in the server object for connecting or listening.
433 * If there is an error loading the CRL, an error will automatically be logged.
434 * @param crl_file The path to the CRL file.
435 * @return EINA_FALSE if the file cannot be loaded,
436 * otherwise EINA_TRUE.
437 */
438
439EAPI Eina_Bool
440ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr,
441 const char *crl_file)
442{
443 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
444 {
445 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, "ecore_con_ssl_server_crl_add");
446 return EINA_FALSE;
447 }
448
449 return SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (svr, crl_file);
450}
451
452/**
453 * @brief Upgrade a connection to a specified level of encryption
454 *
455 * Use this function to begin an SSL handshake on a connection (STARTTLS or similar).
456 * Once the upgrade has been completed, an ECORE_CON_EVENT_SERVER_UPGRADE event will be emitted.
457 * The connection should be treated as disconnected until the next event.
458 * @param svr The server object
459 * @param ssl_type The SSL connection type (ONLY).
460 * @return EINA_FALSE if the connection cannot be upgraded, otherwise EINA_TRUE.
461 * @note This function is NEVER to be used on a server object created with ecore_con_server_add
462 * @warning Setting a wrong value for @p compl_type WILL mess up your program.
463 * @since 1.1
464 */
465
466EAPI Eina_Bool
467ecore_con_ssl_server_upgrade(Ecore_Con_Server *svr, Ecore_Con_Type ssl_type)
468{
469 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER))
470 {
471 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_CON_SERVER, __func__);
472 return EINA_FALSE;
473 }
474#if _ECORE_CON_SSL_AVAILABLE == 0
475 return EINA_FALSE;
476#endif
477
478 if (!svr->ssl_prepared)
479 {
480 if (ecore_con_ssl_server_prepare(svr, ssl_type))
481 return EINA_FALSE;
482 }
483 svr->type |= ssl_type;
484 svr->upgrade = EINA_TRUE;
485 svr->handshaking = EINA_TRUE;
486 svr->ssl_state = ECORE_CON_SSL_STATE_INIT;
487 return !SSL_SUFFIX(_ecore_con_ssl_server_init) (svr);
488}
489
490/**
491 * @brief Upgrade a connection to a specified level of encryption
492 *
493 * Use this function to begin an SSL handshake on a connection (STARTTLS or similar).
494 * Once the upgrade has been completed, an ECORE_CON_EVENT_CLIENT_UPGRADE event will be emitted.
495 * The connection should be treated as disconnected until the next event.
496 * @param cl The client object
497 * @param compl_type The SSL connection type (ONLY).
498 * @return EINA_FALSE if the connection cannot be upgraded, otherwise EINA_TRUE.
499 * @warning Setting a wrong value for @p compl_type WILL mess up your program.
500 * @since 1.1
501 */
502
503EAPI Eina_Bool
504ecore_con_ssl_client_upgrade(Ecore_Con_Client *cl, Ecore_Con_Type ssl_type)
505{
506 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT))
507 {
508 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, __func__);
509 return EINA_FALSE;
510 }
511#if _ECORE_CON_SSL_AVAILABLE == 0
512 return EINA_FALSE;
513#endif
514
515 if (!cl->host_server->ssl_prepared)
516 {
517 if (ecore_con_ssl_server_prepare(cl->host_server, ssl_type))
518 return EINA_FALSE;
519 }
520 cl->host_server->type |= ssl_type;
521 cl->upgrade = EINA_TRUE;
522 cl->host_server->upgrade = EINA_TRUE;
523 cl->handshaking = EINA_TRUE;
524 cl->ssl_state = ECORE_CON_SSL_STATE_INIT;
525 return SSL_SUFFIX(_ecore_con_ssl_client_init) (cl);
526}
527
528/**
529 * @}
530 */
531
532#if USE_GNUTLS
533
534/*
535 * GnuTLS
536 */
537
538static Ecore_Con_Ssl_Error
539_ecore_con_ssl_init_gnutls(void)
540{
541#ifdef EINA_HAVE_THREADS
542 if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread))
543 WRN("YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!");
544#endif
545 if (gnutls_global_init())
546 return ECORE_CON_SSL_ERROR_INIT_FAILED;
547
548#ifdef ISCOMFITOR
549 gnutls_global_set_log_level(9);
550 gnutls_global_set_log_function(_gnutls_log_func);
551#endif
552 return ECORE_CON_SSL_ERROR_NONE;
553}
554
555static Ecore_Con_Ssl_Error
556_ecore_con_ssl_shutdown_gnutls(void)
557{
558 gnutls_global_deinit();
559
560 return ECORE_CON_SSL_ERROR_NONE;
561}
562
563static Ecore_Con_Ssl_Error
564_ecore_con_ssl_server_prepare_gnutls(Ecore_Con_Server *svr,
565 int ssl_type)
566{
567 int ret;
568
569 if (ssl_type & ECORE_CON_USE_SSL2)
570 return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
571
572 switch (ssl_type)
573 {
574 case ECORE_CON_USE_SSL3:
575 case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
576 case ECORE_CON_USE_TLS:
577 case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
578 case ECORE_CON_USE_MIXED:
579 case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
580 break;
581
582 default:
583 return ECORE_CON_SSL_ERROR_NONE;
584 }
585
586 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_allocate_credentials(&svr->cert));
587
588 if (svr->use_cert)
589 {
590 if (svr->created)
591 {
592 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_dh_params_init(&svr->dh_params));
593 INF("Generating DH params");
594 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_dh_params_generate2(svr->dh_params, 1024));
595
596 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_server_credentials(&svr->anoncred_s));
597 /* TODO: implement PSK */
598 // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_server_credentials(&svr->pskcred_s));
599
600 gnutls_anon_set_server_dh_params(svr->anoncred_s, svr->dh_params);
601 gnutls_certificate_set_dh_params(svr->cert, svr->dh_params);
602 //gnutls_psk_set_server_dh_params(svr->pskcred_s, svr->dh_params);
603 INF("DH params successfully generated and applied!");
604 }
605 else
606 {
607 //SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_client_credentials(&svr->pskcred_c));
608 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_client_credentials(&svr->anoncred_c));
609 }
610 }
611
612 svr->ssl_prepared = EINA_TRUE;
613 return ECORE_CON_SSL_ERROR_NONE;
614
615error:
616 _gnutls_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR, ret);
617 _ecore_con_ssl_server_shutdown_gnutls(svr);
618 return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
619}
620
621
622static Ecore_Con_Ssl_Error
623_ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr)
624{
625 const gnutls_datum_t *cert_list;
626 unsigned int iter, cert_list_size;
627 gnutls_x509_crt_t cert = NULL;
628 const char *priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0";
629 int ret = 0;
630
631 switch (svr->ssl_state)
632 {
633 case ECORE_CON_SSL_STATE_DONE:
634 return ECORE_CON_SSL_ERROR_NONE;
635
636 case ECORE_CON_SSL_STATE_INIT:
637 if (svr->type & ECORE_CON_USE_SSL2) /* not supported because of security issues */
638 return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
639
640 switch (svr->type & ECORE_CON_SSL)
641 {
642 case ECORE_CON_USE_SSL3:
643 case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
644 priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1";
645 break;
646
647 case ECORE_CON_USE_TLS:
648 case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
649 priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0";
650 break;
651
652 case ECORE_CON_USE_MIXED:
653 case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
654 break;
655
656 default:
657 return ECORE_CON_SSL_ERROR_NONE;
658 }
659
660 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_init(&svr->session, GNUTLS_CLIENT));
661 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_enable_client(svr->session));
662 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_server_name_set(svr->session, GNUTLS_NAME_DNS, svr->name, strlen(svr->name)));
663 INF("Applying priority string: %s", priority);
664 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_priority_set_direct(svr->session, priority, NULL));
665 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_CERTIFICATE, svr->cert));
666 // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_PSK, svr->pskcred_c));
667 if (!svr->use_cert)
668 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_ANON, svr->anoncred_c));
669
670 gnutls_dh_set_prime_bits(svr->session, 512);
671 gnutls_transport_set_ptr(svr->session, (gnutls_transport_ptr_t)((intptr_t)svr->fd));
672 svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
673
674 case ECORE_CON_SSL_STATE_HANDSHAKING:
675 if (!svr->session)
676 {
677 DBG("Server was previously lost, going to error condition");
678 goto error;
679 }
680 ret = gnutls_handshake(svr->session);
681 DBG("calling gnutls_handshake(): returned with '%s'", gnutls_strerror_name(ret));
682 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_error_is_fatal(ret));
683 if (!ret)
684 {
685 svr->handshaking = EINA_FALSE;
686 svr->ssl_state = ECORE_CON_SSL_STATE_DONE;
687 }
688 else
689 {
690 if (gnutls_record_get_direction(svr->session))
691 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
692 else
693 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
694 return ECORE_CON_SSL_ERROR_NONE;
695 }
696
697 default:
698 break;
699 }
700
701 if ((!svr->verify) && (!svr->verify_basic))
702 /* not verifying certificates, so we're done! */
703 return ECORE_CON_SSL_ERROR_NONE;
704 if (svr->verify)
705 {
706 /* use CRL/CA lists to verify */
707 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_verify_peers2(svr->session, &iter));
708 if (iter & GNUTLS_CERT_INVALID)
709 ERR("The certificate is not trusted.");
710 else if (iter & GNUTLS_CERT_SIGNER_NOT_FOUND)
711 ERR("The certificate hasn't got a known issuer.");
712 else if (iter & GNUTLS_CERT_REVOKED)
713 ERR("The certificate has been revoked.");
714 else if (iter & GNUTLS_CERT_EXPIRED)
715 ERR("The certificate has expired");
716 else if (iter & GNUTLS_CERT_NOT_ACTIVATED)
717 ERR("The certificate is not yet activated");
718
719 if (iter)
720 goto error;
721 }
722 if (gnutls_certificate_type_get(svr->session) != GNUTLS_CRT_X509)
723 {
724 ERR("Warning: PGP certificates are not yet supported!");
725 goto error;
726 }
727
728 SSL_ERROR_CHECK_GOTO_ERROR(!(cert_list = gnutls_certificate_get_peers(svr->session, &cert_list_size)));
729 SSL_ERROR_CHECK_GOTO_ERROR(!cert_list_size);
730
731 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_init(&cert));
732 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER));
733
734 SSL_ERROR_CHECK_GOTO_ERROR(!gnutls_x509_crt_check_hostname(cert, svr->name));
735 gnutls_x509_crt_deinit(cert);
736 DBG("SSL certificate verification succeeded!");
737 return ECORE_CON_SSL_ERROR_NONE;
738
739error:
740 _gnutls_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR, ret);
741 if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED))
742 ERR("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(svr->session)));
743 if (svr->session && (svr->ssl_state != ECORE_CON_SSL_STATE_DONE))
744 {
745 ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(svr->session)));
746 ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(svr->session)));
747 }
748 if (cert)
749 gnutls_x509_crt_deinit(cert);
750 _ecore_con_ssl_server_shutdown_gnutls(svr);
751 return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
752}
753
754static Eina_Bool
755_ecore_con_ssl_server_cafile_add_gnutls(Ecore_Con_Server *svr,
756 const char *ca_file)
757{
758 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_trust_file(svr->cert, ca_file,
759 GNUTLS_X509_FMT_PEM) < 1);
760
761 return EINA_TRUE;
762error:
763 ERR("Could not load CA file!");
764 return EINA_FALSE;
765}
766
767static Eina_Bool
768_ecore_con_ssl_server_crl_add_gnutls(Ecore_Con_Server *svr,
769 const char *crl_file)
770{
771 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_crl_file(svr->cert, crl_file,
772 GNUTLS_X509_FMT_PEM) < 1);
773
774 return EINA_TRUE;
775error:
776 ERR("Could not load CRL file!");
777 return EINA_FALSE;
778}
779
780static Eina_Bool
781_ecore_con_ssl_server_privkey_add_gnutls(Ecore_Con_Server *svr,
782 const char *key_file)
783{
784 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_key_file(svr->cert, svr->cert_file, key_file,
785 GNUTLS_X509_FMT_PEM));
786
787 return EINA_TRUE;
788error:
789 ERR("Could not load certificate/key file!");
790 return EINA_FALSE;
791}
792
793static Eina_Bool
794_ecore_con_ssl_server_cert_add_gnutls(Ecore_Con_Server *svr,
795 const char *cert_file)
796{
797 if (!(svr->cert_file = strdup(cert_file)))
798 return EINA_FALSE;
799
800 return EINA_TRUE;
801}
802
803static Ecore_Con_Ssl_Error
804_ecore_con_ssl_server_shutdown_gnutls(Ecore_Con_Server *svr)
805{
806 if (svr->session)
807 {
808 gnutls_bye(svr->session, GNUTLS_SHUT_RDWR);
809 gnutls_deinit(svr->session);
810 }
811
812 free(svr->cert_file);
813 svr->cert_file = NULL;
814 if (svr->cert)
815 gnutls_certificate_free_credentials(svr->cert);
816 svr->cert = NULL;
817
818 if ((svr->type & ECORE_CON_SSL) && svr->created)
819 {
820 if (svr->dh_params)
821 {
822 gnutls_dh_params_deinit(svr->dh_params);
823 svr->dh_params = NULL;
824 }
825 if (svr->anoncred_s)
826 gnutls_anon_free_server_credentials(svr->anoncred_s);
827 // if (svr->pskcred_s)
828 // gnutls_psk_free_server_credentials(svr->pskcred_s);
829
830 svr->anoncred_s = NULL;
831 svr->pskcred_s = NULL;
832 }
833 else if (svr->type & ECORE_CON_SSL)
834 {
835 if (svr->anoncred_c)
836 gnutls_anon_free_client_credentials(svr->anoncred_c);
837 // if (svr->pskcred_c)
838 // gnutls_psk_free_client_credentials(svr->pskcred_c);
839
840 svr->anoncred_c = NULL;
841 svr->pskcred_c = NULL;
842 }
843
844 svr->session = NULL;
845
846 return ECORE_CON_SSL_ERROR_NONE;
847}
848
849static int
850_ecore_con_ssl_server_read_gnutls(Ecore_Con_Server *svr,
851 unsigned char *buf,
852 int size)
853{
854 int num;
855
856 if (svr->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
857 {
858 DBG("Continuing gnutls handshake");
859 if (!_ecore_con_ssl_server_init_gnutls(svr))
860 return 0;
861 return -1;
862 }
863
864 num = gnutls_record_recv(svr->session, buf, size);
865 if (num > 0)
866 return num;
867
868 if (num == GNUTLS_E_REHANDSHAKE)
869 {
870 WRN("Rehandshake request ignored");
871 return 0;
872
873 svr->handshaking = EINA_TRUE;
874 svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
875 if (!_ecore_con_ssl_server_init_gnutls(svr))
876 return 0;
877 }
878 else if ((!gnutls_error_is_fatal(num)) && (num != GNUTLS_E_SUCCESS))
879 return 0;
880
881 return -1;
882}
883
884static int
885_ecore_con_ssl_server_write_gnutls(Ecore_Con_Server *svr,
886 const unsigned char *buf,
887 int size)
888{
889 int num;
890
891 if (svr->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
892 {
893 DBG("Continuing gnutls handshake");
894 if (!_ecore_con_ssl_server_init_gnutls(svr))
895 return 0;
896 return -1;
897 }
898
899 num = gnutls_record_send(svr->session, buf, size);
900 if (num > 0)
901 return num;
902
903 if (num == GNUTLS_E_REHANDSHAKE)
904 {
905 WRN("Rehandshake request ignored");
906 return 0;
907/* this is only partly functional I think? */
908 svr->handshaking = EINA_TRUE;
909 svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
910 if (!_ecore_con_ssl_server_init_gnutls(svr))
911 return 0;
912 }
913 else if (!gnutls_error_is_fatal(num))
914 return 0;
915
916 return -1;
917}
918
919static Ecore_Con_Ssl_Error
920_ecore_con_ssl_client_init_gnutls(Ecore_Con_Client *cl)
921{
922 const gnutls_datum_t *cert_list;
923 unsigned int iter, cert_list_size;
924 const char *priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0";
925 int ret = 0;
926
927 switch (cl->ssl_state)
928 {
929 case ECORE_CON_SSL_STATE_DONE:
930 return ECORE_CON_SSL_ERROR_NONE;
931
932 case ECORE_CON_SSL_STATE_INIT:
933 if (cl->host_server->type & ECORE_CON_USE_SSL2) /* not supported because of security issues */
934 return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
935
936 switch (cl->host_server->type & ECORE_CON_SSL)
937 {
938 case ECORE_CON_USE_SSL3:
939 case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
940 priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1";
941 break;
942
943 case ECORE_CON_USE_TLS:
944 case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
945 priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0";
946 break;
947
948 case ECORE_CON_USE_MIXED:
949 case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
950 break;
951
952 default:
953 return ECORE_CON_SSL_ERROR_NONE;
954 }
955
956 _client_connected++;
957
958 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_init(&cl->session, GNUTLS_SERVER));
959 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_key_generate(&cl->session_ticket));
960 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_enable_server(cl->session, &cl->session_ticket));
961 INF("Applying priority string: %s", priority);
962 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_priority_set_direct(cl->session, priority, NULL));
963 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_CERTIFICATE, cl->host_server->cert));
964 // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_PSK, cl->host_server->pskcred_s));
965 if (!cl->host_server->use_cert)
966 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_ANON, cl->host_server->anoncred_s));
967
968 gnutls_certificate_server_set_request(cl->session, GNUTLS_CERT_REQUEST);
969
970 gnutls_dh_set_prime_bits(cl->session, 2048);
971 gnutls_transport_set_ptr(cl->session, (gnutls_transport_ptr_t)((intptr_t)cl->fd));
972 cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
973
974 case ECORE_CON_SSL_STATE_HANDSHAKING:
975 if (!cl->session)
976 {
977 DBG("Client was previously lost, going to error condition");
978 goto error;
979 }
980 DBG("calling gnutls_handshake()");
981 ret = gnutls_handshake(cl->session);
982 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_error_is_fatal(ret));
983
984 if (!ret)
985 {
986 cl->handshaking = EINA_FALSE;
987 cl->ssl_state = ECORE_CON_SSL_STATE_DONE;
988 }
989 else
990 {
991 if (gnutls_record_get_direction(cl->session))
992 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
993 else
994 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
995 return ECORE_CON_SSL_ERROR_NONE;
996 }
997
998 default:
999 break;
1000 }
1001
1002 if (!cl->host_server->verify)
1003 /* not verifying certificates, so we're done! */
1004 return ECORE_CON_SSL_ERROR_NONE;
1005 /* use CRL/CA lists to verify */
1006 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_verify_peers2(cl->session, &iter));
1007 if (iter & GNUTLS_CERT_INVALID)
1008 ERR("The certificate is not trusted.");
1009 else if (iter & GNUTLS_CERT_SIGNER_NOT_FOUND)
1010 ERR("The certificate hasn't got a known issuer.");
1011 else if (iter & GNUTLS_CERT_REVOKED)
1012 ERR("The certificate has been revoked.");
1013 else if (iter & GNUTLS_CERT_EXPIRED)
1014 ERR("The certificate has expired");
1015 else if (iter & GNUTLS_CERT_NOT_ACTIVATED)
1016 ERR("The certificate is not yet activated");
1017
1018 if (iter)
1019 goto error;
1020 if (gnutls_certificate_type_get(cl->session) != GNUTLS_CRT_X509)
1021 {
1022 ERR("Warning: PGP certificates are not yet supported!");
1023 goto error;
1024 }
1025
1026 SSL_ERROR_CHECK_GOTO_ERROR(!(cert_list = gnutls_certificate_get_peers(cl->session, &cert_list_size)));
1027 SSL_ERROR_CHECK_GOTO_ERROR(!cert_list_size);
1028
1029/*
1030 gnutls_x509_crt_t cert = NULL;
1031 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_init(&cert));
1032 SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER));
1033
1034 SSL_ERROR_CHECK_GOTO_ERROR(!gnutls_x509_crt_check_hostname(cert, cl->host_server->name));
1035 gnutls_x509_crt_deinit(cert);
1036*/
1037 DBG("SSL certificate verification succeeded!");
1038 return ECORE_CON_SSL_ERROR_NONE;
1039
1040error:
1041 _gnutls_print_errors(cl, ECORE_CON_EVENT_CLIENT_ERROR, ret);
1042 if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED))
1043 ERR("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(cl->session)));
1044 if (cl->session && (cl->ssl_state != ECORE_CON_SSL_STATE_DONE))
1045 {
1046 ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(cl->session)));
1047 ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(cl->session)));
1048 }
1049/*
1050 if (cert)
1051 gnutls_x509_crt_deinit(cert);
1052*/
1053 _ecore_con_ssl_client_shutdown_gnutls(cl);
1054 return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
1055}
1056
1057static Ecore_Con_Ssl_Error
1058_ecore_con_ssl_client_shutdown_gnutls(Ecore_Con_Client *cl)
1059{
1060 if (cl->session)
1061 {
1062 gnutls_bye(cl->session, GNUTLS_SHUT_RDWR);
1063 gnutls_deinit(cl->session);
1064 gnutls_free(cl->session_ticket.data);
1065 cl->session_ticket.data = NULL;
1066 }
1067
1068 cl->session = NULL;
1069
1070 return ECORE_CON_SSL_ERROR_NONE;
1071}
1072
1073static int
1074_ecore_con_ssl_client_read_gnutls(Ecore_Con_Client *cl,
1075 unsigned char *buf,
1076 int size)
1077{
1078 int num;
1079
1080 if (cl->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
1081 {
1082 if (!_ecore_con_ssl_client_init_gnutls(cl))
1083 return 0;
1084 return -1;
1085 }
1086
1087 num = gnutls_record_recv(cl->session, buf, size);
1088 if (num > 0)
1089 return num;
1090
1091 if (num == GNUTLS_E_REHANDSHAKE)
1092 {
1093 WRN("Rehandshake request ignored");
1094 return 0;
1095 cl->handshaking = EINA_TRUE;
1096 cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
1097 if (!_ecore_con_ssl_client_init_gnutls(cl))
1098 return 0;
1099 WRN("Rehandshake request ignored");
1100 return 0;
1101 }
1102 else if ((!gnutls_error_is_fatal(num)) && (num != GNUTLS_E_SUCCESS))
1103 return 0;
1104
1105 return -1;
1106}
1107
1108static int
1109_ecore_con_ssl_client_write_gnutls(Ecore_Con_Client *cl,
1110 const unsigned char *buf,
1111 int size)
1112{
1113 int num;
1114
1115 if (cl->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING)
1116 {
1117 if (!_ecore_con_ssl_client_init_gnutls(cl))
1118 return 0;
1119 return -1;
1120 }
1121
1122 num = gnutls_record_send(cl->session, buf, size);
1123 if (num > 0)
1124 return num;
1125
1126 if (num == GNUTLS_E_REHANDSHAKE)
1127 {
1128 WRN("Rehandshake request ignored");
1129 return 0;
1130 cl->handshaking = EINA_TRUE;
1131 cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
1132 if (!_ecore_con_ssl_client_init_gnutls(cl))
1133 return 0;
1134 }
1135 else if (!gnutls_error_is_fatal(num))
1136 return 0;
1137
1138 return -1;
1139}
1140
1141#elif USE_OPENSSL && !USE_GNUTLS
1142
1143/*
1144 * OpenSSL
1145 */
1146
1147static Ecore_Con_Ssl_Error
1148_ecore_con_ssl_init_openssl(void)
1149{
1150 SSL_library_init();
1151 SSL_load_error_strings();
1152 OpenSSL_add_all_algorithms();
1153
1154 return ECORE_CON_SSL_ERROR_NONE;
1155}
1156
1157static Ecore_Con_Ssl_Error
1158_ecore_con_ssl_shutdown_openssl(void)
1159{
1160 ERR_free_strings();
1161 EVP_cleanup();
1162 return ECORE_CON_SSL_ERROR_NONE;
1163}
1164
1165static Ecore_Con_Ssl_Error
1166_ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr,
1167 int ssl_type)
1168{
1169 long options;
1170 int dh = 0;
1171
1172 if (ssl_type & ECORE_CON_USE_SSL2)
1173 return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED;
1174
1175 switch (ssl_type)
1176 {
1177 case ECORE_CON_USE_SSL3:
1178 case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT:
1179 if (!svr->created)
1180 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method())));
1181 else
1182 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_server_method())));
1183 break;
1184
1185 case ECORE_CON_USE_TLS:
1186 case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT:
1187 if (!svr->created)
1188 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_client_method())));
1189 else
1190 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_server_method())));
1191 break;
1192
1193 case ECORE_CON_USE_MIXED:
1194 case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT:
1195 if (!svr->created)
1196 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_client_method())));
1197 else
1198 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_server_method())));
1199 options = SSL_CTX_get_options(svr->ssl_ctx);
1200 SSL_CTX_set_options(svr->ssl_ctx, options | SSL_OP_NO_SSLv2 | SSL_OP_SINGLE_DH_USE);
1201 break;
1202
1203 default:
1204 return ECORE_CON_SSL_ERROR_NONE;
1205 }
1206
1207 if ((!svr->use_cert) && svr->created)
1208 {
1209 DH *dh_params;
1210 INF("Generating DH params");
1211 SSL_ERROR_CHECK_GOTO_ERROR(!(dh_params = DH_new()));
1212 SSL_ERROR_CHECK_GOTO_ERROR(!DH_generate_parameters_ex(dh_params, 1024, DH_GENERATOR_5, NULL));
1213 SSL_ERROR_CHECK_GOTO_ERROR(!DH_check(dh_params, &dh));
1214 SSL_ERROR_CHECK_GOTO_ERROR((dh & DH_CHECK_P_NOT_PRIME) || (dh & DH_CHECK_P_NOT_SAFE_PRIME));
1215 SSL_ERROR_CHECK_GOTO_ERROR(!DH_generate_key(dh_params));
1216 SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_tmp_dh(svr->ssl_ctx, dh_params));
1217 DH_free(dh_params);
1218 INF("DH params successfully generated and applied!");
1219 SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_cipher_list(svr->ssl_ctx, "aNULL:!eNULL:!LOW:!EXPORT:@STRENGTH"));
1220 }
1221 else if (!svr->use_cert)
1222 SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_cipher_list(svr->ssl_ctx, "aNULL:!eNULL:!LOW:!EXPORT:!ECDH:RSA:AES:!PSK:@STRENGTH"));
1223
1224 return ECORE_CON_SSL_ERROR_NONE;
1225
1226error:
1227 if (dh)
1228 {
1229 if (dh & DH_CHECK_P_NOT_PRIME)
1230 ERR("openssl error: dh_params could not generate a prime!");
1231 else
1232 ERR("openssl error: dh_params could not generate a safe prime!");
1233 }
1234 else
1235 _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
1236 _ecore_con_ssl_server_shutdown_openssl(svr);
1237 return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
1238}
1239
1240static Ecore_Con_Ssl_Error
1241_ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr)
1242{
1243 int ret = -1;
1244
1245 switch (svr->ssl_state)
1246 {
1247 case ECORE_CON_SSL_STATE_DONE:
1248 return ECORE_CON_SSL_ERROR_NONE;
1249
1250 case ECORE_CON_SSL_STATE_INIT:
1251 SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl = SSL_new(svr->ssl_ctx)));
1252
1253 SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(svr->ssl, svr->fd));
1254 SSL_set_connect_state(svr->ssl);
1255 svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
1256
1257 case ECORE_CON_SSL_STATE_HANDSHAKING:
1258 if (!svr->ssl)
1259 {
1260 DBG("Server was previously lost, going to error condition");
1261 goto error;
1262 }
1263 ret = SSL_do_handshake(svr->ssl);
1264 svr->ssl_err = SSL_get_error(svr->ssl, ret);
1265 SSL_ERROR_CHECK_GOTO_ERROR((svr->ssl_err == SSL_ERROR_SYSCALL) || (svr->ssl_err == SSL_ERROR_SSL));
1266
1267 if (ret == 1)
1268 {
1269 svr->handshaking = EINA_FALSE;
1270 svr->ssl_state = ECORE_CON_SSL_STATE_DONE;
1271 }
1272 else
1273 {
1274 if (svr->ssl_err == SSL_ERROR_WANT_READ)
1275 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
1276 else if (svr->ssl_err == SSL_ERROR_WANT_WRITE)
1277 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
1278 return ECORE_CON_SSL_ERROR_NONE;
1279 }
1280
1281 default:
1282 break;
1283 }
1284
1285#ifdef ISCOMFITOR
1286 {
1287 /* print session info into DBG */
1288 SSL_SESSION *s;
1289 BIO *b;
1290 char log[4096];
1291
1292 memset(log, 0, sizeof(log));
1293 s = SSL_get_session(svr->ssl);
1294 b = BIO_new(BIO_s_mem());
1295 SSL_SESSION_print(b, s);
1296 while (BIO_read(b, log, sizeof(log)) > 0)
1297 DBG("%s", log);
1298
1299 BIO_free(b);
1300 }
1301#endif
1302 if ((!svr->verify) && (!svr->verify_basic))
1303 /* not verifying certificates, so we're done! */
1304 return ECORE_CON_SSL_ERROR_NONE;
1305
1306 {
1307 X509 *cert;
1308 SSL_set_verify(svr->ssl, SSL_VERIFY_PEER, NULL);
1309 /* use CRL/CA lists to verify */
1310 cert = SSL_get_peer_certificate(svr->ssl);
1311 if (cert)
1312 {
1313 char buf[256] = {0};
1314 if (svr->verify)
1315 SSL_ERROR_CHECK_GOTO_ERROR(SSL_get_verify_result(svr->ssl));
1316 X509_NAME_get_text_by_NID(X509_get_subject_name(cert), NID_subject_alt_name, buf, sizeof(buf));
1317 if (buf[0])
1318 SSL_ERROR_CHECK_GOTO_ERROR(!_openssl_name_verify(buf, svr->name));
1319 else
1320 {
1321 X509_NAME_get_text_by_NID(X509_get_subject_name(cert), NID_commonName, buf, sizeof(buf));
1322 SSL_ERROR_CHECK_GOTO_ERROR(!_openssl_name_verify(buf, svr->name));
1323 }
1324 }
1325 }
1326
1327 DBG("SSL certificate verification succeeded!");
1328
1329 return ECORE_CON_SSL_ERROR_NONE;
1330
1331error:
1332 _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
1333 _ecore_con_ssl_server_shutdown_openssl(svr);
1334 return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
1335}
1336
1337static Eina_Bool
1338_ecore_con_ssl_server_cafile_add_openssl(Ecore_Con_Server *svr,
1339 const char *ca_file)
1340{
1341 SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_load_verify_locations(svr->ssl_ctx, ca_file, NULL));
1342 return EINA_TRUE;
1343
1344error:
1345 _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
1346 return EINA_FALSE;
1347}
1348
1349static Eina_Bool
1350_ecore_con_ssl_server_crl_add_openssl(Ecore_Con_Server *svr,
1351 const char *crl_file)
1352{
1353 X509_STORE *st;
1354 X509_LOOKUP *lu;
1355 static Eina_Bool flag = EINA_FALSE;
1356
1357 SSL_ERROR_CHECK_GOTO_ERROR(!(st = SSL_CTX_get_cert_store(svr->ssl_ctx)));
1358 SSL_ERROR_CHECK_GOTO_ERROR(!(lu = X509_STORE_add_lookup(st, X509_LOOKUP_file())));
1359 SSL_ERROR_CHECK_GOTO_ERROR(X509_load_crl_file(lu, crl_file, X509_FILETYPE_PEM) < 1);
1360 if (!flag)
1361 {
1362 X509_STORE_set_flags(st, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
1363 flag = EINA_TRUE;
1364 }
1365
1366 return EINA_TRUE;
1367
1368error:
1369 _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
1370 return EINA_FALSE;
1371}
1372
1373static Eina_Bool
1374_ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *svr,
1375 const char *key_file)
1376{
1377 FILE *fp = NULL;
1378 EVP_PKEY *privkey = NULL;
1379
1380 if (!(fp = fopen(key_file, "r")))
1381 goto error;
1382
1383 SSL_ERROR_CHECK_GOTO_ERROR(!(privkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL)));
1384
1385 fclose(fp);
1386 SSL_ERROR_CHECK_GOTO_ERROR(SSL_CTX_use_PrivateKey(svr->ssl_ctx, privkey) < 1);
1387 SSL_ERROR_CHECK_GOTO_ERROR(SSL_CTX_check_private_key(svr->ssl_ctx) < 1);
1388
1389 return EINA_TRUE;
1390
1391error:
1392 if (fp)
1393 fclose(fp);
1394 _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
1395 return EINA_FALSE;
1396}
1397
1398static Eina_Bool
1399_ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *svr,
1400 const char *cert_file)
1401{
1402 FILE *fp = NULL;
1403 X509 *cert = NULL;
1404
1405 if (!(fp = fopen(cert_file, "r")))
1406 goto error;
1407
1408 SSL_ERROR_CHECK_GOTO_ERROR(!(cert = PEM_read_X509(fp, NULL, NULL, NULL)));
1409
1410 fclose(fp);
1411
1412 SSL_ERROR_CHECK_GOTO_ERROR(SSL_CTX_use_certificate(svr->ssl_ctx, cert) < 1);
1413
1414 return EINA_TRUE;
1415
1416error:
1417 if (fp)
1418 fclose(fp);
1419 _openssl_print_errors(svr, ECORE_CON_EVENT_SERVER_ERROR);
1420 return EINA_FALSE;
1421}
1422
1423static Ecore_Con_Ssl_Error
1424_ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *svr)
1425{
1426 if (svr->ssl)
1427 {
1428 if (!SSL_shutdown(svr->ssl))
1429 SSL_shutdown(svr->ssl);
1430
1431 SSL_free(svr->ssl);
1432 }
1433
1434 if (svr->ssl_ctx)
1435 SSL_CTX_free(svr->ssl_ctx);
1436
1437 svr->ssl = NULL;
1438 svr->ssl_ctx = NULL;
1439 svr->ssl_err = SSL_ERROR_NONE;
1440
1441 return ECORE_CON_SSL_ERROR_NONE;
1442}
1443
1444static int
1445_ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr,
1446 unsigned char *buf,
1447 int size)
1448{
1449 int num;
1450
1451 if (!svr->ssl) return -1;
1452 num = SSL_read(svr->ssl, buf, size);
1453 svr->ssl_err = SSL_get_error(svr->ssl, num);
1454
1455 if (svr->fd_handler)
1456 {
1457 if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_READ)
1458 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
1459 else if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_WRITE)
1460 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
1461 }
1462
1463 if ((svr->ssl_err == SSL_ERROR_ZERO_RETURN) ||
1464 (svr->ssl_err == SSL_ERROR_SYSCALL) ||
1465 (svr->ssl_err == SSL_ERROR_SSL))
1466 return -1;
1467
1468 if (num < 0)
1469 return 0;
1470
1471 return num;
1472}
1473
1474static int
1475_ecore_con_ssl_server_write_openssl(Ecore_Con_Server *svr,
1476 const unsigned char *buf,
1477 int size)
1478{
1479 int num;
1480
1481 num = SSL_write(svr->ssl, buf, size);
1482 svr->ssl_err = SSL_get_error(svr->ssl, num);
1483
1484 if (svr->fd_handler)
1485 {
1486 if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_READ)
1487 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ);
1488 else if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_WRITE)
1489 ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE);
1490 }
1491
1492 if ((svr->ssl_err == SSL_ERROR_ZERO_RETURN) ||
1493 (svr->ssl_err == SSL_ERROR_SYSCALL) ||
1494 (svr->ssl_err == SSL_ERROR_SSL))
1495 return -1;
1496
1497 if (num < 0)
1498 return 0;
1499
1500 return num;
1501}
1502
1503static Ecore_Con_Ssl_Error
1504_ecore_con_ssl_client_init_openssl(Ecore_Con_Client *cl)
1505{
1506 int ret = -1;
1507 switch (cl->ssl_state)
1508 {
1509 case ECORE_CON_SSL_STATE_DONE:
1510 return ECORE_CON_SSL_ERROR_NONE;
1511
1512 case ECORE_CON_SSL_STATE_INIT:
1513 SSL_ERROR_CHECK_GOTO_ERROR(!(cl->ssl = SSL_new(cl->host_server->ssl_ctx)));
1514
1515 SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(cl->ssl, cl->fd));
1516 SSL_set_accept_state(cl->ssl);
1517 cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING;
1518
1519 case ECORE_CON_SSL_STATE_HANDSHAKING:
1520 if (!cl->ssl)
1521 {
1522 DBG("Client was previously lost, going to error condition");
1523 goto error;
1524 }
1525 ret = SSL_do_handshake(cl->ssl);
1526 cl->ssl_err = SSL_get_error(cl->ssl, ret);
1527 SSL_ERROR_CHECK_GOTO_ERROR((cl->ssl_err == SSL_ERROR_SYSCALL) || (cl->ssl_err == SSL_ERROR_SSL));
1528 if (ret == 1)
1529 {
1530 cl->handshaking = EINA_FALSE;
1531 cl->ssl_state = ECORE_CON_SSL_STATE_DONE;
1532 }
1533 else
1534 {
1535 if (cl->ssl_err == SSL_ERROR_WANT_READ)
1536 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
1537 else if (cl->ssl_err == SSL_ERROR_WANT_WRITE)
1538 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
1539 return ECORE_CON_SSL_ERROR_NONE;
1540 }
1541
1542 default:
1543 break;
1544 }
1545
1546#ifdef ISCOMFITOR
1547 {
1548 /* print session info into DBG */
1549 SSL_SESSION *s;
1550 BIO *b;
1551 char log[4096];
1552
1553 memset(log, 0, sizeof(log));
1554 s = SSL_get_session(cl->ssl);
1555 b = BIO_new(BIO_s_mem());
1556 SSL_SESSION_print(b, s);
1557 while (BIO_read(b, log, sizeof(log)) > 0)
1558 DBG("%s", log);
1559
1560 BIO_free(b);
1561 }
1562#endif
1563
1564 if (!cl->host_server->verify)
1565 /* not verifying certificates, so we're done! */
1566 return ECORE_CON_SSL_ERROR_NONE;
1567 SSL_set_verify(cl->ssl, SSL_VERIFY_PEER, NULL);
1568 /* use CRL/CA lists to verify */
1569 if (SSL_get_peer_certificate(cl->ssl))
1570 SSL_ERROR_CHECK_GOTO_ERROR(SSL_get_verify_result(cl->ssl));
1571
1572 return ECORE_CON_SSL_ERROR_NONE;
1573
1574error:
1575 _openssl_print_errors(cl, ECORE_CON_EVENT_CLIENT_ERROR);
1576 _ecore_con_ssl_client_shutdown_openssl(cl);
1577 return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED;
1578}
1579
1580static Ecore_Con_Ssl_Error
1581_ecore_con_ssl_client_shutdown_openssl(Ecore_Con_Client *cl)
1582{
1583 if (cl->ssl)
1584 {
1585 if (!SSL_shutdown(cl->ssl))
1586 SSL_shutdown(cl->ssl);
1587
1588 SSL_free(cl->ssl);
1589 }
1590
1591 cl->ssl = NULL;
1592 cl->ssl_err = SSL_ERROR_NONE;
1593
1594 return ECORE_CON_SSL_ERROR_NONE;
1595}
1596
1597static int
1598_ecore_con_ssl_client_read_openssl(Ecore_Con_Client *cl,
1599 unsigned char *buf,
1600 int size)
1601{
1602 int num;
1603
1604 if (!cl->ssl) return -1;
1605 num = SSL_read(cl->ssl, buf, size);
1606 cl->ssl_err = SSL_get_error(cl->ssl, num);
1607
1608 if (cl->fd_handler)
1609 {
1610 if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_READ)
1611 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
1612 else if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_WRITE)
1613 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
1614 }
1615
1616 if ((cl->ssl_err == SSL_ERROR_ZERO_RETURN) ||
1617 (cl->ssl_err == SSL_ERROR_SYSCALL) ||
1618 (cl->ssl_err == SSL_ERROR_SSL))
1619 return -1;
1620
1621 if (num < 0)
1622 return 0;
1623
1624 return num;
1625}
1626
1627static int
1628_ecore_con_ssl_client_write_openssl(Ecore_Con_Client *cl,
1629 const unsigned char *buf,
1630 int size)
1631{
1632 int num;
1633
1634 num = SSL_write(cl->ssl, buf, size);
1635 cl->ssl_err = SSL_get_error(cl->ssl, num);
1636
1637 if (cl->fd_handler)
1638 {
1639 if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_READ)
1640 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ);
1641 else if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_WRITE)
1642 ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE);
1643 }
1644
1645 if ((cl->ssl_err == SSL_ERROR_ZERO_RETURN) ||
1646 (cl->ssl_err == SSL_ERROR_SYSCALL) ||
1647 (cl->ssl_err == SSL_ERROR_SSL))
1648 return -1;
1649
1650 if (num < 0)
1651 return 0;
1652
1653 return num;
1654}
1655
1656#else
1657
1658/*
1659 * No Ssl
1660 */
1661
1662static Ecore_Con_Ssl_Error
1663_ecore_con_ssl_init_none(void)
1664{
1665 return ECORE_CON_SSL_ERROR_NONE;
1666}
1667
1668static Ecore_Con_Ssl_Error
1669_ecore_con_ssl_shutdown_none(void)
1670{
1671 return ECORE_CON_SSL_ERROR_NONE;
1672}
1673
1674static Ecore_Con_Ssl_Error
1675_ecore_con_ssl_server_prepare_none(Ecore_Con_Server *svr __UNUSED__,
1676 int ssl_type __UNUSED__)
1677{
1678 return ECORE_CON_SSL_ERROR_NONE;
1679}
1680
1681static Ecore_Con_Ssl_Error
1682_ecore_con_ssl_server_upgrade_none(Ecore_Con_Server *svr __UNUSED__)
1683{
1684 return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
1685}
1686
1687static Ecore_Con_Ssl_Error
1688_ecore_con_ssl_server_init_none(Ecore_Con_Server *svr __UNUSED__)
1689{
1690 return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
1691}
1692
1693static Eina_Bool
1694_ecore_con_ssl_server_cafile_add_none(Ecore_Con_Server *svr __UNUSED__,
1695 const char *ca_file __UNUSED__)
1696{
1697 return EINA_FALSE;
1698}
1699
1700static Eina_Bool
1701_ecore_con_ssl_server_cert_add_none(Ecore_Con_Server *svr __UNUSED__,
1702 const char *cert_file __UNUSED__)
1703{
1704 return EINA_FALSE;
1705}
1706
1707static Eina_Bool
1708_ecore_con_ssl_server_privkey_add_none(Ecore_Con_Server *svr __UNUSED__,
1709 const char *key_file __UNUSED__)
1710{
1711 return EINA_FALSE;
1712}
1713
1714static Eina_Bool
1715_ecore_con_ssl_server_crl_add_none(Ecore_Con_Server *svr __UNUSED__,
1716 const char *crl_file __UNUSED__)
1717{
1718 return EINA_FALSE;
1719}
1720
1721static Ecore_Con_Ssl_Error
1722_ecore_con_ssl_server_shutdown_none(Ecore_Con_Server *svr __UNUSED__)
1723{
1724 return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
1725}
1726
1727static int
1728_ecore_con_ssl_server_read_none(Ecore_Con_Server *svr __UNUSED__,
1729 unsigned char *buf __UNUSED__,
1730 int size __UNUSED__)
1731{
1732 return -1;
1733}
1734
1735static int
1736_ecore_con_ssl_server_write_none(Ecore_Con_Server *svr __UNUSED__,
1737 const unsigned char *buf __UNUSED__,
1738 int size __UNUSED__)
1739{
1740 return -1;
1741}
1742
1743static Ecore_Con_Ssl_Error
1744_ecore_con_ssl_client_upgrade_none(Ecore_Con_Client *cl __UNUSED__)
1745{
1746 return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
1747}
1748
1749static Ecore_Con_Ssl_Error
1750_ecore_con_ssl_client_init_none(Ecore_Con_Client *cl __UNUSED__)
1751{
1752 return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
1753}
1754
1755static Ecore_Con_Ssl_Error
1756_ecore_con_ssl_client_shutdown_none(Ecore_Con_Client *cl __UNUSED__)
1757{
1758 return ECORE_CON_SSL_ERROR_NOT_SUPPORTED;
1759}
1760
1761static int
1762_ecore_con_ssl_client_read_none(Ecore_Con_Client *cl __UNUSED__,
1763 unsigned char *buf __UNUSED__,
1764 int size __UNUSED__)
1765{
1766 return -1;
1767}
1768
1769static int
1770_ecore_con_ssl_client_write_none(Ecore_Con_Client *cl __UNUSED__,
1771 const unsigned char *buf __UNUSED__,
1772 int size __UNUSED__)
1773{
1774 return -1;
1775}
1776
1777#endif
diff --git a/libraries/ecore/src/lib/ecore_con/ecore_con_url.c b/libraries/ecore/src/lib/ecore_con/ecore_con_url.c
new file mode 100644
index 0000000..cfcf095
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_con/ecore_con_url.c
@@ -0,0 +1,1572 @@
1/*
2 * For info on how to use libcurl, see:
3 * http://curl.haxx.se/libcurl/c/libcurl-tutorial.html
4 */
5
6/*
7 * FIXME: Support more CURL features...
8 */
9
10#ifdef HAVE_CONFIG_H
11# include <config.h>
12#endif
13
14#include <string.h>
15#include <errno.h>
16#include <sys/stat.h>
17#include <sys/types.h>
18#include <unistd.h>
19
20#ifdef HAVE_WS2TCPIP_H
21# include <ws2tcpip.h>
22#endif
23
24#ifdef HAVE_ESCAPE
25# include <Escape.h>
26#endif
27
28#include "Ecore.h"
29#include "ecore_private.h"
30#include "Ecore_Con.h"
31#include "ecore_con_private.h"
32
33int ECORE_CON_EVENT_URL_DATA = 0;
34int ECORE_CON_EVENT_URL_COMPLETE = 0;
35int ECORE_CON_EVENT_URL_PROGRESS = 0;
36
37#ifdef HAVE_CURL
38static Eina_Bool _ecore_con_url_fd_handler(void *data,
39 Ecore_Fd_Handler *fd_handler);
40static Eina_Bool _ecore_con_url_perform(Ecore_Con_Url *url_con);
41static size_t _ecore_con_url_header_cb(void *ptr,
42 size_t size,
43 size_t nitems,
44 void *stream);
45static size_t _ecore_con_url_data_cb(void *buffer,
46 size_t size,
47 size_t nitems,
48 void *userp);
49static int _ecore_con_url_progress_cb(void *clientp,
50 double dltotal,
51 double dlnow,
52 double ultotal,
53 double ulnow);
54static size_t _ecore_con_url_read_cb(void *ptr,
55 size_t size,
56 size_t nitems,
57 void *stream);
58static void _ecore_con_event_url_free(void *data __UNUSED__,
59 void *ev);
60static int _ecore_con_url_process_completed_jobs(
61 Ecore_Con_Url *url_con_to_match);
62static Eina_Bool _ecore_con_url_idler_handler(void *data);
63
64static Ecore_Idler *_fd_idler_handler = NULL;
65static Eina_List *_url_con_list = NULL;
66static CURLM *_curlm = NULL;
67static fd_set _current_fd_set;
68static int _init_count = 0;
69static Ecore_Timer *_curl_timeout = NULL;
70static Eina_Bool pipelining = EINA_FALSE;
71
72typedef struct _Ecore_Con_Url_Event Ecore_Con_Url_Event;
73struct _Ecore_Con_Url_Event
74{
75 int type;
76 void *ev;
77};
78
79static Eina_Bool
80_url_complete_idler_cb(void *data)
81{
82 Ecore_Con_Url_Event *lev;
83
84 lev = data;
85 ecore_event_add(lev->type, lev->ev, _ecore_con_event_url_free, NULL);
86 free(lev);
87
88 return ECORE_CALLBACK_CANCEL;
89}
90
91static void
92_url_complete_push_event(int type,
93 void *ev)
94{
95 Ecore_Con_Url_Event *lev;
96
97 lev = malloc(sizeof(Ecore_Con_Url_Event));
98 lev->type = type;
99 lev->ev = ev;
100
101 ecore_idler_add(_url_complete_idler_cb, lev);
102}
103
104#endif
105
106/**
107 * @addtogroup Ecore_Con_Url_Group Ecore URL Connection Functions
108 *
109 * @{
110 */
111
112EAPI int
113ecore_con_url_init(void)
114{
115#ifdef HAVE_CURL
116 _init_count++;
117
118 if (_init_count > 1)
119 return _init_count;
120
121 if (!ECORE_CON_EVENT_URL_DATA)
122 {
123 ECORE_CON_EVENT_URL_DATA = ecore_event_type_new();
124 ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new();
125 ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new();
126 }
127
128 if (!_curlm)
129 {
130 long ms;
131
132 FD_ZERO(&_current_fd_set);
133 if (curl_global_init(CURL_GLOBAL_ALL))
134 {
135 while (_url_con_list)
136 ecore_con_url_free(eina_list_data_get(_url_con_list));
137 return 0;
138 }
139
140 _curlm = curl_multi_init();
141 if (!_curlm)
142 {
143 while (_url_con_list)
144 ecore_con_url_free(eina_list_data_get(_url_con_list));
145
146 _init_count--;
147 return 0;
148 }
149
150 curl_multi_timeout(_curlm, &ms);
151 if (ms <= 0)
152 ms = 1000;
153
154 _curl_timeout =
155 ecore_timer_add((double)ms / 1000, _ecore_con_url_idler_handler,
156 (void *)0xACE);
157 ecore_timer_freeze(_curl_timeout);
158 }
159
160 return 1;
161#else
162 return 0;
163#endif
164}
165
166EAPI int
167ecore_con_url_shutdown(void)
168{
169#ifdef HAVE_CURL
170 if (!_init_count)
171 return 0;
172
173 _init_count--;
174
175 if (_init_count != 0)
176 return _init_count;
177
178 if (_fd_idler_handler)
179 ecore_idler_del(_fd_idler_handler);
180
181 _fd_idler_handler = NULL;
182
183 if (_curl_timeout)
184 ecore_timer_del(_curl_timeout);
185
186 _curl_timeout = NULL;
187
188 while (_url_con_list)
189 ecore_con_url_free(eina_list_data_get(_url_con_list));
190
191 if (_curlm)
192 {
193 curl_multi_cleanup(_curlm);
194 _curlm = NULL;
195 }
196
197 curl_global_cleanup();
198#endif
199 return 1;
200}
201
202EAPI void
203ecore_con_url_pipeline_set(Eina_Bool enable)
204{
205#ifdef HAVE_CURL
206 if (enable)
207 curl_multi_setopt(_curlm, CURLMOPT_PIPELINING, 1);
208 else
209 curl_multi_setopt(_curlm, CURLMOPT_PIPELINING, 0);
210 pipelining = enable;
211#else
212 return;
213 (void)enable;
214#endif
215}
216
217EAPI Eina_Bool
218ecore_con_url_pipeline_get(void)
219{
220#ifdef HAVE_CURL
221 return pipelining;
222#endif
223 return EINA_FALSE;
224}
225
226EAPI Ecore_Con_Url *
227ecore_con_url_new(const char *url)
228{
229#ifdef HAVE_CURL
230 Ecore_Con_Url *url_con;
231 CURLcode ret;
232
233 if (!_init_count)
234 return NULL;
235
236 url_con = calloc(1, sizeof(Ecore_Con_Url));
237 if (!url_con)
238 return NULL;
239
240 url_con->fd = -1;
241 url_con->write_fd = -1;
242
243 url_con->curl_easy = curl_easy_init();
244 if (!url_con->curl_easy)
245 {
246 free(url_con);
247 return NULL;
248 }
249
250 ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL);
251
252 if (!ecore_con_url_url_set(url_con, url))
253 {
254 ecore_con_url_free(url_con);
255 return NULL;
256 }
257
258 ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate");
259 if (ret != CURLE_OK)
260 {
261 ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s",
262 curl_easy_strerror(ret));
263 ecore_con_url_free(url_con);
264 return NULL;
265 }
266
267 curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
268 _ecore_con_url_data_cb);
269 curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con);
270
271 curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
272 _ecore_con_url_progress_cb);
273 curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
274 curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
275
276 curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
277 _ecore_con_url_header_cb);
278 curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con);
279
280 /*
281 * FIXME: Check that these timeouts are sensible defaults
282 * FIXME: Provide a means to change these timeouts
283 */
284 curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30);
285 curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
286
287 return url_con;
288#else
289 return NULL;
290 url = NULL;
291#endif
292}
293
294EAPI Ecore_Con_Url *
295ecore_con_url_custom_new(const char *url,
296 const char *custom_request)
297{
298#ifdef HAVE_CURL
299 Ecore_Con_Url *url_con;
300 CURLcode ret;
301
302 if (!url)
303 return NULL;
304
305 if (!custom_request)
306 return NULL;
307
308 url_con = ecore_con_url_new(url);
309
310 if (!url_con)
311 return NULL;
312
313 ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request);
314 if (ret != CURLE_OK)
315 {
316 ERR("Could not set a custom request string: %s",
317 curl_easy_strerror(ret));
318 ecore_con_url_free(url_con);
319 return NULL;
320 }
321
322 return url_con;
323#else
324 return NULL;
325 url = NULL;
326 custom_request = NULL;
327#endif
328}
329
330EAPI void
331ecore_con_url_free(Ecore_Con_Url *url_con)
332{
333#ifdef HAVE_CURL
334 char *s;
335 CURLMcode ret;
336
337 if (!url_con)
338 return;
339
340 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
341 {
342 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_free");
343 return;
344 }
345
346 ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE);
347 if(url_con->fd != -1)
348 {
349 FD_CLR(url_con->fd, &_current_fd_set);
350 if (url_con->fd_handler)
351 ecore_main_fd_handler_del(url_con->fd_handler);
352
353 url_con->fd = -1;
354 url_con->fd_handler = NULL;
355 }
356
357 if (url_con->curl_easy)
358 {
359 // FIXME: For an unknown reason, progress continue to arrive after destruction
360 // this prevent any further call to the callback.
361 curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL);
362 curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_TRUE);
363
364 if (url_con->active)
365 {
366 url_con->active = EINA_FALSE;
367
368 ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
369 if (ret != CURLM_OK)
370 ERR("curl_multi_remove_handle failed: %s",
371 curl_multi_strerror(ret));
372 }
373
374 curl_easy_cleanup(url_con->curl_easy);
375 }
376
377 _url_con_list = eina_list_remove(_url_con_list, url_con);
378 curl_slist_free_all(url_con->headers);
379 EINA_LIST_FREE(url_con->additional_headers, s)
380 free(s);
381 EINA_LIST_FREE(url_con->response_headers, s)
382 free(s);
383 eina_stringshare_del(url_con->url);
384 free(url_con);
385#else
386 return;
387 (void)url_con;
388#endif
389}
390
391EAPI const char *
392ecore_con_url_url_get(Ecore_Con_Url *url_con)
393{
394#ifdef HAVE_CURL
395 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
396 {
397 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__);
398 return NULL;
399 }
400 return url_con->url;
401#else
402 return NULL;
403 (void)url_con;
404#endif
405}
406
407EAPI Eina_Bool
408ecore_con_url_url_set(Ecore_Con_Url *url_con,
409 const char *url)
410{
411#ifdef HAVE_CURL
412 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
413 {
414 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_url_set");
415 return EINA_FALSE;
416 }
417
418 if (url_con->active)
419 return EINA_FALSE;
420
421 eina_stringshare_replace(&url_con->url, url);
422
423 if (url_con->url)
424 curl_easy_setopt(url_con->curl_easy, CURLOPT_URL,
425 url_con->url);
426 else
427 curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, "");
428
429 return EINA_TRUE;
430#else
431 return EINA_FALSE;
432 (void)url;
433 (void)url_con;
434#endif
435}
436
437EAPI void
438ecore_con_url_data_set(Ecore_Con_Url *url_con,
439 void *data)
440{
441#ifdef HAVE_CURL
442 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
443 {
444 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_set");
445 return;
446 }
447
448 url_con->data = data;
449#else
450 return;
451 url_con = NULL;
452 data = NULL;
453#endif
454}
455
456EAPI void
457ecore_con_url_additional_header_add(Ecore_Con_Url *url_con,
458 const char *key,
459 const char *value)
460{
461#ifdef HAVE_CURL
462 char *tmp;
463
464 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
465 {
466 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
467 "ecore_con_url_additional_header_add");
468 return;
469 }
470
471 tmp = malloc(strlen(key) + strlen(value) + 3);
472 if (!tmp)
473 return;
474
475 sprintf(tmp, "%s: %s", key, value);
476 url_con->additional_headers = eina_list_append(url_con->additional_headers,
477 tmp);
478#else
479 return;
480 url_con = NULL;
481 key = NULL;
482 value = NULL;
483#endif
484}
485
486EAPI void
487ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con)
488{
489#ifdef HAVE_CURL
490 char *s;
491
492 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
493 {
494 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
495 "ecore_con_url_additional_headers_clear");
496 return;
497 }
498
499 EINA_LIST_FREE(url_con->additional_headers, s)
500 free(s);
501#else
502 return;
503 url_con = NULL;
504#endif
505}
506
507EAPI void *
508ecore_con_url_data_get(Ecore_Con_Url *url_con)
509{
510#ifdef HAVE_CURL
511 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
512 {
513 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_get");
514 return NULL;
515 }
516
517 return url_con->data;
518#else
519 return NULL;
520 url_con = NULL;
521#endif
522}
523
524EAPI void
525ecore_con_url_time(Ecore_Con_Url *url_con,
526 Ecore_Con_Url_Time condition,
527 double timestamp)
528{
529#ifdef HAVE_CURL
530 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
531 {
532 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_time");
533 return;
534 }
535
536 url_con->time_condition = condition;
537 url_con->timestamp = timestamp;
538#else
539 return;
540 (void)url_con;
541 (void)condition;
542 (void)timestamp;
543#endif
544}
545
546EAPI void
547ecore_con_url_fd_set(Ecore_Con_Url *url_con,
548 int fd)
549{
550#ifdef HAVE_CURL
551 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
552 {
553 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_set");
554 return;
555 }
556
557 url_con->write_fd = fd;
558#else
559 return;
560 (void)url_con;
561 (void)fd;
562#endif
563}
564
565EAPI int
566ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con)
567{
568#ifdef HAVE_CURL
569 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
570 {
571 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
572 "ecore_con_url_received_bytes_get");
573 return -1;
574 }
575
576 return url_con->received;
577#else
578 return 0;
579 (void)url_con;
580#endif
581}
582
583EAPI const Eina_List *
584ecore_con_url_response_headers_get(Ecore_Con_Url *url_con)
585{
586#ifdef HAVE_CURL
587 return url_con->response_headers;
588#else
589 return NULL;
590 (void)url_con;
591#endif
592}
593
594EAPI Eina_Bool
595ecore_con_url_httpauth_set(Ecore_Con_Url *url_con,
596 const char *username,
597 const char *password,
598 Eina_Bool safe)
599{
600#ifdef HAVE_CURL
601 CURLcode ret;
602
603 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
604 {
605 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
606 "ecore_con_url_httpauth_set");
607 return EINA_FALSE;
608 }
609
610# if LIBCURL_VERSION_NUM >= 0x071301
611 if ((username) && (password))
612 {
613 if (safe)
614 curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
615 CURLAUTH_ANYSAFE);
616 else
617 curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
618
619 ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
620 if (ret != CURLE_OK)
621 {
622 ERR("Could not set username for HTTP authentication: %s",
623 curl_easy_strerror(ret));
624 return EINA_FALSE;
625 }
626
627 ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
628 if (ret != CURLE_OK)
629 {
630 ERR("Could not set password for HTTP authentication: %s",
631 curl_easy_strerror(ret));
632 return EINA_FALSE;
633 }
634
635 return EINA_TRUE;
636 }
637# endif
638#else
639 return EINA_FALSE;
640 (void)url_con;
641 (void)username;
642 (void)password;
643 (void)safe;
644#endif
645
646 return EINA_FALSE;
647}
648
649#define MODE_AUTO 0
650#define MODE_GET 1
651#define MODE_POST 2
652
653static Eina_Bool
654_ecore_con_url_send(Ecore_Con_Url *url_con,
655 int mode,
656 const void *data,
657 long length,
658 const char *content_type)
659{
660#ifdef HAVE_CURL
661 Eina_List *l;
662 const char *s;
663 char tmp[256];
664
665 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
666 {
667 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_send");
668 return EINA_FALSE;
669 }
670
671 if (url_con->active)
672 return EINA_FALSE;
673
674 if (!url_con->url)
675 return EINA_FALSE;
676
677 /* Free response headers from previous send() calls */
678 EINA_LIST_FREE(url_con->response_headers, s)
679 free((char *)s);
680 url_con->response_headers = NULL;
681
682 curl_slist_free_all(url_con->headers);
683 url_con->headers = NULL;
684
685 if ((mode == MODE_POST) || (mode == MODE_AUTO))
686 {
687 if (data)
688 {
689 if ((content_type) && (strlen(content_type) < 200))
690 {
691 snprintf(tmp, sizeof(tmp), "Content-Type: %s", content_type);
692 url_con->headers = curl_slist_append(url_con->headers, tmp);
693 }
694
695 curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data);
696 curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length);
697 }
698 else curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, 0);
699 if (mode == MODE_POST)
700 curl_easy_setopt(url_con->curl_easy, CURLOPT_POST, 1);
701 }
702
703 switch (url_con->time_condition)
704 {
705 case ECORE_CON_URL_TIME_NONE:
706 curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
707 CURL_TIMECOND_NONE);
708 break;
709
710 case ECORE_CON_URL_TIME_IFMODSINCE:
711 curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
712 CURL_TIMECOND_IFMODSINCE);
713 curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
714 (long)url_con->timestamp);
715 break;
716
717 case ECORE_CON_URL_TIME_IFUNMODSINCE:
718 curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION,
719 CURL_TIMECOND_IFUNMODSINCE);
720 curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE,
721 (long)url_con->timestamp);
722 break;
723 }
724
725 /* Additional headers */
726 EINA_LIST_FOREACH(url_con->additional_headers, l, s)
727 url_con->headers = curl_slist_append(url_con->headers, s);
728
729 curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers);
730
731 url_con->received = 0;
732
733 return _ecore_con_url_perform(url_con);
734#else
735 return EINA_FALSE;
736 (void)url_con;
737 (void)mode;
738 (void)data;
739 (void)length;
740 (void)content_type;
741#endif
742}
743
744EINA_DEPRECATED EAPI Eina_Bool
745ecore_con_url_send(Ecore_Con_Url *url_con,
746 const void *data,
747 long length,
748 const char *content_type)
749{
750 return _ecore_con_url_send(url_con, MODE_AUTO, data, length, content_type);
751}
752
753EAPI Eina_Bool
754ecore_con_url_get(Ecore_Con_Url *url_con)
755{
756 return _ecore_con_url_send(url_con, MODE_GET, NULL, 0, NULL);
757}
758
759EAPI Eina_Bool
760ecore_con_url_post(Ecore_Con_Url *url_con,
761 const void *data,
762 long length,
763 const char *content_type)
764{
765 return _ecore_con_url_send(url_con, MODE_POST, data, length, content_type);
766}
767
768EAPI Eina_Bool
769ecore_con_url_ftp_upload(Ecore_Con_Url *url_con,
770 const char *filename,
771 const char *user,
772 const char *pass,
773 const char *upload_dir)
774{
775#ifdef HAVE_CURL
776 char url[4096];
777 char userpwd[4096];
778 FILE *fd;
779 struct stat file_info;
780 CURLcode ret;
781
782 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
783 {
784 ECORE_MAGIC_FAIL(url_con,
785 ECORE_MAGIC_CON_URL,
786 "ecore_con_url_ftp_upload");
787 return EINA_FALSE;
788 }
789
790 if (url_con->active)
791 return EINA_FALSE;
792
793 if (!url_con->url)
794 return EINA_FALSE;
795
796 if (filename)
797 {
798 if (stat(filename, &file_info))
799 return EINA_FALSE;
800
801 snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
802 ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
803 if (ret != CURLE_OK)
804 {
805 ERR("Could not set username and password for FTP upload: %s",
806 curl_easy_strerror(ret));
807 return EINA_FALSE;
808 }
809
810 char tmp[PATH_MAX];
811 snprintf(tmp, PATH_MAX, "%s", filename);
812
813 if (upload_dir)
814 snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
815 upload_dir, basename(tmp));
816 else
817 snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
818 basename(tmp));
819
820 if (!ecore_con_url_url_set(url_con, url))
821 return EINA_FALSE;
822
823 curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE,
824 (curl_off_t)file_info.st_size);
825 curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
826 curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION,
827 _ecore_con_url_read_cb);
828
829 fd = fopen(filename, "rb");
830 if (!fd)
831 {
832 ERR("Could not open \"%s\" for FTP upload", filename);
833 return EINA_FALSE;
834 }
835 curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
836
837 return _ecore_con_url_perform(url_con);
838 }
839#else
840 return EINA_FALSE;
841 (void)url_con;
842 (void)filename;
843 (void)user;
844 (void)pass;
845 (void)upload_dir;
846#endif
847
848 return EINA_FALSE;
849}
850
851EAPI void
852ecore_con_url_cookies_init(Ecore_Con_Url *url_con)
853{
854#ifdef HAVE_CURL
855 if (!url_con)
856 return;
857
858 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
859 {
860 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
861 "ecore_con_url_cookies_init");
862 return;
863 }
864
865 curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, "");
866#else
867 return;
868 (void)url_con;
869#endif
870}
871
872EAPI void
873ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con, Eina_Bool ignore)
874{
875#ifdef HAVE_CURL
876 if (!url_con)
877 return;
878
879 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
880 {
881 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
882 "ecore_con_url_cookies_ignore_old_session_set");
883 return;
884 }
885
886 curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore);
887#else
888 return;
889 (void)url_con;
890 (void)ignore;
891#endif
892}
893
894EAPI void
895ecore_con_url_cookies_clear(Ecore_Con_Url *url_con)
896{
897#ifdef HAVE_CURL
898 if (!url_con)
899 return;
900
901 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
902 {
903 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
904 "ecore_con_url_cookies_clear");
905 return;
906 }
907
908 curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL");
909#else
910 return;
911 (void)url_con;
912#endif
913}
914
915EAPI void
916ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con)
917{
918#ifdef HAVE_CURL
919 if (!url_con)
920 return;
921
922 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
923 {
924 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
925 "ecore_con_url_cookies_session_clear");
926 return;
927 }
928
929 curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS");
930#else
931 return;
932 (void)url_con;
933#endif
934}
935
936EAPI void
937ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con, const char * const file_name)
938{
939#ifdef HAVE_CURL
940 if (!url_con)
941 return;
942
943 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
944 {
945 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
946 "ecore_con_url_cookies_file_add");
947 return;
948 }
949
950 curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name);
951#else
952 return;
953 (void)url_con;
954 (void)file_name;
955#endif
956}
957
958EAPI Eina_Bool
959ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con, const char * const cookiejar_file)
960{
961#ifdef HAVE_CURL
962 CURLcode ret;
963
964 if (!url_con)
965 return EINA_FALSE;
966
967 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
968 {
969 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
970 "ecore_con_url_cookies_jar_file_set");
971 return EINA_FALSE;
972 }
973
974 ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR,
975 cookiejar_file);
976 if (ret != CURLE_OK)
977 {
978 ERR("Setting the cookie-jar name failed: %s",
979 curl_easy_strerror(ret));
980 return EINA_FALSE;
981 }
982
983 return EINA_TRUE;
984#else
985 return EINA_FALSE;
986 (void)url_con;
987 (void)cookiejar_file;
988#endif
989}
990
991EAPI void
992ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con)
993{
994#ifdef HAVE_CURL
995 if (!url_con)
996 return;
997
998 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
999 {
1000 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
1001 "ecore_con_url_cookies_jar_write");
1002 return;
1003 }
1004
1005 curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH");
1006#else
1007 return;
1008 (void)url_con;
1009#endif
1010}
1011
1012EAPI void
1013ecore_con_url_verbose_set(Ecore_Con_Url *url_con,
1014 Eina_Bool verbose)
1015{
1016#ifdef HAVE_CURL
1017 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
1018 {
1019 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
1020 "ecore_con_url_verbose_set");
1021 return;
1022 }
1023
1024 if (url_con->active)
1025 return;
1026
1027 if (!url_con->url)
1028 return;
1029
1030 curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose);
1031#else
1032 return;
1033 (void)url_con;
1034 (void)verbose;
1035#endif
1036}
1037
1038EAPI void
1039ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con,
1040 Eina_Bool use_epsv)
1041{
1042#ifdef HAVE_CURL
1043 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
1044 {
1045 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
1046 "ecore_con_url_ftp_use_epsv_set");
1047 return;
1048 }
1049
1050 if (url_con->active)
1051 return;
1052
1053 if (!url_con->url)
1054 return;
1055
1056 curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, (int)use_epsv);
1057#else
1058 return;
1059 (void)url_con;
1060 (void)use_epsv;
1061#endif
1062}
1063
1064/**
1065 * Toggle libcurl's verify peer's certificate option.
1066 *
1067 * If @p verify is @c EINA_TRUE, libcurl will verify
1068 * the authenticity of the peer's certificate, otherwise
1069 * it will not. Default behavior of libcurl is to check
1070 * peer's certificate.
1071 *
1072 * @param url_con Ecore_Con_Url instance which will be acted upon.
1073 * @param verify Whether or not libcurl will check peer's certificate.
1074 * @since 1.1.0
1075 */
1076EAPI void
1077ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con,
1078 Eina_Bool verify)
1079{
1080#ifdef HAVE_CURL
1081 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
1082 {
1083 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
1084 "ecore_con_url_ssl_verify_peer_set");
1085 return;
1086 }
1087
1088 if (url_con->active)
1089 return;
1090
1091 if (!url_con->url)
1092 return;
1093
1094 curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, (int)verify);
1095#else
1096 return;
1097 (void)url_con;
1098 (void)verify;
1099#endif
1100}
1101
1102/**
1103 * Set a custom CA to trust for SSL/TLS connections.
1104 *
1105 * Specify the path of a file (in PEM format) containing one or more
1106 * CA certificate(s) to use for the validation of the server certificate.
1107 *
1108 * This function can also disable CA validation if @p ca_path is @c NULL.
1109 * However, the server certificate still needs to be valid for the connection
1110 * to succeed (i.e., the certificate must concern the server the
1111 * connection is made to).
1112 *
1113 * @param url_con Connection object that will use the custom CA.
1114 * @param ca_path Path to a CA certificate(s) file or @c NULL to disable
1115 * CA validation.
1116 *
1117 * @return @c 0 on success. When cURL is used, non-zero return values
1118 * are equal to cURL error codes.
1119 */
1120EAPI int
1121ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con, const char *ca_path)
1122{
1123 int res = -1;
1124
1125#ifdef HAVE_CURL
1126 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
1127 {
1128 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ssl_ca_set");
1129 return -1;
1130 }
1131
1132 if (url_con->active) return -1;
1133 if (!url_con->url) return -1;
1134 if (ca_path == NULL)
1135 res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 0);
1136 else
1137 {
1138 res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 1);
1139 if (!res)
1140 res = curl_easy_setopt(url_con->curl_easy, CURLOPT_CAINFO, ca_path);
1141 }
1142#else
1143 return -1;
1144 (void)url_con;
1145 (void)ca_path;
1146#endif
1147
1148 return res;
1149}
1150
1151
1152/**
1153 * @}
1154 */
1155
1156#ifdef HAVE_CURL
1157static int
1158_ecore_con_url_suspend_fd_handler(void)
1159{
1160 Eina_List *l;
1161 Ecore_Con_Url *url_con;
1162 int deleted = 0;
1163
1164 if (!_url_con_list)
1165 return 0;
1166
1167 EINA_LIST_FOREACH(_url_con_list, l, url_con)
1168 {
1169 if (url_con->active && url_con->fd_handler)
1170 {
1171 ecore_main_fd_handler_del(url_con->fd_handler);
1172 url_con->fd_handler = NULL;
1173 deleted++;
1174 }
1175 }
1176
1177 return deleted;
1178}
1179
1180static int
1181_ecore_con_url_restart_fd_handler(void)
1182{
1183 Eina_List *l;
1184 Ecore_Con_Url *url_con;
1185 int activated = 0;
1186
1187 if (!_url_con_list)
1188 return 0;
1189
1190 EINA_LIST_FOREACH(_url_con_list, l, url_con)
1191 {
1192 if (!url_con->fd_handler && url_con->fd != -1)
1193 {
1194 url_con->fd_handler =
1195 ecore_main_fd_handler_add(url_con->fd, url_con->flags,
1196 _ecore_con_url_fd_handler,
1197 NULL, NULL, NULL);
1198 activated++;
1199 }
1200 }
1201
1202 return activated;
1203}
1204
1205static size_t
1206_ecore_con_url_data_cb(void *buffer,
1207 size_t size,
1208 size_t nitems,
1209 void *userp)
1210{
1211 Ecore_Con_Url *url_con;
1212 Ecore_Con_Event_Url_Data *e;
1213 size_t real_size = size * nitems;
1214
1215 url_con = (Ecore_Con_Url *)userp;
1216
1217 if (!url_con)
1218 return -1;
1219
1220 if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
1221 {
1222 ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb");
1223 return -1;
1224 }
1225
1226 url_con->received += real_size;
1227
1228 if (url_con->write_fd < 0)
1229 {
1230 e =
1231 malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) *
1232 (real_size - 1));
1233 if (e)
1234 {
1235 e->url_con = url_con;
1236 e->size = real_size;
1237 memcpy(e->data, buffer, real_size);
1238 ecore_event_add(ECORE_CON_EVENT_URL_DATA, e,
1239 _ecore_con_event_url_free, NULL);
1240 }
1241 }
1242 else
1243 {
1244 ssize_t count = 0;
1245 size_t total_size = real_size;
1246 size_t offset = 0;
1247
1248 while (total_size > 0)
1249 {
1250 count = write(url_con->write_fd,
1251 (char *)buffer + offset,
1252 total_size);
1253 if (count < 0)
1254 {
1255 if (errno != EAGAIN && errno != EINTR)
1256 return -1;
1257 }
1258 else
1259 {
1260 total_size -= count;
1261 offset += count;
1262 }
1263 }
1264 }
1265
1266 return real_size;
1267}
1268
1269#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \
1270 { \
1271 Ecore_Con_Event_Url_Progress *e; \
1272 if ((Total != 0) || (Now != 0)) \
1273 { \
1274 e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \
1275 if (e) \
1276 { \
1277 e->url_con = url_con; \
1278 e->total = Total; \
1279 e->now = Now; \
1280 ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \
1281 } \
1282 } \
1283 }
1284
1285static size_t
1286_ecore_con_url_header_cb(void *ptr,
1287 size_t size,
1288 size_t nitems,
1289 void *stream)
1290{
1291 size_t real_size = size * nitems;
1292 Ecore_Con_Url *url_con = stream;
1293
1294 char *header = malloc(sizeof(char) * (real_size + 1));
1295 if (!header)
1296 return real_size;
1297
1298 memcpy(header, ptr, real_size);
1299 header[real_size] = '\0';
1300
1301 url_con->response_headers = eina_list_append(url_con->response_headers,
1302 header);
1303
1304 return real_size;
1305}
1306
1307static int
1308_ecore_con_url_progress_cb(void *clientp,
1309 double dltotal,
1310 double dlnow,
1311 double ultotal,
1312 double ulnow)
1313{
1314 Ecore_Con_Event_Url_Progress *e;
1315 Ecore_Con_Url *url_con;
1316
1317 url_con = clientp;
1318
1319 e = malloc(sizeof(Ecore_Con_Event_Url_Progress));
1320 if (e)
1321 {
1322 e->url_con = url_con;
1323 e->down.total = dltotal;
1324 e->down.now = dlnow;
1325 e->up.total = ultotal;
1326 e->up.now = ulnow;
1327 ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e,
1328 _ecore_con_event_url_free, NULL);
1329 }
1330
1331 return 0;
1332}
1333
1334static size_t
1335_ecore_con_url_read_cb(void *ptr,
1336 size_t size,
1337 size_t nitems,
1338 void *stream)
1339{
1340 size_t retcode = fread(ptr, size, nitems, stream);
1341
1342 if (ferror((FILE *)stream))
1343 {
1344 fclose(stream);
1345 return CURL_READFUNC_ABORT;
1346 }
1347 else if (retcode == 0)
1348 {
1349 fclose((FILE *)stream);
1350 return 0;
1351 }
1352
1353#ifdef _WIN32
1354 INF("*** We read %Iu bytes from file", retcode);
1355#else
1356 INF("*** We read %zu bytes from file", retcode);
1357#endif
1358 return retcode;
1359}
1360
1361static Eina_Bool
1362_ecore_con_url_perform(Ecore_Con_Url *url_con)
1363{
1364 fd_set read_set, write_set, exc_set;
1365 int fd_max, fd;
1366 int flags, still_running;
1367 int completed_immediately = 0;
1368 CURLMcode ret;
1369
1370 _url_con_list = eina_list_append(_url_con_list, url_con);
1371
1372 url_con->active = EINA_TRUE;
1373 curl_multi_add_handle(_curlm, url_con->curl_easy);
1374 curl_multi_perform(_curlm, &still_running);
1375
1376 completed_immediately = _ecore_con_url_process_completed_jobs(url_con);
1377
1378 if (!completed_immediately)
1379 {
1380 if (url_con->fd_handler)
1381 ecore_main_fd_handler_del(url_con->fd_handler);
1382
1383 url_con->fd_handler = NULL;
1384
1385 /* url_con still active -- set up an fd_handler */
1386 FD_ZERO(&read_set);
1387 FD_ZERO(&write_set);
1388 FD_ZERO(&exc_set);
1389
1390 /* Stupid curl, why can't I get the fd to the current added job? */
1391 ret = curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set,
1392 &fd_max);
1393 if (ret != CURLM_OK)
1394 {
1395 ERR("curl_multi_fdset failed: %s", curl_multi_strerror(ret));
1396 return EINA_FALSE;
1397 }
1398
1399 for (fd = 0; fd <= fd_max; fd++)
1400 {
1401 if (!FD_ISSET(fd, &_current_fd_set))
1402 {
1403 flags = 0;
1404 if (FD_ISSET(fd, &read_set))
1405 flags |= ECORE_FD_READ;
1406
1407 if (FD_ISSET(fd, &write_set))
1408 flags |= ECORE_FD_WRITE;
1409
1410 if (FD_ISSET(fd, &exc_set))
1411 flags |= ECORE_FD_ERROR;
1412
1413 if (flags)
1414 {
1415 long ms = 0;
1416
1417 ret = curl_multi_timeout(_curlm, &ms);
1418 if (ret != CURLM_OK)
1419 ERR("curl_multi_timeout failed: %s",
1420 curl_multi_strerror(ret));
1421
1422 if (ms == 0)
1423 ms = 1000;
1424
1425 FD_SET(fd, &_current_fd_set);
1426 url_con->fd = fd;
1427 url_con->flags = flags;
1428 url_con->fd_handler =
1429 ecore_main_fd_handler_add(fd, flags,
1430 _ecore_con_url_fd_handler,
1431 NULL, NULL, NULL);
1432 break;
1433 }
1434 }
1435 }
1436 if (!url_con->fd_handler)
1437 {
1438 /* Failed to set up an fd_handler */
1439 ecore_timer_freeze(_curl_timeout);
1440
1441 ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
1442 if (ret != CURLM_OK)
1443 ERR("curl_multi_remove_handle failed: %s",
1444 curl_multi_strerror(ret));
1445
1446 url_con->active = EINA_FALSE;
1447 url_con->fd = -1;
1448 return EINA_FALSE;
1449 }
1450
1451 ecore_timer_thaw(_curl_timeout);
1452 }
1453
1454 return EINA_TRUE;
1455}
1456
1457static Eina_Bool
1458_ecore_con_url_idler_handler(void *data)
1459{
1460 int done, still_running;
1461
1462 done = (curl_multi_perform(_curlm, &still_running) != CURLM_CALL_MULTI_PERFORM);
1463
1464 _ecore_con_url_process_completed_jobs(NULL);
1465
1466 if (done)
1467 {
1468 _ecore_con_url_restart_fd_handler();
1469 _fd_idler_handler = NULL;
1470
1471 if (!_url_con_list)
1472 ecore_timer_freeze(_curl_timeout);
1473
1474 return data ==
1475 (void *)0xACE ? ECORE_CALLBACK_RENEW : ECORE_CALLBACK_CANCEL;
1476 }
1477
1478 return ECORE_CALLBACK_RENEW;
1479}
1480
1481static Eina_Bool
1482_ecore_con_url_fd_handler(void *data __UNUSED__,
1483 Ecore_Fd_Handler *fd_handler __UNUSED__)
1484{
1485 _ecore_con_url_suspend_fd_handler();
1486
1487 if (!_fd_idler_handler)
1488 _fd_idler_handler = ecore_idler_add(
1489 _ecore_con_url_idler_handler, NULL);
1490
1491 return ECORE_CALLBACK_RENEW;
1492}
1493
1494static int
1495_ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match)
1496{
1497 Eina_List *l;
1498 Ecore_Con_Url *url_con;
1499 Ecore_Con_Event_Url_Complete *e;
1500 CURLMsg *curlmsg;
1501 CURLMcode ret;
1502 int n_remaining;
1503 int job_matched = 0;
1504
1505 /* Loop jobs and check if any are done */
1506 while ((curlmsg = curl_multi_info_read(_curlm, &n_remaining)))
1507 {
1508 if (curlmsg->msg != CURLMSG_DONE)
1509 continue;
1510
1511 /* find the job which is done */
1512 EINA_LIST_FOREACH(_url_con_list, l, url_con)
1513 {
1514 if (curlmsg->easy_handle == url_con->curl_easy)
1515 {
1516 if (url_con_to_match &&
1517 (url_con == url_con_to_match))
1518 job_matched = 1;
1519
1520 if(url_con->fd != -1)
1521 {
1522 FD_CLR(url_con->fd, &_current_fd_set);
1523 if (url_con->fd_handler)
1524 ecore_main_fd_handler_del(
1525 url_con->fd_handler);
1526
1527 url_con->fd = -1;
1528 url_con->fd_handler = NULL;
1529 }
1530
1531 _url_con_list = eina_list_remove(_url_con_list, url_con);
1532 url_con->active = EINA_FALSE;
1533 e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete));
1534 if (e)
1535 {
1536 e->url_con = url_con;
1537 e->status = 0;
1538 if (curlmsg->data.result == CURLE_OK)
1539 {
1540 long status; /* curl API uses long, not int */
1541
1542 status = 0;
1543 curl_easy_getinfo(curlmsg->easy_handle,
1544 CURLINFO_RESPONSE_CODE,
1545 &status);
1546 e->status = status;
1547 }
1548
1549 _url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
1550 }
1551
1552 ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
1553 if (ret != CURLM_OK)
1554 ERR("curl_multi_remove_handle failed: %s",
1555 curl_multi_strerror(ret));
1556
1557 break;
1558 }
1559 }
1560 }
1561
1562 return job_matched;
1563}
1564
1565static void
1566_ecore_con_event_url_free(void *data __UNUSED__,
1567 void *ev)
1568{
1569 free(ev);
1570}
1571
1572#endif
diff --git a/libraries/ecore/src/lib/ecore_config/Ecore_Config.h b/libraries/ecore/src/lib/ecore_config/Ecore_Config.h
new file mode 100644
index 0000000..6733d7b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/Ecore_Config.h
@@ -0,0 +1,312 @@
1#ifndef _ECORE_CONFIG_H
2# define _ECORE_CONFIG_H
3
4#ifdef EAPI
5#undef EAPI
6#endif
7#ifdef _MSC_VER
8# ifdef BUILDING_DLL
9# define EAPI __declspec(dllexport)
10# else
11# define EAPI __declspec(dllimport)
12# endif
13#else
14# ifdef __GNUC__
15# if __GNUC__ >= 4
16# define EAPI __attribute__ ((visibility("default")))
17# else
18# define EAPI
19# endif
20# else
21# define EAPI
22# endif
23#endif
24
25/**
26 * @file
27 * @brief Provides the Enlightened Property Library.
28 *
29 * This file provies all headers and structs for use with Ecore_Config.
30 * Using individual header files should not be necessary.
31 */
32
33# define DIR_DELIMITER '/'
34# define ECORE_CONFIG_FLOAT_PRECISION 1000
35
36/* FIXME: this should only be included if evas is present */
37# include <Evas.h>
38
39# define ECORE_CONFIG_GLOBAL_ID "_system"
40
41/* structures */
42
43/**
44 * Valid configuration property types.
45 */
46typedef enum Ecore_Config_Type
47{
48 ECORE_CONFIG_NIL = 0, /**< Property with no value. */
49 ECORE_CONFIG_INT = 1, /**< Integer property type. */
50 ECORE_CONFIG_FLT = 2, /**< Float property type. */
51 ECORE_CONFIG_STR = 3, /**< String property type. */
52 ECORE_CONFIG_RGB = 4, /**< Colour property type. */
53 ECORE_CONFIG_THM = 5, /**< Theme property type. */
54 ECORE_CONFIG_BLN = 6, /**< Boolean property type. */
55 ECORE_CONFIG_SCT = 7, /**< Structure property type */
56} Ecore_Config_Type;
57
58typedef enum Ecore_Config_Flag
59{
60 ECORE_CONFIG_FLAG_NONE = 0,
61 ECORE_CONFIG_FLAG_BOUNDS = 1,
62 ECORE_CONFIG_FLAG_MODIFIED = 2,
63 ECORE_CONFIG_FLAG_SYSTEM = 4,
64 ECORE_CONFIG_FLAG_CMDLN = 8
65} Ecore_Config_Flag;
66
67/**
68 * Property change callback function prototype.
69 */
70typedef int (*Ecore_Config_Listener) (const char *key,
71 const Ecore_Config_Type type,
72 const int tag, void *data);
73
74typedef struct Ecore_Config_Listener_List
75{
76 Ecore_Config_Listener listener;
77 const char *name;
78 void *data;
79 int tag;
80 struct Ecore_Config_Listener_List *next;
81} Ecore_Config_Listener_List;
82
83/**
84 * The actual property for storing a key-value pair.
85 */
86typedef struct Ecore_Config_Prop
87{
88 char *key; /* Property key. */
89 char *description; /* Description set by ecore_config_descibe. */
90 char short_opt; /* short identifier on command line (-f) */
91 char *long_opt; /* long identifier on command line (--foo) */
92 char *ptr; /* Used as the value when the property is a string or theme. */
93 Ecore_Config_Type type; /* Property type. */
94 long val; /* Used as the value when the property is an integer, float or colour. */
95 long lo; /* Lower bound for the value when the property is an integer or float. */
96 long hi; /* Higher bound for the value when the property is an integer or float. */
97 long step; /* Increment for the value when the property is an integer or float. */
98 Ecore_Config_Flag flags; /// < Configuration flags.
99 Ecore_Config_Listener_List *listeners; /* List of change listeners. */
100 void *data; /// < Stores extra data for the property.
101 struct Ecore_Config_Prop *parent; /* if we are in a struct we have a parent to notify of changes etc */
102 struct Ecore_Config_Prop *next; /* Pointer to the next property in the list. */
103} Ecore_Config_Prop;
104
105/*
106 * A container for a list of properties. Provided so that an
107 * application can use different set of properties at any time. This
108 * is useful for multiple window support.
109 */
110typedef struct Ecore_Config_Bundle
111{
112 char *identifier; /* Identifier for this set of properties (window ID for example) */
113 char *owner; /* This is used to store the application name related to the bundle */
114 long serial; /* Unique identifier to identify bundle */
115 Ecore_Config_Prop *data; /* Pointer to root of property list */
116 void *user_data; /* App specific pointer to "other data" */
117 struct Ecore_Config_Bundle *next; /* Pointer to next bundle in this application */
118} Ecore_Config_Bundle;
119
120typedef struct Ecore_Config_Server
121{
122 void *server;
123 char *name;
124 Ecore_Config_Bundle *bundles; /* data anchor */
125 struct Ecore_Config_Server *next;
126} Ecore_Config_Server;
127
128# ifdef __cplusplus
129extern "C"
130{
131# endif
132
133/* global ptrs to save passing them through the API */
134 EAPI extern Ecore_Config_Server *__ecore_config_server_global;
135 EAPI extern Ecore_Config_Server *__ecore_config_server_local;
136 EAPI extern Ecore_Config_Bundle *__ecore_config_bundle_local;
137 EAPI extern char *__ecore_config_app_name;
138
139 EAPI Ecore_Config_Prop *ecore_config_get(const char *key);
140 EAPI const char *ecore_config_type_get(const Ecore_Config_Prop *e);
141 EAPI int ecore_config_boolean_get(const char *key);
142 EAPI char *ecore_config_string_get(const char *key);
143 EAPI long ecore_config_int_get(const char *key);
144 EAPI int ecore_config_argb_get(const char *key, int *a, int *r,
145 int *g, int *b);
146 EAPI long ecore_config_argbint_get(const char *key);
147 EAPI char *ecore_config_argbstr_get(const char *key);
148 EAPI float ecore_config_float_get(const char *key);
149 EAPI char *ecore_config_theme_get(const char *key);
150 EAPI char *ecore_config_as_string_get(const char *key);
151 EAPI int ecore_config_bound(Ecore_Config_Prop *e);
152 EAPI int ecore_config_describe(const char *key, const char *desc);
153 EAPI int ecore_config_short_opt_set(const char *key,
154 char short_opt);
155 EAPI int ecore_config_long_opt_set(const char *key,
156 const char *long_opt);
157 EAPI int ecore_config_set(const char *key, const char *val);
158 EAPI int ecore_config_typed_set(const char *key, const void *val,
159 int type);
160 EAPI int ecore_config_boolean_set(const char *key, int val);
161 EAPI int ecore_config_string_set(const char *key, const char *val);
162 EAPI int ecore_config_int_set(const char *key, int val);
163 EAPI int ecore_config_argb_set(const char *key, int a, int r, int g, int b);
164 EAPI int ecore_config_argbint_set(const char *key, long argb);
165 EAPI int ecore_config_argbstr_set(const char *key, const char *val);
166 EAPI int ecore_config_float_set(const char *key, float val);
167 EAPI int ecore_config_theme_set(const char *key, const char *val);
168 EAPI int ecore_config_theme_preview_group_set(const char *key,
169 const char *group);
170 EAPI int ecore_config_as_string_set(const char *key, const char *val);
171
172 EAPI int ecore_config_default(const char *key, const char *val,
173 float lo, float hi, float step);
174 EAPI int ecore_config_typed_default(const char *key, const void *val,
175 int type);
176 EAPI int ecore_config_boolean_default(const char *key, int val);
177 EAPI int ecore_config_int_default(const char *key, int val);
178 EAPI int ecore_config_int_default_bound(const char *key, int val,
179 int lo, int hi, int step);
180 EAPI int ecore_config_string_default(const char *key, const char *val);
181 EAPI int ecore_config_float_default(const char *key, float val);
182 EAPI int ecore_config_float_default_bound(const char *key,
183 float val, float lo,
184 float hi, float step);
185 EAPI int ecore_config_argb_default(const char *key, int a, int r, int g, int b);
186 EAPI int ecore_config_argbint_default(const char *key, long argb);
187 EAPI int ecore_config_argbstr_default(const char *key, const char *val);
188 EAPI int ecore_config_theme_default(const char *key, const char *val);
189 EAPI int ecore_config_struct_default(const char *key);
190 EAPI int ecore_config_struct_int_add(const char *key, const char *name, int val);
191 EAPI int ecore_config_struct_float_add(const char *key, const char *name, float val);
192 EAPI int ecore_config_struct_create(const char *key);
193 EAPI int ecore_config_struct_string_add(const char *key, const char *name, const char* val);
194 EAPI int ecore_config_struct_theme_add(const char *key, const char *name, const char* val);
195 EAPI int ecore_config_struct_argb_add(const char *key, const char *name, int a, int r, int g, int b);
196 EAPI int ecore_config_struct_boolean_add(const char *key, const char *name, int val);
197 EAPI int ecore_config_struct_get(const char *key, void *data);
198
199 EAPI int ecore_config_listen(const char *name, const char *key,
200 Ecore_Config_Listener listener,
201 int tag, void *data);
202 EAPI int ecore_config_deaf(const char *name, const char *key,
203 Ecore_Config_Listener listener);
204 EAPI Ecore_Config_Prop *ecore_config_dst(Ecore_Config_Prop *e);
205 EAPI int ecore_config_type_guess(const char *key, const char *val);
206
207 EAPI Ecore_Config_Bundle *ecore_config_bundle_new(Ecore_Config_Server *srv,
208 const char *id);
209 EAPI Ecore_Config_Bundle *ecore_config_bundle_1st_get(Ecore_Config_Server *srv);
210 EAPI Ecore_Config_Bundle *ecore_config_bundle_next_get(Ecore_Config_Bundle *ns);
211 EAPI Ecore_Config_Bundle *ecore_config_bundle_by_serial_get(Ecore_Config_Server *srv,
212 long serial);
213 EAPI Ecore_Config_Bundle *ecore_config_bundle_by_label_get(Ecore_Config_Server *srv,
214 const char *label);
215 EAPI long ecore_config_bundle_serial_get(Ecore_Config_Bundle *ns);
216 EAPI char *ecore_config_bundle_label_get(Ecore_Config_Bundle *ns);
217
218 EAPI int ecore_config_init(const char *name);
219 EAPI int ecore_config_shutdown(void);
220
221 EAPI int ecore_config_system_init(void);
222 EAPI int ecore_config_system_shutdown(void);
223
224 EAPI int ecore_config_load(void);
225 EAPI int ecore_config_file_load(const char *file);
226 EAPI int ecore_config_save(void);
227 EAPI int ecore_config_file_save(const char *file);
228
229/* error codes */
230# define ECORE_CONFIG_ERR_NOTSUPP (-16)
231# define ECORE_CONFIG_ERR_NOFILE (-15)
232# define ECORE_CONFIG_ERR_META_DLFAIL (-14)
233# define ECORE_CONFIG_ERR_META_FILE (-13)
234# define ECORE_CONFIG_ERR_META_FORMAT (-12)
235# define ECORE_CONFIG_ERR_MONMIS (-11)
236# define ECORE_CONFIG_ERR_NOEXEC (-10)
237# define ECORE_CONFIG_ERR_PARTIAL (-9)
238# define ECORE_CONFIG_ERR_PATHEX (-8)
239# define ECORE_CONFIG_ERR_TYPEMISMATCH (-7)
240# define ECORE_CONFIG_ERR_MUTEX (-6)
241# define ECORE_CONFIG_ERR_NOTFOUND (-5) /* Error indicating that the item searched for could not be found. */
242# define ECORE_CONFIG_ERR_OOM (-4) /* Error given when the program runs out of memory. */
243# define ECORE_CONFIG_ERR_IGNORED (-3) /* Error occurred, but was ignored. */
244# define ECORE_CONFIG_ERR_NODATA (-2) /* Error given when necessary data is not provided. */
245# define ECORE_CONFIG_ERR_FAIL (-1) /* Failure result. */
246# define ECORE_CONFIG_ERR_SUCC (0) /* Success result. */
247
248# define ECORE_CONFIG_PARSE_HELP (-2) /* Help was displayed */
249# define ECORE_CONFIG_PARSE_EXIT (-1) /* An error occurred */
250# define ECORE_CONFIG_PARSE_CONTINUE (0) /* Arguments parsed successfully */
251
252/* convenience mathods in convenience.c */
253 /* FIXME: this should only be included if evas is present */
254 EAPI int ecore_config_evas_font_path_apply(Evas *evas);
255 EAPI char *ecore_config_theme_search_path_get(void);
256 EAPI int ecore_config_theme_search_path_append(const char *append);
257
258 EAPI char *ecore_config_theme_default_path_get(void);
259 EAPI char *ecore_config_theme_with_path_from_name_get(char *name);
260 EAPI char *ecore_config_theme_with_path_get(const char *key);
261 EAPI void ecore_config_args_display(void);
262 EAPI int ecore_config_args_parse(void);
263 EAPI void ecore_config_args_callback_str_add(char short_opt,
264 char *long_opt, char *desc,
265 void (*func)(char *val, void *data),
266 void *data);
267 EAPI void ecore_config_args_callback_noarg_add(char short_opt,
268 char *long_opt, char *desc,
269 void (*func)(char *val, void *data),
270 void *data);
271 EAPI void ecore_config_app_describe(char *description);
272
273 EAPI int ecore_config_create(const char *key, void *val,
274 char short_opt, char *long_opt,
275 char *desc);
276 EAPI int ecore_config_typed_create(const char *key, void *val,
277 int type, char short_opt,
278 char *long_opt, char *desc);
279 EAPI int ecore_config_boolean_create(const char *key, int val,
280 char short_opt, char *long_opt,
281 char *desc);
282 EAPI int ecore_config_int_create(const char *key, int val,
283 char short_opt, char *long_opt,
284 char *desc);
285 EAPI int ecore_config_int_create_bound(const char *key, int val,
286 int low, int high,
287 int step, char short_opt,
288 char *long_opt,
289 char *desc);
290 EAPI int ecore_config_string_create(const char *key, char *val,
291 char short_opt,
292 char *long_opt, char *desc);
293 EAPI int ecore_config_float_create(const char *key, float val,
294 char short_opt, char *long_opt,
295 char *desc);
296 EAPI int ecore_config_float_create_bound(const char *key,
297 float val, float low,
298 float high, float step,
299 char short_opt,
300 char *long_opt,
301 char *desc);
302 EAPI int ecore_config_argb_create(const char *key, char *val,
303 char short_opt, char *long_opt,
304 char *desc);
305 EAPI int ecore_config_theme_create(const char *key, char *val,
306 char short_opt, char *long_opt,
307 char *desc);
308
309# ifdef __cplusplus
310}
311# endif
312#endif
diff --git a/libraries/ecore/src/lib/ecore_config/Makefile.am b/libraries/ecore/src/lib/ecore_config/Makefile.am
new file mode 100644
index 0000000..c459351
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/Makefile.am
@@ -0,0 +1,62 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_ipc \
6-I$(top_srcdir)/ \
7-I$(top_builddir)/src/lib/ecore \
8-I$(top_builddir)/src/lib/ecore_ipc \
9-I$(top_builddir)/ \
10-DPACKAGE_BIN_DIR=\"$(bindir)\" \
11-DPACKAGE_LIB_DIR=\"$(libdir)\" \
12-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
13@EVAS_CFLAGS@ \
14@EET_CFLAGS@ \
15@EINA_CFLAGS@
16
17CLEANFILES = $(DB)
18
19#DB = system.db
20#$(DB): Makefile
21# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /e/theme/name str "winter"
22# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /e/font/path str "$(pkgdatadir)/data/fonts"
23# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /apps/web/browser str `which firefox 2>/dev/null || which phoenix 2>/dev/null || which mozilla 2>/dev/null || which opera 2>/dev/null || which konqueror 2>/dev/null || which epiphany 2>/dev/null`
24# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /apps/web/email str `which thunderbird 2>/dev/null || which mozilla 2>/dev/null || which kmail 2>/dev/null || which sylpheed 2>/dev/null || which evolution 2>/dev/null`
25
26lib_LTLIBRARIES = libecore_config.la
27
28includes_HEADERS = Ecore_Config.h
29includesdir = $(includedir)/ecore-@VMAJ@
30
31libecore_config_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
32
33#config_DATA = $(DB)
34#configdir = $(pkgdatadir)
35
36libecore_config_la_SOURCES = \
37ecore_config.c \
38ecore_config_util.c \
39ecore_config_storage.c \
40ecore_config_extra.c \
41ecore_config_db.c
42
43libecore_config_la_LIBADD = \
44$(top_builddir)/src/lib/ecore/libecore.la \
45@EET_LIBS@ \
46@EINA_LIBS@ \
47@EVAS_LIBS@
48
49if BUILD_ECORE_IPC
50
51libecore_config_la_SOURCES += \
52ecore_config_ipc_main.c \
53ecore_config_ipc_ecore.c
54
55libecore_config_la_LIBADD += $(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la
56
57endif
58
59EXTRA_DIST = \
60ecore_config_ipc.h \
61ecore_config_private.h \
62ecore_config_util.h
diff --git a/libraries/ecore/src/lib/ecore_config/Makefile.in b/libraries/ecore/src/lib/ecore_config/Makefile.in
new file mode 100644
index 0000000..1732a34
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/Makefile.in
@@ -0,0 +1,855 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38@BUILD_ECORE_IPC_TRUE@am__append_1 = \
39@BUILD_ECORE_IPC_TRUE@ecore_config_ipc_main.c \
40@BUILD_ECORE_IPC_TRUE@ecore_config_ipc_ecore.c
41
42@BUILD_ECORE_IPC_TRUE@am__append_2 = $(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la
43subdir = src/lib/ecore_config
44DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
45 $(srcdir)/Makefile.in
46ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
47am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
48 $(top_srcdir)/m4/ac_path_generic.m4 \
49 $(top_srcdir)/m4/check_x_extension.m4 \
50 $(top_srcdir)/m4/ecore_check_module.m4 \
51 $(top_srcdir)/m4/ecore_check_options.m4 \
52 $(top_srcdir)/m4/efl_compiler_flag.m4 \
53 $(top_srcdir)/m4/efl_doxygen.m4 \
54 $(top_srcdir)/m4/efl_examples.m4 \
55 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
56 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
57 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
58 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
59 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
60 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
61 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
62 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
63 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
64 $(top_srcdir)/configure.ac
65am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
66 $(ACLOCAL_M4)
67mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
68CONFIG_HEADER = $(top_builddir)/config.h
69CONFIG_CLEAN_FILES =
70CONFIG_CLEAN_VPATH_FILES =
71am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
72am__vpath_adj = case $$p in \
73 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
74 *) f=$$p;; \
75 esac;
76am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
77am__install_max = 40
78am__nobase_strip_setup = \
79 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
80am__nobase_strip = \
81 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
82am__nobase_list = $(am__nobase_strip_setup); \
83 for p in $$list; do echo "$$p $$p"; done | \
84 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
85 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
86 if (++n[$$2] == $(am__install_max)) \
87 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
88 END { for (dir in files) print dir, files[dir] }'
89am__base_list = \
90 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
91 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
92am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
93LTLIBRARIES = $(lib_LTLIBRARIES)
94libecore_config_la_DEPENDENCIES = \
95 $(top_builddir)/src/lib/ecore/libecore.la $(am__append_2)
96am__libecore_config_la_SOURCES_DIST = ecore_config.c \
97 ecore_config_util.c ecore_config_storage.c \
98 ecore_config_extra.c ecore_config_db.c ecore_config_ipc_main.c \
99 ecore_config_ipc_ecore.c
100@BUILD_ECORE_IPC_TRUE@am__objects_1 = ecore_config_ipc_main.lo \
101@BUILD_ECORE_IPC_TRUE@ ecore_config_ipc_ecore.lo
102am_libecore_config_la_OBJECTS = ecore_config.lo ecore_config_util.lo \
103 ecore_config_storage.lo ecore_config_extra.lo \
104 ecore_config_db.lo $(am__objects_1)
105libecore_config_la_OBJECTS = $(am_libecore_config_la_OBJECTS)
106AM_V_lt = $(am__v_lt_$(V))
107am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
108am__v_lt_0 = --silent
109libecore_config_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
110 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
111 $(AM_CFLAGS) $(CFLAGS) $(libecore_config_la_LDFLAGS) \
112 $(LDFLAGS) -o $@
113DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
114depcomp = $(SHELL) $(top_srcdir)/depcomp
115am__depfiles_maybe = depfiles
116am__mv = mv -f
117COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
118 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
119LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
120 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
121 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
122 $(AM_CFLAGS) $(CFLAGS)
123AM_V_CC = $(am__v_CC_$(V))
124am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
125am__v_CC_0 = @echo " CC " $@;
126AM_V_at = $(am__v_at_$(V))
127am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
128am__v_at_0 = @
129CCLD = $(CC)
130LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
131 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
132 $(AM_LDFLAGS) $(LDFLAGS) -o $@
133AM_V_CCLD = $(am__v_CCLD_$(V))
134am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
135am__v_CCLD_0 = @echo " CCLD " $@;
136AM_V_GEN = $(am__v_GEN_$(V))
137am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
138am__v_GEN_0 = @echo " GEN " $@;
139SOURCES = $(libecore_config_la_SOURCES)
140DIST_SOURCES = $(am__libecore_config_la_SOURCES_DIST)
141HEADERS = $(includes_HEADERS)
142ETAGS = etags
143CTAGS = ctags
144DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
145ACLOCAL = @ACLOCAL@
146ALLOCA = @ALLOCA@
147AMTAR = @AMTAR@
148AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
149AR = @AR@
150AS = @AS@
151AUTOCONF = @AUTOCONF@
152AUTOHEADER = @AUTOHEADER@
153AUTOMAKE = @AUTOMAKE@
154AWK = @AWK@
155CARES_CFLAGS = @CARES_CFLAGS@
156CARES_LIBS = @CARES_LIBS@
157CC = @CC@
158CCDEPMODE = @CCDEPMODE@
159CFLAGS = @CFLAGS@
160CHECK_CFLAGS = @CHECK_CFLAGS@
161CHECK_LIBS = @CHECK_LIBS@
162CPP = @CPP@
163CPPFLAGS = @CPPFLAGS@
164CURL_CFLAGS = @CURL_CFLAGS@
165CURL_LIBS = @CURL_LIBS@
166CXX = @CXX@
167CXXCPP = @CXXCPP@
168CXXDEPMODE = @CXXDEPMODE@
169CXXFLAGS = @CXXFLAGS@
170CYGPATH_W = @CYGPATH_W@
171DEFS = @DEFS@
172DEPDIR = @DEPDIR@
173DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
174DIRECTFB_LIBS = @DIRECTFB_LIBS@
175DLLTOOL = @DLLTOOL@
176DSYMUTIL = @DSYMUTIL@
177DUMPBIN = @DUMPBIN@
178ECHO_C = @ECHO_C@
179ECHO_N = @ECHO_N@
180ECHO_T = @ECHO_T@
181ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
182ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
183EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
184EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
185EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
186EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
187EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
188EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
189EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
190EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
191EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
192EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
193EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
194EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
195EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
196EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
197EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
198EGREP = @EGREP@
199EINA_CFLAGS = @EINA_CFLAGS@
200EINA_LIBS = @EINA_LIBS@
201ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
202ESCAPE_LIBS = @ESCAPE_LIBS@
203EVAS_CFLAGS = @EVAS_CFLAGS@
204EVAS_LIBS = @EVAS_LIBS@
205EVIL_CFLAGS = @EVIL_CFLAGS@
206EVIL_LIBS = @EVIL_LIBS@
207EXEEXT = @EXEEXT@
208FGREP = @FGREP@
209GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
210GLIB_CFLAGS = @GLIB_CFLAGS@
211GLIB_LIBS = @GLIB_LIBS@
212GMSGFMT = @GMSGFMT@
213GMSGFMT_015 = @GMSGFMT_015@
214GREP = @GREP@
215INSTALL = @INSTALL@
216INSTALL_DATA = @INSTALL_DATA@
217INSTALL_PROGRAM = @INSTALL_PROGRAM@
218INSTALL_SCRIPT = @INSTALL_SCRIPT@
219INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
220INTLLIBS = @INTLLIBS@
221INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
222KEYSYMDEFS = @KEYSYMDEFS@
223LD = @LD@
224LDFLAGS = @LDFLAGS@
225LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
226LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
227LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
228LIBICONV = @LIBICONV@
229LIBINTL = @LIBINTL@
230LIBOBJS = @LIBOBJS@
231LIBS = @LIBS@
232LIBTOOL = @LIBTOOL@
233LIPO = @LIPO@
234LN_S = @LN_S@
235LTLIBICONV = @LTLIBICONV@
236LTLIBINTL = @LTLIBINTL@
237LTLIBOBJS = @LTLIBOBJS@
238MAKEINFO = @MAKEINFO@
239MKDIR_P = @MKDIR_P@
240MSGFMT = @MSGFMT@
241MSGFMT_015 = @MSGFMT_015@
242MSGMERGE = @MSGMERGE@
243NM = @NM@
244NMEDIT = @NMEDIT@
245OBJC = @OBJC@
246OBJCDEPMODE = @OBJCDEPMODE@
247OBJCFLAGS = @OBJCFLAGS@
248OBJDUMP = @OBJDUMP@
249OBJEXT = @OBJEXT@
250OTOOL = @OTOOL@
251OTOOL64 = @OTOOL64@
252PACKAGE = @PACKAGE@
253PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
254PACKAGE_NAME = @PACKAGE_NAME@
255PACKAGE_STRING = @PACKAGE_STRING@
256PACKAGE_TARNAME = @PACKAGE_TARNAME@
257PACKAGE_URL = @PACKAGE_URL@
258PACKAGE_VERSION = @PACKAGE_VERSION@
259PATH_SEPARATOR = @PATH_SEPARATOR@
260PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
261PIXMAN_LIBS = @PIXMAN_LIBS@
262PKG_CONFIG = @PKG_CONFIG@
263PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
264PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
265POSUB = @POSUB@
266RANLIB = @RANLIB@
267SDL_CFLAGS = @SDL_CFLAGS@
268SDL_CONFIG = @SDL_CONFIG@
269SDL_LIBS = @SDL_LIBS@
270SED = @SED@
271SET_MAKE = @SET_MAKE@
272SHELL = @SHELL@
273SSL_CFLAGS = @SSL_CFLAGS@
274SSL_LIBS = @SSL_LIBS@
275STRIP = @STRIP@
276TLS2_CFLAGS = @TLS2_CFLAGS@
277TLS2_LIBS = @TLS2_LIBS@
278TLS_CFLAGS = @TLS_CFLAGS@
279TLS_LIBS = @TLS_LIBS@
280TSLIB_CFLAGS = @TSLIB_CFLAGS@
281TSLIB_LIBS = @TSLIB_LIBS@
282USE_NLS = @USE_NLS@
283VERSION = @VERSION@
284VMAJ = @VMAJ@
285WIN32_CFLAGS = @WIN32_CFLAGS@
286WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
287WIN32_LIBS = @WIN32_LIBS@
288XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
289XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
290XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
291XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
292XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
293XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
294XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
295XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
296XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
297XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
298XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
299XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
300XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
301XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
302XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
303XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
304XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
305XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
306XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
307XCB_X11_LIBS = @XCB_X11_LIBS@
308XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
309XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
310XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
311XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
312XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
313XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
314XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
315XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
316XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
317XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
318XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
319XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
320XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
321XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
322XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
323XDAMAGE_LIBS = @XDAMAGE_LIBS@
324XDPMS_CFLAGS = @XDPMS_CFLAGS@
325XDPMS_LIBS = @XDPMS_LIBS@
326XFIXES_CFLAGS = @XFIXES_CFLAGS@
327XFIXES_LIBS = @XFIXES_LIBS@
328XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
329XGESTURE_LIBS = @XGESTURE_LIBS@
330XGETTEXT = @XGETTEXT@
331XGETTEXT_015 = @XGETTEXT_015@
332XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
333XI2_CFLAGS = @XI2_CFLAGS@
334XI2_LIBS = @XI2_LIBS@
335XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
336XINERAMA_LIBS = @XINERAMA_LIBS@
337XKB_CFLAGS = @XKB_CFLAGS@
338XKB_LIBS = @XKB_LIBS@
339XMKMF = @XMKMF@
340XPRINT_CFLAGS = @XPRINT_CFLAGS@
341XPRINT_LIBS = @XPRINT_LIBS@
342XRANDR_CFLAGS = @XRANDR_CFLAGS@
343XRANDR_LIBS = @XRANDR_LIBS@
344XRENDER_CFLAGS = @XRENDER_CFLAGS@
345XRENDER_LIBS = @XRENDER_LIBS@
346XSS_CFLAGS = @XSS_CFLAGS@
347XSS_LIBS = @XSS_LIBS@
348XTEST_CFLAGS = @XTEST_CFLAGS@
349XTEST_LIBS = @XTEST_LIBS@
350X_CFLAGS = @X_CFLAGS@
351X_EXTRA_LIBS = @X_EXTRA_LIBS@
352X_LIBS = @X_LIBS@
353X_PRE_LIBS = @X_PRE_LIBS@
354Xcursor_cflags = @Xcursor_cflags@
355Xcursor_libs = @Xcursor_libs@
356abs_builddir = @abs_builddir@
357abs_srcdir = @abs_srcdir@
358abs_top_builddir = @abs_top_builddir@
359abs_top_srcdir = @abs_top_srcdir@
360ac_ct_CC = @ac_ct_CC@
361ac_ct_CXX = @ac_ct_CXX@
362ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
363ac_ct_OBJC = @ac_ct_OBJC@
364am__include = @am__include@
365am__leading_dot = @am__leading_dot@
366am__quote = @am__quote@
367am__tar = @am__tar@
368am__untar = @am__untar@
369bindir = @bindir@
370build = @build@
371build_alias = @build_alias@
372build_cpu = @build_cpu@
373build_os = @build_os@
374build_vendor = @build_vendor@
375builddir = @builddir@
376cocoa_ldflags = @cocoa_ldflags@
377datadir = @datadir@
378datarootdir = @datarootdir@
379dlopen_libs = @dlopen_libs@
380docdir = @docdir@
381dvidir = @dvidir@
382ecore_cocoa_cflags = @ecore_cocoa_cflags@
383ecore_cocoa_libs = @ecore_cocoa_libs@
384ecore_con_cflags = @ecore_con_cflags@
385ecore_con_libs = @ecore_con_libs@
386ecore_directfb_cflags = @ecore_directfb_cflags@
387ecore_directfb_libs = @ecore_directfb_libs@
388ecore_evas_cflags = @ecore_evas_cflags@
389ecore_evas_libs = @ecore_evas_libs@
390ecore_fb_cflags = @ecore_fb_cflags@
391ecore_fb_libs = @ecore_fb_libs@
392ecore_file_cflags = @ecore_file_cflags@
393ecore_file_libs = @ecore_file_libs@
394ecore_imf_cflags = @ecore_imf_cflags@
395ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
396ecore_imf_evas_libs = @ecore_imf_evas_libs@
397ecore_imf_libs = @ecore_imf_libs@
398ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
399ecore_imf_xim_libs = @ecore_imf_xim_libs@
400ecore_input_cflags = @ecore_input_cflags@
401ecore_input_evas_cflags = @ecore_input_evas_cflags@
402ecore_input_evas_libs = @ecore_input_evas_libs@
403ecore_input_libs = @ecore_input_libs@
404ecore_ipc_cflags = @ecore_ipc_cflags@
405ecore_ipc_libs = @ecore_ipc_libs@
406ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
407ecore_psl1ght_libs = @ecore_psl1ght_libs@
408ecore_sdl_cflags = @ecore_sdl_cflags@
409ecore_sdl_libs = @ecore_sdl_libs@
410ecore_win32_cflags = @ecore_win32_cflags@
411ecore_win32_libs = @ecore_win32_libs@
412ecore_wince_cflags = @ecore_wince_cflags@
413ecore_wince_libs = @ecore_wince_libs@
414ecore_x_cflags = @ecore_x_cflags@
415ecore_x_libs = @ecore_x_libs@
416ecore_x_libs_private = @ecore_x_libs_private@
417efl_doxygen = @efl_doxygen@
418efl_have_doxygen = @efl_have_doxygen@
419exec_prefix = @exec_prefix@
420have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
421host = @host@
422host_alias = @host_alias@
423host_cpu = @host_cpu@
424host_os = @host_os@
425host_vendor = @host_vendor@
426htmldir = @htmldir@
427includedir = @includedir@
428infodir = @infodir@
429install_sh = @install_sh@
430libdir = @libdir@
431libexecdir = @libexecdir@
432localedir = @localedir@
433localstatedir = @localstatedir@
434lt_ECHO = @lt_ECHO@
435lt_enable_auto_import = @lt_enable_auto_import@
436mandir = @mandir@
437mkdir_p = @mkdir_p@
438oldincludedir = @oldincludedir@
439pdfdir = @pdfdir@
440pkgconfig_requires_private = @pkgconfig_requires_private@
441prefix = @prefix@
442program_transform_name = @program_transform_name@
443psdir = @psdir@
444release_info = @release_info@
445requirements_ecore = @requirements_ecore@
446requirements_ecore_cocoa = @requirements_ecore_cocoa@
447requirements_ecore_con = @requirements_ecore_con@
448requirements_ecore_directfb = @requirements_ecore_directfb@
449requirements_ecore_evas = @requirements_ecore_evas@
450requirements_ecore_fb = @requirements_ecore_fb@
451requirements_ecore_file = @requirements_ecore_file@
452requirements_ecore_imf = @requirements_ecore_imf@
453requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
454requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
455requirements_ecore_input = @requirements_ecore_input@
456requirements_ecore_input_evas = @requirements_ecore_input_evas@
457requirements_ecore_ipc = @requirements_ecore_ipc@
458requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
459requirements_ecore_sdl = @requirements_ecore_sdl@
460requirements_ecore_win32 = @requirements_ecore_win32@
461requirements_ecore_wince = @requirements_ecore_wince@
462requirements_ecore_x = @requirements_ecore_x@
463rt_libs = @rt_libs@
464sbindir = @sbindir@
465sharedstatedir = @sharedstatedir@
466srcdir = @srcdir@
467sysconfdir = @sysconfdir@
468target_alias = @target_alias@
469top_build_prefix = @top_build_prefix@
470top_builddir = @top_builddir@
471top_srcdir = @top_srcdir@
472version_info = @version_info@
473x_cflags = @x_cflags@
474x_includes = @x_includes@
475x_libs = @x_libs@
476MAINTAINERCLEANFILES = Makefile.in
477AM_CPPFLAGS = \
478-I$(top_srcdir)/src/lib/ecore \
479-I$(top_srcdir)/src/lib/ecore_ipc \
480-I$(top_srcdir)/ \
481-I$(top_builddir)/src/lib/ecore \
482-I$(top_builddir)/src/lib/ecore_ipc \
483-I$(top_builddir)/ \
484-DPACKAGE_BIN_DIR=\"$(bindir)\" \
485-DPACKAGE_LIB_DIR=\"$(libdir)\" \
486-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
487@EVAS_CFLAGS@ \
488@EET_CFLAGS@ \
489@EINA_CFLAGS@
490
491CLEANFILES = $(DB)
492
493#DB = system.db
494#$(DB): Makefile
495# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /e/theme/name str "winter"
496# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /e/font/path str "$(pkgdatadir)/data/fonts"
497# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /apps/web/browser str `which firefox 2>/dev/null || which phoenix 2>/dev/null || which mozilla 2>/dev/null || which opera 2>/dev/null || which konqueror 2>/dev/null || which epiphany 2>/dev/null`
498# edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /apps/web/email str `which thunderbird 2>/dev/null || which mozilla 2>/dev/null || which kmail 2>/dev/null || which sylpheed 2>/dev/null || which evolution 2>/dev/null`
499lib_LTLIBRARIES = libecore_config.la
500includes_HEADERS = Ecore_Config.h
501includesdir = $(includedir)/ecore-@VMAJ@
502libecore_config_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
503
504#config_DATA = $(DB)
505#configdir = $(pkgdatadir)
506libecore_config_la_SOURCES = ecore_config.c ecore_config_util.c \
507 ecore_config_storage.c ecore_config_extra.c ecore_config_db.c \
508 $(am__append_1)
509libecore_config_la_LIBADD = $(top_builddir)/src/lib/ecore/libecore.la \
510 @EET_LIBS@ @EINA_LIBS@ @EVAS_LIBS@ $(am__append_2)
511EXTRA_DIST = \
512ecore_config_ipc.h \
513ecore_config_private.h \
514ecore_config_util.h
515
516all: all-am
517
518.SUFFIXES:
519.SUFFIXES: .c .lo .o .obj
520$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
521 @for dep in $?; do \
522 case '$(am__configure_deps)' in \
523 *$$dep*) \
524 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
525 && { if test -f $@; then exit 0; else break; fi; }; \
526 exit 1;; \
527 esac; \
528 done; \
529 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_config/Makefile'; \
530 $(am__cd) $(top_srcdir) && \
531 $(AUTOMAKE) --gnu src/lib/ecore_config/Makefile
532.PRECIOUS: Makefile
533Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
534 @case '$?' in \
535 *config.status*) \
536 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
537 *) \
538 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
539 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
540 esac;
541
542$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
543 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
544
545$(top_srcdir)/configure: $(am__configure_deps)
546 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
547$(ACLOCAL_M4): $(am__aclocal_m4_deps)
548 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
549$(am__aclocal_m4_deps):
550install-libLTLIBRARIES: $(lib_LTLIBRARIES)
551 @$(NORMAL_INSTALL)
552 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
553 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
554 list2=; for p in $$list; do \
555 if test -f $$p; then \
556 list2="$$list2 $$p"; \
557 else :; fi; \
558 done; \
559 test -z "$$list2" || { \
560 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
561 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
562 }
563
564uninstall-libLTLIBRARIES:
565 @$(NORMAL_UNINSTALL)
566 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
567 for p in $$list; do \
568 $(am__strip_dir) \
569 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
570 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
571 done
572
573clean-libLTLIBRARIES:
574 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
575 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
576 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
577 test "$$dir" != "$$p" || dir=.; \
578 echo "rm -f \"$${dir}/so_locations\""; \
579 rm -f "$${dir}/so_locations"; \
580 done
581libecore_config.la: $(libecore_config_la_OBJECTS) $(libecore_config_la_DEPENDENCIES)
582 $(AM_V_CCLD)$(libecore_config_la_LINK) -rpath $(libdir) $(libecore_config_la_OBJECTS) $(libecore_config_la_LIBADD) $(LIBS)
583
584mostlyclean-compile:
585 -rm -f *.$(OBJEXT)
586
587distclean-compile:
588 -rm -f *.tab.c
589
590@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config.Plo@am__quote@
591@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config_db.Plo@am__quote@
592@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config_extra.Plo@am__quote@
593@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config_ipc_ecore.Plo@am__quote@
594@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config_ipc_main.Plo@am__quote@
595@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config_storage.Plo@am__quote@
596@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_config_util.Plo@am__quote@
597
598.c.o:
599@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
600@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
601@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
602@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
603@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
604@am__fastdepCC_FALSE@ $(COMPILE) -c $<
605
606.c.obj:
607@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
608@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
609@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
610@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
611@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
612@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
613
614.c.lo:
615@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
616@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
617@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
618@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
619@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
620@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
621
622mostlyclean-libtool:
623 -rm -f *.lo
624
625clean-libtool:
626 -rm -rf .libs _libs
627install-includesHEADERS: $(includes_HEADERS)
628 @$(NORMAL_INSTALL)
629 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
630 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
631 for p in $$list; do \
632 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
633 echo "$$d$$p"; \
634 done | $(am__base_list) | \
635 while read files; do \
636 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
637 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
638 done
639
640uninstall-includesHEADERS:
641 @$(NORMAL_UNINSTALL)
642 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
643 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
644 test -n "$$files" || exit 0; \
645 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
646 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
647
648ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
649 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
650 unique=`for i in $$list; do \
651 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
652 done | \
653 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
654 END { if (nonempty) { for (i in files) print i; }; }'`; \
655 mkid -fID $$unique
656tags: TAGS
657
658TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
659 $(TAGS_FILES) $(LISP)
660 set x; \
661 here=`pwd`; \
662 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
663 unique=`for i in $$list; do \
664 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
665 done | \
666 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
667 END { if (nonempty) { for (i in files) print i; }; }'`; \
668 shift; \
669 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
670 test -n "$$unique" || unique=$$empty_fix; \
671 if test $$# -gt 0; then \
672 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
673 "$$@" $$unique; \
674 else \
675 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
676 $$unique; \
677 fi; \
678 fi
679ctags: CTAGS
680CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
681 $(TAGS_FILES) $(LISP)
682 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
683 unique=`for i in $$list; do \
684 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
685 done | \
686 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
687 END { if (nonempty) { for (i in files) print i; }; }'`; \
688 test -z "$(CTAGS_ARGS)$$unique" \
689 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
690 $$unique
691
692GTAGS:
693 here=`$(am__cd) $(top_builddir) && pwd` \
694 && $(am__cd) $(top_srcdir) \
695 && gtags -i $(GTAGS_ARGS) "$$here"
696
697distclean-tags:
698 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
699
700distdir: $(DISTFILES)
701 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
702 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
703 list='$(DISTFILES)'; \
704 dist_files=`for file in $$list; do echo $$file; done | \
705 sed -e "s|^$$srcdirstrip/||;t" \
706 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
707 case $$dist_files in \
708 */*) $(MKDIR_P) `echo "$$dist_files" | \
709 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
710 sort -u` ;; \
711 esac; \
712 for file in $$dist_files; do \
713 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
714 if test -d $$d/$$file; then \
715 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
716 if test -d "$(distdir)/$$file"; then \
717 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
718 fi; \
719 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
720 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
721 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
722 fi; \
723 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
724 else \
725 test -f "$(distdir)/$$file" \
726 || cp -p $$d/$$file "$(distdir)/$$file" \
727 || exit 1; \
728 fi; \
729 done
730check-am: all-am
731check: check-am
732all-am: Makefile $(LTLIBRARIES) $(HEADERS)
733installdirs:
734 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
735 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
736 done
737install: install-am
738install-exec: install-exec-am
739install-data: install-data-am
740uninstall: uninstall-am
741
742install-am: all-am
743 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
744
745installcheck: installcheck-am
746install-strip:
747 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
748 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
749 `test -z '$(STRIP)' || \
750 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
751mostlyclean-generic:
752
753clean-generic:
754 -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
755
756distclean-generic:
757 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
758 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
759
760maintainer-clean-generic:
761 @echo "This command is intended for maintainers to use"
762 @echo "it deletes files that may require special tools to rebuild."
763 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
764clean: clean-am
765
766clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
767 mostlyclean-am
768
769distclean: distclean-am
770 -rm -rf ./$(DEPDIR)
771 -rm -f Makefile
772distclean-am: clean-am distclean-compile distclean-generic \
773 distclean-tags
774
775dvi: dvi-am
776
777dvi-am:
778
779html: html-am
780
781html-am:
782
783info: info-am
784
785info-am:
786
787install-data-am: install-includesHEADERS
788
789install-dvi: install-dvi-am
790
791install-dvi-am:
792
793install-exec-am: install-libLTLIBRARIES
794
795install-html: install-html-am
796
797install-html-am:
798
799install-info: install-info-am
800
801install-info-am:
802
803install-man:
804
805install-pdf: install-pdf-am
806
807install-pdf-am:
808
809install-ps: install-ps-am
810
811install-ps-am:
812
813installcheck-am:
814
815maintainer-clean: maintainer-clean-am
816 -rm -rf ./$(DEPDIR)
817 -rm -f Makefile
818maintainer-clean-am: distclean-am maintainer-clean-generic
819
820mostlyclean: mostlyclean-am
821
822mostlyclean-am: mostlyclean-compile mostlyclean-generic \
823 mostlyclean-libtool
824
825pdf: pdf-am
826
827pdf-am:
828
829ps: ps-am
830
831ps-am:
832
833uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
834
835.MAKE: install-am install-strip
836
837.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
838 clean-libLTLIBRARIES clean-libtool ctags distclean \
839 distclean-compile distclean-generic distclean-libtool \
840 distclean-tags distdir dvi dvi-am html html-am info info-am \
841 install install-am install-data install-data-am install-dvi \
842 install-dvi-am install-exec install-exec-am install-html \
843 install-html-am install-includesHEADERS install-info \
844 install-info-am install-libLTLIBRARIES install-man install-pdf \
845 install-pdf-am install-ps install-ps-am install-strip \
846 installcheck installcheck-am installdirs maintainer-clean \
847 maintainer-clean-generic mostlyclean mostlyclean-compile \
848 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
849 tags uninstall uninstall-am uninstall-includesHEADERS \
850 uninstall-libLTLIBRARIES
851
852
853# Tell versions [3.59,3.63) of GNU make to not export all variables.
854# Otherwise a system limit (for SysV at least) may be exceeded.
855.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config.c b/libraries/ecore/src/lib/ecore_config/ecore_config.c
new file mode 100644
index 0000000..e81538e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config.c
@@ -0,0 +1,1870 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6#include <ctype.h>
7#include <stdio.h>
8#include <stdlib.h>
9
10#include <sys/param.h>
11#include <sys/types.h>
12#include <sys/stat.h>
13#include <fcntl.h>
14#include <limits.h>
15#include <unistd.h>
16
17#include "Ecore_Config.h"
18#include "ecore_config_private.h"
19#include "ecore_config_ipc.h"
20
21#include "ecore_config_util.h"
22int _ecore_config_log_dom = -1;
23int DEBUG = 0;
24EAPI Ecore_Config_Server *__ecore_config_server_global = NULL;
25EAPI Ecore_Config_Server *__ecore_config_server_local = NULL;
26EAPI Ecore_Config_Bundle *__ecore_config_bundle_local = NULL;
27EAPI char *__ecore_config_app_name = NULL;
28int __ecore_config_system_init = 0;
29
30static int _ecore_config_system_init_no_load(void);
31static int _ecore_config_system_load(void);
32
33static inline void *__ecore_argb_to_long(int a, int r, int g, int b, long *v);
34static inline void *__ecore_argbstr_to_long(const char *argb, long *v);
35
36static const char *_ecore_config_type[] =
37 { "undefined", "integer", "float", "string", "colour", "theme", "boolean", "structure" };
38
39/**
40 * @defgroup Ecore_Config_Property_Group Ecore Config Property Functions
41 *
42 * Functions that retrieve or set the attributes relating to a property.
43 */
44
45/**
46 * Removes the given property from the local configuration and destroys it.
47 * @param e Property to destroy.
48 * @return @c NULL
49 * @ingroup Ecore_Config_Property_Group
50 */
51EAPI Ecore_Config_Prop *
52ecore_config_dst(Ecore_Config_Prop * e)
53{
54 Ecore_Config_Bundle *t;
55 Ecore_Config_Prop *p, *c;
56 Ecore_Config_Listener_List *l;
57
58 p = NULL;
59 t = __ecore_config_bundle_local;
60 c = t->data;
61
62 if (!e || !e->key)
63 return NULL;
64 if (t)
65 {
66 if (t->data == e)
67 t->data = e->next;
68 else
69 {
70 do
71 {
72 p = c;
73 c = c->next;
74 }
75 while (c && (c != e));
76 if (c) /* remove from list if even in there */
77 p->next = c->next;
78 }
79 }
80
81 while (e->listeners)
82 {
83 l = e->listeners;
84 e->listeners = e->listeners->next;
85 free(l);
86 }
87
88 if (e->key)
89 free(e->key);
90 if (e->ptr && ((e->type == ECORE_CONFIG_STR) || (e->type == ECORE_CONFIG_THM)))
91 free(e->ptr);
92
93 memset(e, 0, sizeof(Ecore_Config_Prop));
94 free(e);
95
96 return NULL;
97}
98
99/**
100 * @defgroup Ecore_Config_Get_Group Configuration Retrieve Functions
101 *
102 * Functions that retrieve configuration values, based on type.
103 */
104
105/**
106 * Returns the property with the given key.
107 * @param key The unique name of the wanted property.
108 * @return The property that corresponds to the given key. @c NULL if the
109 * key could not be found.
110 * @ingroup Ecore_Config_Get_Group
111 */
112EAPI Ecore_Config_Prop *
113ecore_config_get(const char *key)
114{
115 Ecore_Config_Bundle *t;
116 Ecore_Config_Prop *e;
117
118 t = __ecore_config_bundle_local;
119 if (!t || !key)
120 return NULL;
121 e = t->data;
122 while (e)
123 {
124 if (!strcmp(key, e->key))
125 return e;
126 e = e->next;
127 }
128 return NULL;
129}
130
131/**
132 * Returns the type of the property.
133 * @param e Property to get the type of.
134 * @returns The type of the property. If the property is invalid, then the
135 * string "not found" is returned.
136 * @ingroup Ecore_Config_Property_Group
137 */
138EAPI const char *
139ecore_config_type_get(const Ecore_Config_Prop * e)
140{
141 if (e)
142 {
143 return _ecore_config_type[e->type];
144 }
145 return "not found";
146}
147
148/**
149 * Returns the specified property as a string.
150 * @param key The property key.
151 * @return The string value of the property. The function returns @c NULL if
152 * the property is not a string or is not set.
153 * @ingroup Ecore_Config_Get_Group
154 */
155EAPI char *
156ecore_config_string_get(const char *key)
157{
158 return _ecore_config_string_get( ecore_config_get(key) );
159}
160
161char *
162_ecore_config_string_get(Ecore_Config_Prop *e)
163{
164 return (e && (e->type == ECORE_CONFIG_STR) && e->ptr) ? strdup(e->ptr) : NULL;
165}
166
167/**
168 * Returns the specified property as an integer.
169 * @param key The property key.
170 * @return The value of the property. The function returns -1 if the
171 * property is not an integer or is not set.
172 * @ingroup Ecore_Config_Get_Group
173 */
174EAPI int
175ecore_config_boolean_get(const char *key)
176{
177 return _ecore_config_boolean_get( ecore_config_get(key) );
178}
179
180int
181_ecore_config_boolean_get(Ecore_Config_Prop *e)
182{
183 return (e && ((e->type == ECORE_CONFIG_INT) || (e->type == ECORE_CONFIG_BLN))) ? (e->val != 0) : -1;
184}
185
186/**
187 * Returns the specified property as a long integer.
188 * @param key The property key.
189 * @return The integer value of the property. The function returns 0 if the
190 * property is not an integer or is not set.
191 * @ingroup Ecore_Config_Get_Group
192 */
193EAPI long
194ecore_config_int_get(const char *key)
195{
196 return _ecore_config_int_get( ecore_config_get(key) );
197}
198
199long
200_ecore_config_int_get(Ecore_Config_Prop *e)
201{
202 return (e && ((e->type == ECORE_CONFIG_INT) || (e->type == ECORE_CONFIG_RGB))) ? e->val : 0L;
203}
204
205/**
206 * Returns the specified property as a float.
207 * @param key The property key.
208 * @return The float value of the property. The function returns 0.0 if the
209 * property is not a float or is not set.
210 * @ingroup Ecore_Config_Get_Group
211 */
212EAPI float
213ecore_config_float_get(const char *key)
214{
215 return _ecore_config_float_get( ecore_config_get(key) );
216}
217
218float
219_ecore_config_float_get(Ecore_Config_Prop *e)
220{
221 return (e && (e->type == ECORE_CONFIG_FLT)) ? ((float)e->val / ECORE_CONFIG_FLOAT_PRECISION) : 0.0;
222}
223
224/**
225 * Finds the alpha, red, green and blue values of a color property.
226 * @param key The property key.
227 * @param a A pointer to an integer to store the alpha value into.
228 * @param r A pointer to an integer to store the red value into.
229 * @param g A pointer to an integer to store the green value into.
230 * @param b A pointer to an integer to store the blue value into.
231 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_FAIL
232 * otherwise.
233 * @ingroup Ecore_Config_Get_Group
234 */
235EAPI int
236ecore_config_argb_get(const char *key, int *a, int *r, int *g, int *b)
237{
238 return _ecore_config_argb_get( ecore_config_get(key), a, r, g, b);
239}
240
241int
242_ecore_config_argb_get(Ecore_Config_Prop *e, int *a, int *r, int *g, int *b)
243{
244 if (e && ((e->type == ECORE_CONFIG_RGB)))
245 {
246 if(a) *a = (e->val >> 24) & 0xff;
247 if(r) *r = (e->val >> 16) & 0xff;
248 if(g) *g = (e->val >> 8) & 0xff;
249 if(b) *b = e->val & 0xff;
250 return ECORE_CONFIG_ERR_SUCC;
251 }
252 return ECORE_CONFIG_ERR_FAIL;
253}
254
255/**
256 * Returns a color property as a long
257 * @param key The property key.
258 * @return ARGB data as long
259 * @ingroup Ecore_Config_Get_Group
260 */
261EAPI long
262ecore_config_argbint_get(const char *key)
263{
264 return _ecore_config_argbint_get( ecore_config_get(key) );
265}
266
267long
268_ecore_config_argbint_get(Ecore_Config_Prop *e)
269{
270 if (e && ((e->type == ECORE_CONFIG_RGB)))
271 {
272 return e->val;
273 }
274 return 0L;
275}
276
277/**
278 * Returns a color property as a string of hexadecimal characters.
279 * @param key The property key.
280 * @return A string of hexadecimal characters in the format #aarrggbb.
281 * @ingroup Ecore_Config_Get_Group
282 */
283EAPI char *
284ecore_config_argbstr_get(const char *key)
285{
286 return _ecore_config_argbstr_get( ecore_config_get(key) );
287}
288
289char *
290_ecore_config_argbstr_get(Ecore_Config_Prop *e)
291{
292 char *r;
293
294 r = NULL;
295 esprintf(&r, "#%08x", _ecore_config_int_get(e));
296 return r;
297}
298
299/**
300 * Returns a theme property.
301 * @param key The property key.
302 * @return The name of the theme the property refers to. The function returns
303 * @c NULL if the property is not a theme or is not set.
304 * @ingroup Ecore_Config_Get_Group
305 */
306EAPI char *
307ecore_config_theme_get(const char *key)
308{
309 return _ecore_config_theme_get( ecore_config_get(key) );
310}
311
312char *
313_ecore_config_theme_get(Ecore_Config_Prop *e)
314{
315 return (e && (e->type == ECORE_CONFIG_THM)) ? strdup(e->ptr) : NULL;
316}
317
318/**
319 * Retrieves the key as a string.
320 * @param key The property key.
321 * @return Returns a character array in the form of 'key:type=value'. @c NULL
322 * is returned if the property does not exist.
323 * @ingroup Ecore_Config_Get_Group
324 */
325EAPI char *
326ecore_config_as_string_get(const char *key)
327{
328 Ecore_Config_Prop *e;
329 char *val;
330 char *r;
331
332 val = NULL;
333 r = NULL;
334 if (!(e = ecore_config_get(key)))
335 ERR("no such property, \"%s\"...", key);
336 else
337 {
338 switch (e->type)
339 {
340 case ECORE_CONFIG_NIL:
341 val = strdup("<nil>");
342 break;
343 case ECORE_CONFIG_INT:
344 esprintf(&val, "%ld", _ecore_config_int_get(e));
345 break;
346 case ECORE_CONFIG_BLN:
347 esprintf(&val, "%ld", _ecore_config_boolean_get(e));
348 break;
349 case ECORE_CONFIG_FLT:
350 esprintf(&val, "%lf", _ecore_config_float_get(e));
351 break;
352 case ECORE_CONFIG_STR:
353 esprintf(&val, "\"%s\"", _ecore_config_string_get(e));
354 break;
355 case ECORE_CONFIG_RGB:
356 esprintf(&val, "#%08x", _ecore_config_int_get(e));
357 break;
358 case ECORE_CONFIG_THM:
359 esprintf(&val, "\"%s\"", _ecore_config_theme_get(e));
360 break;
361 case ECORE_CONFIG_SCT:
362 break;
363 default:
364 esprintf(&r, "%s:unknown_type", key);
365 break;
366 }
367 if (val)
368 {
369 esprintf(&r, "%s:%s=%s", key, _ecore_config_type[e->type], val);
370 free(val);
371 }
372 }
373 return r;
374}
375
376EAPI int
377ecore_config_bound(Ecore_Config_Prop * e)
378{
379 int ret;
380 long v;
381
382 ret = ECORE_CONFIG_ERR_SUCC;
383
384 if (!e)
385 return ECORE_CONFIG_ERR_FAIL;
386 if (e->flags & ECORE_CONFIG_FLAG_BOUNDS)
387 {
388 if ((e->val < e->lo))
389 {
390 WRN("ecore_config_bounds(\"%s\",%ld): value out of range; adjusted to %ld...",
391 e->key, e->val, e->lo);
392 e->val = e->lo;
393 }
394 else if ((e->val > e->hi))
395 {
396 WRN("ecore_config_bounds(\"%s\",%ld): value out of range; adjusted to %ld...",
397 e->key, e->val, e->hi);
398 e->val = e->hi;
399 }
400 else
401 ret = ECORE_CONFIG_ERR_IGNORED;
402 }
403 else
404 ret = ECORE_CONFIG_ERR_IGNORED;
405
406 if (e->step)
407 {
408 v = ((int)(e->val / e->step)) * e->step;
409 if (v != e->val)
410 {
411 if (e->type == ECORE_CONFIG_FLT)
412 WRN("ecore_config_bound(\"%s\"): float value %f not a multiple of %f, adjusted to %f...",
413 e->key, ((double)e->val) / ECORE_CONFIG_FLOAT_PRECISION,
414 ((double)e->step) / ECORE_CONFIG_FLOAT_PRECISION,
415 ((double)v) / ECORE_CONFIG_FLOAT_PRECISION);
416 else
417 WRN("ecore_config_bound(\"%s\"): integer value %ld not a multiple of %ld, adjusted to %ld...",
418 e->key, e->val, e->step, v);
419 ret = ECORE_CONFIG_ERR_SUCC;
420 e->val = v;
421 }
422 }
423
424 return ret;
425}
426
427/**
428 * Tries to guess the type of a property.
429 *
430 * This function first checks to see if the property exists. If it does, then
431 * the type of the stored property is returned. Otherwise, the function tries
432 * to guess the type of the property based on @p val.
433 *
434 * @param key The property key.
435 * @param val The value in string form.
436 * @return The type of the property determined by the function. Note that if
437 * val is @c NULL, @c ECORE_CONFIG_NIL will be returned.
438 */
439EAPI int
440ecore_config_type_guess(const char *key, const char *val)
441{
442 Ecore_Config_Prop *p;
443 char *l;
444
445 l = NULL;
446
447 if (key && (p = ecore_config_get(key)) && p->type != ECORE_CONFIG_NIL)
448 return p->type;
449
450 if (!val)
451 return ECORE_CONFIG_NIL;
452 if (val[0] == '#')
453 return ECORE_CONFIG_RGB;
454 strtol(val, &l, 10);
455 if (*l)
456 {
457 float f;
458
459 if (sscanf(val, "%f%*s", &f) != 1)
460 return ECORE_CONFIG_STR;
461 return ECORE_CONFIG_FLT;
462 }
463 return ECORE_CONFIG_INT;
464}
465
466static int
467ecore_config_typed_val(Ecore_Config_Prop * e, const void *val, int type)
468{
469
470 if (!e)
471 return ECORE_CONFIG_ERR_NODATA;
472
473 if (!(val) && (type != ECORE_CONFIG_NIL && type != ECORE_CONFIG_SCT))
474 e->ptr = NULL;
475 else
476 {
477 if (type == ECORE_CONFIG_INT || type == ECORE_CONFIG_BLN)
478 {
479 e->val = (long) *((int *)val);
480 e->type = type;
481 }
482 else if (type == ECORE_CONFIG_STR || type == ECORE_CONFIG_THM)
483 {
484 if (!(e->ptr = strdup(val)))
485 return ECORE_CONFIG_ERR_OOM;
486 if (e->type == ECORE_CONFIG_NIL)
487 e->type = type;
488 }
489 else if (type == ECORE_CONFIG_RGB)
490 {
491 __ecore_argbstr_to_long((char *)val, &e->val);
492 e->type = ECORE_CONFIG_RGB;
493 }
494 else if (type == ECORE_CONFIG_FLT)
495 {
496 e->val = (long) ((*((float *)val)) * ECORE_CONFIG_FLOAT_PRECISION);
497 e->type = ECORE_CONFIG_FLT;
498 }
499 else if (type == ECORE_CONFIG_SCT)
500 {
501 e->type = ECORE_CONFIG_SCT;
502 }
503 else
504 {
505 e->type = ECORE_CONFIG_NIL;
506 }
507
508 ecore_config_bound(e);
509 e->flags |= ECORE_CONFIG_FLAG_MODIFIED;
510 e->flags &= ~ECORE_CONFIG_FLAG_CMDLN;
511 return ECORE_CONFIG_ERR_SUCC;
512 }
513 return ECORE_CONFIG_ERR_IGNORED;
514}
515
516static int
517ecore_config_typed_add(const char *key, const void *val, int type)
518{
519 int error = ECORE_CONFIG_ERR_SUCC;
520 Ecore_Config_Prop *e = NULL;
521 Ecore_Config_Bundle *t;
522
523 t = __ecore_config_bundle_local;
524 if (!key)
525 return ECORE_CONFIG_ERR_NODATA;
526
527 if (!(e = calloc(1, sizeof(Ecore_Config_Prop))))
528 {
529 return ECORE_CONFIG_ERR_OOM;
530 }
531 else if (!(e->key = strdup(key)))
532 {
533 error = ECORE_CONFIG_ERR_OOM;
534 }
535 else if ((error = ecore_config_typed_val(e, val, type)) == ECORE_CONFIG_ERR_SUCC)
536 {
537 if (t)
538 {
539 e->next = t->data;
540 t->data = e;
541 }
542 return ECORE_CONFIG_ERR_SUCC;
543 }
544
545 if(e->key)
546 free(e->key);
547 if(e)
548 free(e);
549
550 if (error == ECORE_CONFIG_ERR_SUCC)
551 error = ECORE_CONFIG_ERR_FAIL;
552
553 return error;
554}
555
556static int
557ecore_config_add(const char *key, const char *val)
558{
559 int type;
560
561 type = ecore_config_type_guess(key, val);
562 return ecore_config_typed_add(key, val, type);
563}
564
565/**
566 * Sets the description field of the indicated property.
567 * @param key The property key.
568 * @param desc Description string.
569 * @note The description string is copied for the property's use. You can
570 * free @p desc once this function is called.
571 * @ingroup Ecore_Config_Property_Group
572 */
573EAPI int
574ecore_config_describe(const char *key, const char *desc)
575{
576 Ecore_Config_Prop *e;
577
578 if (!(e = ecore_config_get(key)))
579 return ECORE_CONFIG_ERR_NODATA;
580 e->description = strdup(desc);
581 return ECORE_CONFIG_ERR_SUCC;
582}
583
584/**
585 * Set the short option character of a property.
586 * @param key The property key.
587 * @param short_opt Character used to indicate the value of a property
588 * given on the command line.
589 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_NODATA
590 * is returned if the property does not exist.
591 * @ingroup Ecore_Config_Property_Group
592 */
593EAPI int
594ecore_config_short_opt_set(const char *key, char short_opt)
595{
596 Ecore_Config_Prop *e;
597
598 if (!(e = ecore_config_get(key)))
599 return ECORE_CONFIG_ERR_NODATA;
600 e->short_opt = short_opt;
601 return ECORE_CONFIG_ERR_SUCC;
602}
603
604/**
605 * Set the long option string of the property.
606 * @param key The property key.
607 * @param long_opt String used to indicate the value of a property given
608 * on the command line.
609 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_NODATA
610 * is returned if the property does not exist.
611 * @ingroup Ecore_Config_Property_Group
612 */
613EAPI int
614ecore_config_long_opt_set(const char *key, const char *long_opt)
615{
616 Ecore_Config_Prop *e;
617
618 if (!(e = ecore_config_get(key)))
619 return ECORE_CONFIG_ERR_NODATA;
620 if (e->long_opt)
621 free(e->long_opt);
622 if (long_opt)
623 e->long_opt = strdup(long_opt);
624 return ECORE_CONFIG_ERR_SUCC;
625}
626
627static void
628_ecore_config_listener_fire(Ecore_Config_Prop *prop)
629{
630 Ecore_Config_Listener_List *l;
631 for (l = prop->listeners; l; l = l->next)
632 l->listener(prop->key, prop->type, l->tag, l->data);
633
634 /* fire change listeners for the generic struct container etc */
635 if (prop->parent)
636 _ecore_config_listener_fire(prop->parent);
637}
638
639/**
640 * Sets the indicated property to the given value and type.
641 * @param key The property key.
642 * @param val A pointer to the value to set the property to.
643 * @param type The type of the property.
644 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
645 * @ingroup Ecore_Config_Property_Group
646 */
647EAPI int
648ecore_config_typed_set(const char *key, const void *val, int type)
649{
650 Ecore_Config_Prop *e;
651 int ret;
652
653 if (!key)
654 return ECORE_CONFIG_ERR_NODATA;
655/* if (!t) { * global prop *
656 e=ecore_config_get(key);
657 if (e)
658 for(l=e->listeners;l;l=l->next)
659 l->listener(e->key,e->type,l->tag,l->data,t);
660 return ECORE_CONFIG_ERR_SUCC;
661 }
662*/
663 if (!(e = ecore_config_get(key)))
664 return ecore_config_typed_add(key, val, type);
665
666 if ((ret = ecore_config_typed_val(e, val, type)) == ECORE_CONFIG_ERR_SUCC)
667 {
668 _ecore_config_listener_fire(e);
669 }
670 else
671 {
672 ERR("ecore_config_typed_set(\"%s\"): ecore_config_typed_val() failed: %d",
673 key, ret);
674 }
675
676 return ret;
677}
678
679/**
680 * @defgroup Ecore_Config_Set_Group Ecore Config Setters
681 *
682 * Functions that set the value of a property.
683 */
684
685/**
686 * Sets the indicated property to the value indicated by @a val.
687 * @param key The property key.
688 * @param val String representation of value to set.
689 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
690 * @ingroup Ecore_Config_Set_Group
691 */
692EAPI int
693ecore_config_set(const char *key, const char *val)
694{
695 int type;
696 int tmpi;
697 float tmpf;
698 long tmpl;
699
700 type = ecore_config_type_guess(key, val);
701 if (type == ECORE_CONFIG_INT || type == ECORE_CONFIG_BLN)
702 {
703 tmpi = atoi(val);
704 return ecore_config_typed_set(key, &tmpi, type);
705 }
706 else if (type == ECORE_CONFIG_FLT)
707 {
708 tmpf = atof(val);
709 return ecore_config_typed_set(key, &tmpf, type);
710 }
711 else if (type == ECORE_CONFIG_RGB)
712 {
713 __ecore_argbstr_to_long(val, &tmpl);
714 return ecore_config_typed_set(key, &tmpl, type);
715 }
716 else
717 return ecore_config_typed_set(key, val, type);
718}
719
720/**
721 * Sets the indicated property to the value given in the string.
722 * @param key The property key.
723 * @param val String representation of the value.
724 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
725 * @ingroup Ecore_Config_Set_Group
726 */
727EAPI int
728ecore_config_as_string_set(const char *key, const char *val)
729{
730 return ecore_config_set(key, val);
731}
732
733/**
734 * Sets the indicated property to the given boolean.
735 * @param key The property key.
736 * @param val Boolean integer to set the property to.
737 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
738 * @ingroup Ecore_Config_Set_Group
739 */
740EAPI int
741ecore_config_boolean_set(const char *key, int val)
742{
743 val = val ? 1 : 0;
744 return ecore_config_typed_set(key, &val, ECORE_CONFIG_BLN);
745}
746
747/**
748 * Sets the indicated property to the given integer.
749 * @param key The property key.
750 * @param val Integer to set the property to.
751 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
752 * @ingroup Ecore_Config_Set_Group
753 */
754EAPI int
755ecore_config_int_set(const char *key, int val)
756{
757 return ecore_config_typed_set(key, &val, ECORE_CONFIG_INT);
758}
759
760/**
761 * Sets the indicated property to the given string.
762 * @param key The property key.
763 * @param val String to set the property to.
764 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
765 * @ingroup Ecore_Config_Set_Group
766 */
767EAPI int
768ecore_config_string_set(const char *key, const char *val)
769{
770 return ecore_config_typed_set(key, val, ECORE_CONFIG_STR);
771}
772
773/**
774 * Sets the indicated property to the given float value.
775 * @param key The property key.
776 * @param val Float to set the property to.
777 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
778 * @ingroup Ecore_Config_Set_Group
779 */
780EAPI int
781ecore_config_float_set(const char *key, float val)
782{
783 return ecore_config_typed_set(key, &val, ECORE_CONFIG_FLT);
784}
785
786/**
787 * Sets the indicated property to a color value.
788 * @param key The property key
789 * @param a integer 0..255
790 * @param r integer 0..255
791 * @param g integer 0..255
792 * @param b integer 0..255
793 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
794 * @ingroup Ecore_Config_Set_Group
795 */
796EAPI int
797ecore_config_argb_set(const char *key, int a, int r, int g, int b)
798{
799 long v = 0;
800 return ecore_config_typed_set(key, __ecore_argb_to_long(a,r,g,b, &v), ECORE_CONFIG_RGB);
801}
802
803/**
804 * Sets the indicated property to a color value.
805 * @param key The property key
806 * @param argb ARGB data as long
807 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
808 * @ingroup Ecore_Config_Set_Group
809 */
810EAPI int
811ecore_config_argbint_set(const char *key, long argb)
812{
813 return ecore_config_typed_set(key, &argb, ECORE_CONFIG_RGB);
814}
815
816/**
817 * Sets the indicated property to a color value.
818 * @param key The property key
819 * @param val Color value in ARGB format.
820 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
821 * @ingroup Ecore_Config_Set_Group
822 */
823EAPI int
824ecore_config_argbstr_set(const char *key, const char *val)
825{
826 long v = 0;
827 return ecore_config_typed_set(key, __ecore_argbstr_to_long(val, &v), ECORE_CONFIG_RGB);
828}
829
830/**
831 * Sets the indicated property to a theme name.
832 * @param key The property key.
833 * @param val String giving the name of the theme.
834 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
835 * @ingroup Ecore_Config_Set_Group
836 */
837EAPI int
838ecore_config_theme_set(const char *key, const char *val)
839{
840 return ecore_config_typed_set(key, val, ECORE_CONFIG_THM);
841}
842
843/**
844 * Sets the theme preview group of an indicated property.
845 * @param key The property key.
846 * @param group The group name.
847 * @return @c ECORE_CONFIG_ERR_SUCC on success.
848 * @ingroup Ecore_Config_Set_Group
849 */
850EAPI int
851ecore_config_theme_preview_group_set(const char *key, const char *group)
852{
853 int ret;
854 Ecore_Config_Prop *e;
855
856 ret = ECORE_CONFIG_ERR_SUCC;
857 if (!(e = ecore_config_get(key)))
858 { /* prop doesn't exist yet */
859 if ((ret = ecore_config_typed_add(key, "", ECORE_CONFIG_THM)) != ECORE_CONFIG_ERR_SUCC) /* try to add it */
860 return ret; /* ...failed */
861 if (!(e = ecore_config_get(key))) /* get handle */
862 return ECORE_CONFIG_ERR_FAIL;
863 }
864 if (e->data)
865 free(e->data);
866 e->data = strdup(group);
867
868 return ret;
869}
870
871EAPI int
872ecore_config_typed_default(const char *key, const void *val, int type)
873{
874 int ret;
875 Ecore_Config_Prop *e;
876
877 ret = ECORE_CONFIG_ERR_SUCC;
878
879 if (!(e = ecore_config_get(key)))
880 { /* prop doesn't exist yet */
881 if ((ret = ecore_config_typed_add(key, val, type)) != ECORE_CONFIG_ERR_SUCC) /* try to add it */
882 return ret; /* ...failed */
883 if (!(e = ecore_config_get(key))) /* get handle */
884 return ECORE_CONFIG_ERR_FAIL;
885 e->flags = e->flags & ~ECORE_CONFIG_FLAG_MODIFIED;
886 }
887 else if (!(e->flags & ECORE_CONFIG_FLAG_MODIFIED) && !(e->flags & ECORE_CONFIG_FLAG_SYSTEM))
888 {
889 ecore_config_typed_set(key, val, type);
890 if (!(e = ecore_config_get(key))) /* get handle */
891 return ECORE_CONFIG_ERR_FAIL;
892 e->flags = e->flags & ~ECORE_CONFIG_FLAG_MODIFIED;
893 }
894 return ret;
895}
896
897/**
898 * @defgroup Ecore_Config_Default_Group Ecore Config Defaults
899 *
900 * Functions that are used to set the default values of properties.
901 */
902
903/**
904 * Sets the indicated property if it has not already been set or loaded.
905 * @param key The property key.
906 * @param val Default value of the key.
907 * @param lo Lowest valid value for the key.
908 * @param hi Highest valid value for the key.
909 * @param step Used by integer and float values.
910 * @return @c ECORE_CONFIG_ERR_SUCC if there are no errors.
911 * @note The @p lo, @p hi and @p step parameters are only used when storing
912 * integer and float properties.
913 * @ingroup Ecore_Config_Default_Group
914 */
915EAPI int
916ecore_config_default(const char *key, const char *val, float lo, float hi, float step)
917{
918 int ret, type;
919 Ecore_Config_Prop *e;
920
921 type = ecore_config_type_guess(key, val);
922 ret = ecore_config_typed_default(key, val, type);
923 e = ecore_config_get(key);
924 if (e)
925 {
926 if (type == ECORE_CONFIG_INT)
927 {
928 e->step = step;
929 e->flags |= ECORE_CONFIG_FLAG_BOUNDS;
930 e->lo = lo;
931 e->hi = hi;
932 ecore_config_bound(e);
933 }
934 else if (type == ECORE_CONFIG_FLT)
935 {
936 e->step = (int)(step * ECORE_CONFIG_FLOAT_PRECISION);
937 e->flags |= ECORE_CONFIG_FLAG_BOUNDS;
938 e->lo = (int)(lo * ECORE_CONFIG_FLOAT_PRECISION);
939 e->hi = (int)(hi * ECORE_CONFIG_FLOAT_PRECISION);
940 ecore_config_bound(e);
941 }
942 }
943
944 return ret;
945}
946
947/**
948 * Sets the indicated property to the given boolean if the property has not yet
949 * been set.
950 * @param key The property key.
951 * @param val Boolean Integer to set the value to.
952 * @return @c ECORE_CONFIG_ERR_SUCC if there are no problems.
953 * @ingroup Ecore_Config_Default_Group
954 */
955EAPI int
956ecore_config_boolean_default(const char *key, int val)
957{
958 val = val ? 1 : 0;
959 return ecore_config_typed_default(key, &val, ECORE_CONFIG_BLN);
960}
961
962/**
963 * Sets the indicated property to the given integer if the property has not yet
964 * been set.
965 * @param key The property key.
966 * @param val Integer to set the value to.
967 * @return @c ECORE_CONFIG_ERR_SUCC if there are no problems.
968 * @ingroup Ecore_Config_Default_Group
969 */
970EAPI int
971ecore_config_int_default(const char *key, int val)
972{
973 return ecore_config_typed_default(key, &val, ECORE_CONFIG_INT);
974}
975
976/**
977 * Sets the indicated property to the given integer if the property has not yet
978 * been set.
979 *
980 * The bounds and step values are set regardless.
981 *
982 * @param key The property key.
983 * @param val Integer to set the property to.
984 * @param low Lowest valid integer value for the property.
985 * @param high Highest valid integer value for the property.
986 * @param step Increment value for the property.
987 * @return @c ECORE_CONFIG_ERR_SUCC if there were no problems.
988 * @ingroup Ecore_Config_Default_Group
989 */
990EAPI int
991ecore_config_int_default_bound(const char *key, int val, int low, int high,
992 int step)
993{
994 Ecore_Config_Prop *e;
995 int ret;
996
997 ret = ecore_config_typed_default(key, &val, ECORE_CONFIG_INT);
998 e = ecore_config_get(key);
999 if (e)
1000 {
1001 e->step = step;
1002 e->flags |= ECORE_CONFIG_FLAG_BOUNDS;
1003 e->lo = low;
1004 e->hi = high;
1005 ecore_config_bound(e);
1006 }
1007
1008 return ret;
1009}
1010
1011/**
1012 * Sets the indicated property to the given string if the property has not yet
1013 * been set.
1014 * @param key The property key.
1015 * @param val String to set the property to.
1016 * @return @c ECORE_CONFIG_ERR_SUCC if there were no problems.
1017 * @ingroup Ecore_Config_Default_Group
1018 */
1019EAPI int
1020ecore_config_string_default(const char *key, const char *val)
1021{
1022 return ecore_config_typed_default(key, val, ECORE_CONFIG_STR);
1023}
1024
1025/**
1026 * Sets the indicated property to the given float if the property has not yet
1027 * been set.
1028 * @param key The property key.
1029 * @param val Float to set the property to.
1030 * @return @c ECORE_CONFIG_ERR_SUCC if there were no problems.
1031 * @ingroup Ecore_Config_Default_Group
1032 */
1033EAPI int
1034ecore_config_float_default(const char *key, float val)
1035{
1036 return ecore_config_typed_default(key, &val, ECORE_CONFIG_FLT);
1037}
1038
1039/**
1040 * Sets the indicated property to the given float if the property has not yet
1041 * been set.
1042 *
1043 * The bounds and step values are set regardless.
1044 *
1045 * @param key The property key.
1046 * @param val Float to set the property to.
1047 * @param low Lowest valid integer value for the property.
1048 * @param high Highest valid float value for the property.
1049 * @param step Increment value for the property.
1050 * @return @c ECORE_CONFIG_ERR_SUCC if there were no problems.
1051 * @ingroup Ecore_Config_Default_Group
1052 */
1053EAPI int
1054ecore_config_float_default_bound(const char *key, float val, float low,
1055 float high, float step)
1056{
1057 Ecore_Config_Prop *e;
1058 int ret;
1059
1060 ret = ecore_config_typed_default(key, &val, ECORE_CONFIG_FLT);
1061 e = ecore_config_get(key);
1062 if (e)
1063 {
1064 e->step = (int)(step * ECORE_CONFIG_FLOAT_PRECISION);
1065 e->flags |= ECORE_CONFIG_FLAG_BOUNDS;
1066 e->lo = (int)(low * ECORE_CONFIG_FLOAT_PRECISION);
1067 e->hi = (int)(high * ECORE_CONFIG_FLOAT_PRECISION);
1068 ecore_config_bound(e);
1069 }
1070
1071 return ret;
1072}
1073
1074/**
1075 * Sets the indicated property to a color value if the property has not yet
1076 * been set.
1077 * @param key The property key.
1078 * @param a integer 0..255
1079 * @param r integer 0..255
1080 * @param g integer 0..255
1081 * @param b integer 0..255
1082 * @return @c ECORE_CONFIG_ERR_SUCC if there are no problems.
1083 * @ingroup Ecore_Config_Default_Group
1084 */
1085EAPI int
1086ecore_config_argb_default(const char *key, int a, int r, int g, int b)
1087{
1088 long v = 0;
1089 return ecore_config_typed_default(key, __ecore_argb_to_long(a,r,g,b, &v), ECORE_CONFIG_RGB);
1090}
1091
1092/**
1093 * Sets the indicated property to a color value if the property has not yet
1094 * been set.
1095 * @param key The property key.
1096 * @param argb ARGB data as long
1097 * @return @c ECORE_CONFIG_ERR_SUCC if there are no problems.
1098 * @ingroup Ecore_Config_Default_Group
1099 */
1100EAPI int
1101ecore_config_argbint_default(const char *key, long argb)
1102{
1103 return ecore_config_typed_default(key, &argb, ECORE_CONFIG_RGB);
1104}
1105
1106/**
1107 * Sets the indicated property to a color value if the property has not yet
1108 * been set.
1109 * @param key The property key.
1110 * @param val Color value in ARGB format.
1111 * @return @c ECORE_CONFIG_ERR_SUCC if there are no problems.
1112 * @ingroup Ecore_Config_Default_Group
1113 */
1114EAPI int
1115ecore_config_argbstr_default(const char *key, const char *val)
1116{
1117 long v = 0;
1118 return ecore_config_typed_default(key, __ecore_argbstr_to_long(val, &v), ECORE_CONFIG_RGB);
1119}
1120
1121/**
1122 * Sets the indicated property to a theme name if the property has not yet
1123 * been set.
1124 * @param key The property key.
1125 * @param val String giving the name of the theme.
1126 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1127 * @ingroup Ecore_Config_Default_Group
1128 */
1129EAPI int
1130ecore_config_theme_default(const char *key, const char *val)
1131{
1132 return ecore_config_typed_default(key, val, ECORE_CONFIG_THM);
1133}
1134
1135/**
1136 * @defgroup Ecore_Config_Struct_Group Ecore Config Structures
1137 *
1138 * Functions that are used to create structures of properties.
1139 */
1140
1141/**
1142 * Sets the indicated property to a structure if the property has not yet
1143 * been set.
1144 * @param key The property key.
1145 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1146 * @ingroup Ecore_Config_Struct_Group
1147 */
1148EAPI int
1149ecore_config_struct_create(const char *key)
1150{
1151 WRN("you are using ecore_config structures. These are very young");
1152 WRN(" and not complete - you have been warned");
1153
1154 return ecore_config_typed_default(key, NULL, ECORE_CONFIG_SCT);
1155}
1156
1157static int
1158_ecore_config_struct_append(Ecore_Config_Prop *sct, Ecore_Config_Prop *add)
1159{
1160 Eina_List *l;
1161
1162 if (!sct || !add || sct->type != ECORE_CONFIG_SCT)
1163 return ECORE_CONFIG_ERR_IGNORED;
1164
1165 l = sct->data;
1166 sct->data = eina_list_append(l, add);
1167 add->parent = sct;
1168
1169 return ECORE_CONFIG_ERR_SUCC;
1170}
1171
1172static int
1173_ecore_config_struct_typed_add(const char *key, const char *name, const void *val,
1174 int type)
1175{
1176 char *subkey;
1177 int ret;
1178
1179 subkey = malloc((strlen(key) + strlen(name) + 2) * sizeof(char));
1180 strcpy(subkey, key);
1181 strcat(subkey, ".");
1182 strcat(subkey, name);
1183
1184 ecore_config_typed_default(subkey, val, type);
1185 ret = _ecore_config_struct_append(ecore_config_get(key),
1186 ecore_config_get(subkey));
1187 free(subkey);
1188 return ret;
1189}
1190
1191/**
1192 * Add an int property to the named structure. The property is set if it has not
1193 * yet been set.
1194 * @param key The key of the structure to add to.
1195 * @param name The name of the item to add - this will be appended to the key
1196 * @param val the int to default to
1197 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1198 * @ingroup Ecore_Config_Struct_Group
1199 */
1200EAPI int
1201ecore_config_struct_int_add(const char *key, const char *name, int val)
1202{
1203 return _ecore_config_struct_typed_add(key, name, &val, ECORE_CONFIG_INT);
1204}
1205
1206/**
1207 * Add a float property to the named structure. The property is set if it has
1208 * not yet been set.
1209 * @param key The key of the structure to add to.
1210 * @param name The name of the item to add - this will be appended to the key
1211 * @param val The float to default to
1212 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1213 * @ingroup Ecore_Config_Struct_Group
1214 */
1215EAPI int
1216ecore_config_struct_float_add(const char *key, const char *name, float val)
1217{
1218 return _ecore_config_struct_typed_add(key, name, &val, ECORE_CONFIG_FLT);
1219}
1220
1221/**
1222 * Add a string property to the named structure. The property is set if it has
1223 * not yet been set.
1224 * @param key The key of the structure to add to.
1225 * @param name The name of the item to add - this will be appended to the key
1226 * @param val The string to default to
1227 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1228 * @ingroup Ecore_Config_Struct_Group
1229 */
1230EAPI int
1231ecore_config_struct_string_add(const char *key, const char *name, const char* val)
1232{
1233 return _ecore_config_struct_typed_add(key, name, val, ECORE_CONFIG_STR);
1234}
1235
1236/**
1237 * Add an argb property to the named structure. The property is set if it has
1238 * not yet been set.
1239 * @param key The key of the structure to add to.
1240 * @param name The name of the item to add - this will be appended to the key
1241 * @param a The alpha to default to
1242 * @param r The red to default to
1243 * @param g The green to default to
1244 * @param b The blue to default to
1245 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1246 * @ingroup Ecore_Config_Struct_Group
1247 */
1248EAPI int
1249ecore_config_struct_argb_add(const char *key, const char *name, int a, int r,
1250 int g, int b)
1251{
1252 long argb;
1253
1254 __ecore_argb_to_long(a, r, g, b, &argb);
1255 return _ecore_config_struct_typed_add(key, name, &argb, ECORE_CONFIG_RGB);
1256}
1257
1258/**
1259 * Add a theme property to the named structure. The property is set if it has
1260 * not yet been set.
1261 * @param key The key of the structure to add to.
1262 * @param name The name of the item to add - this will be appended to the key
1263 * @param val The theme name to default to
1264 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1265 * @ingroup Ecore_Config_Struct_Group
1266 */
1267EAPI int
1268ecore_config_struct_theme_add(const char *key, const char *name, const char* val)
1269{
1270 return _ecore_config_struct_typed_add(key, name, val, ECORE_CONFIG_THM);
1271}
1272
1273/**
1274 * Add a boolean property to the named structure. The property is set if it has
1275 * not yet been set.
1276 * @param key The key of the structure to add to.
1277 * @param name The name of the item to add - this will be appended to the key
1278 * @param val The boolean to default to
1279 * @return @c ECORE_CONFIG_ERR_SUCC if the property is set successfully.
1280 * @ingroup Ecore_Config_Struct_Group
1281 */
1282EAPI int
1283ecore_config_struct_boolean_add(const char *key, const char *name, int val)
1284{
1285 val = val ? 1 : 0;
1286 return _ecore_config_struct_typed_add(key, name, &val, ECORE_CONFIG_BLN);
1287}
1288
1289/**
1290 * Get the contents of a defined structure property and load it into the passed
1291 * C struct
1292 * @param key The name of the structure property to look up.
1293 * @param data The struct to write into.
1294 * @return @c ECORE_CONFIG_ERR_SUCC if the structure is written successfully.
1295 * @ingroup Ecore_Config_Struct_Group
1296 */
1297EAPI int
1298ecore_config_struct_get(const char *key, void *data)
1299{
1300 Ecore_Config_Prop *e, *f;
1301 Eina_List *l;
1302 unsigned char *ptr;
1303 long argb;
1304
1305 e = ecore_config_get(key);
1306 if (!e)
1307 return ECORE_CONFIG_ERR_NODATA;
1308
1309 l = e->data;
1310 ptr = data;
1311 while (l)
1312 {
1313 f = (Ecore_Config_Prop *) l->data;
1314 switch (f->type)
1315 {
1316 case ECORE_CONFIG_INT:
1317 *((int *) ptr) = _ecore_config_int_get(f);
1318 ptr += sizeof(int);
1319 break;
1320 case ECORE_CONFIG_BLN:
1321 *((int *) ptr) = _ecore_config_boolean_get(f);
1322 ptr += sizeof(int);
1323 break;
1324 case ECORE_CONFIG_FLT:
1325 *((float *) ptr) = _ecore_config_float_get(f);
1326 ptr += sizeof(float);
1327 break;
1328 case ECORE_CONFIG_STR:
1329 case ECORE_CONFIG_THM:
1330 *((char **) ptr) = _ecore_config_string_get(f);
1331 ptr += sizeof(char *);
1332 break;
1333 case ECORE_CONFIG_RGB:
1334 argb = _ecore_config_argbint_get(f);
1335 *((int *) ptr) = (argb >> 24) & 0xff;
1336 ptr += sizeof(int);
1337 *((int *) ptr) = (argb >> 16) & 0xff;
1338 ptr += sizeof(int);
1339 *((int *) ptr) = (argb >> 8) & 0xff;
1340 ptr += sizeof(int);
1341 *((int *) ptr) = argb & 0xff;
1342 ptr += sizeof(int);
1343 break;
1344 default:
1345 WRN("ARGH - STRUCT coding not implemented yet");
1346 }
1347 l = eina_list_next(l);
1348 }
1349 return ECORE_CONFIG_ERR_SUCC;
1350}
1351
1352/**
1353 * @defgroup Ecore_Config_Listeners_Group Ecore Config Listeners
1354 *
1355 * Functions that set and unset property listener callbacks.
1356 */
1357
1358/**
1359 * Adds a callback function to the list of functions called when a property
1360 * changes.
1361 * @param name Name of the callback.
1362 * @param key The key of the property to listen to.
1363 * @param listener Listener callback function.
1364 * @param tag Tag to pass to @p listener when it is called.
1365 * @param data Data to pass to @p listener when it is called.
1366 * @return @c ECORE_CONFIG_ERR_SUCC if successful in setting up the callback.
1367 * @ingroup Ecore_Config_Listeners_Group
1368 */
1369EAPI int
1370ecore_config_listen(const char *name, const char *key,
1371 Ecore_Config_Listener listener, int tag, void *data)
1372{
1373 Ecore_Config_Prop *e;
1374 Ecore_Config_Listener_List *l;
1375
1376 if (!key)
1377 return ECORE_CONFIG_ERR_NODATA;
1378
1379 if (!(e = ecore_config_get(key)))
1380 {
1381 int ret = ecore_config_add(key, "");
1382
1383 if (ret != ECORE_CONFIG_ERR_SUCC)
1384 {
1385 ERR("ecore_config_listen: ecore_config_add(\"%s\") failed: %d",
1386 key, ret);
1387 return ret;
1388 }
1389 if (!(e = ecore_config_get(key)))
1390 {
1391 ERR("ecore_config_listen: list of properties corrupted!?");
1392 return ECORE_CONFIG_ERR_FAIL;
1393 }
1394 }
1395
1396 for (l = e->listeners; l; l = l->next)
1397 if (!strcmp(l->name, name) || (l->listener == listener))
1398 {
1399 ERR("ecore_config_listen: %s is already listening for changes of %s...",
1400 name, key);
1401 return ECORE_CONFIG_ERR_IGNORED;
1402 }
1403
1404 if (!(l = malloc(sizeof(Ecore_Config_Listener_List))))
1405 return ECORE_CONFIG_ERR_OOM;
1406
1407 ERR("registering listener \"%s\" for \"%s\" (%d)...", name, key, e->type);
1408
1409 memset(l, 0, sizeof(Ecore_Config_Listener_List));
1410
1411 l->listener = listener;
1412 l->name = name;
1413 l->data = data;
1414 l->tag = tag;
1415 l->next = e->listeners;
1416 e->listeners = l;
1417
1418 if (e->type != ECORE_CONFIG_NIL) /* call right on creation if prop exists and has val */
1419 listener(key, e->type, tag, data);
1420
1421 return ECORE_CONFIG_ERR_SUCC;
1422}
1423
1424/**
1425 * Removes a listener callback.
1426 * @param name Name of the callback to remove.
1427 * @param key The property key the callback is listening to.
1428 * @param listener The callback function to remove.
1429 * @return @c ECORE_CONFIG_ERR_SUCC if successful in removing the callback.
1430 * If no callback matches the given parameters, then
1431 * @c ECORE_CONFIG_ERR_NOTFOUND is returned. If @c NULL is passed
1432 * for the key pointer, @c ECORE_CONFIG_ERR_NODATA is returned.
1433 * @ingroup Ecore_Config_Listeners_Group
1434 */
1435EAPI int
1436ecore_config_deaf(const char *name, const char *key,
1437 Ecore_Config_Listener listener)
1438{
1439 Ecore_Config_Prop *e;
1440 Ecore_Config_Listener_List *l, *p;
1441 int ret;
1442
1443 ret = ECORE_CONFIG_ERR_NOTFOUND;
1444
1445 if (!key)
1446 return ECORE_CONFIG_ERR_NODATA;
1447
1448 if (!(e = ecore_config_get(key)))
1449 return ECORE_CONFIG_ERR_NOTFOUND;
1450
1451 for (p = NULL, l = e->listeners; l; p = l)
1452 {
1453 Ecore_Config_Listener_List *nl;
1454
1455 nl = l->next;
1456 if ((name && !strcmp(l->name, name)) || (l->listener == listener))
1457 {
1458 ret = ECORE_CONFIG_ERR_SUCC;
1459 if (!p)
1460 e->listeners = e->listeners->next;
1461 else
1462 p->next = l->next;
1463 memset(l, 0, sizeof(Ecore_Config_Listener));
1464 free(l);
1465 }
1466 l = nl;
1467 }
1468
1469 return ret;
1470}
1471
1472/**
1473 * Locates the first configuration bundle on the given server.
1474 * @param srv The configuration server.
1475 * @return Pointer to the first configuration bundle.
1476 */
1477EAPI Ecore_Config_Bundle *
1478ecore_config_bundle_1st_get(Ecore_Config_Server * srv)
1479{ /* anchor: global, but read-only */
1480 return srv->bundles;
1481}
1482
1483/**
1484 * Locates the configuration bundle after the given one.
1485 * @param ns The configuration bundle.
1486 * @return The next configuration bundle.
1487 */
1488EAPI Ecore_Config_Bundle *
1489ecore_config_bundle_next_get(Ecore_Config_Bundle * ns)
1490{
1491 return ns ? ns->next : NULL;
1492}
1493
1494/**
1495 * Locates a configuration bundle on a configuration server based on its serial
1496 * number.
1497 * @param srv The configuration server.
1498 * @param serial Serial number.
1499 * @return The configuration bundle with the given serial number.
1500 */
1501EAPI Ecore_Config_Bundle *
1502ecore_config_bundle_by_serial_get(Ecore_Config_Server * srv, long serial)
1503{
1504 Ecore_Config_Bundle *eb;
1505
1506 eb = srv->bundles;
1507
1508 if (serial < 0)
1509 return NULL;
1510 else if (serial == 0)
1511 {
1512 Ecore_Config_Bundle *r = eb;
1513
1514 return r;
1515 }
1516
1517 while (eb)
1518 {
1519 if (eb->serial == serial)
1520 return eb;
1521 eb = eb->next;
1522 }
1523 return NULL;
1524}
1525
1526/**
1527 * Gets the Ecore_Config_Bundle with the given identifier from the given
1528 * server.
1529 * @param srv The configuration server.
1530 * @param label The bundle's identifier string.
1531 * @return The bundle with the given identifier string, or @c NULL if it
1532 * could not be found.
1533 */
1534EAPI Ecore_Config_Bundle *
1535ecore_config_bundle_by_label_get(Ecore_Config_Server * srv, const char *label)
1536{
1537 Ecore_Config_Bundle *ns;
1538
1539 ns = srv->bundles;
1540
1541 while (ns)
1542 {
1543 if (ns->identifier && !strcmp(ns->identifier, label))
1544 return ns;
1545 ns = ns->next;
1546 }
1547 return NULL;
1548}
1549
1550/**
1551 * Retrieves the bundle's serial number.
1552 * @param ns The configuration bundle.
1553 * @return The bundle's identifier string, or -1 if ns is @c NULL.
1554 */
1555EAPI long
1556ecore_config_bundle_serial_get(Ecore_Config_Bundle * ns)
1557{
1558 return ns ? ns->serial : -1;
1559}
1560
1561/**
1562 * Retrieves the bundle's identifier.
1563 * @param ns The configuration bundle.
1564 * @return The bundle's identifer string.
1565 */
1566EAPI char *
1567ecore_config_bundle_label_get(Ecore_Config_Bundle * ns)
1568{
1569 return ns ? ns->identifier : NULL;
1570}
1571
1572/**
1573 * Creates a new Ecore_Config_Bundle.
1574 * @param srv Config server.
1575 * @param identifier Identifier string for the new bundle.
1576 * @return A pointer to a new Ecore_Config_Bundle. @c NULL is returned if the
1577 * structure couldn't be allocated.
1578 */
1579EAPI Ecore_Config_Bundle *
1580ecore_config_bundle_new(Ecore_Config_Server * srv, const char *identifier)
1581{
1582 Ecore_Config_Bundle *t;
1583 static long ss;
1584
1585 ss = 0; /* bundle unique serial */
1586
1587 if ((t = malloc(sizeof(Ecore_Config_Bundle))))
1588 {
1589 memset(t, 0, sizeof(Ecore_Config_Bundle));
1590
1591 t->identifier = (char *)identifier;
1592 t->serial = ++ss;
1593 t->owner = srv->name;
1594 t->next = srv->bundles;
1595 srv->bundles = t;
1596 }
1597 return t;
1598}
1599
1600static Ecore_Config_Server *
1601do_init(const char *name)
1602{
1603 return _ecore_config_ipc_init(name);
1604}
1605
1606static Ecore_Config_Server *
1607ecore_config_init_local(const char *name)
1608{
1609 char *p;
1610 char *buf;
1611
1612 if ((p = getenv("HOME")))
1613 { /* debug-only ### FIXME */
1614 if (!(buf = malloc(PATH_MAX * sizeof(char))))
1615 return NULL;
1616 snprintf(buf, PATH_MAX, "%s/.ecore/%s/.global", p, name);
1617 unlink(buf);
1618
1619 free(buf);
1620 }
1621
1622 return do_init(name);
1623}
1624
1625static Ecore_Config_Server *
1626ecore_config_init_global(const char *name)
1627{
1628 char *p;
1629 int global;
1630 char *buf;
1631
1632 if ((p = getenv("HOME")))
1633 { /* debug-only ### FIXME */
1634 if (!(buf = malloc(PATH_MAX * sizeof(char))))
1635 return NULL;
1636 snprintf(buf, PATH_MAX, "%s/.ecore/%s/.global", p, name);
1637 global = creat(buf, S_IRWXU);
1638
1639 if (global >= 0)
1640 close(global);
1641
1642 free(buf);
1643 }
1644
1645 return do_init(name);
1646}
1647
1648/**
1649 * @defgroup Ecore_Config_App_Lib_Group Ecore Config App Library Functions
1650 *
1651 * Functions that are used to start up and shutdown the Enlightened
1652 * Property Library when used directly by an application.
1653 */
1654
1655/**
1656 * Initializes the Enlightened Property Library.
1657 *
1658 * Either this function or @ref ecore_config_system_init must be run
1659 * before any other function in the Enlightened Property Library, even
1660 * if you have run @ref ecore_init . The name given is used to
1661 * determine the default configuration to load.
1662 *
1663 * @param name Application name
1664 * @return @c ECORE_CONFIG_ERR_SUCC if the library is successfully set up.
1665 * @c ECORE_CONFIG_ERR_FAIL otherwise.
1666 * @ingroup Ecore_Config_App_Lib_Group
1667 */
1668EAPI int
1669ecore_config_init(const char *name)
1670{
1671 char *path;
1672 Ecore_Config_Prop *list;
1673 _ecore_config_log_dom = eina_log_domain_register
1674 ("ecore_config", ECORE_CONFIG_DEFAULT_LOG_COLOR);
1675 if(_ecore_config_log_dom < 0)
1676 {
1677 EINA_LOG_ERR("Impossible to create a log domain for the Ecore config module.");
1678 return -1;
1679 }
1680 _ecore_config_system_init_no_load();
1681
1682 __ecore_config_app_name = strdup(name);
1683 __ecore_config_server_local = ecore_config_init_local(name);
1684 if (!__ecore_config_server_local)
1685 return ECORE_CONFIG_ERR_FAIL;
1686
1687 list = __ecore_config_bundle_local->data;
1688 free( __ecore_config_bundle_local );
1689 __ecore_config_bundle_local =
1690 ecore_config_bundle_new(__ecore_config_server_local, "config");
1691 __ecore_config_bundle_local->data = list;
1692
1693 path = ecore_config_theme_default_path_get();
1694 ecore_config_string_default("/e/themes/search_path", path);
1695 if (path)
1696 free(path);
1697
1698 list = ecore_config_get("/e/themes/search_path");
1699 if (list)
1700 {
1701 list->flags |= ECORE_CONFIG_FLAG_SYSTEM;
1702 list->flags &= ~ECORE_CONFIG_FLAG_MODIFIED;
1703 }
1704
1705 return _ecore_config_system_load();
1706}
1707
1708/**
1709 * Frees memory and shuts down the library for an application.
1710 * @return @c ECORE_CONFIG_ERR_IGNORED .
1711 * @ingroup Ecore_Config_App_Lib_Group
1712 */
1713EAPI int
1714ecore_config_shutdown(void)
1715{
1716 return ecore_config_system_shutdown();
1717}
1718
1719/**
1720 * @defgroup Ecore_Config_Lib_Lib_Group Ecore Config Library Functions
1721 *
1722 * Functions that are used to start up and shutdown the Enlightened
1723 * Property Library when used directly by an application.
1724 */
1725
1726/**
1727 * Initializes the Enlightened Property Library.
1728 *
1729 * This function is meant to be run from other programming libraries.
1730 * It should not be called from applications.
1731 *
1732 * This function (or @ref ecore_config_init )
1733 * must be run before any other function in the
1734 * Enlightened Property Library, even if you have run @ref ecore_init .
1735 *
1736 * @return @c ECORE_CONFIG_ERR_SUCC if the library is successfully set up.
1737 * @c ECORE_CONFIG_ERR_FAIL otherwise.
1738 * @ingroup Ecore_Config_Lib_Lib_Group
1739 */
1740EAPI int
1741ecore_config_system_init(void)
1742{
1743 _ecore_config_system_init_no_load();
1744 return _ecore_config_system_load();
1745}
1746
1747static int
1748_ecore_config_system_init_no_load(void)
1749{
1750 char *p;
1751
1752 __ecore_config_system_init++;
1753 if (__ecore_config_system_init > 1)
1754 return ECORE_CONFIG_ERR_IGNORED;
1755
1756 DEBUG = -1;
1757 if ((p = getenv("ECORE_CONFIG_DEBUG")) && p[0] != 0)
1758 {
1759 DEBUG = atoi(p);
1760 }
1761
1762 __ecore_config_server_global =
1763 ecore_config_init_global(ECORE_CONFIG_GLOBAL_ID);
1764 if (!__ecore_config_server_global)
1765 return ECORE_CONFIG_ERR_FAIL;
1766
1767 __ecore_config_bundle_local =
1768 ecore_config_bundle_new(__ecore_config_server_global, "system");
1769
1770 /* set up a simple default path */
1771 ecore_config_string_default("/e/themes/search_path", PACKAGE_DATA_DIR "../ewl/themes");
1772
1773 return ECORE_CONFIG_ERR_SUCC;
1774}
1775
1776
1777static int
1778_ecore_config_system_load(void)
1779{
1780 char *buf, *p;
1781 Ecore_Config_Prop *sys;
1782
1783 if (__ecore_config_system_init != 1)
1784 return ECORE_CONFIG_ERR_FAIL;
1785
1786 if ((p = getenv("HOME")))
1787 { /* debug-only ### FIXME */
1788 if ((buf = malloc(PATH_MAX * sizeof(char))))
1789 {
1790 snprintf(buf, PATH_MAX, "%s/.e/config.eet", p);
1791 if (ecore_config_file_load(buf) != 0) {
1792 /* even if this file (system.eet) doesn't exist we can
1793 * continue without it as it isn't striclty necessary.
1794 */
1795 ecore_config_file_load(PACKAGE_DATA_DIR "/system.eet");
1796 }
1797 sys = __ecore_config_bundle_local->data;
1798 while (sys)
1799 {
1800 /* unmark it modified - modification will mean it has been overridden */
1801 sys->flags &= ~ECORE_CONFIG_FLAG_MODIFIED;
1802 /* mark as system so that examine can hide them */
1803 sys->flags |= ECORE_CONFIG_FLAG_SYSTEM;
1804 sys = sys->next;
1805 }
1806 }
1807 free(buf);
1808 }
1809
1810 return ECORE_CONFIG_ERR_SUCC;
1811}
1812
1813
1814/**
1815 * Frees memory and shuts down the library for other programming libraries.
1816 * @return @c ECORE_CONFIG_ERR_IGNORED
1817 * @ingroup Ecore_Config_Lib_Lib_Group
1818 */
1819EAPI int
1820ecore_config_system_shutdown(void)
1821{
1822 int ret;
1823
1824 __ecore_config_system_init--;
1825 if (__ecore_config_system_init > 0)
1826 return ECORE_CONFIG_ERR_IGNORED;
1827
1828 ret = _ecore_config_ipc_exit();
1829 if (__ecore_config_app_name)
1830 free(__ecore_config_app_name);
1831 while(__ecore_config_bundle_local->data)
1832 ecore_config_dst(__ecore_config_bundle_local->data);
1833 free(__ecore_config_bundle_local);
1834 free(__ecore_config_server_local);
1835 free(__ecore_config_server_global);
1836 eina_log_domain_unregister(_ecore_config_log_dom);
1837 _ecore_config_log_dom = -1;
1838 return ret;
1839}
1840
1841static inline void *
1842__ecore_argb_to_long(int a, int r, int g, int b, long *v)
1843{
1844 *v = ((a << 24) & 0xff000000 )
1845 | ((r << 16) & 0xff0000 )
1846 | ((g << 8) & 0xff00 )
1847 | ( b & 0xff );
1848
1849 return v;
1850}
1851
1852static inline void *
1853__ecore_argbstr_to_long(const char *argb, long *v)
1854{
1855 char *l = NULL;
1856
1857 // convert hexadecimal string #..., #0x..., 0x..., ... to long
1858 if(*argb == '#')
1859 argb++;
1860 *v = (long)strtoul( argb, &l, 16);
1861
1862 if(*l)
1863 {
1864 ERR("ecore_config_val: value \"%s\" not a valid hexadecimal RGB value?", argb);
1865 return NULL;
1866 }
1867
1868 return v;
1869}
1870
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_db.c b/libraries/ecore/src/lib/ecore_config/ecore_config_db.c
new file mode 100644
index 0000000..6238958
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_db.c
@@ -0,0 +1,296 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include <limits.h>
9
10#include <sys/param.h>
11#include <sys/types.h>
12#include <sys/stat.h>
13#include <unistd.h>
14#include <locale.h>
15
16#include <Eet.h>
17
18#include "Ecore_Config.h"
19#include "ecore_config_private.h"
20#include "ecore_config_util.h"
21
22struct _Ecore_Config_DB_File
23{
24 Eet_File *ef;
25};
26
27Ecore_Config_DB_File *
28_ecore_config_db_open_read(const char *file)
29{
30 Eet_File *ef;
31 Ecore_Config_DB_File *db;
32
33 eet_init();
34 db = malloc(sizeof(Ecore_Config_DB_File));
35 if (!db) return NULL;
36 ef = eet_open((char*)file, EET_FILE_MODE_READ);
37 if (!ef)
38 {
39 free(db);
40 return NULL;
41 }
42 db->ef = ef;
43 return db;
44}
45
46Ecore_Config_DB_File *
47_ecore_config_db_open_write(const char *file)
48{
49 Eet_File *ef;
50 Ecore_Config_DB_File *db;
51
52 eet_init();
53 db = malloc(sizeof(Ecore_Config_DB_File));
54 if (!db) return NULL;
55 ef = eet_open((char*)file, EET_FILE_MODE_WRITE);
56 if (!ef)
57 {
58 free(db);
59 return NULL;
60 }
61 db->ef = ef;
62 return db;
63}
64
65void
66_ecore_config_db_close(Ecore_Config_DB_File *db)
67{
68 eet_close(db->ef);
69 free(db);
70 eet_shutdown();
71}
72
73char **
74_ecore_config_db_keys_get(Ecore_Config_DB_File *db, int *num_ret)
75{
76 char **keys;
77 int key_count;
78 int i;
79
80 keys = eet_list(db->ef, (char*)"*", &key_count);
81 if (!keys)
82 {
83 *num_ret = 0;
84 return NULL;
85 }
86 /* make keys freeable - this is safe to do */
87 for (i = 0; i < key_count; i++) keys[i] = strdup(keys[i]);
88 *num_ret = key_count;
89 return keys;
90}
91
92Ecore_Config_Type
93_ecore_config_db_key_type_get(Ecore_Config_DB_File *db, const char *key)
94{
95 char *data;
96 int size;
97
98 data = eet_read(db->ef, (char*)key, &size);
99 if (data)
100 {
101 if (size <= 2)
102 {
103 free(data);
104 return ECORE_CONFIG_NIL;
105 }
106 if (data[size - 1] != 0)
107 {
108 free(data);
109 return ECORE_CONFIG_NIL;
110 }
111 return (Ecore_Config_Type) data[0];
112 }
113 return ECORE_CONFIG_NIL;
114}
115
116int
117_ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
118{
119 char *data, *value;
120 int size;
121 Ecore_Config_Type type;
122
123 data = eet_read(db->ef, (char*)key, &size);
124 if (data)
125 {
126 int l;
127 char *prev_locale;
128
129 if (size <= 2)
130 {
131 free(data);
132 return 0;
133 }
134 if (data[size - 1] != 0)
135 {
136 free(data);
137 return 0;
138 }
139 /* "type" NIL 1242 NIL */
140 l = strlen(data);
141 if (l >= (size - 1))
142 {
143 free(data);
144 return 0;
145 }
146
147 type = data[0];
148 value = data + l + 1;
149
150 switch (type)
151 {
152 case ECORE_CONFIG_INT:
153 case ECORE_CONFIG_BLN:
154 {
155 int tmp;
156 prev_locale = setlocale(LC_NUMERIC, "C");
157 tmp = atoi(value);
158 if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
159
160 ecore_config_typed_set(key, (void *)&tmp, type);
161 break;
162 }
163 case ECORE_CONFIG_FLT:
164 {
165 float tmp;
166 prev_locale = setlocale(LC_NUMERIC, "C");
167 tmp = atof(value);
168 if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
169
170 ecore_config_typed_set(key, (void *)&tmp, type);
171 break;
172 }
173 case ECORE_CONFIG_RGB:
174 ecore_config_argbstr_set(key, value);
175 break;
176 case ECORE_CONFIG_STR:
177 case ECORE_CONFIG_THM:
178 ecore_config_typed_set(key, (void *)value, type);
179 break;
180 case ECORE_CONFIG_SCT:
181 INF("loading struct %s", key);
182 break;
183 default:
184 WRN("Type %d not handled", type);
185 }
186 free(data);
187 return 1;
188 }
189 return 0;
190}
191
192/*
193void *
194_ecore_config_db_key_data_get(Ecore_Config_DB_File *db, const char *key, int *size_ret)
195{
196 char *data;
197 int size;
198
199 data = eet_read(db->ef, (char*)key, &size);
200 if (data)
201 {
202 int l;
203 char *dat;
204
205 if (size <= 2)
206 {
207 free(data);
208 return NULL;
209 }
210 if (data[size - 1] != 0)
211 {
212 free(data);
213 return NULL;
214 }
215 * "type" NIL data_goes_here NIL *
216 l = strlen(data);
217 if (l >= (size - 1))
218 {
219 free(data);
220 return NULL;
221 }
222 dat = malloc(size - (l + 2));
223 memcpy(dat, data + l + 1, size - (l + 2));
224 free(data);
225 *size_ret = size - (l + 2);
226 return dat;
227 }
228 return NULL;
229}*/
230
231void
232_ecore_config_db_write(Ecore_Config_DB_File *db, Ecore_Config_Prop *e)
233{
234 char *prev_locale= NULL;
235 char *val = NULL;
236 char *r = NULL;
237 int num;
238
239 prev_locale = setlocale(LC_NUMERIC, "C");
240
241 switch (e->type)
242 {
243 case ECORE_CONFIG_INT:
244 esprintf(&val, "%i", _ecore_config_int_get(e));
245 break;
246 case ECORE_CONFIG_BLN:
247 esprintf(&val, "%i", _ecore_config_boolean_get(e));
248 break;
249 case ECORE_CONFIG_FLT:
250 esprintf(&val, "%16.16f", _ecore_config_float_get(e));
251 break;
252 case ECORE_CONFIG_STR:
253 val = _ecore_config_string_get(e);
254 break;
255 case ECORE_CONFIG_THM:
256 val = _ecore_config_theme_get(e);
257 break;
258 case ECORE_CONFIG_RGB:
259 val = _ecore_config_argbstr_get(e);
260 break;
261 default:
262 WRN("Type %d not handled", e->type);
263 }
264
265 if (prev_locale)
266 {
267 setlocale(LC_NUMERIC, prev_locale);
268 }
269
270 if(val)
271 {
272 num = esprintf(&r, "%c%c%s%c", (char) e->type, 0, val, 0);
273 if(num)
274 eet_write(db->ef, e->key, r, num, 1);
275 free(r);
276 }
277
278 free(val);
279}
280/*
281void
282_ecore_config_db_key_data_set(Ecore_Config_DB_File *db, const char *key, void *data, int data_size)
283{
284 char *buf;
285 int num;
286
287 num = 1 + 1 + data_size + 1;
288 buf = malloc(num);
289 if (!buf) return;
290 buf[0] = (char) ECORE_CONFIG_BIN;
291 buf[1] = 0;
292 memcpy(buf + 2, data, data_size);
293 buf[num - 1] = 0;
294 eet_write(db->ef, (char*)key, buf, num, 1);
295 free(buf);
296}*/
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_extra.c b/libraries/ecore/src/lib/ecore_config/ecore_config_extra.c
new file mode 100644
index 0000000..a134952
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_extra.c
@@ -0,0 +1,803 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6#include <stdio.h>
7#include <stdlib.h>
8
9#include <sys/types.h>
10#include <sys/stat.h>
11
12#include "Ecore_Config.h"
13#include "Ecore.h"
14#include "ecore_config_private.h"
15typedef struct __Ecore_Config_Arg_Callback _Ecore_Config_Arg_Callback;
16struct __Ecore_Config_Arg_Callback
17{
18 char short_opt;
19 char *long_opt;
20 char *description;
21 void *data;
22 void (*func)(char *val, void *data);
23 Ecore_Config_Type type;
24 _Ecore_Config_Arg_Callback *next;
25};
26
27char *__ecore_config_app_description;
28_Ecore_Config_Arg_Callback *_ecore_config_arg_callbacks;
29
30/* shorthand prop setup code to make client apps a little smaller ;) */
31
32/**
33 * Creates a new property, if it does not already exist, and sets its
34 * attributes to those given.
35 *
36 * The type of the property is guessed from the key and the value
37 * given.
38 *
39 * @param key The property key.
40 * @param val Pointer to default value of key.
41 * @param short_opt Short option used to set the property from command
42 * line.
43 * @param long_opt Long option used to set the property from command line.
44 * @param desc String description of property.
45 * @return @c ECORE_CONFIG_ERR_SUCC on success.
46 * @ingroup Ecore_Config_Create_Group
47 */
48int
49ecore_config_create(const char *key, void *val, char short_opt, char *long_opt,
50 char *desc)
51{
52 int type = ecore_config_type_guess(key, val);
53
54 return ecore_config_typed_create(key, val, type, short_opt, long_opt, desc);
55}
56
57/**
58 * Creates a new property, if it does not already exist, and sets its
59 * attributes to those given.
60 * @param key The property key.
61 * @param val Pointer to default value of key.
62 * @param type Type of the property.
63 * @param short_opt Short option used to set the property from
64 * command line.
65 * @param long_opt Long option used to set the property from command line.
66 * @param desc String description of property.
67 * @return @c ECORE_CONFIG_ERR_SUCC on success.
68 * @ingroup Ecore_Config_Create_Group
69 */
70int
71ecore_config_typed_create(const char *key, void *val, int type, char short_opt,
72 char *long_opt, char *desc)
73{
74 int ret;
75
76 if ((ret =
77 ecore_config_typed_default(key, val, type)) != ECORE_CONFIG_ERR_SUCC)
78 return ret;
79 if ((ret =
80 ecore_config_short_opt_set(key, short_opt)) != ECORE_CONFIG_ERR_SUCC)
81 return ret;
82 if ((ret =
83 ecore_config_long_opt_set(key, long_opt)) != ECORE_CONFIG_ERR_SUCC)
84 return ret;
85 ret = ecore_config_describe(key, desc);
86 return ret;
87}
88
89/**
90 * Creates a new boolean property, if it does not already exist, and sets its
91 * attributes to those given.
92 * @param key The property key.
93 * @param val Default boolean value of key.
94 * @param short_opt Short option used to set the property from command
95 * line.
96 * @param long_opt Long option used to set the property from command line.
97 * @param desc String description of property.
98 * @return @c ECORE_CONFIG_ERR_SUCC on success.
99 * @ingroup Ecore_Config_Create_Group
100 */
101int
102ecore_config_boolean_create(const char *key, int val, char short_opt,
103 char *long_opt, char *desc)
104{
105 return
106 ecore_config_typed_create(key, (void *)&val, ECORE_CONFIG_BLN, short_opt, long_opt,
107 desc);
108}
109
110/**
111 * Creates a new integer property, if it does not already exist, and sets its
112 * attributes to those given.
113 * @param key The property key.
114 * @param val Default integer value of key.
115 * @param short_opt Short option used to set the property from command
116 * line.
117 * @param long_opt Long option used to set the property from command line.
118 * @param desc String description of property.
119 * @return @c ECORE_CONFIG_ERR_SUCC on success.
120 * @ingroup Ecore_Config_Create_Group
121 */
122int
123ecore_config_int_create(const char *key, int val, char short_opt,
124 char *long_opt, char *desc)
125{
126 return
127 ecore_config_typed_create(key, (void *)&val, ECORE_CONFIG_INT, short_opt, long_opt,
128 desc);
129}
130
131/**
132 * Creates a new integer property, if it does not already exist, and sets its
133 * attributes to those given.
134 * @param key The property key.
135 * @param val Default integer value of key.
136 * @param low Lowest valid integer value for the property.
137 * @param high Highest valid integer value for the property.
138 * @param step Increment value for the property.
139 * @param short_opt Short option used to set the property from command
140 * line.
141 * @param long_opt Long option used to set the property from command line.
142 * @param desc String description of property.
143 * @return @c ECORE_CONFIG_ERR_SUCC on success.
144 * @ingroup Ecore_Config_Create_Group
145 */
146int
147ecore_config_int_create_bound(const char *key, int val, int low, int high,
148 int step, char short_opt, char *long_opt,
149 char *desc)
150{
151 Ecore_Config_Prop *e;
152 int ret;
153
154 ret =
155 ecore_config_typed_create(key, (void *)&val, ECORE_CONFIG_INT, short_opt, long_opt,
156 desc);
157 if (ret != ECORE_CONFIG_ERR_SUCC)
158 return ret;
159 e = ecore_config_get(key);
160 if (e)
161 {
162 e->step = step;
163 e->flags |= ECORE_CONFIG_FLAG_BOUNDS;
164 e->lo = low;
165 e->hi = high;
166 ecore_config_bound(e);
167 }
168 return ret;
169}
170
171/**
172 * Creates a new string property, if it does not already exist, and sets its
173 * attributes to those given.
174 * @param key The property key.
175 * @param val Default value of key.
176 * @param short_opt Short option used to set the property from command
177 * line.
178 * @param long_opt Long option used to set the property from command line.
179 * @param desc String description of property.
180 * @return @c ECORE_CONFIG_ERR_SUCC on success.
181 * @ingroup Ecore_Config_Create_Group
182 */
183int
184ecore_config_string_create(const char *key, char *val, char short_opt,
185 char *long_opt, char *desc)
186{
187 return
188 ecore_config_typed_create(key, (void *)val, ECORE_CONFIG_STR, short_opt, long_opt,
189 desc);
190}
191
192/**
193 * Creates a new float property, if it does not already exist, and sets its
194 * attributes to those given.
195 * @param key The property key.
196 * @param val Default float value of key.
197 * @param short_opt Short option used to set the property from command
198 * line.
199 * @param long_opt Long option used to set the property from command line.
200 * @param desc String description of property.
201 * @return @c ECORE_CONFIG_ERR_SUCC on success.
202 * @ingroup Ecore_Config_Create_Group
203 */
204int
205ecore_config_float_create(const char *key, float val, char short_opt,
206 char *long_opt, char *desc)
207{
208 return
209 ecore_config_typed_create(key, (void *)&val, ECORE_CONFIG_FLT, short_opt, long_opt,
210 desc);
211}
212
213/**
214 * Creates a new float property, if it does not already exist, and sets its
215 * attributes to those given.
216 * @param key The property key.
217 * @param val Default float value of key.
218 * @param low Lowest valid float value for the property.
219 * @param high Highest valid float value for the property.
220 * @param step Increment value for the property.
221 * @param short_opt Short option used to set the property from command
222 * line.
223 * @param long_opt Long option used to set the property from command line.
224 * @param desc String description of property.
225 * @return @c ECORE_CONFIG_ERR_SUCC on success.
226 * @ingroup Ecore_Config_Create_Group
227 */
228int
229ecore_config_float_create_bound(const char *key, float val, float low,
230 float high, float step, char short_opt,
231 char *long_opt, char *desc)
232{
233 Ecore_Config_Prop *e;
234 int ret;
235
236 ret =
237 ecore_config_typed_create(key, (void *)&val, ECORE_CONFIG_FLT, short_opt, long_opt,
238 desc);
239 e = ecore_config_get(key);
240 if (e)
241 {
242 e->step = (int)(step * ECORE_CONFIG_FLOAT_PRECISION);
243 e->flags |= ECORE_CONFIG_FLAG_BOUNDS;
244 e->lo = (int)(low * ECORE_CONFIG_FLOAT_PRECISION);
245 e->hi = (int)(high * ECORE_CONFIG_FLOAT_PRECISION);
246 ecore_config_bound(e);
247 }
248 return ret;
249}
250
251/**
252 * Creates a new color property, if it does not already exist, and sets its
253 * attributes to those given.
254 * @param key The property key.
255 * @param val Default color value of key, as a hexadecimal string.
256 * @param short_opt Short option used to set the property from command
257 * line.
258 * @param long_opt Long option used to set the property from command line.
259 * @param desc String description of property.
260 * @return @c ECORE_CONFIG_ERR_SUCC on success.
261 * @ingroup Ecore_Config_Create_Group
262 */
263int
264ecore_config_argb_create(const char *key, char *val, char short_opt,
265 char *long_opt, char *desc)
266{
267 return
268 ecore_config_typed_create(key, (void *)val, ECORE_CONFIG_RGB, short_opt, long_opt,
269 desc);
270}
271
272/**
273 * Creates a new theme property, if it does not already exist, and sets its
274 * attributes to those given.
275 * @param key The property key.
276 * @param val Default theme name for the property.
277 * @param short_opt Short option used to set the property from command
278 * line.
279 * @param long_opt Long option used to set the property from command line.
280 * @param desc String description of property.
281 * @return @c ECORE_CONFIG_ERR_SUCC on success.
282 * @ingroup Ecore_Config_Create_Group
283 */
284int
285ecore_config_theme_create(const char *key, char *val, char short_opt,
286 char *long_opt, char *desc)
287{
288 return
289 ecore_config_typed_create(key, (void *)val, ECORE_CONFIG_THM, short_opt, long_opt,
290 desc);
291}
292
293/* this should only be built if evas is present */
294
295/**
296 * Calls evas_font_path_append on @p evas for each of the font names stored
297 * in the property "/e/font/path".
298 * @param evas Evas object to append the font names to.
299 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_NODATA
300 * is returned if the property has not been set.
301 */
302int
303ecore_config_evas_font_path_apply(Evas * evas)
304{
305 char *font_path, *font_path_tmp, *ptr, *end;
306
307 font_path = ecore_config_string_get("/e/font/path");
308
309 if (!font_path)
310 return ECORE_CONFIG_ERR_NODATA;
311 ptr = font_path;
312 end = font_path + strlen(font_path);
313 font_path_tmp = font_path;
314 while (ptr && ptr < end)
315 {
316 while (*ptr != '|' && ptr < end)
317 ptr++;
318 if (ptr < end)
319 *ptr = '\0';
320
321 evas_font_path_append(evas, font_path_tmp);
322 ptr++;
323 font_path_tmp = ptr;
324 }
325
326 free(font_path);
327
328 return ECORE_CONFIG_ERR_SUCC;
329}
330
331/**
332 * Retrieves the default theme search path.
333 *
334 * @return The default theme search path.
335 */
336char *
337ecore_config_theme_default_path_get(void)
338{
339 char *path, *home;
340 int len;
341
342 home = getenv("HOME");
343 len = strlen(PACKAGE_DATA_DIR "/../") + strlen(__ecore_config_app_name) +
344 strlen("/themes/") + 1;
345 if (home)
346 len += strlen(home) + strlen("/.e/apps/") +
347 strlen(__ecore_config_app_name) +
348 strlen("/themes/|"); /* no \0, as that is above */
349
350 if (!(path = malloc(len)))
351 return NULL;
352
353 *path = '\0';
354 if (home)
355 {
356 strcat(path, home);
357 strcat(path, "/.e/apps/");
358 strcat(path, __ecore_config_app_name);
359 strcat(path, "/themes/|");
360 }
361 strcat(path, PACKAGE_DATA_DIR "/../");
362 strcat(path, __ecore_config_app_name);
363 strcat(path, "/themes/");
364
365 return path;
366}
367
368/**
369 * Retrieves the search path used to find themes.
370 *
371 * The search path is stored in the property "/e/themes/search_path". If
372 * the property has not been set, the default path used is
373 * "/usr/local/share/<app_name>/themes|~/.e/apps/<app_name>/themes".
374 * See @ref ecore_config_theme_default_path_get for more information about
375 * the default path.
376 *
377 * @return The search path. @c NULL is returned if there is no memory left.
378 */
379char *
380ecore_config_theme_search_path_get(void)
381{
382 char *search_path;
383 search_path = ecore_config_string_get("/e/themes/search_path");
384
385 /* this should no longer be the case, as it is defaulted in init */
386 if (!search_path)
387 {
388 search_path = ecore_config_theme_default_path_get();
389 if (search_path)
390 {
391 ecore_config_string_default("/e/themes/search_path", search_path);
392 free(search_path);
393 }
394 }
395 return search_path;
396}
397
398/**
399 * Adds the given path to the search path used to find themes.
400 *
401 * If the search path is successfully, the new search path will be saved
402 * into the property "/e/themes/search_path". Therefore, this function
403 * should be called @b after @ref ecore_config_load to allow a user to
404 * override the default search path.
405 *
406 * @param path The given
407 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_FAIL
408 * will be returned if @p path already exists in the search path.
409 * @c ECORE_CONFIG_ERR_FAIL is returned if @p path is @c NULL.
410 */
411int
412ecore_config_theme_search_path_append(const char *path)
413{
414 char *search_path, *loc, *new_search_path;
415 int len, search_len;
416 Ecore_Config_Prop *prop;
417
418 if (!path)
419 return ECORE_CONFIG_ERR_NODATA;
420 search_path = ecore_config_theme_search_path_get();
421
422 loc = strstr(search_path, path);
423 len = strlen(path);
424 search_len = strlen(search_path);
425
426 if (!loc || (loc != search_path && *(loc - 1) != '|') ||
427 (loc != (search_path + search_len - len) && *(loc + len - 1) != '|'))
428 {
429 new_search_path = malloc(search_len + len + 2); /* 2 = \0 + | */
430 strcpy(new_search_path, search_path);
431 strncat(new_search_path, "|", 1);
432 strncat(new_search_path, path, len);
433
434 ecore_config_string_set("/e/themes/search_path", new_search_path);
435 prop = ecore_config_get("/e/themes/search_path");
436 if (prop)
437 prop->flags &= ~ECORE_CONFIG_FLAG_MODIFIED;
438
439 free(new_search_path);
440
441 return ECORE_CONFIG_ERR_SUCC;
442 }
443 return ECORE_CONFIG_ERR_FAIL;
444}
445
446/**
447 * Retrieve a theme file's full path.
448 *
449 * The search path for theme files is given by @ref
450 * ecore_config_theme_search_path_get .
451 *
452 * @param name The name of the theme.
453 * @return A full path to the theme on success. @c NULL will be returned
454 * if @p name is @c NULL or no theme matching the given name could
455 * be found.
456 */
457char *
458ecore_config_theme_with_path_from_name_get(char *name)
459{
460 char *search_path, *search_path_tmp, *ptr, *end, *file;
461 struct stat st;
462
463 if (!name)
464 return NULL; /* no theme specified (nor a default) */
465
466 search_path = ecore_config_theme_search_path_get();
467 ptr = search_path;
468 end = search_path + strlen(search_path);
469 search_path_tmp = search_path;
470 while (ptr && ptr < end)
471 {
472 while (*ptr != '|' && ptr < end)
473 ptr++;
474 if (ptr < end)
475 *ptr = '\0';
476
477 file = malloc(strlen(search_path_tmp) + strlen(name) + 6);
478 /* 6 = / + .edj + \0 */
479
480 snprintf(file, strlen(search_path_tmp) + strlen(name) + 6,
481 "%s/%s.edj", search_path_tmp, name);
482
483 if (stat(file, &st) == 0)
484 {
485 free(search_path);
486 return file;
487 }
488 free(file);
489 ptr++;
490 search_path_tmp = ptr;
491 }
492
493 free(search_path);
494
495 return NULL; /* we could not find the theme with that name in search path */
496}
497
498/**
499 * Retrieves the full path to the theme file of the theme stored in the
500 * given property.
501 *
502 * The search path for themes is given by @ref
503 * ecore_config_theme_search_path_get .
504 *
505 * @param key The given property.
506 * @return A full path to the theme on success, or @c NULL on failure.
507 * This function will fail if no key is specified or not theme
508 * matching that given by the property @p key could be found.
509 */
510char *
511ecore_config_theme_with_path_get(const char *key)
512{
513 return
514 ecore_config_theme_with_path_from_name_get(ecore_config_theme_get(key));
515}
516
517static const char *_ecore_config_short_types[] =
518 { " ", "<int> ", "<flt> ", "<str> ", "<rgb> ", "<str> ", "<bool>" };
519
520/**
521 * Prints the property list of the local configuration bundle to output.
522 */
523void
524ecore_config_args_display(void)
525{
526 Ecore_Config_Prop *props;
527 _Ecore_Config_Arg_Callback *callbacks;
528
529 if (__ecore_config_app_description)
530 ERR("%s\n\n", __ecore_config_app_description);
531 ERR("Supported Options:");
532 ERR(" -h, --help\t Print this text");
533 if (!__ecore_config_bundle_local)
534 return;
535 props = __ecore_config_bundle_local->data;
536 while (props)
537 {
538 /* if it is a system prop, or cannot be set on command line hide it */
539 if (props->flags & ECORE_CONFIG_FLAG_SYSTEM || (!props->short_opt && !props->long_opt))
540 {
541 props = props->next;
542 continue;
543 }
544 INF(" %c%c%c --%s\t%s %s", props->short_opt ? '-' : ' ',
545 props->short_opt ? props->short_opt : ' ',
546 props->short_opt ? ',' : ' ',
547 props->long_opt ? props->long_opt : props->key,
548 _ecore_config_short_types[props->type],
549 props->description ? props->description :
550 "(no description available)");
551
552 props = props->next;
553 }
554 callbacks = _ecore_config_arg_callbacks;
555 while (callbacks)
556 {
557 INF(" %c%c%c --%s\t%s %s", callbacks->short_opt ? '-' : ' ',
558 callbacks->short_opt ? callbacks->short_opt : ' ',
559 callbacks->short_opt ? ',' : ' ',
560 callbacks->long_opt ? callbacks->long_opt : "",
561 _ecore_config_short_types[callbacks->type],
562 callbacks->description ? callbacks->description :
563 "(no description available)");
564
565 callbacks = callbacks->next;
566 }
567}
568
569static int
570ecore_config_parse_set(Ecore_Config_Prop * prop, char *arg, char *opt,
571 char opt2)
572{
573 if (!arg)
574 {
575 if (opt)
576 ERR("Missing expected argument for option --%s", opt);
577 else
578 ERR("Missing expected argument for option -%c", opt2);
579 return ECORE_CONFIG_PARSE_EXIT;
580 }
581 else
582 {
583 ecore_config_set(prop->key, arg);
584 prop->flags |= ECORE_CONFIG_FLAG_CMDLN;
585 }
586 return ECORE_CONFIG_PARSE_CONTINUE;
587}
588
589static void
590ecore_config_args_callback_add(char short_opt, char *long_opt, char *desc,
591 void (*func)(char *val, void *data),
592 void *data, Ecore_Config_Type type) {
593 _Ecore_Config_Arg_Callback *new_cb;
594
595 new_cb = malloc(sizeof(_Ecore_Config_Arg_Callback));
596 new_cb->short_opt = short_opt;
597 if (long_opt)
598 new_cb->long_opt = strdup(long_opt);
599 if (desc)
600 new_cb->description = strdup(desc);
601 new_cb->data = data;
602 new_cb->func = func;
603 new_cb->type = type;
604
605 new_cb->next = _ecore_config_arg_callbacks;
606 _ecore_config_arg_callbacks = new_cb;
607}
608
609void
610ecore_config_args_callback_str_add(char short_opt, char *long_opt, char *desc,
611 void (*func)(char *val, void *data),
612 void *data) {
613 ecore_config_args_callback_add(short_opt, long_opt, desc, func, data, ECORE_CONFIG_STR);
614}
615
616void
617ecore_config_args_callback_noarg_add(char short_opt, char *long_opt, char *desc,
618 void (*func)(char *val, void *data),
619 void *data) {
620 ecore_config_args_callback_add(short_opt, long_opt, desc, func, data, ECORE_CONFIG_NIL);
621}
622
623/**
624 * Parse the arguments set by @ref ecore_app_args_set and set properties
625 * accordingly.
626 *
627 * @return @c ECORE_CONFIG_PARSE_CONTINUE if successful.
628 * @c ECORE_CONFIG_PARSE_EXIT is returned if an unrecognised option
629 * is found. @c ECORE_CONFIG_PARSE_HELP is returned if help was
630 * displayed.
631 */
632int
633ecore_config_args_parse(void)
634{
635 int argc;
636 char **argv;
637 int nextarg, next_short_opt, found, ret;
638 char *arg;
639 char *long_opt, short_opt;
640 Ecore_Config_Prop *prop;
641 _Ecore_Config_Arg_Callback *callback;
642
643 ecore_app_args_get(&argc, &argv);
644 nextarg = 1;
645 while (nextarg < argc)
646 {
647 arg = argv[nextarg];
648
649 if (*arg != '-')
650 {
651 ERR("Unexpected attribute \"%s\"", arg);
652 nextarg++;
653 continue;
654 }
655
656 next_short_opt = 1;
657 short_opt = *(arg + next_short_opt);
658
659 if (short_opt == '-')
660 {
661 long_opt = arg + 2;
662
663 if (!strcmp(long_opt, "help"))
664 {
665 ecore_config_args_display();
666 return ECORE_CONFIG_PARSE_HELP;
667 }
668
669 found = 0;
670 prop = __ecore_config_bundle_local->data;
671 while (prop)
672 {
673 if ((prop->long_opt && !strcmp(long_opt, prop->long_opt))
674 || !strcmp(long_opt, prop->key))
675 {
676 found = 1;
677 if ((ret =
678 ecore_config_parse_set(prop, argv[++nextarg],
679 long_opt,
680 '\0')) !=
681 ECORE_CONFIG_PARSE_CONTINUE)
682 return ret;
683 break;
684 }
685 prop = prop->next;
686 }
687 if (!found)
688 {
689 callback = _ecore_config_arg_callbacks;
690 while (callback)
691 {
692 if ((callback->long_opt &&
693 !strcmp(long_opt, callback->long_opt)))
694 {
695 found = 1;
696 if (callback->type == ECORE_CONFIG_NIL)
697 {
698 callback->func(NULL, callback->data);
699 }
700 else
701 {
702 if (!argv[++nextarg])
703 {
704 ERR("Missing expected argument for option --%s", long_opt);
705 return ECORE_CONFIG_PARSE_EXIT;
706 }
707 callback->func(argv[nextarg], callback->data);
708 }
709 break;
710 }
711 callback = callback->next;
712 }
713 }
714 if (!found)
715 {
716 ERR("Unrecognised option \"%s\"", long_opt);
717 ERR("Try using -h or --help for more information.\n");
718 return ECORE_CONFIG_PARSE_EXIT;
719 }
720 }
721 else
722 {
723 while (short_opt)
724 {
725 if (short_opt == 'h')
726 {
727 ecore_config_args_display();
728 return ECORE_CONFIG_PARSE_HELP;
729 }
730 else
731 {
732 found = 0;
733 prop = __ecore_config_bundle_local->data;
734 while (prop)
735 {
736 if (short_opt == prop->short_opt)
737 {
738 found = 1;
739 if ((ret =
740 ecore_config_parse_set(prop,
741 argv[++nextarg],
742 NULL,
743 short_opt)) !=
744 ECORE_CONFIG_PARSE_CONTINUE)
745 return ret;
746 break;
747 }
748 prop = prop->next;
749 }
750
751 if (!found)
752 {
753 callback = _ecore_config_arg_callbacks;
754 while (callback)
755 {
756 if (short_opt == callback->short_opt)
757 {
758 found = 1;
759 if (callback->type == ECORE_CONFIG_NIL)
760 {
761 callback->func(NULL, callback->data);
762 }
763 else
764 {
765 if (!argv[++nextarg])
766 {
767 ERR("Missing expected argument for option -%c", short_opt);
768 return ECORE_CONFIG_PARSE_EXIT;
769 }
770 callback->func(argv[nextarg], callback->data);
771 }
772 break;
773 }
774 callback = callback->next;
775 }
776 }
777 if (!found)
778 {
779 ERR("Unrecognised option '%c'", short_opt);
780 ERR("Try using -h or --help for more information.\n");
781 return ECORE_CONFIG_PARSE_EXIT;
782 }
783 }
784 short_opt = *(arg + ++next_short_opt);
785 }
786 }
787 nextarg++;
788 }
789
790 return ECORE_CONFIG_PARSE_CONTINUE;
791}
792
793/**
794 * Sets the description string used by @ref ecore_config_args_display .
795 * @param description Description of application.
796 */
797void
798ecore_config_app_describe(char *description)
799{
800 if (__ecore_config_app_description)
801 free(__ecore_config_app_description);
802 __ecore_config_app_description = strdup(description);
803}
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_ipc.h b/libraries/ecore/src/lib/ecore_config/ecore_config_ipc.h
new file mode 100644
index 0000000..7b3dea1
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_ipc.h
@@ -0,0 +1,50 @@
1#include <Ecore_Ipc.h>
2#include "Ecore_Config.h"
3
4typedef enum
5{
6 IPC_NONE,
7 IPC_PROP_LIST,
8 IPC_PROP_DESC,
9 IPC_PROP_GET,
10 IPC_PROP_SET, /* end of the codes shared by evidence and econf */
11
12 IPC_GLOBAL_PROP_LIST,
13
14 IPC_BUNDLE_LIST,
15 IPC_BUNDLE_NEW,
16 IPC_BUNDLE_LABEL_GET,
17 IPC_BUNDLE_LABEL_SET,
18 IPC_BUNDLE_LABEL_FIND,
19
20 IPC_LAST
21} Ecore_Config_Ipc_Call;
22
23Ecore_Config_Server *_ecore_config_ipc_init(const char *pipe_name);
24int _ecore_config_ipc_exit(void);
25
26Ecore_Config_Server *_ecore_config_server_convert(void *srv);
27
28char *_ecore_config_ipc_prop_list(Ecore_Config_Server * srv,
29 const long serial);
30char *_ecore_config_ipc_prop_desc(Ecore_Config_Server * srv,
31 const long serial,
32 const char *key);
33char *_ecore_config_ipc_prop_get(Ecore_Config_Server * srv,
34 const long serial,
35 const char *key);
36int _ecore_config_ipc_prop_set(Ecore_Config_Server * srv,
37 const long serial,
38 const char *key,
39 const char *val);
40
41char *_ecore_config_ipc_bundle_list(Ecore_Config_Server * srv);
42int _ecore_config_ipc_bundle_new(Ecore_Config_Server * srv,
43 const char *);
44char *_ecore_config_ipc_bundle_label_get(Ecore_Config_Server *
45 srv, const long);
46int _ecore_config_ipc_bundle_label_set(Ecore_Config_Server *
47 srv, const long,
48 const char *);
49long _ecore_config_ipc_bundle_label_find(Ecore_Config_Server *
50 srv, const char *);
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_ipc_ecore.c b/libraries/ecore/src/lib/ecore_config/ecore_config_ipc_ecore.c
new file mode 100644
index 0000000..b1622f3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_ipc_ecore.c
@@ -0,0 +1,384 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5/* by Azundris, with thanks to Corey Donohoe <atmos@atmos.org> */
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <errno.h>
10#include <limits.h>
11#include <sys/types.h>
12#include <sys/stat.h>
13#include <unistd.h>
14#include <ctype.h>
15
16#include <Ecore.h>
17#include "ecore_private.h"
18#include <Ecore_Ipc.h>
19
20#include "ecore_config_ipc.h"
21#include "ecore_config_util.h"
22#include "ecore_config_private.h"
23
24#include "Ecore_Config.h"
25
26
27/*****************************************************************************/
28
29static int
30_ecore_config_ipc_ecore_string_get(char **m, char **r)
31{
32 char *q;
33 int l = 0;
34
35 if (!m || !*m)
36 return ECORE_CONFIG_ERR_NODATA;
37 if (!r)
38 return ECORE_CONFIG_ERR_FAIL;
39 q = *m;
40 if (*q != 's')
41 return ECORE_CONFIG_ERR_TYPEMISMATCH;
42 q++;
43 l = (*(q++)) << 8;
44 l += *(q++);
45 *r = q;
46 q += l;
47 *m = q;
48 WRN("IPC/eCore: got string-%d \"%s\"", l, *r);
49 return ECORE_CONFIG_ERR_SUCC;
50}
51
52static char *
53_ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long serial __UNUSED__)
54{
55 Ecore_Config_DB_File *db;
56 char **keys;
57 int key_count, x;
58 estring *s;
59 int f;
60 char buf[PATH_MAX], *p;
61 // char *data; UNUSED
62 Ecore_Config_Type type;
63
64 db = NULL;
65 s = estring_new(8192);
66 f = 0;
67 if ((p = getenv("HOME")))
68 {
69 snprintf(buf, sizeof(buf), "%s/.e/config.eet", p);
70 if (!(db = _ecore_config_db_open_read(buf)))
71 {
72 strcpy(buf, PACKAGE_DATA_DIR"/system.eet");
73 if (!(db = _ecore_config_db_open_read(buf)))
74 return NULL;
75 }
76 }
77 if (!db) return NULL;
78 key_count = 0;
79 keys = _ecore_config_db_keys_get(db, &key_count);
80 if (keys)
81 {
82 for (x = 0; x < key_count; x++)
83 {
84 type = _ecore_config_db_key_type_get(db, keys[x]);
85 switch (type)
86 {
87 case ECORE_CONFIG_INT:
88 estring_appendf(s, "%s%s: integer", f ? "\n" : "", keys[x]);
89 break;
90 case ECORE_CONFIG_BLN:
91 estring_appendf(s, "%s%s: boolean", f ? "\n" : "", keys[x]);
92 break;
93 case ECORE_CONFIG_FLT:
94 estring_appendf(s, "%s%s: float", f ? "\n" : "", keys[x]);
95 break;
96 case ECORE_CONFIG_STR:
97 estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
98 break;
99 case ECORE_CONFIG_RGB:
100 estring_appendf(s, "%s%s: colour", f ? "\n" : "", keys[x]);
101 break;
102 case ECORE_CONFIG_THM:
103 estring_appendf(s, "%s%s: theme", f ? "\n" : "", keys[x]);
104 break;
105 case ECORE_CONFIG_SCT:
106 estring_appendf(s, "%s%s: structure", f ? "\n" : "", keys[x]);
107 break;
108 default:
109 estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
110 continue;
111 }
112 f = 1;
113 }
114 }
115 _ecore_config_db_close(db);
116 if (keys)
117 {
118 for (x = 0; x < key_count; x++)
119 {
120 free(keys[x]);
121 }
122 free(keys);
123 }
124
125 return estring_disown(s);
126}
127
128/*****************************************************************************/
129
130static int
131_ecore_config_ipc_ecore_send(Ecore_Ipc_Event_Client_Data * e, int code,
132 char *reply)
133{
134 static int our_ref = 0;
135 int len = reply ? strlen(reply) + 1 : 0;
136
137 our_ref++;
138 WRN("IPC/eCore: replying [0,0] %d IRT %d => %d {\"%s\":%d}", our_ref,
139 e->ref, code, reply ? reply : "", len);
140 return ecore_ipc_client_send(e->client, 0, 0, our_ref, e->ref, code, reply,
141 len);
142}
143
144/*****************************************************************************/
145
146static int
147_ecore_config_ipc_ecore_handle_request(Ecore_Ipc_Server * server,
148 Ecore_Ipc_Event_Client_Data * e)
149{
150 Ecore_Config_Server *srv;
151 long serial;
152 int ret;
153 char *r, *k, *v, *m;
154
155 srv = _ecore_config_server_convert(server);
156 serial = e->minor;
157 r = NULL;
158 m = (char *)e->data;
159 INF("IPC/eCore: client sent: [%d,%d] #%d (%d) @ %p", e->major, e->minor,
160 e->ref, e->size, server);
161
162 switch (e->major)
163 {
164 case IPC_PROP_LIST:
165 if (srv == __ecore_config_server_global)
166 r = _ecore_config_ipc_global_prop_list(srv, serial);
167 else
168 r = _ecore_config_ipc_prop_list(srv, serial);
169 break;
170 case IPC_PROP_DESC:
171 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
172 r = _ecore_config_ipc_prop_desc(srv, serial, k);
173 break;
174 case IPC_PROP_GET:
175 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
176 r = _ecore_config_ipc_prop_get(srv, serial, k);
177 break;
178 case IPC_PROP_SET:
179 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
180 {
181 if (_ecore_config_ipc_ecore_string_get(&m, &v) ==
182 ECORE_CONFIG_ERR_SUCC)
183 return _ecore_config_ipc_ecore_send(e,
184 _ecore_config_ipc_prop_set
185 (srv, serial, k, v), NULL);
186 }
187 break;
188
189 case IPC_BUNDLE_LIST:
190 r = _ecore_config_ipc_bundle_list(srv);
191 break;
192 case IPC_BUNDLE_NEW:
193 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
194 return _ecore_config_ipc_ecore_send(e,
195 k ?
196 _ecore_config_ipc_bundle_new(srv,
197 k) :
198 ECORE_CONFIG_ERR_FAIL, NULL);
199 break;
200 case IPC_BUNDLE_LABEL_SET:
201 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
202 return _ecore_config_ipc_ecore_send(e,
203 k ?
204 _ecore_config_ipc_bundle_label_set
205 (srv, serial,
206 k) : ECORE_CONFIG_ERR_FAIL,
207 NULL);
208 break;
209 case IPC_BUNDLE_LABEL_FIND:
210 if (_ecore_config_ipc_ecore_string_get(&m, &k) == ECORE_CONFIG_ERR_SUCC)
211 return _ecore_config_ipc_ecore_send(e,
212 _ecore_config_ipc_bundle_label_find
213 (srv, k), NULL);
214 break;
215 case IPC_BUNDLE_LABEL_GET:
216 r = _ecore_config_ipc_bundle_label_get(srv, serial);
217 break;
218 }
219
220 ret =
221 _ecore_config_ipc_ecore_send(e,
222 r ? ECORE_CONFIG_ERR_SUCC :
223 ECORE_CONFIG_ERR_FAIL, r);
224 if (r)
225 {
226 free(r);
227 return ret;
228 }
229 return ECORE_CONFIG_ERR_NOTFOUND;
230}
231
232/*****************************************************************************/
233
234static Eina_Bool
235_ecore_config_ipc_client_add(void *data, int type __UNUSED__, void *event)
236{
237 Ecore_Ipc_Server **server;
238 Ecore_Ipc_Event_Client_Data *e;
239
240 server = (Ecore_Ipc_Server **) data;
241 e = (Ecore_Ipc_Event_Client_Data *) event;
242
243 if (*server != ecore_ipc_client_server_get(e->client))
244 return EINA_TRUE;
245
246 INF("IPC/eCore: Client connected. @ %p", server);
247 return EINA_TRUE;
248}
249
250static Eina_Bool
251_ecore_config_ipc_client_del(void *data, int type __UNUSED__, void *event)
252{
253 Ecore_Ipc_Server **server;
254 Ecore_Ipc_Event_Client_Data *e;
255
256 server = (Ecore_Ipc_Server **) data;
257 e = (Ecore_Ipc_Event_Client_Data *) event;
258
259 if (*server != ecore_ipc_client_server_get(e->client))
260 return EINA_TRUE;
261
262 INF("IPC/eCore: Client disconnected. @ %p", server);
263 return EINA_TRUE;
264}
265
266static Eina_Bool
267_ecore_config_ipc_client_sent(void *data, int type __UNUSED__, void *event)
268{
269 Ecore_Ipc_Server **server;
270 Ecore_Ipc_Event_Client_Data *e;
271
272 server = (Ecore_Ipc_Server **) data;
273 e = (Ecore_Ipc_Event_Client_Data *) event;
274
275 if (*server != ecore_ipc_client_server_get(e->client))
276 return EINA_TRUE;
277
278 _ecore_config_ipc_ecore_handle_request(*server, e);
279 return EINA_TRUE;
280}
281
282/*****************************************************************************/
283
284int
285_ecore_config_ipc_ecore_init(const char *pipe_name, void **data)
286{
287 Ecore_Ipc_Server **server;
288 struct stat st;
289 char *p;
290 int port;
291 char socket[PATH_MAX];
292
293 server = (Ecore_Ipc_Server **) data;
294 port = 0;
295 if (!server)
296 return ECORE_CONFIG_ERR_FAIL;
297
298/* if(*server)
299 return ECORE_CONFIG_ERR_IGNORED; */
300
301 ecore_init();
302 if (ecore_ipc_init() < 1)
303 return ECORE_CONFIG_ERR_FAIL;
304
305 if ((p = getenv("HOME")))
306 { /* debug-only ### FIXME */
307 int stale;
308
309 stale = 1;
310 while (stale)
311 {
312 snprintf(socket, PATH_MAX, "%s/.ecore/%s/%d", p, pipe_name, port);
313
314 if (!stat(socket, &st))
315 {
316 INF("IPC/eCore: pipe \"%s\" already exists!?", socket);
317/* if(unlink(buf))
318 E(0,"IPC/eCore: could not remove pipe \"%s\": %d\n",buf,errno); }}*/
319 port++;
320 }
321 else
322 {
323 stale = 0;
324 }
325 }
326 }
327 *server = ecore_ipc_server_add(ECORE_IPC_LOCAL_USER, pipe_name, port, NULL);
328 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_ADD,
329 _ecore_config_ipc_client_add, server);
330 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DEL,
331 _ecore_config_ipc_client_del, server);
332 ecore_event_handler_add(ECORE_IPC_EVENT_CLIENT_DATA,
333 _ecore_config_ipc_client_sent, server);
334
335 if (*server)
336 {
337 INF("IPC/eCore: Server is listening on %s.", pipe_name);
338 }
339
340 return ECORE_CONFIG_ERR_SUCC;
341}
342
343int
344_ecore_config_ipc_ecore_exit(void **data)
345{
346 int ret;
347 Ecore_Ipc_Server **server;
348
349 ret = ECORE_CONFIG_ERR_SUCC;
350 server = (Ecore_Ipc_Server **) data;
351
352 if (!server)
353 return ECORE_CONFIG_ERR_FAIL;
354
355 if (*server)
356 {
357 ecore_ipc_server_del(*server);
358 *server = NULL;
359 }
360
361 ecore_ipc_shutdown();
362 ecore_shutdown();
363
364 return ret;
365}
366
367/*****************************************************************************/
368
369int
370_ecore_config_ipc_ecore_poll(void **data)
371{
372 Ecore_Ipc_Server **server;
373
374 server = (Ecore_Ipc_Server **) data;
375
376 if (!server)
377 return ECORE_CONFIG_ERR_FAIL;
378
379 ecore_main_loop_iterate();
380
381 return ECORE_CONFIG_ERR_SUCC;
382}
383
384/*****************************************************************************/
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_ipc_main.c b/libraries/ecore/src/lib/ecore_config/ecore_config_ipc_main.c
new file mode 100644
index 0000000..35bd783
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_ipc_main.c
@@ -0,0 +1,275 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5/* ############## bad */
6#define HAVE_EVAS2
7
8#include <signal.h>
9#include <dlfcn.h>
10#include <stdio.h>
11#include <glob.h>
12#include <sys/param.h>
13#include <limits.h>
14#include <string.h>
15#include <stdlib.h> /* malloc(), free() */
16
17#include "Ecore.h"
18#include "Ecore_Config.h"
19#include "ecore_config_util.h"
20#include "ecore_config_ipc.h"
21
22#include "ecore_config_private.h"
23
24static Ecore_Config_Server *__ecore_config_servers;
25Ecore_Timer *ipc_timer = NULL;
26
27Ecore_Config_Server *
28_ecore_config_server_convert(void *srv)
29{
30 Ecore_Config_Server *srv_tmp;
31
32 srv_tmp = __ecore_config_servers;
33 while (srv_tmp)
34 {
35 if (srv_tmp->server == srv)
36 return srv_tmp;
37 srv_tmp = srv_tmp->next;
38 }
39
40 return __ecore_config_server_global;
41}
42
43/*****************************************************************************/
44/* INTERFACE FOR IPC MODULES */
45/*****************************/
46
47char *
48_ecore_config_ipc_prop_list(Ecore_Config_Server * srv, const long serial)
49{
50 Ecore_Config_Bundle *theme;
51 Ecore_Config_Prop *e;
52 estring *s;
53 int f;
54
55 theme = ecore_config_bundle_by_serial_get(srv, serial);
56 e = theme ? theme->data : NULL;
57 s = estring_new(8192);
58 f = 0;
59 while (e)
60 {
61 /* ignore system properties in listings, unless they have been overridden */
62 if (e->flags & ECORE_CONFIG_FLAG_SYSTEM && !(e->flags & ECORE_CONFIG_FLAG_MODIFIED))
63 {
64 e = e->next;
65 continue;
66 }
67 estring_appendf(s, "%s%s: %s", f ? "\n" : "", e->key,
68 ecore_config_type_get(e));
69 if (e->flags & ECORE_CONFIG_FLAG_BOUNDS)
70 {
71 if (e->type == ECORE_CONFIG_FLT)
72 estring_appendf(s, ", range %le..%le",
73 (float)e->lo / ECORE_CONFIG_FLOAT_PRECISION,
74 (float)e->hi / ECORE_CONFIG_FLOAT_PRECISION);
75 else
76 estring_appendf(s, ", range %d..%d", e->lo, e->hi);
77 }
78 if (e->type == ECORE_CONFIG_THM)
79 estring_appendf(s, ", group %s", e->data ? e->data : "Main");
80 f = 1;
81 e = e->next;
82 }
83
84 return estring_disown(s);
85}
86
87char *
88_ecore_config_ipc_prop_desc(Ecore_Config_Server * srv, const long serial,
89 const char *key)
90{
91#ifdef HAVE_EVAS2
92 Ecore_Config_Prop *e;
93
94 e = ecore_config_get(key);
95 if (e)
96 {
97 estring *s = estring_new(512);
98
99 estring_appendf(s, "%s: %s", e->key, ecore_config_type_get(e));
100 if (e->flags & ECORE_CONFIG_FLAG_BOUNDS)
101 estring_appendf(s, ", range %d..%d", e->lo, e->hi);
102 return estring_disown(s);
103 }
104#endif
105 return strdup("<undefined>");
106}
107
108char *
109_ecore_config_ipc_prop_get(Ecore_Config_Server * srv, const long serial,
110 const char *key)
111{
112#ifdef HAVE_EVAS2
113 char *ret;
114
115 if ((ret = ecore_config_as_string_get(key)))
116 return ret;
117#endif
118 return strdup("<undefined>");
119}
120
121int
122_ecore_config_ipc_prop_set(Ecore_Config_Server * srv, const long serial,
123 const char *key, const char *val)
124{
125#ifdef HAVE_EVAS2
126 int ret;
127 Ecore_Config_Bundle *theme;
128
129 theme = ecore_config_bundle_by_serial_get(srv, serial);
130 ret = ecore_config_set(key, (char *)val);
131 ERR("ipc.prop.set(%s->%s,\"%s\") => %d\n", theme ? theme->identifier : "",
132 key, val, ret);
133 return ret;
134#else
135 return ECORE_CONFIG_ERR_NOTSUPP;
136#endif
137}
138
139/*****************************************************************************/
140
141char *
142_ecore_config_ipc_bundle_list(Ecore_Config_Server * srv)
143{
144 Ecore_Config_Bundle *ns;
145 estring *s;
146 int f;
147
148 ns = ecore_config_bundle_1st_get(srv);
149 s = estring_new(8192);
150 f = 0;
151 if (!ns)
152 return strdup("<no_bundles_created>");
153
154 while (ns)
155 {
156 estring_appendf(s, "%s%d: %s", f ? "\n" : "",
157 ecore_config_bundle_serial_get(ns),
158 ecore_config_bundle_label_get(ns));
159 f = 1;
160 ns = ecore_config_bundle_next_get(ns);
161 }
162
163 return estring_disown(s);
164}
165
166int
167_ecore_config_ipc_bundle_new(Ecore_Config_Server * srv, const char *label)
168{
169 if (ecore_config_bundle_new(srv, label))
170 return ECORE_CONFIG_ERR_SUCC;
171 return ECORE_CONFIG_ERR_FAIL;
172}
173
174char *
175_ecore_config_ipc_bundle_label_get(Ecore_Config_Server * srv, const long serial)
176{
177 Ecore_Config_Bundle *ns;
178 char *label;
179
180 ns = ecore_config_bundle_by_serial_get(srv, serial);
181 label = ecore_config_bundle_label_get(ns);
182 return strdup(label ? label : "<no such bundle>");
183}
184
185int
186_ecore_config_ipc_bundle_label_set(Ecore_Config_Server * srv, const long serial,
187 const char *label)
188{
189 Ecore_Config_Bundle *ns;
190
191 ns = ecore_config_bundle_by_serial_get(srv, serial);
192 if (!(ns->identifier = malloc(sizeof(label))))
193 return ECORE_CONFIG_ERR_OOM;
194 memcpy(ns->identifier, label, sizeof(label));
195 return ECORE_CONFIG_ERR_SUCC;
196}
197
198long
199_ecore_config_ipc_bundle_label_find(Ecore_Config_Server * srv,
200 const char *label)
201{
202 Ecore_Config_Bundle *ns;
203
204 ns = ecore_config_bundle_by_label_get(srv, label);
205 return ns ? ecore_config_bundle_serial_get(ns) : -1;
206}
207
208static Eina_Bool
209_ecore_config_ipc_poll(void *data __UNUSED__)
210{
211 Ecore_Config_Server *s;
212
213 s = __ecore_config_servers;
214 while (s)
215 {
216 _ecore_config_ipc_ecore_poll(&s->server);
217 s = s->next;
218 }
219
220 return EINA_TRUE;
221}
222
223int
224_ecore_config_ipc_exit(void)
225{
226 Ecore_Config_Server *l;
227
228 if (ipc_timer)
229 ecore_timer_del(ipc_timer);
230
231 l = __ecore_config_servers;
232 while (l)
233 {
234 _ecore_config_ipc_ecore_exit(&l->server);
235 if (l->name)
236 free(l->name);
237 l = l->next;
238 }
239
240 return ECORE_CONFIG_ERR_SUCC;
241}
242
243Ecore_Config_Server *
244_ecore_config_ipc_init(const char *pipe_name)
245{
246 int ret;
247 Ecore_Config_Server *list;
248 Ecore_Config_Server *ret_srv;
249
250 list = NULL;
251 ret_srv = NULL;
252 list = NULL;
253
254 list = calloc(1, sizeof(Ecore_Config_Server));
255 if ((ret = _ecore_config_ipc_ecore_init(pipe_name, &list->server)) != ECORE_CONFIG_ERR_SUCC)
256 {
257 ERR("_ecore_config_ipc_init: failed to register %s, code %d",
258 pipe_name, ret);
259 }
260
261 ERR("_ecore_config_ipc_init: registered \"%s\"...", pipe_name);
262
263 list->name = strdup(pipe_name);
264 list->next = __ecore_config_servers;
265
266 __ecore_config_servers = list;
267 if (!ret_srv)
268 ret_srv = list;
269
270 if (!ipc_timer)
271 ipc_timer = ecore_timer_add(100, _ecore_config_ipc_poll, NULL);
272
273 return ret_srv;
274}
275/*****************************************************************************/
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_private.h b/libraries/ecore/src/lib/ecore_config/ecore_config_private.h
new file mode 100644
index 0000000..b97f695
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_private.h
@@ -0,0 +1,70 @@
1#ifndef _ECORE_CONFIG_PRIVATE_H
2# define _ECORE_CONFIG_PRIVATE_H
3#ifdef ECORE_CONFIG_DEFAULT_LOG_COLOR
4# undef ECORE_CONFIG_DEFAULT_LOG_COLOR
5#endif
6#define ECORE_CONFIG_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
7 /* eina_log related things */
8
9extern int _ecore_config_log_dom;
10#ifdef ERR
11# undef ERR
12#endif
13#define ERR(...) EINA_LOG_DOM_ERR(_ecore_config_log_dom, __VA_ARGS__)
14
15#ifdef DBG
16# undef DBG
17#endif
18#define DBG(...) EINA_LOG_DOM_DBG(_ecore_config_log_dom, __VA_ARGS__)
19
20#ifdef INF
21# undef INF
22#endif
23#define INF(...) EINA_LOG_DOM_INFO(_ecore_config_log_dom, __VA_ARGS__)
24
25#ifdef WRN
26# undef WRN
27#endif
28#define WRN(...) EINA_LOG_DOM_WARN(_ecore_config_log_dom, __VA_ARGS__)
29
30#ifdef CRIT
31# undef CRIT
32#endif
33#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_config_log_dom, __VA_ARGS__)
34
35/* debug */
36extern int DEBUG;
37
38
39typedef struct _Ecore_Config_DB_File Ecore_Config_DB_File;
40
41int _ecore_config_mod_init(const char *pipe_name, void **data);
42int _ecore_config_mod_exit(void **data);
43int _ecore_config_mod_poll(void **data);
44
45Ecore_Config_DB_File *_ecore_config_db_open_read(const char *file);
46Ecore_Config_DB_File *_ecore_config_db_open_write(const char *file);
47void _ecore_config_db_close(Ecore_Config_DB_File *db);
48char **_ecore_config_db_keys_get(Ecore_Config_DB_File *db, int *num_ret);
49Ecore_Config_Type _ecore_config_db_key_type_get(Ecore_Config_DB_File *db, const char *key);
50int _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key);
51void _ecore_config_db_write(Ecore_Config_DB_File *db, Ecore_Config_Prop *e);
52
53int _ecore_config_boolean_get(Ecore_Config_Prop *e);
54char *_ecore_config_string_get(Ecore_Config_Prop *e);
55long _ecore_config_int_get(Ecore_Config_Prop *e);
56int _ecore_config_argb_get(Ecore_Config_Prop *e, int *a, int *r,
57 int *g, int *b);
58char *_ecore_config_argbstr_get(Ecore_Config_Prop *e);
59long _ecore_config_argbint_get(Ecore_Config_Prop *e);
60float _ecore_config_float_get(Ecore_Config_Prop *e);
61char *_ecore_config_theme_get(Ecore_Config_Prop *e);
62
63int _ecore_config_ipc_ecore_init(const char *pipe_name, void **data);
64int _ecore_config_ipc_ecore_exit(void **data);
65int _ecore_config_ipc_ecore_poll(void **data);
66
67#include "Ecore.h"
68#include "ecore_private.h"
69
70#endif
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_storage.c b/libraries/ecore/src/lib/ecore_config/ecore_config_storage.c
new file mode 100644
index 0000000..d059645
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_storage.c
@@ -0,0 +1,176 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include <limits.h>
9
10#include <sys/param.h>
11#include <sys/types.h>
12#include <sys/stat.h>
13#include <unistd.h>
14
15#include "Ecore_Config.h"
16#include "ecore_config_private.h"
17
18/**
19 * Loads the default configuration.
20 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_NODATA
21 * is returned if the file cannot be loaded.
22 * @ingroup Ecore_Config_File_Group
23 */
24EAPI int
25ecore_config_load(void)
26{
27 char file[PATH_MAX];
28
29 if (!__ecore_config_app_name)
30 return ECORE_CONFIG_ERR_FAIL;
31
32 snprintf(file, PATH_MAX, "%s/.e/apps/%s/config.eet", getenv("HOME"),
33 __ecore_config_app_name);
34 return ecore_config_file_load(file);
35}
36
37/**
38 * Saves the current configuration to the default file.
39 * @return @c ECORE_CONFIG_ERR_SUCC is returned on success.
40 * @c ECORE_CONFIG_ERR_FAIL is returned if the data cannot be
41 * saved.
42 * @ingroup Ecore_Config_File_Group
43 */
44EAPI int
45ecore_config_save(void)
46{
47 char file[PATH_MAX];
48
49 if (!__ecore_config_app_name)
50 return ECORE_CONFIG_ERR_FAIL;
51
52 snprintf(file, PATH_MAX, "%s/.e/apps/%s/config.eet", getenv("HOME"),
53 __ecore_config_app_name);
54 return ecore_config_file_save(file);
55}
56
57/**
58 * Load the given configuration file to the local configuration.
59 * @param file Name of the file to load.
60 * @return @c ECORE_CONFIG_ERR_SUCC on success. @c ECORE_CONFIG_ERR_NODATA
61 * is returned if the file cannot be loaded.
62 * @ingroup Ecore_Config_File_Group
63 */
64EAPI int
65ecore_config_file_load(const char *file)
66{
67 Ecore_Config_DB_File *db;
68 char **keys;
69 int key_count;
70 int x;
71 // double ftmp; UNUSED
72 // int pt; UNUSED
73 // int itmp; UNUSED
74 // Ecore_Config_Type type; UNUSED
75 char *data;
76
77 db = NULL;
78 data = NULL;
79
80 db = _ecore_config_db_open_read(file);
81 if (!db)
82 {
83 ERR("Cannot open database from file %s!", file);
84 return ECORE_CONFIG_ERR_NODATA;
85 }
86 key_count = 0;
87 keys = _ecore_config_db_keys_get(db, &key_count);
88 if (keys)
89 {
90 for (x = 0; x < key_count; x++)
91 {
92 _ecore_config_db_read(db, keys[x]);
93 }
94 }
95 _ecore_config_db_close(db);
96 if (keys)
97 {
98 for (x = 0; x < key_count; x++)
99 {
100 free(keys[x]);
101 }
102 free(keys);
103 }
104 return ECORE_CONFIG_ERR_SUCC;
105}
106
107static void
108_ecore_config_recurse_mkdir(const char *file)
109{
110 char *file_ptr;
111 char *file_tmp;
112 struct stat status;
113
114 file_tmp = strdup(file);
115 file_ptr = file_tmp + strlen(file_tmp);
116 while (*file_ptr != '/' && file_ptr > file_tmp)
117 file_ptr--;
118 *file_ptr = '\0';
119
120 if ((file_tmp[0] != 0) && stat(file_tmp, &status))
121 {
122 _ecore_config_recurse_mkdir(file_tmp);
123 mkdir(file_tmp, S_IRUSR | S_IWUSR | S_IXUSR);
124 }
125 free(file_tmp);
126}
127
128/**
129 * Saves the local configuration to the given file.
130 * @param file Name of the file to save to.
131 * @return @c ECORE_CONFIG_ERR_SUCC is returned on success.
132 * @c ECORE_CONFIG_ERR_FAIL is returned if the data cannot be
133 * saved.
134 * @ingroup Ecore_Config_File_Group
135 */
136EAPI int
137ecore_config_file_save(const char *file)
138{
139 Ecore_Config_Prop *next;
140 Ecore_Config_DB_File *db;
141 struct stat status;
142
143 next = __ecore_config_bundle_local->data;
144 db = NULL;
145
146 /* if file does not exist check to see if the dirs exist, creating if not */
147 if (stat(file, &status))
148 _ecore_config_recurse_mkdir(file);
149
150 db = _ecore_config_db_open_write(file);
151 if (!db)
152 {
153 ERR("Cannot open database from file %s!", file);
154 return ECORE_CONFIG_ERR_FAIL;
155 }
156
157 while (next)
158 {
159 /* let the config_db deal with this
160 * handyande: hmm, not sure that it ever does - reinstating until
161 * further discussions satisfy me!
162 */
163 if (!(next->flags & ECORE_CONFIG_FLAG_MODIFIED) || next->flags & ECORE_CONFIG_FLAG_CMDLN)
164 {
165 next = next->next;
166 continue;
167 }
168
169 _ecore_config_db_write(db, next);
170
171 next = next->next;
172 }
173
174 _ecore_config_db_close(db);
175 return ECORE_CONFIG_ERR_SUCC;
176}
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_util.c b/libraries/ecore/src/lib/ecore_config/ecore_config_util.c
new file mode 100644
index 0000000..6156936
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_util.c
@@ -0,0 +1,129 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5/* azundris */
6
7#include <sys/types.h>
8#include <stdlib.h> /* malloc(), free() */
9#include <stdio.h>
10#include <string.h> /* str...() */
11
12#include <stdarg.h> /* varargs in sprintf/appendf */
13
14#include "Ecore.h"
15#include "ecore_private.h"
16
17#include "Ecore_Config.h"
18#include "ecore_config_util.h"
19
20#include "ecore_config_private.h"
21
22#define CHUNKLEN 4096
23
24/*****************************************************************************/
25/* STRINGS */
26/***********/
27
28estring *
29estring_new(int size)
30{
31 estring *e = malloc(sizeof(estring));
32
33 if (e)
34 {
35 memset(e, 0, sizeof(estring));
36 if ((size > 0) && (e->str = malloc(size)))
37 e->alloc = size;
38 }
39 return e;
40}
41
42char *
43estring_disown(estring * e)
44{
45 if (e)
46 {
47 char *r = e->str;
48
49 free(e);
50 return r;
51 }
52 return NULL;
53}
54
55int
56estring_appendf(estring * e, const char *fmt, ...)
57{
58 int need;
59 va_list ap;
60 char *p;
61
62 if (!e)
63 return ECORE_CONFIG_ERR_FAIL;
64
65 if (!e->str)
66 {
67 e->used = e->alloc = 0;
68 if (!(e->str = (char *)malloc(e->alloc = CHUNKLEN)))
69 return ECORE_CONFIG_ERR_OOM;
70 }
71
72 va_start(ap, fmt);
73 need = vsnprintf(NULL, 0, fmt, ap);
74 va_end(ap);
75
76 if (need >= (e->alloc - e->used))
77 {
78 e->alloc = e->used + need + (CHUNKLEN - (need % CHUNKLEN));
79
80 if (!(p = (char *)realloc(e->str, e->alloc)))
81 {
82 free(e->str);
83 e->alloc = e->used = 0;
84 return ECORE_CONFIG_ERR_OOM;
85 }
86 e->str = p;
87 }
88
89 va_start(ap, fmt);
90 need = vsnprintf(e->str + e->used, e->alloc - e->used, fmt, ap);
91 va_end(ap);
92
93 return e->used += need;
94}
95
96int
97esprintf(char **result, const char *fmt, ...)
98{
99 va_list ap;
100 size_t need;
101 char *n;
102
103 if (!result)
104 return ECORE_CONFIG_ERR_FAIL;
105
106 va_start(ap, fmt);
107 need = vsnprintf(NULL, 0, fmt, ap) + 1;
108 va_end(ap);
109 n = malloc(need + 1);
110
111 if (n)
112 {
113 va_start(ap, fmt);
114 need = vsnprintf(n, need, fmt, ap);
115 va_end(ap);
116
117 n[need] = 0;
118
119 if(*result)
120 free(result);
121 *result = n;
122
123 return need;
124 }
125
126 return ECORE_CONFIG_ERR_OOM;
127}
128
129/*****************************************************************************/
diff --git a/libraries/ecore/src/lib/ecore_config/ecore_config_util.h b/libraries/ecore/src/lib/ecore_config/ecore_config_util.h
new file mode 100644
index 0000000..5bee9d6
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_config/ecore_config_util.h
@@ -0,0 +1,14 @@
1#define TIMER_STOP 0
2#define TIMER_CONT 1
3
4typedef struct _estring
5{
6 char *str;
7 int alloc, used;
8} estring;
9
10estring *estring_new(int size);
11char *estring_disown(estring * e);
12int estring_appendf(estring * e, const char *fmt, ...);
13
14int esprintf(char **result, const char *fmt, ...);
diff --git a/libraries/ecore/src/lib/ecore_directfb/Ecore_DirectFB.h b/libraries/ecore/src/lib/ecore_directfb/Ecore_DirectFB.h
new file mode 100644
index 0000000..1f6fc63
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_directfb/Ecore_DirectFB.h
@@ -0,0 +1,181 @@
1#ifndef _ECORE_DIRECTFB_H
2#define _ECORE_DIRECTFB_H
3
4#include <directfb.h>
5
6#include <Eina.h>
7
8#ifdef EAPI
9# undef EAPI
10#endif /* ifdef EAPI */
11
12#ifdef __GNUC__
13# if __GNUC__ >= 4
14# define EAPI __attribute__ ((visibility("default")))
15# else /* if __GNUC__ >= 4 */
16# define EAPI
17# endif /* if __GNUC__ >= 4 */
18#else /* ifdef __GNUC__ */
19# define EAPI
20#endif /* ifdef __GNUC__ */
21
22#ifdef __cplusplus
23extern "C" {
24#endif /* ifdef __cplusplus */
25
26EAPI extern int ECORE_DIRECTFB_EVENT_POSITION;
27EAPI extern int ECORE_DIRECTFB_EVENT_SIZE;
28EAPI extern int ECORE_DIRECTFB_EVENT_CLOSE;
29EAPI extern int ECORE_DIRECTFB_EVENT_DESTROYED;
30EAPI extern int ECORE_DIRECTFB_EVENT_GOT_FOCUS;
31EAPI extern int ECORE_DIRECTFB_EVENT_LOST_FOCUS;
32EAPI extern int ECORE_DIRECTFB_EVENT_KEY_DOWN;
33EAPI extern int ECORE_DIRECTFB_EVENT_KEY_UP;
34EAPI extern int ECORE_DIRECTFB_EVENT_BUTTON_DOWN;
35EAPI extern int ECORE_DIRECTFB_EVENT_BUTTON_UP;
36EAPI extern int ECORE_DIRECTFB_EVENT_MOTION;
37EAPI extern int ECORE_DIRECTFB_EVENT_ENTER;
38EAPI extern int ECORE_DIRECTFB_EVENT_LEAVE;
39EAPI extern int ECORE_DIRECTFB_EVENT_WHEEL;
40
41#ifndef _ECORE_DIRECTFB_WINDOW_PREDEF
42typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
43#endif /* ifndef _ECORE_DIRECTFB_WINDOW_PREDEF */
44typedef struct _Ecore_DirectFB_Cursor Ecore_DirectFB_Cursor;
45
46typedef struct _Ecore_DirectFB_Event_Key_Down Ecore_DirectFB_Event_Key_Down;
47typedef struct _Ecore_DirectFB_Event_Key_Up Ecore_DirectFB_Event_Key_Up;
48typedef struct _Ecore_DirectFB_Event_Button_Down Ecore_DirectFB_Event_Button_Down;
49typedef struct _Ecore_DirectFB_Event_Button_Up Ecore_DirectFB_Event_Button_Up;
50typedef struct _Ecore_DirectFB_Event_Motion Ecore_DirectFB_Event_Motion;
51typedef struct _Ecore_DirectFB_Event_Enter Ecore_DirectFB_Event_Enter;
52typedef struct _Ecore_DirectFB_Event_Leave Ecore_DirectFB_Event_Leave;
53typedef struct _Ecore_DirectFB_Event_Wheel Ecore_DirectFB_Event_Wheel;
54typedef struct _Ecore_DirectFB_Event_Got_Focus Ecore_DirectFB_Event_Got_Focus;
55typedef struct _Ecore_DirectFB_Event_Lost_Focus Ecore_DirectFB_Event_Lost_Focus;
56
57/* this struct is to keep windows data (id, window itself and surface) in memory as every call
58 * to DirectFB for this values (e.g window->GetSurface(window,&surface)) will increment the
59 * reference count, then we will have to release N times the data, so better we just ask for
60 them once */
61struct _Ecore_DirectFB_Window
62{
63 DFBWindowID id;
64 IDirectFBWindow *window;
65 IDirectFBSurface *surface;
66 Ecore_DirectFB_Cursor *cursor;
67};
68
69struct _Ecore_DirectFB_Cursor
70{
71 IDirectFBSurface *surface;
72 int hot_x;
73 int hot_y;
74};
75
76struct _Ecore_DirectFB_Event_Key_Down /** DirectFB Key Down event */
77{
78 char *name; /**< The name of the key that was released */
79 char *string; /**< The logical symbol of the key that was pressed */
80 char *key_compose; /**< The UTF-8 string conversion if any */
81 unsigned int time;
82 DFBWindowID win;
83};
84
85struct _Ecore_DirectFB_Event_Key_Up /** DirectFB Key Up event */
86{
87 char *name; /**< The name of the key that was released */
88 char *string; /**< The logical symbol of the key that was pressed */
89 char *key_compose; /**< The UTF-8 string conversion if any */
90 unsigned int time;
91 DFBWindowID win;
92};
93
94struct _Ecore_DirectFB_Event_Button_Down
95{
96 int button;
97 int modifiers;
98 int x, y;
99 unsigned int time;
100 int double_click : 1;
101 int triple_click : 1;
102 DFBWindowID win;
103};
104struct _Ecore_DirectFB_Event_Button_Up
105{
106 int button;
107 int modifiers;
108 int x, y;
109 unsigned int time;
110 DFBWindowID win;
111 int double_click : 1;
112 int triple_click : 1;
113};
114struct _Ecore_DirectFB_Event_Motion
115{
116 int modifiers;
117 int x, y;
118 unsigned int time;
119 DFBWindowID win;
120};
121
122struct _Ecore_DirectFB_Event_Enter
123{
124 int modifiers;
125 int x, y;
126 unsigned int time;
127 DFBWindowID win;
128};
129
130struct _Ecore_DirectFB_Event_Leave
131{
132 int modifiers;
133 int x, y;
134 unsigned int time;
135 DFBWindowID win;
136};
137
138struct _Ecore_DirectFB_Event_Wheel
139{
140 int direction;
141 int z;
142 int modifiers;
143 unsigned int time;
144 DFBWindowID win;
145};
146
147struct _Ecore_DirectFB_Event_Got_Focus
148{
149 unsigned int time;
150 DFBWindowID win;
151};
152
153struct _Ecore_DirectFB_Event_Lost_Focus
154{
155 unsigned int time;
156 DFBWindowID win;
157};
158
159/* main functions */
160EAPI int ecore_directfb_init(const char *name);
161EAPI int ecore_directfb_shutdown(void);
162EAPI IDirectFB * ecore_directfb_interface_get(void);
163
164/* window operations */
165EAPI Ecore_DirectFB_Window *ecore_directfb_window_new(int x, int y, int w, int h);
166EAPI void ecore_directfb_window_free(Ecore_DirectFB_Window *window);
167EAPI void ecore_directfb_window_move(Ecore_DirectFB_Window *window, int x, int y);
168EAPI void ecore_directfb_window_resize(Ecore_DirectFB_Window *window, int w, int h);
169EAPI void ecore_directfb_window_focus(Ecore_DirectFB_Window *window);
170EAPI void ecore_directfb_window_show(Ecore_DirectFB_Window *window);
171EAPI void ecore_directfb_window_hide(Ecore_DirectFB_Window *window);
172EAPI void ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *window, Eina_Bool set);
173EAPI void ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *window, Eina_Bool set);
174EAPI void ecore_directfb_window_size_get(Ecore_DirectFB_Window *window, int *w, int *h);
175EAPI void ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *window, Eina_Bool show);
176
177#ifdef __cplusplus
178}
179#endif /* ifdef __cplusplus */
180
181#endif /* ifndef _ECORE_DIRECTFB_H */
diff --git a/libraries/ecore/src/lib/ecore_directfb/Makefile.am b/libraries/ecore/src/lib/ecore_directfb/Makefile.am
new file mode 100644
index 0000000..8142d33
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_directfb/Makefile.am
@@ -0,0 +1,31 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_builddir)/src/lib/ecore \
6@DIRECTFB_CFLAGS@ @EINA_CFLAGS@
7
8lib_LTLIBRARIES = libecore_directfb.la
9includes_HEADERS = Ecore_DirectFB.h
10includesdir = $(includedir)/ecore-@VMAJ@
11
12libecore_directfb_la_SOURCES = \
13ecore_directfb.c \
14ecore_directfb_keys.h \
15ecore_directfb_private.h
16
17libecore_directfb_la_LIBADD = \
18$(top_builddir)/src/lib/ecore/libecore.la \
19@DIRECTFB_LIBS@ \
20@EINA_LIBS@
21
22libecore_directfb_la_LDFLAGS = -version-info @version_info@ @release_info@
23
24libecore_directfb_la_DEPENDENCIES = \
25$(top_builddir)/src/lib/ecore/libecore.la
26
27EXTRA_DIST = \
28Ecore_DirectFB.h \
29ecore_directfb.c \
30ecore_directfb_keys.h \
31ecore_directfb_private.h
diff --git a/libraries/ecore/src/lib/ecore_directfb/Makefile.in b/libraries/ecore/src/lib/ecore_directfb/Makefile.in
new file mode 100644
index 0000000..51d113f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_directfb/Makefile.in
@@ -0,0 +1,822 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_directfb
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89am_libecore_directfb_la_OBJECTS = ecore_directfb.lo
90libecore_directfb_la_OBJECTS = $(am_libecore_directfb_la_OBJECTS)
91AM_V_lt = $(am__v_lt_$(V))
92am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
93am__v_lt_0 = --silent
94libecore_directfb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
95 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
96 $(AM_CFLAGS) $(CFLAGS) $(libecore_directfb_la_LDFLAGS) \
97 $(LDFLAGS) -o $@
98DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
99depcomp = $(SHELL) $(top_srcdir)/depcomp
100am__depfiles_maybe = depfiles
101am__mv = mv -f
102COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
103 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
104LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
105 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
106 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
107 $(AM_CFLAGS) $(CFLAGS)
108AM_V_CC = $(am__v_CC_$(V))
109am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
110am__v_CC_0 = @echo " CC " $@;
111AM_V_at = $(am__v_at_$(V))
112am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
113am__v_at_0 = @
114CCLD = $(CC)
115LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
116 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
117 $(AM_LDFLAGS) $(LDFLAGS) -o $@
118AM_V_CCLD = $(am__v_CCLD_$(V))
119am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
120am__v_CCLD_0 = @echo " CCLD " $@;
121AM_V_GEN = $(am__v_GEN_$(V))
122am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
123am__v_GEN_0 = @echo " GEN " $@;
124SOURCES = $(libecore_directfb_la_SOURCES)
125DIST_SOURCES = $(libecore_directfb_la_SOURCES)
126HEADERS = $(includes_HEADERS)
127ETAGS = etags
128CTAGS = ctags
129DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
130ACLOCAL = @ACLOCAL@
131ALLOCA = @ALLOCA@
132AMTAR = @AMTAR@
133AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
134AR = @AR@
135AS = @AS@
136AUTOCONF = @AUTOCONF@
137AUTOHEADER = @AUTOHEADER@
138AUTOMAKE = @AUTOMAKE@
139AWK = @AWK@
140CARES_CFLAGS = @CARES_CFLAGS@
141CARES_LIBS = @CARES_LIBS@
142CC = @CC@
143CCDEPMODE = @CCDEPMODE@
144CFLAGS = @CFLAGS@
145CHECK_CFLAGS = @CHECK_CFLAGS@
146CHECK_LIBS = @CHECK_LIBS@
147CPP = @CPP@
148CPPFLAGS = @CPPFLAGS@
149CURL_CFLAGS = @CURL_CFLAGS@
150CURL_LIBS = @CURL_LIBS@
151CXX = @CXX@
152CXXCPP = @CXXCPP@
153CXXDEPMODE = @CXXDEPMODE@
154CXXFLAGS = @CXXFLAGS@
155CYGPATH_W = @CYGPATH_W@
156DEFS = @DEFS@
157DEPDIR = @DEPDIR@
158DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
159DIRECTFB_LIBS = @DIRECTFB_LIBS@
160DLLTOOL = @DLLTOOL@
161DSYMUTIL = @DSYMUTIL@
162DUMPBIN = @DUMPBIN@
163ECHO_C = @ECHO_C@
164ECHO_N = @ECHO_N@
165ECHO_T = @ECHO_T@
166ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
167ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
168EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
169EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
170EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
171EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
172EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
173EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
174EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
175EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
176EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
177EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
178EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
179EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
180EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
181EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
182EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
183EGREP = @EGREP@
184EINA_CFLAGS = @EINA_CFLAGS@
185EINA_LIBS = @EINA_LIBS@
186ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
187ESCAPE_LIBS = @ESCAPE_LIBS@
188EVAS_CFLAGS = @EVAS_CFLAGS@
189EVAS_LIBS = @EVAS_LIBS@
190EVIL_CFLAGS = @EVIL_CFLAGS@
191EVIL_LIBS = @EVIL_LIBS@
192EXEEXT = @EXEEXT@
193FGREP = @FGREP@
194GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
195GLIB_CFLAGS = @GLIB_CFLAGS@
196GLIB_LIBS = @GLIB_LIBS@
197GMSGFMT = @GMSGFMT@
198GMSGFMT_015 = @GMSGFMT_015@
199GREP = @GREP@
200INSTALL = @INSTALL@
201INSTALL_DATA = @INSTALL_DATA@
202INSTALL_PROGRAM = @INSTALL_PROGRAM@
203INSTALL_SCRIPT = @INSTALL_SCRIPT@
204INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
205INTLLIBS = @INTLLIBS@
206INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
207KEYSYMDEFS = @KEYSYMDEFS@
208LD = @LD@
209LDFLAGS = @LDFLAGS@
210LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
211LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
212LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
213LIBICONV = @LIBICONV@
214LIBINTL = @LIBINTL@
215LIBOBJS = @LIBOBJS@
216LIBS = @LIBS@
217LIBTOOL = @LIBTOOL@
218LIPO = @LIPO@
219LN_S = @LN_S@
220LTLIBICONV = @LTLIBICONV@
221LTLIBINTL = @LTLIBINTL@
222LTLIBOBJS = @LTLIBOBJS@
223MAKEINFO = @MAKEINFO@
224MKDIR_P = @MKDIR_P@
225MSGFMT = @MSGFMT@
226MSGFMT_015 = @MSGFMT_015@
227MSGMERGE = @MSGMERGE@
228NM = @NM@
229NMEDIT = @NMEDIT@
230OBJC = @OBJC@
231OBJCDEPMODE = @OBJCDEPMODE@
232OBJCFLAGS = @OBJCFLAGS@
233OBJDUMP = @OBJDUMP@
234OBJEXT = @OBJEXT@
235OTOOL = @OTOOL@
236OTOOL64 = @OTOOL64@
237PACKAGE = @PACKAGE@
238PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
239PACKAGE_NAME = @PACKAGE_NAME@
240PACKAGE_STRING = @PACKAGE_STRING@
241PACKAGE_TARNAME = @PACKAGE_TARNAME@
242PACKAGE_URL = @PACKAGE_URL@
243PACKAGE_VERSION = @PACKAGE_VERSION@
244PATH_SEPARATOR = @PATH_SEPARATOR@
245PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
246PIXMAN_LIBS = @PIXMAN_LIBS@
247PKG_CONFIG = @PKG_CONFIG@
248PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
249PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
250POSUB = @POSUB@
251RANLIB = @RANLIB@
252SDL_CFLAGS = @SDL_CFLAGS@
253SDL_CONFIG = @SDL_CONFIG@
254SDL_LIBS = @SDL_LIBS@
255SED = @SED@
256SET_MAKE = @SET_MAKE@
257SHELL = @SHELL@
258SSL_CFLAGS = @SSL_CFLAGS@
259SSL_LIBS = @SSL_LIBS@
260STRIP = @STRIP@
261TLS2_CFLAGS = @TLS2_CFLAGS@
262TLS2_LIBS = @TLS2_LIBS@
263TLS_CFLAGS = @TLS_CFLAGS@
264TLS_LIBS = @TLS_LIBS@
265TSLIB_CFLAGS = @TSLIB_CFLAGS@
266TSLIB_LIBS = @TSLIB_LIBS@
267USE_NLS = @USE_NLS@
268VERSION = @VERSION@
269VMAJ = @VMAJ@
270WIN32_CFLAGS = @WIN32_CFLAGS@
271WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
272WIN32_LIBS = @WIN32_LIBS@
273XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
274XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
275XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
276XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
277XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
278XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
279XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
280XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
281XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
282XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
283XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
284XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
285XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
286XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
287XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
288XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
289XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
290XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
291XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
292XCB_X11_LIBS = @XCB_X11_LIBS@
293XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
294XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
295XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
296XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
297XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
298XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
299XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
300XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
301XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
302XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
303XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
304XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
305XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
306XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
307XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
308XDAMAGE_LIBS = @XDAMAGE_LIBS@
309XDPMS_CFLAGS = @XDPMS_CFLAGS@
310XDPMS_LIBS = @XDPMS_LIBS@
311XFIXES_CFLAGS = @XFIXES_CFLAGS@
312XFIXES_LIBS = @XFIXES_LIBS@
313XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
314XGESTURE_LIBS = @XGESTURE_LIBS@
315XGETTEXT = @XGETTEXT@
316XGETTEXT_015 = @XGETTEXT_015@
317XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
318XI2_CFLAGS = @XI2_CFLAGS@
319XI2_LIBS = @XI2_LIBS@
320XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
321XINERAMA_LIBS = @XINERAMA_LIBS@
322XKB_CFLAGS = @XKB_CFLAGS@
323XKB_LIBS = @XKB_LIBS@
324XMKMF = @XMKMF@
325XPRINT_CFLAGS = @XPRINT_CFLAGS@
326XPRINT_LIBS = @XPRINT_LIBS@
327XRANDR_CFLAGS = @XRANDR_CFLAGS@
328XRANDR_LIBS = @XRANDR_LIBS@
329XRENDER_CFLAGS = @XRENDER_CFLAGS@
330XRENDER_LIBS = @XRENDER_LIBS@
331XSS_CFLAGS = @XSS_CFLAGS@
332XSS_LIBS = @XSS_LIBS@
333XTEST_CFLAGS = @XTEST_CFLAGS@
334XTEST_LIBS = @XTEST_LIBS@
335X_CFLAGS = @X_CFLAGS@
336X_EXTRA_LIBS = @X_EXTRA_LIBS@
337X_LIBS = @X_LIBS@
338X_PRE_LIBS = @X_PRE_LIBS@
339Xcursor_cflags = @Xcursor_cflags@
340Xcursor_libs = @Xcursor_libs@
341abs_builddir = @abs_builddir@
342abs_srcdir = @abs_srcdir@
343abs_top_builddir = @abs_top_builddir@
344abs_top_srcdir = @abs_top_srcdir@
345ac_ct_CC = @ac_ct_CC@
346ac_ct_CXX = @ac_ct_CXX@
347ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
348ac_ct_OBJC = @ac_ct_OBJC@
349am__include = @am__include@
350am__leading_dot = @am__leading_dot@
351am__quote = @am__quote@
352am__tar = @am__tar@
353am__untar = @am__untar@
354bindir = @bindir@
355build = @build@
356build_alias = @build_alias@
357build_cpu = @build_cpu@
358build_os = @build_os@
359build_vendor = @build_vendor@
360builddir = @builddir@
361cocoa_ldflags = @cocoa_ldflags@
362datadir = @datadir@
363datarootdir = @datarootdir@
364dlopen_libs = @dlopen_libs@
365docdir = @docdir@
366dvidir = @dvidir@
367ecore_cocoa_cflags = @ecore_cocoa_cflags@
368ecore_cocoa_libs = @ecore_cocoa_libs@
369ecore_con_cflags = @ecore_con_cflags@
370ecore_con_libs = @ecore_con_libs@
371ecore_directfb_cflags = @ecore_directfb_cflags@
372ecore_directfb_libs = @ecore_directfb_libs@
373ecore_evas_cflags = @ecore_evas_cflags@
374ecore_evas_libs = @ecore_evas_libs@
375ecore_fb_cflags = @ecore_fb_cflags@
376ecore_fb_libs = @ecore_fb_libs@
377ecore_file_cflags = @ecore_file_cflags@
378ecore_file_libs = @ecore_file_libs@
379ecore_imf_cflags = @ecore_imf_cflags@
380ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
381ecore_imf_evas_libs = @ecore_imf_evas_libs@
382ecore_imf_libs = @ecore_imf_libs@
383ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
384ecore_imf_xim_libs = @ecore_imf_xim_libs@
385ecore_input_cflags = @ecore_input_cflags@
386ecore_input_evas_cflags = @ecore_input_evas_cflags@
387ecore_input_evas_libs = @ecore_input_evas_libs@
388ecore_input_libs = @ecore_input_libs@
389ecore_ipc_cflags = @ecore_ipc_cflags@
390ecore_ipc_libs = @ecore_ipc_libs@
391ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
392ecore_psl1ght_libs = @ecore_psl1ght_libs@
393ecore_sdl_cflags = @ecore_sdl_cflags@
394ecore_sdl_libs = @ecore_sdl_libs@
395ecore_win32_cflags = @ecore_win32_cflags@
396ecore_win32_libs = @ecore_win32_libs@
397ecore_wince_cflags = @ecore_wince_cflags@
398ecore_wince_libs = @ecore_wince_libs@
399ecore_x_cflags = @ecore_x_cflags@
400ecore_x_libs = @ecore_x_libs@
401ecore_x_libs_private = @ecore_x_libs_private@
402efl_doxygen = @efl_doxygen@
403efl_have_doxygen = @efl_have_doxygen@
404exec_prefix = @exec_prefix@
405have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
406host = @host@
407host_alias = @host_alias@
408host_cpu = @host_cpu@
409host_os = @host_os@
410host_vendor = @host_vendor@
411htmldir = @htmldir@
412includedir = @includedir@
413infodir = @infodir@
414install_sh = @install_sh@
415libdir = @libdir@
416libexecdir = @libexecdir@
417localedir = @localedir@
418localstatedir = @localstatedir@
419lt_ECHO = @lt_ECHO@
420lt_enable_auto_import = @lt_enable_auto_import@
421mandir = @mandir@
422mkdir_p = @mkdir_p@
423oldincludedir = @oldincludedir@
424pdfdir = @pdfdir@
425pkgconfig_requires_private = @pkgconfig_requires_private@
426prefix = @prefix@
427program_transform_name = @program_transform_name@
428psdir = @psdir@
429release_info = @release_info@
430requirements_ecore = @requirements_ecore@
431requirements_ecore_cocoa = @requirements_ecore_cocoa@
432requirements_ecore_con = @requirements_ecore_con@
433requirements_ecore_directfb = @requirements_ecore_directfb@
434requirements_ecore_evas = @requirements_ecore_evas@
435requirements_ecore_fb = @requirements_ecore_fb@
436requirements_ecore_file = @requirements_ecore_file@
437requirements_ecore_imf = @requirements_ecore_imf@
438requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
439requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
440requirements_ecore_input = @requirements_ecore_input@
441requirements_ecore_input_evas = @requirements_ecore_input_evas@
442requirements_ecore_ipc = @requirements_ecore_ipc@
443requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
444requirements_ecore_sdl = @requirements_ecore_sdl@
445requirements_ecore_win32 = @requirements_ecore_win32@
446requirements_ecore_wince = @requirements_ecore_wince@
447requirements_ecore_x = @requirements_ecore_x@
448rt_libs = @rt_libs@
449sbindir = @sbindir@
450sharedstatedir = @sharedstatedir@
451srcdir = @srcdir@
452sysconfdir = @sysconfdir@
453target_alias = @target_alias@
454top_build_prefix = @top_build_prefix@
455top_builddir = @top_builddir@
456top_srcdir = @top_srcdir@
457version_info = @version_info@
458x_cflags = @x_cflags@
459x_includes = @x_includes@
460x_libs = @x_libs@
461MAINTAINERCLEANFILES = Makefile.in
462AM_CPPFLAGS = \
463-I$(top_srcdir)/src/lib/ecore \
464-I$(top_builddir)/src/lib/ecore \
465@DIRECTFB_CFLAGS@ @EINA_CFLAGS@
466
467lib_LTLIBRARIES = libecore_directfb.la
468includes_HEADERS = Ecore_DirectFB.h
469includesdir = $(includedir)/ecore-@VMAJ@
470libecore_directfb_la_SOURCES = \
471ecore_directfb.c \
472ecore_directfb_keys.h \
473ecore_directfb_private.h
474
475libecore_directfb_la_LIBADD = \
476$(top_builddir)/src/lib/ecore/libecore.la \
477@DIRECTFB_LIBS@ \
478@EINA_LIBS@
479
480libecore_directfb_la_LDFLAGS = -version-info @version_info@ @release_info@
481libecore_directfb_la_DEPENDENCIES = \
482$(top_builddir)/src/lib/ecore/libecore.la
483
484EXTRA_DIST = \
485Ecore_DirectFB.h \
486ecore_directfb.c \
487ecore_directfb_keys.h \
488ecore_directfb_private.h
489
490all: all-am
491
492.SUFFIXES:
493.SUFFIXES: .c .lo .o .obj
494$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
495 @for dep in $?; do \
496 case '$(am__configure_deps)' in \
497 *$$dep*) \
498 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
499 && { if test -f $@; then exit 0; else break; fi; }; \
500 exit 1;; \
501 esac; \
502 done; \
503 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_directfb/Makefile'; \
504 $(am__cd) $(top_srcdir) && \
505 $(AUTOMAKE) --gnu src/lib/ecore_directfb/Makefile
506.PRECIOUS: Makefile
507Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
508 @case '$?' in \
509 *config.status*) \
510 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
511 *) \
512 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
513 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
514 esac;
515
516$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
517 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
518
519$(top_srcdir)/configure: $(am__configure_deps)
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
521$(ACLOCAL_M4): $(am__aclocal_m4_deps)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523$(am__aclocal_m4_deps):
524install-libLTLIBRARIES: $(lib_LTLIBRARIES)
525 @$(NORMAL_INSTALL)
526 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
527 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
528 list2=; for p in $$list; do \
529 if test -f $$p; then \
530 list2="$$list2 $$p"; \
531 else :; fi; \
532 done; \
533 test -z "$$list2" || { \
534 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
535 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
536 }
537
538uninstall-libLTLIBRARIES:
539 @$(NORMAL_UNINSTALL)
540 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
541 for p in $$list; do \
542 $(am__strip_dir) \
543 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
544 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
545 done
546
547clean-libLTLIBRARIES:
548 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
549 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
550 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
551 test "$$dir" != "$$p" || dir=.; \
552 echo "rm -f \"$${dir}/so_locations\""; \
553 rm -f "$${dir}/so_locations"; \
554 done
555libecore_directfb.la: $(libecore_directfb_la_OBJECTS) $(libecore_directfb_la_DEPENDENCIES)
556 $(AM_V_CCLD)$(libecore_directfb_la_LINK) -rpath $(libdir) $(libecore_directfb_la_OBJECTS) $(libecore_directfb_la_LIBADD) $(LIBS)
557
558mostlyclean-compile:
559 -rm -f *.$(OBJEXT)
560
561distclean-compile:
562 -rm -f *.tab.c
563
564@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_directfb.Plo@am__quote@
565
566.c.o:
567@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
568@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
569@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
570@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
572@am__fastdepCC_FALSE@ $(COMPILE) -c $<
573
574.c.obj:
575@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
576@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
577@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
578@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
580@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
581
582.c.lo:
583@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
584@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
585@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
587@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
588@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
589
590mostlyclean-libtool:
591 -rm -f *.lo
592
593clean-libtool:
594 -rm -rf .libs _libs
595install-includesHEADERS: $(includes_HEADERS)
596 @$(NORMAL_INSTALL)
597 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
598 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
599 for p in $$list; do \
600 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
601 echo "$$d$$p"; \
602 done | $(am__base_list) | \
603 while read files; do \
604 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
605 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
606 done
607
608uninstall-includesHEADERS:
609 @$(NORMAL_UNINSTALL)
610 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
611 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
612 test -n "$$files" || exit 0; \
613 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
614 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
615
616ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
617 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
618 unique=`for i in $$list; do \
619 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
620 done | \
621 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
622 END { if (nonempty) { for (i in files) print i; }; }'`; \
623 mkid -fID $$unique
624tags: TAGS
625
626TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
627 $(TAGS_FILES) $(LISP)
628 set x; \
629 here=`pwd`; \
630 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
631 unique=`for i in $$list; do \
632 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
633 done | \
634 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
635 END { if (nonempty) { for (i in files) print i; }; }'`; \
636 shift; \
637 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
638 test -n "$$unique" || unique=$$empty_fix; \
639 if test $$# -gt 0; then \
640 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
641 "$$@" $$unique; \
642 else \
643 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
644 $$unique; \
645 fi; \
646 fi
647ctags: CTAGS
648CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
649 $(TAGS_FILES) $(LISP)
650 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
651 unique=`for i in $$list; do \
652 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
653 done | \
654 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
655 END { if (nonempty) { for (i in files) print i; }; }'`; \
656 test -z "$(CTAGS_ARGS)$$unique" \
657 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
658 $$unique
659
660GTAGS:
661 here=`$(am__cd) $(top_builddir) && pwd` \
662 && $(am__cd) $(top_srcdir) \
663 && gtags -i $(GTAGS_ARGS) "$$here"
664
665distclean-tags:
666 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
667
668distdir: $(DISTFILES)
669 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
670 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
671 list='$(DISTFILES)'; \
672 dist_files=`for file in $$list; do echo $$file; done | \
673 sed -e "s|^$$srcdirstrip/||;t" \
674 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
675 case $$dist_files in \
676 */*) $(MKDIR_P) `echo "$$dist_files" | \
677 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
678 sort -u` ;; \
679 esac; \
680 for file in $$dist_files; do \
681 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
682 if test -d $$d/$$file; then \
683 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
684 if test -d "$(distdir)/$$file"; then \
685 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
686 fi; \
687 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
688 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
689 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
690 fi; \
691 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
692 else \
693 test -f "$(distdir)/$$file" \
694 || cp -p $$d/$$file "$(distdir)/$$file" \
695 || exit 1; \
696 fi; \
697 done
698check-am: all-am
699check: check-am
700all-am: Makefile $(LTLIBRARIES) $(HEADERS)
701installdirs:
702 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
703 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
704 done
705install: install-am
706install-exec: install-exec-am
707install-data: install-data-am
708uninstall: uninstall-am
709
710install-am: all-am
711 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
712
713installcheck: installcheck-am
714install-strip:
715 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
716 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
717 `test -z '$(STRIP)' || \
718 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
719mostlyclean-generic:
720
721clean-generic:
722
723distclean-generic:
724 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
725 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
726
727maintainer-clean-generic:
728 @echo "This command is intended for maintainers to use"
729 @echo "it deletes files that may require special tools to rebuild."
730 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
731clean: clean-am
732
733clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
734 mostlyclean-am
735
736distclean: distclean-am
737 -rm -rf ./$(DEPDIR)
738 -rm -f Makefile
739distclean-am: clean-am distclean-compile distclean-generic \
740 distclean-tags
741
742dvi: dvi-am
743
744dvi-am:
745
746html: html-am
747
748html-am:
749
750info: info-am
751
752info-am:
753
754install-data-am: install-includesHEADERS
755
756install-dvi: install-dvi-am
757
758install-dvi-am:
759
760install-exec-am: install-libLTLIBRARIES
761
762install-html: install-html-am
763
764install-html-am:
765
766install-info: install-info-am
767
768install-info-am:
769
770install-man:
771
772install-pdf: install-pdf-am
773
774install-pdf-am:
775
776install-ps: install-ps-am
777
778install-ps-am:
779
780installcheck-am:
781
782maintainer-clean: maintainer-clean-am
783 -rm -rf ./$(DEPDIR)
784 -rm -f Makefile
785maintainer-clean-am: distclean-am maintainer-clean-generic
786
787mostlyclean: mostlyclean-am
788
789mostlyclean-am: mostlyclean-compile mostlyclean-generic \
790 mostlyclean-libtool
791
792pdf: pdf-am
793
794pdf-am:
795
796ps: ps-am
797
798ps-am:
799
800uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
801
802.MAKE: install-am install-strip
803
804.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
805 clean-libLTLIBRARIES clean-libtool ctags distclean \
806 distclean-compile distclean-generic distclean-libtool \
807 distclean-tags distdir dvi dvi-am html html-am info info-am \
808 install install-am install-data install-data-am install-dvi \
809 install-dvi-am install-exec install-exec-am install-html \
810 install-html-am install-includesHEADERS install-info \
811 install-info-am install-libLTLIBRARIES install-man install-pdf \
812 install-pdf-am install-ps install-ps-am install-strip \
813 installcheck installcheck-am installdirs maintainer-clean \
814 maintainer-clean-generic mostlyclean mostlyclean-compile \
815 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
816 tags uninstall uninstall-am uninstall-includesHEADERS \
817 uninstall-libLTLIBRARIES
818
819
820# Tell versions [3.59,3.63) of GNU make to not export all variables.
821# Otherwise a system limit (for SysV at least) may be exceeded.
822.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_directfb/ecore_directfb.c b/libraries/ecore/src/lib/ecore_directfb/ecore_directfb.c
new file mode 100644
index 0000000..f45b3c3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_directfb/ecore_directfb.c
@@ -0,0 +1,757 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdio.h>
6#include <string.h>
7
8#include "Ecore_DirectFB.h"
9#include "ecore_directfb_private.h"
10#include "ecore_directfb_keys.h"
11#include "Ecore.h"
12#include "ecore_private.h"
13
14/* ecore_directfb */
15/******************/
16/* About */
17/* with this you can create windows of directfb and handle events through ecore
18 * TODO:
19 * - handle all event types
20 * -
21 * */
22int _ecore_directfb_log_dom = -1;
23
24static int _ecore_directfb_init_count = 0;
25
26static int _window_event_fd = 0;
27static int _input_event_fd = 0;
28
29static int _ecore_directfb_fullscreen_window_id = 0;
30static int _cursor_x = 0;
31static int _cursor_y = 0;
32
33EAPI int ECORE_DIRECTFB_EVENT_POSITION = 0;
34EAPI int ECORE_DIRECTFB_EVENT_SIZE = 0;
35EAPI int ECORE_DIRECTFB_EVENT_CLOSE = 0;
36EAPI int ECORE_DIRECTFB_EVENT_DESTROYED = 0;
37EAPI int ECORE_DIRECTFB_EVENT_GOT_FOCUS = 0;
38EAPI int ECORE_DIRECTFB_EVENT_LOST_FOCUS = 0;
39EAPI int ECORE_DIRECTFB_EVENT_KEY_DOWN = 0;
40EAPI int ECORE_DIRECTFB_EVENT_KEY_UP = 0;
41EAPI int ECORE_DIRECTFB_EVENT_BUTTON_DOWN = 0;
42EAPI int ECORE_DIRECTFB_EVENT_BUTTON_UP = 0;
43EAPI int ECORE_DIRECTFB_EVENT_MOTION = 0;
44EAPI int ECORE_DIRECTFB_EVENT_ENTER = 0;
45EAPI int ECORE_DIRECTFB_EVENT_LEAVE = 0;
46EAPI int ECORE_DIRECTFB_EVENT_WHEEL = 0;
47
48static Ecore_Fd_Handler *_window_event_fd_handler_handle = NULL;
49static Ecore_Fd_Handler *_input_event_fd_handler_handle = NULL;
50
51/* this hash is to store all the possible key names for fast lookup */
52static Eina_Hash *_ecore_directfb_key_symbols_hash = NULL;
53
54static IDirectFB *_dfb = NULL; // the main interface
55static IDirectFBEventBuffer *_window_event; // the main event buffer (all windows are attached to this)
56static IDirectFBEventBuffer *_input_event; // the main event buffer (all windows are attached to this)
57static IDirectFBDisplayLayer *_layer; // the main layer
58static DFBResult _err; // useful for DFBCHECK
59
60/*******************/
61/* local functions */
62/*******************/
63
64/* free ecore directfb events functions */
65/****************************************/
66
67static void
68_ecore_directfb_event_free_key_down(void *data __UNUSED__, void *ev)
69{
70 Ecore_DirectFB_Event_Key_Up *e;
71
72 e = ev;
73 if(e->name)
74 free(e->name);
75
76 if (e->string)
77 free(e->string);
78
79 if (e->key_compose)
80 free(e->key_compose);
81
82 free(e);
83} /* _ecore_directfb_event_free_key_down */
84
85static void
86_ecore_directfb_event_free_key_up(void *data __UNUSED__, void *ev)
87{
88 Ecore_DirectFB_Event_Key_Up *e;
89
90 e = ev;
91 if(e->name)
92 free(e->name);
93
94 if (e->string)
95 free(e->string);
96
97 if (e->key_compose)
98 free(e->key_compose);
99
100 free(e);
101} /* _ecore_directfb_event_free_key_up */
102
103/* directfb window input events handler */
104/****************************************/
105
106static void
107_ecore_directfb_event_handle_motion(DFBEvent *evt)
108{
109 Ecore_DirectFB_Event_Motion *e;
110 e = calloc(1, sizeof(Ecore_DirectFB_Event_Motion));
111
112 switch(evt->clazz)
113 {
114 case DFEC_INPUT:
115 e->modifiers = 0;
116 switch(evt->input.axis)
117 {
118 case DIAI_X:
119 e->x = _cursor_x = evt->input.axisabs;
120 e->y = _cursor_y;
121 break;
122
123 case DIAI_Y:
124 e->y = _cursor_y = evt->input.axisabs;
125 e->x = _cursor_x;
126 break;
127
128 case DIAI_Z:
129 //_ecore_directfb_event_handle_wheel(evt);
130 return;
131
132 default:
133 return;
134 } /* switch */
135 e->win = _ecore_directfb_fullscreen_window_id;
136 e->time = 0;
137 break;
138
139 case DFEC_WINDOW:
140 e->modifiers = 0;
141 e->x = evt->window.x;
142 e->y = evt->window.y;
143 e->win = evt->window.window_id;
144 e->time = 0;
145 break;
146
147 default:
148 break;
149 } /* switch */
150 ecore_event_add(ECORE_DIRECTFB_EVENT_MOTION, e, NULL, NULL);
151} /* _ecore_directfb_event_handle_motion */
152
153static void
154_ecore_directfb_event_handle_key_down(DFBEvent *evt)
155{
156 Ecore_DirectFB_Event_Key_Down *e;
157 unsigned int key_symbol;
158 struct keymap *k;
159
160 e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Down));
161
162 switch(evt->clazz)
163 {
164 case DFEC_INPUT:
165 key_symbol = evt->input.key_symbol;
166 k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
167
168 if(!k)
169 {
170 ERR("Symbol %0X of class DFEC_INPUT not found.", evt->input.key_symbol);
171 return;
172 }
173
174 e->name = strdup(k->name);
175 e->string = strdup(k->string);
176 e->key_compose = NULL;
177 e->win = _ecore_directfb_fullscreen_window_id;
178 e->time = 0;
179 break;
180
181 case DFEC_WINDOW:
182 key_symbol = evt->window.key_symbol;
183 k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
184
185 if(!k)
186 {
187 ERR("Symbol %0X of class DFEC_WINDOW not found.", evt->window.key_symbol);
188 return;
189 }
190
191 e->name = strdup(k->name);
192 e->string = strdup(k->string);
193 e->key_compose = NULL;
194 e->win = evt->window.window_id;
195 e->time = 0;
196 break;
197
198 default:
199 break;
200 } /* switch */
201
202 ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, e, _ecore_directfb_event_free_key_down, NULL);
203} /* _ecore_directfb_event_handle_key_down */
204
205static void
206_ecore_directfb_event_handle_key_up(DFBEvent *evt)
207{
208 Ecore_DirectFB_Event_Key_Up *e;
209 unsigned int key_symbol;
210 struct keymap *k;
211
212 e = calloc(1, sizeof(Ecore_DirectFB_Event_Key_Up));
213
214 switch(evt->clazz)
215 {
216 case DFEC_INPUT:
217 key_symbol = evt->input.key_symbol;
218 k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
219
220 if(!k)
221 {
222 ERR("Symbol %0X of class DFEC_INPUT not found.", evt->input.key_symbol);
223 return;
224 }
225
226 e->name = strdup(k->name);
227 e->string = strdup(k->string);
228 e->key_compose = NULL;
229 e->win = _ecore_directfb_fullscreen_window_id;
230 e->time = 0;
231 break;
232
233 case DFEC_WINDOW:
234 key_symbol = evt->window.key_symbol;
235 k = eina_hash_find(_ecore_directfb_key_symbols_hash, &key_symbol);
236
237 if(!k)
238 {
239 ERR("Symbol %0X of class DFEC_WINDOW not found.", evt->window.key_symbol);
240 return;
241 }
242
243 e->name = strdup(k->name);
244 e->string = strdup(k->string);
245 e->key_compose = NULL;
246 e->win = evt->window.window_id;
247 e->time = 0;
248 break;
249
250 default:
251 break;
252 } /* switch */
253 ecore_event_add(ECORE_DIRECTFB_EVENT_KEY_UP, e, _ecore_directfb_event_free_key_up, NULL);
254} /* _ecore_directfb_event_handle_key_up */
255
256static void
257_ecore_directfb_event_handle_button_down(DFBEvent *evt)
258{
259 Ecore_DirectFB_Event_Button_Down *e;
260 e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Down));
261
262 switch(evt->clazz)
263 {
264 case DFEC_INPUT:
265 e->button = evt->input.button + 1;
266 e->modifiers = 0;
267 DFBCHECK(_layer->GetCursorPosition(_layer,&e->x,&e->y));
268 e->x = _cursor_x;
269 e->y = _cursor_y;
270 e->win = _ecore_directfb_fullscreen_window_id;
271 e->time = 0;
272
273 break;
274
275 case DFEC_WINDOW:
276 e->button = evt->window.button + 1;
277 e->modifiers = 0;
278 e->x = evt->window.x;
279 e->y = evt->window.y;
280 e->win = evt->window.window_id;
281 e->time = 0;
282 break;
283
284 default:
285 break;
286 } /* switch */
287
288 ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, e, NULL, NULL);
289} /* _ecore_directfb_event_handle_button_down */
290
291static void
292_ecore_directfb_event_handle_button_up(DFBEvent *evt)
293{
294 Ecore_DirectFB_Event_Button_Up *e;
295 e = calloc(1, sizeof(Ecore_DirectFB_Event_Button_Up));
296
297 switch(evt->clazz)
298 {
299 case DFEC_INPUT:
300 e->button = evt->input.button + 1;
301 e->modifiers = 0;
302 e->x = _cursor_x;
303 e->y = _cursor_y;
304 e->win = _ecore_directfb_fullscreen_window_id;
305 e->time = 0;
306
307 break;
308
309 case DFEC_WINDOW:
310 e->button = evt->window.button + 1;
311 e->modifiers = 0;
312 e->x = evt->window.x;
313 e->y = evt->window.y;
314 e->win = evt->window.window_id;
315 e->time = 0;
316 break;
317
318 default:
319 break;
320 } /* switch */
321 ecore_event_add(ECORE_DIRECTFB_EVENT_BUTTON_UP, e, NULL, NULL);
322} /* _ecore_directfb_event_handle_button_up */
323
324static void
325_ecore_directfb_event_handle_enter(DFBWindowEvent *evt)
326{
327 Ecore_DirectFB_Event_Enter *e;
328 e = calloc(1, sizeof(Ecore_DirectFB_Event_Enter));
329
330 e->modifiers = 0;
331 e->x = evt->x;
332 e->y = evt->y;
333 e->win = evt->window_id;
334 e->time = 0;
335
336 ecore_event_add(ECORE_DIRECTFB_EVENT_ENTER, e, NULL, NULL);
337} /* _ecore_directfb_event_handle_enter */
338
339static void
340_ecore_directfb_event_handle_leave(DFBWindowEvent *evt)
341{
342 Ecore_DirectFB_Event_Leave *e;
343 e = calloc(1, sizeof(Ecore_DirectFB_Event_Leave));
344
345 e->modifiers = 0;
346 e->x = evt->x;
347 e->y = evt->y;
348 e->win = evt->window_id;
349 e->time = 0;
350
351 ecore_event_add(ECORE_DIRECTFB_EVENT_LEAVE, e, NULL, NULL);
352} /* _ecore_directfb_event_handle_leave */
353
354static void
355_ecore_directfb_event_handle_wheel(DFBWindowEvent *evt)
356{
357 Ecore_DirectFB_Event_Wheel *e;
358 e = calloc(1, sizeof(Ecore_DirectFB_Event_Wheel));
359
360 // currently there's no direction (only up/down);
361 e->direction = 0;
362 e->z = evt->step;
363 e->modifiers = 0;
364 e->win = evt->window_id;
365 e->time = 0;
366
367 ecore_event_add(ECORE_DIRECTFB_EVENT_WHEEL, e, NULL, NULL);
368} /* _ecore_directfb_event_handle_wheel */
369
370static void
371_ecore_directfb_event_handle_got_focus(DFBWindowEvent *evt)
372{
373 Ecore_DirectFB_Event_Got_Focus *e;
374 e = calloc(1, sizeof(Ecore_DirectFB_Event_Got_Focus));
375
376 e->win = evt->window_id;
377 e->time = 0;
378
379 ecore_event_add(ECORE_DIRECTFB_EVENT_GOT_FOCUS, e, NULL, NULL);
380} /* _ecore_directfb_event_handle_got_focus */
381
382static void
383_ecore_directfb_event_handle_lost_focus(DFBWindowEvent *evt)
384{
385 Ecore_DirectFB_Event_Lost_Focus *e;
386 e = calloc(1, sizeof(Ecore_DirectFB_Event_Lost_Focus));
387
388 e->win = evt->window_id;
389 e->time = 0;
390
391 ecore_event_add(ECORE_DIRECTFB_EVENT_LOST_FOCUS, e, NULL, NULL);
392} /* _ecore_directfb_event_handle_lost_focus */
393
394/* inputs and windows fds handlers */
395/***********************************/
396/* TODO fix this to handle windows and input events (fullscreen/window mode)
397 * in fullscreen theres no window_id so get the id from a global var (only one fullscreen
398 * window at a time */
399
400static Eina_Bool
401_ecore_directfb_input_event_fd_handler(void *data __UNUSED__,Ecore_Fd_Handler *fd_handler __UNUSED__)
402{
403 DFBEvent evt;
404 int v = 0;
405
406 v = read(_input_event_fd, &evt, sizeof(DFBEvent));
407 if (v < 0)
408 return EINA_TRUE;
409
410 if (v < 1)
411 return EINA_TRUE;
412
413 /* we are getting duplicate events, only parse if we are in fullscreen */
414 //if(_ecore_directfb_fullscreen_window_id == 0) break;
415 if(evt.input.type == DIET_KEYPRESS)
416 _ecore_directfb_event_handle_key_down(&evt);
417
418 if(evt.input.type == DIET_KEYRELEASE)
419 _ecore_directfb_event_handle_key_up(&evt);
420
421 if(evt.input.type == DIET_BUTTONPRESS)
422 _ecore_directfb_event_handle_button_down(&evt);
423
424 if(evt.input.type == DIET_BUTTONRELEASE)
425 _ecore_directfb_event_handle_button_up(&evt);
426
427 if(evt.input.type == DIET_AXISMOTION)
428 _ecore_directfb_event_handle_motion(&evt);
429
430 return EINA_TRUE;
431} /* _ecore_directfb_input_event_fd_handler */
432
433static Eina_Bool
434_ecore_directfb_window_event_fd_handler(void *data __UNUSED__,Ecore_Fd_Handler *fd_handler __UNUSED__)
435{
436 DFBEvent evt;
437 int v = 0;
438
439 v = read(_window_event_fd, &evt, sizeof(DFBEvent));
440 if (v < 0)
441 return EINA_TRUE;
442
443 if (v < 1)
444 return EINA_TRUE;
445
446 if(evt.window.type & DWET_POSITION)
447 INF("position");
448
449 if(evt.window.type & DWET_SIZE)
450 INF("size");
451
452 if(evt.window.type & DWET_CLOSE)
453 INF("close");
454
455 if(evt.window.type & DWET_DESTROYED)
456 INF("destroyed");
457
458 if(evt.window.type & DWET_GOTFOCUS)
459 _ecore_directfb_event_handle_got_focus(&evt.window);
460
461 if(evt.window.type & DWET_LOSTFOCUS)
462 _ecore_directfb_event_handle_lost_focus(&evt.window);
463
464 if(evt.window.type & DWET_KEYDOWN)
465 _ecore_directfb_event_handle_key_down(&evt);
466
467 if(evt.window.type & DWET_KEYUP)
468 _ecore_directfb_event_handle_key_up(&evt);
469
470 if(evt.window.type & DWET_BUTTONDOWN)
471 _ecore_directfb_event_handle_button_down(&evt);
472
473 if(evt.window.type & DWET_BUTTONUP)
474 _ecore_directfb_event_handle_button_up(&evt);
475
476 if(evt.window.type & DWET_MOTION)
477 _ecore_directfb_event_handle_motion(&evt);
478
479 if(evt.window.type & DWET_ENTER)
480 _ecore_directfb_event_handle_enter(&evt.window);
481
482 if(evt.window.type & DWET_LEAVE)
483 _ecore_directfb_event_handle_leave(&evt.window);
484
485 if(evt.window.type & DWET_WHEEL)
486 _ecore_directfb_event_handle_wheel(&evt.window);
487
488 return EINA_TRUE;
489} /* _ecore_directfb_window_event_fd_handler */
490
491/* api functions */
492/*****************/
493
494EAPI IDirectFB *
495ecore_directfb_interface_get(void)
496{
497 return _dfb;
498} /* ecore_directfb_interface_get */
499
500EAPI Ecore_DirectFB_Window *
501ecore_directfb_window_new(int x, int y, int w, int h)
502{
503 Ecore_DirectFB_Window *window;
504 IDirectFBWindow *dfb_window;
505 IDirectFBSurface *dfb_surface = NULL;
506 DFBWindowDescription desc;
507 DFBWindowID id;
508
509 memset(&desc, 0, sizeof(DFBWindowDescription));
510 desc.flags = (DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS);
511 desc.posx = x;
512 desc.posy = y;
513 desc.width = w;
514 desc.height = h;
515 desc.caps = DWCAPS_ALPHACHANNEL;
516
517 DFBCHECK(_layer->CreateWindow(_layer, &desc, &dfb_window));
518
519 dfb_window->AttachEventBuffer(dfb_window, _window_event);
520 dfb_window->SetOptions(dfb_window,DWOP_NONE);
521 dfb_window->SetOpacity(dfb_window, 0xFF);
522
523 DFBCHECK(dfb_window->GetID(dfb_window, &id));
524 DFBCHECK(dfb_window->GetSurface(dfb_window,&dfb_surface));
525
526 window = malloc(sizeof(Ecore_DirectFB_Window));
527 window->id = id;
528 window->window = dfb_window;
529 window->surface = dfb_surface;
530 window->cursor = NULL;
531
532 return window;
533} /* ecore_directfb_window_new */
534
535EAPI void
536ecore_directfb_window_free(Ecore_DirectFB_Window *ecore_window)
537{
538 DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
539 DFBCHECK(ecore_window->window->Release(ecore_window->window));
540 free(ecore_window);
541} /* ecore_directfb_window_free */
542
543EAPI void
544ecore_directfb_window_move(Ecore_DirectFB_Window *ecore_window, int x, int y)
545{
546 DFBCHECK(ecore_window->window->MoveTo(ecore_window->window, x, y));
547} /* ecore_directfb_window_move */
548
549EAPI void
550ecore_directfb_window_resize(Ecore_DirectFB_Window *ecore_window, int w, int h)
551{
552 DFBCHECK(ecore_window->window->Resize(ecore_window->window, w, h));
553} /* ecore_directfb_window_resize */
554
555EAPI void
556ecore_directfb_window_focus(Ecore_DirectFB_Window *ecore_window)
557{
558 DFBCHECK(ecore_window->window->RequestFocus(ecore_window->window));
559} /* ecore_directfb_window_focus */
560
561EAPI void
562ecore_directfb_window_hide(Ecore_DirectFB_Window *ecore_window)
563{
564 DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window, 0));
565} /* ecore_directfb_window_hide */
566
567EAPI void
568ecore_directfb_window_show(Ecore_DirectFB_Window *ecore_window)
569{
570 DFBCHECK(ecore_window->window->SetOpacity(ecore_window->window, 0xFF));
571} /* ecore_directfb_window_show */
572
573EAPI void
574ecore_directfb_window_shaped_set(Ecore_DirectFB_Window *ecore_window, Eina_Bool set)
575{
576 DFBWindowOptions opts;
577
578 DFBCHECK(ecore_window->window->GetOptions(ecore_window->window, &opts));
579 if(set)
580 {
581 opts |= DWOP_SHAPED;
582 opts |= DWOP_ALPHACHANNEL;
583 DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
584 }
585 else
586 {
587 opts &= ~DWOP_SHAPED;
588 opts &= ~DWOP_ALPHACHANNEL;
589 DFBCHECK(ecore_window->window->SetOptions(ecore_window->window, opts));
590 }
591} /* ecore_directfb_window_shaped_set */
592
593EAPI void
594ecore_directfb_window_cursor_show(Ecore_DirectFB_Window *ecore_window, Eina_Bool show)
595{
596 if(!show)
597 {
598 /* create an empty cursor and set it */
599 IDirectFBSurface *cursor;
600 DFBSurfaceDescription desc;
601
602 memset(&desc, 0, sizeof(DFBSurfaceDescription));
603 desc.flags = (DSDESC_HEIGHT | DSDESC_WIDTH | DSDESC_PIXELFORMAT);
604 desc.width = 1;
605 desc.height = 1;
606 desc.pixelformat = DSPF_A1;
607
608 DFBCHECK(_dfb->CreateSurface(_dfb,&desc,&cursor));
609 DFBCHECK(cursor->Clear(cursor,0,0,0,0));
610 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor, 0, 0));
611 }
612 else
613 {
614 /* we already have a cursor surface so set it*/
615 if(ecore_window->cursor)
616 {
617 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, ecore_window->cursor->surface, ecore_window->cursor->hot_x, ecore_window->cursor->hot_y));
618 }
619 /* or just set the default directfb cursor */
620 else
621 {
622 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
623 }
624 }
625} /* ecore_directfb_window_cursor_show */
626
627EAPI void
628ecore_directfb_window_cursor_set(Ecore_DirectFB_Window *ecore_window, Ecore_DirectFB_Cursor *cursor)
629{
630 if((!cursor) && (ecore_window->cursor))
631 {
632 ecore_window->cursor = NULL;
633 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, NULL, 0, 0));
634 return;
635 }
636
637 if(cursor)
638 {
639 ecore_window->cursor = cursor;
640 DFBCHECK(ecore_window->window->SetCursorShape(ecore_window->window, cursor->surface, cursor->hot_x, cursor->hot_y));
641 }
642} /* ecore_directfb_window_cursor_set */
643
644EAPI void
645ecore_directfb_window_fullscreen_set(Ecore_DirectFB_Window *ecore_window, Eina_Bool on)
646{
647 // always release the surface (we are going to get a new one in both cases)
648 DFBCHECK(ecore_window->surface->Release(ecore_window->surface));
649 if(on)
650 {
651 DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_EXCLUSIVE));
652 DFBCHECK(_layer->GetSurface(_layer,&ecore_window->surface));
653 DFBCHECK(_dfb->CreateInputEventBuffer(_dfb, DICAPS_ALL, DFB_FALSE, &_input_event));
654 DFBCHECK(_input_event->CreateFileDescriptor(_input_event,&_input_event_fd));
655 /* the event of axismove sends one axis at a time, so we must store both */
656 DFBCHECK(_layer->GetCursorPosition(_layer,&_cursor_x,&_cursor_y));
657
658 _input_event_fd_handler_handle = ecore_main_fd_handler_add(_input_event_fd,ECORE_FD_READ,_ecore_directfb_input_event_fd_handler, NULL,NULL,NULL);
659 _ecore_directfb_fullscreen_window_id = ecore_window->id;
660 }
661 else
662 {
663 ecore_main_fd_handler_del(_input_event_fd_handler_handle);
664 DFBCHECK(_input_event->Release(_input_event));
665 DFBCHECK(_layer->SetCooperativeLevel(_layer,DLSCL_SHARED));
666 DFBCHECK(ecore_window->window->GetSurface(ecore_window->window, &ecore_window->surface));
667 _ecore_directfb_fullscreen_window_id = 0;
668 }
669} /* ecore_directfb_window_fullscreen_set */
670
671EAPI void
672ecore_directfb_window_size_get(Ecore_DirectFB_Window *ecore_window, int *w, int *h)
673{
674 DFBCHECK(ecore_window->surface->GetSize(ecore_window->surface,w,h));
675 return;
676} /* ecore_directfb_window_size_get */
677
678EAPI int
679ecore_directfb_init(const char *name __UNUSED__)
680{
681 int i = 0;
682
683 if (++_ecore_directfb_init_count != 1)
684 return _ecore_directfb_init_count;
685
686 _ecore_directfb_log_dom = eina_log_domain_register
687 ("ecore_directfb", ECORE_DIRECTFB_DEFAULT_LOG_COLOR);
688 if(_ecore_directfb_log_dom < 0)
689 {
690 EINA_LOG_ERR("Impossible to create a log domain for the Ecore directFB module.");
691 return _ecore_directfb_init_count--;
692 }
693
694 DFBCHECK(DirectFBInit(NULL,NULL));
695 DFBCHECK(DirectFBCreate(&_dfb));
696
697 DFBCHECK(_dfb->GetDisplayLayer(_dfb, DLID_PRIMARY, &_layer));
698 DFBCHECK(_layer->SetCooperativeLevel(_layer, DLSCL_SHARED));
699
700 /* window events and fd */
701 DFBCHECK(_dfb->CreateEventBuffer(_dfb, &_window_event));
702 DFBCHECK(_window_event->CreateFileDescriptor(_window_event,&_window_event_fd));
703 _window_event_fd_handler_handle = ecore_main_fd_handler_add(_window_event_fd,ECORE_FD_READ,_ecore_directfb_window_event_fd_handler, NULL,NULL,NULL);
704
705 /* register ecore directfb events */
706 ECORE_DIRECTFB_EVENT_POSITION = ecore_event_type_new();
707 ECORE_DIRECTFB_EVENT_SIZE = ecore_event_type_new();
708 ECORE_DIRECTFB_EVENT_CLOSE = ecore_event_type_new();
709 ECORE_DIRECTFB_EVENT_DESTROYED = ecore_event_type_new();
710 ECORE_DIRECTFB_EVENT_GOT_FOCUS = ecore_event_type_new();
711 ECORE_DIRECTFB_EVENT_LOST_FOCUS = ecore_event_type_new();
712 ECORE_DIRECTFB_EVENT_KEY_DOWN = ecore_event_type_new();
713 ECORE_DIRECTFB_EVENT_KEY_UP = ecore_event_type_new();
714 ECORE_DIRECTFB_EVENT_BUTTON_DOWN = ecore_event_type_new();
715 ECORE_DIRECTFB_EVENT_BUTTON_UP = ecore_event_type_new();
716 ECORE_DIRECTFB_EVENT_MOTION = ecore_event_type_new();
717 ECORE_DIRECTFB_EVENT_ENTER = ecore_event_type_new();
718 ECORE_DIRECTFB_EVENT_LEAVE = ecore_event_type_new();
719 ECORE_DIRECTFB_EVENT_WHEEL = ecore_event_type_new();
720
721 /* create the hash table for the keynames */
722 _ecore_directfb_key_symbols_hash = eina_hash_int32_new(free);
723 for(i = 0; i < _ecore_directfb_key_symbols_count; i++)
724 {
725 struct keymap *k;
726 k = malloc(sizeof(struct keymap));
727 k->name = _ecore_directfb_key_symbols[i].name;
728 k->string = _ecore_directfb_key_symbols[i].string;
729 eina_hash_add(_ecore_directfb_key_symbols_hash, &_ecore_directfb_key_symbols[i].id, k);
730 }
731 /* create the hash for the windows(key = windowid, val = Ecore_DirectFB_Window struct) */
732 return _ecore_directfb_init_count;
733} /* ecore_directfb_init */
734
735EAPI int
736ecore_directfb_shutdown(void)
737{
738 if (--_ecore_directfb_init_count != 0)
739 return _ecore_directfb_init_count;
740
741 ecore_main_fd_handler_del(_window_event_fd_handler_handle);
742 eina_hash_free(_ecore_directfb_key_symbols_hash);
743
744 if(_ecore_directfb_fullscreen_window_id)
745 {
746 DFBCHECK(_input_event->Release(_input_event));
747 ecore_main_fd_handler_del(_input_event_fd_handler_handle);
748 }
749
750 DFBCHECK(_window_event->Release(_window_event));
751 DFBCHECK(_layer->Release(_layer));
752 DFBCHECK(_dfb->Release(_dfb));
753 eina_log_domain_unregister(_ecore_directfb_log_dom);
754 _ecore_directfb_log_dom = -1;
755 return _ecore_directfb_init_count;
756} /* ecore_directfb_shutdown */
757
diff --git a/libraries/ecore/src/lib/ecore_directfb/ecore_directfb_keys.h b/libraries/ecore/src/lib/ecore_directfb/ecore_directfb_keys.h
new file mode 100644
index 0000000..19cca46
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_directfb/ecore_directfb_keys.h
@@ -0,0 +1,184 @@
1typedef struct _Ecore_DirectFB_Key_Symbols Ecore_DirectFB_Key_Symbols;
2struct _Ecore_DirectFB_Key_Symbols
3{
4 char *string;
5 char *name;
6 unsigned int id;
7};
8
9static const Ecore_DirectFB_Key_Symbols _ecore_directfb_key_symbols[] = {
10 {"\010", "BackSpace",DIKS_BACKSPACE},
11 {"\011", "Tab", DIKS_TAB},
12 {"\015", "Return", DIKS_RETURN},
13 {"", "Cancel", DIKS_CANCEL},
14 {"", "Escape", DIKS_ESCAPE},
15 {" ", "space", DIKS_SPACE},
16 {"!", "exclam", DIKS_EXCLAMATION_MARK},
17 {"\"", "quotedbl", DIKS_QUOTATION},
18 {"#", "numbersign", DIKS_NUMBER_SIGN},
19 {"$", "dollar", DIKS_DOLLAR_SIGN},
20 {"%", "percent", DIKS_PERCENT_SIGN},
21 {"&", "ampersand", DIKS_AMPERSAND},
22 {"'", "apostrophe", DIKS_APOSTROPHE},
23 {"(", "parenleft", DIKS_PARENTHESIS_LEFT},
24 {")", "parenright", DIKS_PARENTHESIS_RIGHT},
25 {"*", "asterisk", DIKS_ASTERISK},
26 {"+", "plus", DIKS_PLUS_SIGN},
27 {",", "comma", DIKS_COMMA},
28 {"-", "minus", DIKS_MINUS_SIGN},
29 {".", "period", DIKS_PERIOD},
30 {"/", "slash", DIKS_SLASH},
31 {"0", "0", DIKS_0},
32 {"1", "1", DIKS_1},
33 {"2", "2", DIKS_2},
34 {"3", "3", DIKS_3},
35 {"4", "4", DIKS_4},
36 {"5", "5", DIKS_5},
37 {"6", "6", DIKS_6},
38 {"7", "7", DIKS_7},
39 {"8", "8", DIKS_8},
40 {"9", "9", DIKS_9},
41 {":", "colon", DIKS_COLON},
42 {";", "semicolon", DIKS_SEMICOLON},
43 {"<", "less", DIKS_LESS_THAN_SIGN},
44 {"=", "equal", DIKS_EQUALS_SIGN},
45 {">", "greater", DIKS_GREATER_THAN_SIGN},
46 {"?", "question", DIKS_QUESTION_MARK},
47 {"@", "at", DIKS_AT},
48 {"A", "A", DIKS_CAPITAL_A },
49 {"B", "B", DIKS_CAPITAL_B },
50 {"C", "C", DIKS_CAPITAL_C },
51 {"D", "D", DIKS_CAPITAL_D },
52 {"E", "E", DIKS_CAPITAL_E },
53 {"F", "F", DIKS_CAPITAL_F },
54 {"G", "G", DIKS_CAPITAL_G },
55 {"H", "H", DIKS_CAPITAL_H },
56 {"I", "I", DIKS_CAPITAL_I },
57 {"J", "J", DIKS_CAPITAL_J },
58 {"K", "K", DIKS_CAPITAL_K },
59 {"L", "L", DIKS_CAPITAL_L },
60 {"M", "M", DIKS_CAPITAL_M },
61 {"N", "N", DIKS_CAPITAL_N },
62 {"O", "O", DIKS_CAPITAL_O },
63 {"P", "P", DIKS_CAPITAL_P },
64 {"Q", "Q", DIKS_CAPITAL_Q },
65 {"R", "R", DIKS_CAPITAL_R },
66 {"S", "S", DIKS_CAPITAL_S },
67 {"T", "T", DIKS_CAPITAL_T },
68 {"U", "U", DIKS_CAPITAL_U },
69 {"V", "V", DIKS_CAPITAL_V },
70 {"W", "W", DIKS_CAPITAL_W },
71 {"X", "X", DIKS_CAPITAL_X },
72 {"Y", "Y", DIKS_CAPITAL_Y },
73 {"Z", "Z", DIKS_CAPITAL_Z },
74 {"[", "bracketleft", DIKS_SQUARE_BRACKET_LEFT },
75 {"\\", "backslash", DIKS_BACKSLASH },
76 {"]", "bracketright", DIKS_SQUARE_BRACKET_RIGHT },
77 {"^", "asciicircum", DIKS_CIRCUMFLEX_ACCENT },
78 {"_", "underscore", DIKS_UNDERSCORE },
79 {"`", "grave", DIKS_GRAVE_ACCENT},
80 {"a", "a", DIKS_SMALL_A },
81 {"b","b", DIKS_SMALL_B },
82 {"c","c", DIKS_SMALL_C },
83 {"d","d", DIKS_SMALL_D },
84 {"e","e", DIKS_SMALL_E },
85 {"f","f", DIKS_SMALL_F },
86 {"g","g", DIKS_SMALL_G },
87 {"h","h", DIKS_SMALL_H },
88 {"i","i", DIKS_SMALL_I },
89 {"j","j", DIKS_SMALL_J },
90 {"k","k", DIKS_SMALL_K },
91 {"l","l", DIKS_SMALL_L },
92 {"m","m", DIKS_SMALL_M },
93 {"n","n", DIKS_SMALL_N },
94 {"o", "o", DIKS_SMALL_O },
95 {"p", "p", DIKS_SMALL_P },
96 {"q", "q", DIKS_SMALL_Q },
97 {"r", "r", DIKS_SMALL_R },
98 {"s", "s", DIKS_SMALL_S },
99 {"t", "t", DIKS_SMALL_T },
100 {"u", "u", DIKS_SMALL_U },
101 {"v", "v", DIKS_SMALL_V },
102 {"w", "w", DIKS_SMALL_W },
103 {"x", "x", DIKS_SMALL_X },
104 {"y", "y", DIKS_SMALL_Y },
105 {"z", "z", DIKS_SMALL_Z },
106 {"{", "braceleft",DIKS_CURLY_BRACKET_LEFT },
107 {"|", "bar", DIKS_VERTICAL_BAR },
108 {"}", "braceright", DIKS_CURLY_BRACKET_RIGHT },
109 {"~", "asciitilde", DIKS_TILDE },
110 {"\177", "Delete", DIKS_DELETE },
111 {"", "Left", DIKS_CURSOR_LEFT },
112 {"", "Right", DIKS_CURSOR_RIGHT},
113 {"", "Up", DIKS_CURSOR_UP},
114 {"", "Down", DIKS_CURSOR_DOWN},
115 {"", "Insert", DIKS_INSERT},
116 {"", "Home", DIKS_HOME},
117 {"", "End", DIKS_END},
118 {"", "Page_Up", DIKS_PAGE_UP},
119 {"", "Page_Down", DIKS_PAGE_DOWN},
120 {"", "Print", DIKS_PRINT},
121 {"", "Pause", DIKS_PAUSE},
122 /* ok */
123 {"", "Select",DIKS_SELECT},
124 /* goto */
125 {"", "Clear", DIKS_CLEAR},
126 /* power */
127 /* power 2 */
128 /* option */
129 {"", "Menu",DIKS_MENU},
130 {"", "Help",DIKS_HELP},
131 /* info */
132 /* time */
133 /* vendor */
134 /* archive */
135 /* program */
136 /* channel */
137 /* favorites */
138 /* hasta next */
139 {"", "Next",DIKS_NEXT},
140 {"", "Begin",DIKS_BEGIN},
141 /* digits */
142 /* teen */
143 /* twen */
144 {"", "Break", DIKS_BREAK},
145 /* exit */
146 /* setup */
147 {"", "upleftcorner", DIKS_CURSOR_LEFT_UP },
148 {"", "lowleftcorner", DIKS_CURSOR_LEFT_DOWN },
149 {"", "uprightcorner", DIKS_CURSOR_UP_RIGHT },
150 {"", "lowrightcorner",DIKS_CURSOR_DOWN_RIGHT },
151 {"", "F1",DIKS_F1},
152 {"", "F2",DIKS_F2},
153 {"", "F3",DIKS_F3},
154 {"", "F4",DIKS_F4},
155 {"", "F5",DIKS_F5},
156 {"", "F6",DIKS_F6},
157 {"", "F7",DIKS_F7},
158 {"", "F8",DIKS_F8},
159 {"", "F9",DIKS_F9},
160 {"", "F10",DIKS_F10},
161 {"", "F11",DIKS_F11},
162 {"", "F12",DIKS_F12},
163 /* this are only mapped to one, not left right */
164 {"", "Shift_L", DIKS_SHIFT},
165 /*{"Shift_R",0xFFE2},*/
166 {"", "Control_L", DIKS_CONTROL},
167 /*{"Control_R",0xFFE4},*/
168 {"", "Meta_L", DIKS_META},
169 /* {"Meta_R",0xFFE8},*/
170 {"", "Alt_L", DIKS_ALT},
171 {"", "Alt_R", DIKS_ALTGR},
172 {"", "Super_L", DIKS_SUPER},
173 /*{"Super_R",0xFFEC},*/
174 {"", "Hyper_L", DIKS_HYPER},
175 /*{"Hyper_R",0xFFEE},*/
176
177 {"", "Caps_Lock", DIKS_CAPS_LOCK},
178 {"", "Num_Lock", DIKS_NUM_LOCK},
179 {"", "Scroll_Lock", DIKS_SCROLL_LOCK},
180 /* not included the dead keys */
181 /* not included the custom keys */
182 {"", "VoidSymbol", DIKS_NULL}
183};
184static int _ecore_directfb_key_symbols_count = sizeof(_ecore_directfb_key_symbols) / sizeof(Ecore_DirectFB_Key_Symbols);
diff --git a/libraries/ecore/src/lib/ecore_directfb/ecore_directfb_private.h b/libraries/ecore/src/lib/ecore_directfb/ecore_directfb_private.h
new file mode 100644
index 0000000..ed34587
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_directfb/ecore_directfb_private.h
@@ -0,0 +1,52 @@
1#ifndef _ECORE_DIRECTFB_PRIVATE_H
2#define _ECORE_DIRECTFB_PRIVATE_H
3/* eina_log related things */
4
5extern int _ecore_directfb_log_dom;
6
7#ifdef ECORE_DIRECTFB_DEFAULT_LOG_COLOR
8#undef ECORE_DIRECTFB_DEFAULT_LOG_COLOR
9#endif /* ifdef ECORE_DIRECTFB_DEFAULT_LOG_COLOR */
10#define ECORE_DIRECTFB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
11
12#ifdef ERR
13# undef ERR
14#endif /* ifdef ERR */
15#define ERR(...) EINA_LOG_DOM_ERR(_ecore_directfb_log_dom, __VA_ARGS__)
16
17#ifdef DBG
18# undef DBG
19#endif /* ifdef DBG */
20#define DBG(...) EINA_LOG_DOM_DBG(_ecore_directfb_log_dom, __VA_ARGS__)
21
22#ifdef INF
23# undef INF
24#endif /* ifdef INF */
25#define INF(...) EINA_LOG_DOM_INFO(_ecore_directfb_log_dom, __VA_ARGS__)
26
27#ifdef WRN
28# undef WRN
29#endif /* ifdef WRN */
30#define WRN(...) EINA_LOG_DOM_WARN(_ecore_directfb_log_dom, __VA_ARGS__)
31
32#ifdef CRIT
33# undef CRIT
34#endif /* ifdef CRIT */
35#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_directfb_log_dom, __VA_ARGS__)
36
37/* macro for a safe call to DirectFB functions */
38#define DFBCHECK(x ...)\
39 {\
40 _err = x;\
41 if (_err != DFB_OK) {\
42 CRIT("%s <%d>:\n\t", __FILE__, __LINE__ );\
43 DirectFBErrorFatal( # x, _err );\
44 }\
45 }
46
47struct keymap
48{
49 char *name;
50 char *string;
51};
52#endif /* ifndef _ECORE_DIRECTFB_PRIVATE_H */
diff --git a/libraries/ecore/src/lib/ecore_evas/Ecore_Evas.h b/libraries/ecore/src/lib/ecore_evas/Ecore_Evas.h
new file mode 100644
index 0000000..256e57c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/Ecore_Evas.h
@@ -0,0 +1,1660 @@
1#ifndef _ECORE_EVAS_H
2#define _ECORE_EVAS_H
3
4#include <Evas.h>
5#include <Ecore_Getopt.h>
6#include <Ecore_Input.h>
7
8#ifdef EAPI
9# undef EAPI
10#endif
11
12#ifdef _WIN32
13# ifdef EFL_ECORE_EVAS_BUILD
14# ifdef DLL_EXPORT
15# define EAPI __declspec(dllexport)
16# else
17# define EAPI
18# endif /* ! DLL_EXPORT */
19# else
20# define EAPI __declspec(dllimport)
21# endif /* ! EFL_ECORE_EVAS_BUILD */
22#else
23# ifdef __GNUC__
24# if __GNUC__ >= 4
25# define EAPI __attribute__ ((visibility("default")))
26# else
27# define EAPI
28# endif
29# else
30# define EAPI
31# endif
32#endif /* ! _WIN32 */
33
34/**
35 * @file Ecore_Evas.h
36 * @brief Evas wrapper functions
37 *
38 * The following is a list of example that partially exemplify Ecore_Evas's API:
39 * @li @ref ecore_evas_callbacks_example_c
40 * @li @ref ecore_evas_object_example_c
41 * @li @ref ecore_evas_basics_example_c
42 */
43
44/* FIXME:
45 * to do soon:
46 * - iconfication api needs to work
47 * - maximization api needs to work
48 * - document all calls
49 *
50 * later:
51 * - buffer back-end that renders to an evas_image_object ???
52 * - qt back-end ???
53 * - dfb back-end ??? (dfb's threads make this REALLY HARD)
54 */
55
56#ifdef __cplusplus
57extern "C" {
58#endif
59
60/**
61 * @defgroup Ecore_Evas_Group Ecore_Evas wrapper/helper set of functions
62 *
63 * This is a list of examples of these functions:
64 * - @ref Ecore_Evas_Window_Sizes_Example_c
65 * - @ref Ecore_Evas_Buffer_Example_01_c
66 * - @ref Ecore_Evas_Buffer_Example_02_c
67 * @{
68 */
69
70/* these are dummy and just tell u what API levels ecore_evas supports - not if
71 * the actual support is compiled in. you need to query for that separately.
72 */
73#define HAVE_ECORE_EVAS_X 1
74#define HAVE_ECORE_EVAS_FB 1
75#define HAVE_ECORE_EVAS_X11_GL 1
76#define HAVE_ECORE_EVAS_X11_16 1
77#define HAVE_ECORE_EVAS_DIRECTFB 1
78#define HAVE_ECORE_EVAS_WIN32 1
79#define HAVE_ECORE_EVAS_COCOA 1
80#define HAVE_ECORE_EVAS_SDL 1
81#define HAVE_ECORE_EVAS_WINCE 1
82#define HAVE_ECORE_EVAS_EWS 1
83#define HAVE_ECORE_EVAS_PSL1GHT 1
84
85typedef enum _Ecore_Evas_Engine_Type
86{
87 ECORE_EVAS_ENGINE_SOFTWARE_BUFFER,
88 ECORE_EVAS_ENGINE_SOFTWARE_XLIB,
89 ECORE_EVAS_ENGINE_XRENDER_X11,
90 ECORE_EVAS_ENGINE_OPENGL_X11,
91 ECORE_EVAS_ENGINE_SOFTWARE_XCB,
92 ECORE_EVAS_ENGINE_XRENDER_XCB,
93 ECORE_EVAS_ENGINE_SOFTWARE_GDI,
94 ECORE_EVAS_ENGINE_SOFTWARE_DDRAW,
95 ECORE_EVAS_ENGINE_DIRECT3D,
96 ECORE_EVAS_ENGINE_OPENGL_GLEW,
97 ECORE_EVAS_ENGINE_OPENGL_COCOA,
98 ECORE_EVAS_ENGINE_SOFTWARE_SDL,
99 ECORE_EVAS_ENGINE_DIRECTFB,
100 ECORE_EVAS_ENGINE_SOFTWARE_FB,
101 ECORE_EVAS_ENGINE_SOFTWARE_8_X11,
102 ECORE_EVAS_ENGINE_SOFTWARE_16_X11,
103 ECORE_EVAS_ENGINE_SOFTWARE_16_DDRAW,
104 ECORE_EVAS_ENGINE_SOFTWARE_16_WINCE,
105 ECORE_EVAS_ENGINE_OPENGL_SDL,
106 ECORE_EVAS_ENGINE_EWS,
107 ECORE_EVAS_ENGINE_PSL1GHT
108} Ecore_Evas_Engine_Type;
109
110typedef enum _Ecore_Evas_Avoid_Damage_Type
111{
112 ECORE_EVAS_AVOID_DAMAGE_NONE = 0,
113 ECORE_EVAS_AVOID_DAMAGE_EXPOSE = 1,
114 ECORE_EVAS_AVOID_DAMAGE_BUILT_IN = 2
115} Ecore_Evas_Avoid_Damage_Type;
116
117typedef enum _Ecore_Evas_Object_Associate_Flags
118{
119 ECORE_EVAS_OBJECT_ASSOCIATE_BASE = 0,
120 ECORE_EVAS_OBJECT_ASSOCIATE_STACK = 1 << 0,
121 ECORE_EVAS_OBJECT_ASSOCIATE_LAYER = 1 << 1,
122 ECORE_EVAS_OBJECT_ASSOCIATE_DEL = 1 << 2
123} Ecore_Evas_Object_Associate_Flags;
124
125#ifndef _ECORE_X_H
126#define _ECORE_X_WINDOW_PREDEF
127typedef unsigned int Ecore_X_Window;
128#endif
129
130#ifndef _ECORE_DIRECTFB_H
131#define _ECORE_DIRECTFB_WINDOW_PREDEF
132typedef struct _Ecore_DirectFB_Window Ecore_DirectFB_Window;
133#endif
134
135#ifndef __ECORE_WIN32_H__
136typedef struct _Ecore_Win32_Window Ecore_Win32_Window;
137#endif
138
139#ifndef __ECORE_WINCE_H__
140typedef struct _Ecore_WinCE_Window Ecore_WinCE_Window;
141#endif
142
143#ifndef __ECORE_COCOA_H__
144typedef struct _Ecore_Cocoa_Window Ecore_Cocoa_Window;
145#endif
146
147#ifndef _ECORE_EVAS_PRIVATE_H
148/* basic data types */
149typedef struct _Ecore_Evas Ecore_Evas;
150#endif
151
152/* module setup/shutdown calls */
153
154EAPI int ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine);
155
156/**
157 * @brief Init the Ecore_Evas system.
158 *
159 * @return How many times the lib has been initialized, 0 indicates failure.
160 *
161 * Set up the Evas wrapper system. Init Evas and Ecore libraries.
162 *
163 * @see ecore_evas_shutdown()
164 */
165EAPI int ecore_evas_init(void);
166/**
167 * @brief Shut down the Ecore_Evas system.
168 *
169 * @return 0 if ecore evas is fully shut down, or > 0 if it still being used.
170 *
171 * This closes the Evas wrapper system down. Shut down Evas and Ecore libraries.
172 *
173 * @see ecore_evas_init()
174 */
175EAPI int ecore_evas_shutdown(void);
176
177EAPI void ecore_evas_app_comp_sync_set(Eina_Bool do_sync);
178EAPI Eina_Bool ecore_evas_app_comp_sync_get(void);
179
180/**
181 * @brief Returns a list of supported engines names.
182 *
183 * @return Newly allocated list with engines names. Engines names
184 * strings are internal and should be considered constants, do not
185 * free or modify them, to free the list use ecore_evas_engines_free().
186 */
187EAPI Eina_List *ecore_evas_engines_get(void);
188/**
189 * @brief Free list returned by ecore_evas_engines_get()
190 */
191EAPI void ecore_evas_engines_free(Eina_List *engines);
192/**
193 * @brief Creates a new Ecore_Evas based on engine name and common parameters.
194 *
195 * @param engine_name engine name as returned by
196 * ecore_evas_engines_get() or NULL to use environment variable
197 * ECORE_EVAS_ENGINE, that can be undefined and in this case
198 * this call will try to find the first working engine.
199 * @param x horizontal position of window (not supported in all engines)
200 * @param y vertical position of window (not supported in all engines)
201 * @param w width of window
202 * @param h height of window
203 * @param extra_options string with extra parameter, dependent on engines
204 * or NULL. String is usually in the form: 'key1=value1;key2=value2'.
205 * Pay attention that when getting that from shell commands, most
206 * consider ';' as the command terminator, so you need to escape
207 * it or use quotes.
208 *
209 * @return Ecore_Evas instance or NULL if creation failed.
210 */
211EAPI Ecore_Evas *ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options);
212/**
213 * @brief Set whether an Ecore_Evas has an alpha channel or not.
214 *
215 * @param ee The Ecore_Evas to shape
216 * @param alpha EINA_TRUE to enable the alpha channel, EINA_FALSE to disable it
217 *
218 * This function allows you to make an Ecore_Evas translucent using an
219 * alpha channel. See ecore_evas_shaped_set() for details. The difference
220 * between a shaped window and a window with an alpha channel is that an
221 * alpha channel supports multiple levels of transpararency, as opposed to
222 * the 1 bit transparency of a shaped window (a pixel is either opaque, or
223 * it's transparent).
224 *
225 * @warning Support for this depends on the underlying windowing system.
226 */
227EAPI void ecore_evas_alpha_set(Ecore_Evas *ee, Eina_Bool alpha);
228/**
229 * @brief Query whether an Ecore_Evas has an alpha channel.
230 * @param ee The Ecore_Evas to query.
231 * @return EINA_TRUE if ee has an alpha channel, EINA_FALSE if it does not.
232 *
233 * This function returns EINA_TRUE if @p ee has an alpha channel, and EINA_FALSE
234 * if it does not.
235 *
236 * @see ecore_evas_alpha_set()
237 */
238EAPI Eina_Bool ecore_evas_alpha_get(const Ecore_Evas *ee);
239/**
240 * @brief Set whether an Ecore_Evas has an transparent window or not.
241 *
242 * @param ee The Ecore_Evas to shape
243 * @param transparent EINA_TRUE to enable the transparent window, EINA_FALSE to
244 * disable it
245 *
246 * This function sets some translucency options, for more complete support see
247 * ecore_evas_alpha_set().
248 *
249 * @warning Support for this depends on the underlying windowing system.
250 *
251 * @see ecore_evas_alpha_set()
252 */
253EAPI void ecore_evas_transparent_set(Ecore_Evas *ee, Eina_Bool transparent);
254/**
255 * @brief Query whether an Ecore_Evas is transparent.
256 *
257 * @param ee The Ecore_Evas to query.
258 * @return EINA_TRUE if ee is transparent, EINA_FALSE if it isn't.
259 *
260 * @see ecore_evas_transparent_set()
261 */
262EAPI Eina_Bool ecore_evas_transparent_get(const Ecore_Evas *ee);
263/**
264 * @brief Get the geometry of an Ecore_Evas.
265 *
266 * @param ee The Ecore_Evas whose geometry y
267 * @param x A pointer to an int to place the x coordinate in
268 * @param y A pointer to an int to place the y coordinate in
269 * @param w A pointer to an int to place the w size in
270 * @param h A pointer to an int to place the h size in
271 *
272 * This function takes four pointers to (already allocated) ints, and places
273 * the geometry of @p ee in them. If any of the parameters is not desired you
274 * may pass NULL on them.
275 *
276 * @code
277 * int x, y, w, h;
278 * ecore_evas_geometry_get(ee, &x, &y, &w, &h);
279 * @endcode
280 *
281 * @see ecore_evas_new()
282 * @see ecore_evas_resize()
283 * @see ecore_evas_move()
284 * @see ecore_evas_move_resize()
285 */
286EAPI void ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
287/**
288 * @brief Get the geometry which an Ecore_Evas was latest recently requested.
289 *
290 * @param ee The Ecore_Evas whose geometry y
291 * @param x A pointer to an int to place the x coordinate in
292 * @param y A pointer to an int to place the y coordinate in
293 * @param w A pointer to an int to place the w size in
294 * @param h A pointer to an int to place the h size in
295 *
296 * This function takes four pointers to (already allocated) ints, and places
297 * the geometry which @p ee was latest recently requested . If any of the parameters is not desired you
298 * may pass NULL on them.
299 * This function can represent recently requested geomety.
300 * ecore_evas_geometry_get function returns the value is updated after engine finished request.
301 * By comparison, ecore_evas_request_geometry_get returns recently requested value.
302 *
303 * @code
304 * int x, y, w, h;
305 * ecore_evas_request_geometry_get(ee, &x, &y, &w, &h);
306 * @endcode
307 *
308 * @since 1.1
309 */
310EAPI void ecore_evas_request_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
311/**
312 * @brief Set the focus of an Ecore_Evas' window.
313 *
314 * @param ee The Ecore_Evas
315 * @param on EINA_TRUE for focus, EINA_FALSE to defocus.
316 *
317 * This function focuses @p ee if @p on is EINA_TRUE, or unfocuses @p ee if @p
318 * on is EINA_FALSE.
319 *
320 * @warning Support for this depends on the underlying windowing system.
321 */
322EAPI void ecore_evas_focus_set(Ecore_Evas *ee, Eina_Bool on);
323/**
324 * @brief Query whether an Ecore_Evas' window is focused or not.
325 *
326 * @param ee The Ecore_Evas to set
327 * @return EINA_TRUE if @p ee if focused, EINA_FALSE if not.
328 *
329 * @see ecore_evas_focus_set()
330 */
331EAPI Eina_Bool ecore_evas_focus_get(const Ecore_Evas *ee);
332/**
333 * @brief Iconify or uniconify an Ecore_Evas' window.
334 *
335 * @param ee The Ecore_Evas
336 * @param on EINA_TRUE to iconify, EINA_FALSE to uniconify.
337 *
338 * This function iconifies @p ee if @p on is EINA_TRUE, or uniconifies @p ee if
339 * @p on is EINA_FALSE.
340 *
341 * @note Iconify and minize are synonims.
342 *
343 * @warning Support for this depends on the underlying windowing system.
344 */
345EAPI void ecore_evas_iconified_set(Ecore_Evas *ee, Eina_Bool on);
346/**
347 * @brief Query whether an Ecore_Evas' window is iconified or not.
348 *
349 * @param ee The Ecore_Evas to set
350 * @return EINA_TRUE if @p ee is iconified, EINA_FALSE if not.
351 *
352 * @note Iconify and minize are synonims.
353 *
354 * @see ecore_evas_iconified_set()
355 */
356EAPI Eina_Bool ecore_evas_iconified_get(const Ecore_Evas *ee);
357/**
358 * @brief Set whether an Ecore_Evas' window is borderless or not.
359 *
360 * @param ee The Ecore_Evas
361 * @param on EINA_TRUE for borderless, EINA_FALSE for bordered.
362 *
363 * This function makes @p ee borderless if @p on is EINA_TRUE, or bordered if @p
364 * on is EINA_FALSE.
365 *
366 * @warning Support for this depends on the underlying windowing system.
367 */
368EAPI void ecore_evas_borderless_set(Ecore_Evas *ee, Eina_Bool on);
369/**
370 * @brief Query whether an Ecore_Evas' window is borderless or not.
371 *
372 * @param ee The Ecore_Evas to set
373 * @return EINA_TRUE if @p ee is borderless, EINA_FALSE if not.
374 *
375 * @see ecore_evas_borderless_set()
376 */
377EAPI Eina_Bool ecore_evas_borderless_get(const Ecore_Evas *ee);
378/**
379 * @brief Set whether or not an Ecore_Evas' window is fullscreen.
380 *
381 * @param ee The Ecore_Evas
382 * @param on EINA_TRUE fullscreen, EINA_FALSE not.
383 *
384 * This function causes @p ee to be fullscreen if @p on is EINA_TRUE,
385 * or not if @p on is EINA_FALSE.
386 *
387 * @warning Support for this depends on the underlying windowing system.
388 */
389EAPI void ecore_evas_fullscreen_set(Ecore_Evas *ee, Eina_Bool on);
390/**
391 * @brief Query whether an Ecore_Evas' window is fullscreen or not.
392 *
393 * @param ee The Ecore_Evas to set
394 * @return EINA_TRUE if @p ee is fullscreen, EINA_FALSE if not.
395 *
396 * @see ecore_evas_fullscreen_set()
397 */
398EAPI Eina_Bool ecore_evas_fullscreen_get(const Ecore_Evas *ee);
399/**
400 * @brief Set if this evas should ignore @b all events.
401 *
402 * @param ee The Ecore_Evas whose window's to ignore events.
403 * @param ignore The Ecore_Evas new ignore state.
404 *
405 * @warning Support for this depends on the underlying windowing system.
406 */
407EAPI void ecore_evas_ignore_events_set(Ecore_Evas *ee, Eina_Bool ignore);
408/**
409 * @brief Returns the ignore state of an Ecore_Evas' window.
410 *
411 * @param ee The Ecore_Evas whose window's ignore events state is returned.
412 * @return The Ecore_Evas window's ignore state.
413 *
414 * @see ecore_evas_ignore_events_set()
415 */
416EAPI Eina_Bool ecore_evas_ignore_events_get(const Ecore_Evas *ee);
417/**
418 * @brief Query whether an Ecore_Evas' window is visible or not.
419 *
420 * @param ee The Ecore_Evas to query.
421 * @return 1 if visible, 0 if not.
422 *
423 * This function queries @p ee and returns 1 if it is visible, and 0 if not.
424 *
425 * @see ecore_evas_show()
426 * @see ecore_evas_hide()
427 */
428EAPI int ecore_evas_visibility_get(const Ecore_Evas *ee);
429/**
430 * @brief Set the layer of an Ecore_Evas' window.
431 *
432 * @param ee The Ecore_Evas
433 * @param layer The layer to put @p ee on.
434 *
435 * This function moves @p ee to the layer @p layer.
436 *
437 * @warning Support for this depends on the underlying windowing system.
438 *
439 * @see ecore_evas_lower()
440 * @see ecore_evas_raise()
441 */
442EAPI void ecore_evas_layer_set(Ecore_Evas *ee, int layer);
443/**
444 * @brief Get the layer of an Ecore_Evas' window.
445 *
446 * @param ee The Ecore_Evas to set
447 * @return the layer @p ee's window is on.
448 *
449 * @see ecore_evas_layer_set()
450 * @see ecore_evas_lower()
451 * @see ecore_evas_raise()
452 */
453EAPI int ecore_evas_layer_get(const Ecore_Evas *ee);
454/**
455 * @brief Maximize (or unmaximize) an Ecore_Evas' window.
456 *
457 * @param ee The Ecore_Evas
458 * @param on EINA_TRUE to maximize, EINA_FALSE to unmaximize.
459 *
460 * This function maximizes @p ee if @p on is EINA_TRUE, or unmaximizes @p ee
461 * if @p on is EINA_FALSE.
462 *
463 * @warning Support for this depends on the underlying windowing system.
464 */
465EAPI void ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on);
466/**
467 * @brief Query whether an Ecore_Evas' window is maximized or not.
468 *
469 * @param ee The Ecore_Evas to set
470 * @return EINA_TRUE if @p ee is maximized, EINA_FALSE if not.
471 *
472 * @see ecore_evas_maximized_set()
473 */
474EAPI Eina_Bool ecore_evas_maximized_get(const Ecore_Evas *ee);
475/**
476 * @brief Move an Ecore_Evas.
477 *
478 * @param ee The Ecore_Evas to move
479 * @param x The x coordinate to move to
480 * @param y The y coordinate to move to
481 *
482 * This moves @p ee to the screen coordinates (@p x, @p y)
483 *
484 * @warning Support for this depends on the underlying windowing system.
485 *
486 * @see ecore_evas_new()
487 * @see ecore_evas_resize()
488 * @see ecore_evas_move_resize()
489 */
490EAPI void ecore_evas_move(Ecore_Evas *ee, int x, int y);
491/**
492 * @brief Resize an Ecore_Evas.
493 *
494 * @param ee The Ecore_Evas to move
495 * @param w The w coordinate to resize to
496 * @param h The h coordinate to resize to
497 *
498 * This resizes @p ee to @p w x @p h.
499 *
500 * @warning Support for this depends on the underlying windowing system.
501 *
502 * @see ecore_evas_new()
503 * @see ecore_evas_move()
504 * @see ecore_evas_move_resize()
505 */
506EAPI void ecore_evas_resize(Ecore_Evas *ee, int w, int h);
507/**
508 * @brief Move and resize an Ecore_Evas
509 *
510 * @param ee The Ecore_Evas to move and resize
511 * @param x The x coordinate to move to
512 * @param y The y coordinate to move to
513 * @param w The w coordinate to resize to
514 * @param h The h coordinate to resize to
515 *
516 * This moves @p ee to the screen coordinates (@p x, @p y) and resizes
517 * it to @p w x @p h.
518 *
519 * @warning Support for this depends on the underlying windowing system.
520 *
521 * @see ecore_evas_new()
522 * @see ecore_evas_move()
523 * @see ecore_evas_resize()
524 */
525EAPI void ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h);
526/**
527 * @brief Set the rotation of an Ecore_Evas' window.
528 *
529 * @param ee The Ecore_Evas
530 * @param rot the angle (in degrees) of rotation.
531 *
532 * The allowed values of @p rot depend on the engine being used. Most only
533 * allow multiples of 90.
534 *
535 * @warning Support for this depends on the underlying windowing system.
536 *
537 * @see ecore_evas_rotation_with_resize_set()
538 */
539EAPI void ecore_evas_rotation_set(Ecore_Evas *ee, int rot);
540/**
541 * @brief Set the rotation of an Ecore_Evas' window
542 *
543 * @param ee The Ecore_Evas
544 * @param rot the angle (in degrees) of rotation.
545 *
546 * Like ecore_evas_rotation_set(), but it also resizes the window's contents so
547 * that they fit inside the current window geometry.
548 *
549 * @warning Support for this depends on the underlying windowing system.
550 *
551 * @see ecore_evas_rotation_set()
552 */
553EAPI void ecore_evas_rotation_with_resize_set(Ecore_Evas *ee, int rot);
554/**
555 * @brief Get the rotation of an Ecore_Evas' window
556 *
557 * @param ee The Ecore_Evas
558 * @return the angle (in degrees) of rotation.
559 *
560 * @see ecore_evas_rotation_set()
561 * @see ecore_evas_rotation_with_resize_set()
562 */
563EAPI int ecore_evas_rotation_get(const Ecore_Evas *ee);
564/**
565 * @brief Raise an Ecore_Evas' window.
566 *
567 * @param ee The Ecore_Evas to raise.
568 *
569 * This functions raises the Ecore_Evas to the front.
570 *
571 * @warning Support for this depends on the underlying windowing system.
572 *
573 * @see ecore_evas_lower()
574 * @see ecore_evas_layer_set()
575 */
576EAPI void ecore_evas_raise(Ecore_Evas *ee);
577/**
578 * @brief Lower an Ecore_Evas' window.
579 *
580 * @param ee The Ecore_Evas to raise.
581 *
582 * This functions lowers the Ecore_Evas to the back.
583 *
584 * @warning Support for this depends on the underlying windowing system.
585 *
586 * @see ecore_evas_raise()
587 * @see ecore_evas_layer_set()
588 */
589EAPI void ecore_evas_lower(Ecore_Evas *ee);
590/**
591 * @brief Set the title of an Ecore_Evas' window.
592 *
593 * @param ee The Ecore_Evas whose title you wish to set.
594 * @param t The title
595 *
596 * This function sets the title of @p ee to @p t.
597 *
598 * @warning Support for this depends on the underlying windowing system.
599 */
600EAPI void ecore_evas_title_set(Ecore_Evas *ee, const char *t);
601/**
602 * @brief Get the title of an Ecore_Evas' window.
603 *
604 * @param ee The Ecore_Evas whose title you wish to get.
605 * @return The title of @p ee.
606 *
607 * This function returns the title of @p ee.
608 *
609 * @see ecore_evas_title_set()
610 */
611EAPI const char *ecore_evas_title_get(const Ecore_Evas *ee);
612/**
613 * @brief Set the name and class of an Ecore_Evas' window.
614 *
615 * @param ee the Ecore_Evas
616 * @param n the name
617 * @param c the class
618 *
619 * This function sets the name of @p ee to @p n, and its class to @p c. The
620 * meaning of @p name and @p class depends on the underlying windowing system.
621 *
622 * @warning Support for this depends on the underlying windowing system.
623 */
624EAPI void ecore_evas_name_class_set(Ecore_Evas *ee, const char *n, const char *c);
625/**
626 * @brief Get the name and class of an Ecore_Evas' window
627 *
628 * @p ee The Ecore_Evas to query
629 * @p n A pointer to a string to place the name in.
630 * @p c A pointer to a string to place the class in.
631 *
632 * This function gets the name of @p ee into @p n, and its class into
633 * @p c.
634 *
635 * @see ecore_evas_name_class_set()
636 */
637EAPI void ecore_evas_name_class_get(const Ecore_Evas *ee, const char **n, const char **c);
638/**
639 * @brief Returns a pointer to the underlying window.
640 *
641 * @param ee The Ecore_Evas whose window is desired.
642 *
643 * @warning Support for this depends on the underlying windowing system.
644 */
645EAPI Ecore_Window ecore_evas_window_get(const Ecore_Evas *ee);
646
647
648/* engine/target specific init calls */
649EAPI Ecore_Evas *ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
650EAPI Ecore_X_Window ecore_evas_software_x11_window_get(const Ecore_Evas *ee);
651EAPI void ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
652EAPI Eina_Bool ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee);
653EAPI void ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
654
655#define ECORE_EVAS_GL_X11_OPT_NONE 0
656#define ECORE_EVAS_GL_X11_OPT_INDIRECT 1
657#define ECORE_EVAS_GL_X11_OPT_VSYNC 2
658#define ECORE_EVAS_GL_X11_OPT_LAST 3
659
660EAPI Ecore_Evas *ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
661EAPI Ecore_Evas *ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, const int *opt);
662EAPI Ecore_X_Window ecore_evas_gl_x11_window_get(const Ecore_Evas *ee);
663EAPI void ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
664EAPI Eina_Bool ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee);
665EAPI void ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
666EAPI void ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e));
667
668EAPI Ecore_Evas *ecore_evas_xrender_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
669EAPI Ecore_X_Window ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee);
670EAPI void ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
671EAPI Eina_Bool ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee);
672EAPI void ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
673
674EAPI Ecore_Evas *ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
675EAPI Ecore_X_Window ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee);
676EAPI Ecore_X_Window ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee);
677EAPI void ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
678EAPI Eina_Bool ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee);
679EAPI void ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
680
681EAPI Ecore_Evas *ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h);
682EAPI Ecore_X_Window ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee);
683EAPI void ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on);
684EAPI Eina_Bool ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee);
685EAPI void ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win);
686
687EAPI Ecore_Evas *ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h);
688
689EAPI Ecore_Evas *ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h);
690EAPI Ecore_DirectFB_Window *ecore_evas_directfb_window_get(const Ecore_Evas *ee);
691
692/**
693 * @brief Create a new @c Ecore_Evas canvas bound to the Evas
694 * @b buffer engine
695 *
696 * @param w The width of the canvas, in pixels
697 * @param h The height of the canvas, in pixels
698 * @return A new @c Ecore_Evas instance or @c NULL, on failure
699 *
700 * This creates a new buffer canvas wrapper, with image data array
701 * @b bound to the ARGB format, 8 bits per pixel.
702 *
703 * This function will allocate the needed pixels array with canonical
704 * @c malloc(). If you wish a custom function to allocate it, consider
705 * using ecore_evas_buffer_allocfunc_new(), instead.
706 *
707 * @note This function actually is a wrapper on
708 * ecore_evas_buffer_allocfunc_new(), using the same @a w and @a h
709 * arguments and canonical @c malloc() and @c free() to the memory
710 * allocation and freeing functions. See that function's documentation
711 * for more details.
712 */
713EAPI Ecore_Evas *ecore_evas_buffer_new(int w, int h);
714
715/**
716 * @brief Create a new @c Ecore_Evas canvas bound to the Evas
717 * @b buffer engine, giving custom allocation and freeing functions for
718 * the canvas memory region
719 *
720 * @param w The width of the canvas, in canvas units
721 * @param h The height of the canvas, in canvas units
722 * @param alloc_func Function to be called to allocate the memory
723 * needed for the new buffer canvas. @a data will be passed the same
724 * value as the @p data of this function, while @a size will be passed
725 * @p w times @p h times @c sizeof(int).
726 * @param free_func Function to be called to free the memory used by
727 * the new buffer canvas. @a data will be passed the same value as the
728 * @p data of this function, while @a pix will be passed the canvas
729 * memory pointer.
730 * @param data Custom data to be passed to the allocation and freeing
731 * functions
732 * @return A new @c Ecore_Evas instance or @c NULL, on failure
733 *
734 * This creates a new buffer canvas wrapper, with image data array
735 * @b bound to the ARGB format, 8 bits per pixel.
736 *
737 * This function is useful when one wants an @c Ecore_Evas buffer
738 * canvas with a custom allocation function, like one getting memory
739 * chunks from a memory pool, for example.
740 *
741 * On any resizing of this @c Ecore_Evas buffer canvas, its image data
742 * will be @b freed, to be allocated again with the new size.
743 *
744 * @note @p w and @p h sizes have to greater or equal to 1. Otherwise,
745 * they'll be interpreted as 1, exactly.
746 *
747 * @see ecore_evas_buffer_new()
748 */
749EAPI Ecore_Evas *ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data);
750
751/**
752 * @brief Grab a pointer to the actual pixels array of a given
753 * @c Ecore_Evas @b buffer canvas/window.
754 *
755 * @param ee An @c Ecore_Evas handle
756 * @return A pointer to the internal pixels array of @p ee
757 *
758 * Besides returning a pointer to the actual pixel array of the given
759 * canvas, this call will force a <b>rendering update on @p ee</b>,
760 * first.
761 *
762 * A common use case for this call is to create an image object, from
763 * @b another canvas, to have as data @p ee's contents, thus
764 * snapshoting the canvas. For that case, one can also use the
765 * ecore_evas_object_image_new() helper function.
766 */
767EAPI const void *ecore_evas_buffer_pixels_get(Ecore_Evas *ee);
768
769/**
770 * @brief Create a new @c Ecore_Evas canvas bound to the Evas
771 * @b ews (Ecore + Evas Single Process Windowing System) engine
772 *
773 * EWS is a simple single process windowing system. The backing store
774 * is also an @c Ecore_Evas that can be setup with
775 * ecore_evas_ews_setup() and retrieved with
776 * ecore_evas_ews_ecore_evas_get(). It will allow window management
777 * using events prefixed with @c ECORE_EVAS_EVENT_EWS_.
778 *
779 * The EWS windows (returned by this function or
780 * ecore_evas_new("ews"...)) will all be software buffer windows
781 * automatic rendered to the backing store.
782 *
783 * @param x horizontal position of window, in pixels
784 * @param y vertical position of window, in pixels
785 * @param w The width of the canvas, in pixels
786 * @param h The height of the canvas, in pixels
787 * @return A new @c Ecore_Evas instance or @c NULL, on failure
788 *
789 * @see ecore_evas_ews_setup()
790 * @see ecore_evas_ews_ecore_evas_get()
791 *
792 * @since 1.1
793 */
794EAPI Ecore_Evas *ecore_evas_ews_new(int x, int y, int w, int h);
795
796
797/**
798 * Returns the backing store image object that represents the given
799 * window in EWS.
800 *
801 * @note This should not be modified anyhow, but may be helpful to
802 * determine stacking and geometry of it for window managers
803 * that decorate windows.
804 *
805 * @see ecore_evas_ews_manager_set()
806 * @see ecore_evas_ews_evas_get()
807 * @since 1.1
808 */
809EAPI Evas_Object *ecore_evas_ews_backing_store_get(const Ecore_Evas *ee);
810
811/**
812 * Calls the window to be deleted (freed), but can let user decide to
813 * forbid it by using ecore_evas_callback_delete_request_set()
814 *
815 * @since 1.1
816 */
817EAPI void ecore_evas_ews_delete_request(Ecore_Evas *ee);
818
819/**
820 * @brief Create an Evas image object with image data <b>bound to an
821 * own, internal @c Ecore_Evas canvas wrapper<b>
822 *
823 * @param ee_target @c Ecore_Evas to have the canvas receiving the new
824 * image object
825 * @return A handle to the new image object
826 *
827 * This will create a @b special Evas image object. The image's pixel
828 * array will get bound to the same image data array of an @b internal
829 * @b buffer @c Ecore_Evas canvas. The user of this function is, then,
830 * supposed to grab that @c Ecore_Evas handle, with
831 * ecore_evas_object_ecore_evas_get(), and use its canvas to render
832 * whichever contents he/she wants, @b independently of the contents
833 * of the canvas owned by @p ee_target. Those contents will reflect on
834 * the canvas of @p ee, though, being exactly the image data of the
835 * object returned by this function.
836 *
837 * This is a helper function for the scenario of one wanting to grab a
838 * buffer canvas' contents (with ecore_evas_buffer_pixels_get()) to be
839 * used on another canvas, for whichever reason. The most common goal
840 * of this setup is to @b save an image file with a whole canvas as
841 * contents, which could not be achieved by using an image file within
842 * the target canvas.
843 *
844 * @warning Always resize the returned image and its underlying
845 * @c Ecore_Evas handle accordingly. They must be kept with same sizes
846 * for things to work as expected. Also, you @b must issue
847 * @c evas_object_image_size_set() on the image with that same size. If
848 * the image is to be shown in a canvas bound to an engine different
849 * than the buffer one, then you must also set this image's @b fill
850 * properties accordingly.
851 *
852 * @note The image returned will always be bound to the
853 * @c EVAS_COLORSPACE_ARGB8888 colorspace, always.
854 *
855 * @note Use ecore_evas_object_evas_get() to grab the image's internal
856 * own canvas directly.
857 *
858 * @note If snapshoting this image's internal canvas, remember to
859 * flush its internal @c Ecore_Evas firstly, with
860 * ecore_evas_manual_render().
861 */
862EAPI Evas_Object *ecore_evas_object_image_new(Ecore_Evas *ee_target);
863
864/**
865 * @brief Retrieve the internal @c Ecore_Evas handle of an image
866 * object created via ecore_evas_object_image_new()
867 *
868 * @param obj A handle to an image object created via
869 * ecore_evas_object_image_new()
870 * @return The underlying @c Ecore_Evas handle in @p obj
871 */
872EAPI Ecore_Evas *ecore_evas_object_ecore_evas_get(Evas_Object *obj);
873
874/**
875 * @brief Retrieve the canvas bound to the internal @c Ecore_Evas
876 * handle of an image object created via ecore_evas_object_image_new()
877 *
878 * @param obj A handle to an image object created via
879 * ecore_evas_object_image_new()
880 * @return A handle to @p obj's underlying @c Ecore_Evas's canvas
881 */
882EAPI Evas *ecore_evas_object_evas_get(Evas_Object *obj);
883
884EAPI Ecore_Evas *ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
885 int x,
886 int y,
887 int width,
888 int height);
889
890EAPI Ecore_Evas *ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
891 int x,
892 int y,
893 int width,
894 int height);
895
896EAPI Ecore_Evas *ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
897 int x,
898 int y,
899 int width,
900 int height);
901
902EAPI Ecore_Evas *ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
903 int x,
904 int y,
905 int width,
906 int height);
907
908EAPI Ecore_Evas *ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
909 int x,
910 int y,
911 int width,
912 int height);
913
914EAPI Ecore_Win32_Window *ecore_evas_win32_window_get(const Ecore_Evas *ee);
915
916EAPI Ecore_Evas *ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha);
917EAPI Ecore_Evas *ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha);
918EAPI Ecore_Evas *ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe);
919
920EAPI Ecore_Evas *ecore_evas_software_wince_new(Ecore_WinCE_Window *parent,
921 int x,
922 int y,
923 int width,
924 int height);
925
926EAPI Ecore_Evas *ecore_evas_software_wince_fb_new(Ecore_WinCE_Window *parent,
927 int x,
928 int y,
929 int width,
930 int height);
931
932EAPI Ecore_Evas *ecore_evas_software_wince_gapi_new(Ecore_WinCE_Window *parent,
933 int x,
934 int y,
935 int width,
936 int height);
937
938EAPI Ecore_Evas *ecore_evas_software_wince_ddraw_new(Ecore_WinCE_Window *parent,
939 int x,
940 int y,
941 int width,
942 int height);
943
944EAPI Ecore_Evas *ecore_evas_software_wince_gdi_new(Ecore_WinCE_Window *parent,
945 int x,
946 int y,
947 int width,
948 int height);
949
950EAPI Ecore_WinCE_Window *ecore_evas_software_wince_window_get(const Ecore_Evas *ee);
951
952EAPI Ecore_Evas *ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent,
953 int x,
954 int y,
955 int w,
956 int h);
957
958EAPI Ecore_Evas *ecore_evas_psl1ght_new(const char* name, int w, int h);
959
960
961/* generic manipulation calls */
962/**
963 * @brief Get the engine name used by this Ecore_Evas(window).
964 *
965 * @param ee Ecore_Evas whose engine's name is desired.
966 * @return A string that can(usually) be used in ecore_evas_new()
967 *
968 * @see ecore_evas_free()
969 */
970EAPI const char *ecore_evas_engine_name_get(const Ecore_Evas *ee);
971/**
972 * @brief Return the Ecore_Evas for this Evas
973 *
974 * @param e The Evas to get the Ecore_Evas from
975 * @return The Ecore_Evas that holds this Evas, or NULL if not held by one.
976 *
977 * @warning Only use on Evas' created with ecore evas!
978 */
979EAPI Ecore_Evas *ecore_evas_ecore_evas_get(const Evas *e);
980/**
981 * @brief Free an Ecore_Evas
982 *
983 * @param ee The Ecore_Evas to free
984 *
985 * This frees up any memory used by the Ecore_Evas.
986 */
987EAPI void ecore_evas_free(Ecore_Evas *ee);
988/**
989 * @brief Retrieve user data associated with an Ecore_Evas.
990 *
991 * @param ee The Ecore_Evas to retrieve the user data from.
992 * @param key The key which the user data to be retrieved is associated with.
993 *
994 * This function retrieves user specific data that has been stored within an
995 * Ecore_Evas structure with ecore_evas_data_set().
996 *
997 * @returns NULL on error or no data found, A pointer to the user data on
998 * success.
999 *
1000 * @see ecore_evas_data_set()
1001 */
1002EAPI void *ecore_evas_data_get(const Ecore_Evas *ee, const char *key);
1003/**
1004 * @brief Store user data in an Ecore_Evas structure.
1005 *
1006 * @param ee The Ecore_Evas to store the user data in.
1007 * @param key A unique string to associate the user data against. Cannot
1008 * be NULL.
1009 * @param data A pointer to the user data to store.
1010 *
1011 * This function associates the @p data with a @p key which is stored by
1012 * the Ecore_Evas @p ee. Be aware that a call to ecore_evas_free() will
1013 * not free any memory for the associated user data, this is the responsibility
1014 * of the caller.
1015 *
1016 * @see ecore_evas_callback_pre_free_set()
1017 * @see ecore_evas_free()
1018 * @see ecore_evas_data_get()
1019 */
1020EAPI void ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data);
1021/**
1022 * Set a callback for Ecore_Evas resize events.
1023 * @param ee The Ecore_Evas to set callbacks on
1024 * @param func The function to call
1025
1026 * A call to this function will set a callback on an Ecore_Evas, causing
1027 * @p func to be called whenever @p ee is resized.
1028 *
1029 * @warning If and when this function is called depends on the underlying
1030 * windowing system.
1031 */
1032EAPI void ecore_evas_callback_resize_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1033/**
1034 * Set a callback for Ecore_Evas move events.
1035 * @param ee The Ecore_Evas to set callbacks on
1036 * @param func The function to call
1037
1038 * A call to this function will set a callback on an Ecore_Evas, causing
1039 * @p func to be called whenever @p ee is moved.
1040 *
1041 * @warning If and when this function is called depends on the underlying
1042 * windowing system.
1043 */
1044EAPI void ecore_evas_callback_move_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1045/**
1046 * Set a callback for Ecore_Evas show events.
1047 * @param ee The Ecore_Evas to set callbacks on
1048 * @param func The function to call
1049
1050 * A call to this function will set a callback on an Ecore_Evas, causing
1051 * @p func to be called whenever @p ee is shown.
1052 *
1053 * @warning If and when this function is called depends on the underlying
1054 * windowing system.
1055 */
1056EAPI void ecore_evas_callback_show_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1057/**
1058 * Set a callback for Ecore_Evas hide events.
1059 * @param ee The Ecore_Evas to set callbacks on
1060 * @param func The function to call
1061
1062 * A call to this function will set a callback on an Ecore_Evas, causing
1063 * @p func to be called whenever @p ee is hidden.
1064 *
1065 * @warning If and when this function is called depends on the underlying
1066 * windowing system.
1067 */
1068EAPI void ecore_evas_callback_hide_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1069/**
1070 * Set a callback for Ecore_Evas delete request events.
1071 * @param ee The Ecore_Evas to set callbacks on
1072 * @param func The function to call
1073
1074 * A call to this function will set a callback on an Ecore_Evas, causing
1075 * @p func to be called whenever @p ee gets a delete request.
1076 *
1077 * @warning If and when this function is called depends on the underlying
1078 * windowing system.
1079 */
1080EAPI void ecore_evas_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1081/**
1082 * Set a callback for Ecore_Evas destroy events.
1083 * @param ee The Ecore_Evas to set callbacks on
1084 * @param func The function to call
1085
1086 * A call to this function will set a callback on an Ecore_Evas, causing
1087 * @p func to be called whenever @p ee is destroyed.
1088 *
1089 * @warning If and when this function is called depends on the underlying
1090 * windowing system.
1091 */
1092EAPI void ecore_evas_callback_destroy_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1093/**
1094 * Set a callback for Ecore_Evas focus in events.
1095 * @param ee The Ecore_Evas to set callbacks on
1096 * @param func The function to call
1097
1098 * A call to this function will set a callback on an Ecore_Evas, causing
1099 * @p func to be called whenever @p ee gets focus.
1100 *
1101 * @warning If and when this function is called depends on the underlying
1102 * windowing system.
1103 */
1104EAPI void ecore_evas_callback_focus_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1105/**
1106 * Set a callback for Ecore_Evas focus out events.
1107 * @param ee The Ecore_Evas to set callbacks on
1108 * @param func The function to call
1109
1110 * A call to this function will set a callback on an Ecore_Evas, causing
1111 * @p func to be called whenever @p ee loses focus.
1112 *
1113 * @warning If and when this function is called depends on the underlying
1114 * windowing system.
1115 */
1116EAPI void ecore_evas_callback_focus_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1117/**
1118 * Set a callback for Ecore_Evas sticky events.
1119 * @param ee The Ecore_Evas to set callbacks on
1120 * @param func The function to call
1121
1122 * A call to this function will set a callback on an Ecore_Evas, causing
1123 * @p func to be called whenever @p ee becomes sticky.
1124 *
1125 * @warning If and when this function is called depends on the underlying
1126 * windowing system.
1127 */
1128EAPI void ecore_evas_callback_sticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1129/**
1130 * Set a callback for Ecore_Evas un-sticky events.
1131 * @param ee The Ecore_Evas to set callbacks on
1132 * @param func The function to call
1133
1134 * A call to this function will set a callback on an Ecore_Evas, causing
1135 * @p func to be called whenever @p ee becomes un-sticky.
1136 *
1137 * @warning If and when this function is called depends on the underlying
1138 * windowing system.
1139 */
1140EAPI void ecore_evas_callback_unsticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1141/**
1142 * Set a callback for Ecore_Evas mouse in events.
1143 * @param ee The Ecore_Evas to set callbacks on
1144 * @param func The function to call
1145
1146 * A call to this function will set a callback on an Ecore_Evas, causing
1147 * @p func to be called whenever the mouse enters @p ee.
1148 *
1149 * @warning If and when this function is called depends on the underlying
1150 * windowing system.
1151 */
1152EAPI void ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1153/**
1154 * Set a callback for Ecore_Evas mouse out events.
1155 * @param ee The Ecore_Evas to set callbacks on
1156 * @param func The function to call
1157
1158 * A call to this function will set a callback on an Ecore_Evas, causing
1159 * @p func to be called whenever the mouse leaves @p ee.
1160 *
1161 * @warning If and when this function is called depends on the underlying
1162 * windowing system.
1163 */
1164EAPI void ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1165/**
1166 * Set a callback for Ecore_Evas pre render events.
1167 * @param ee The Ecore_Evas to set callbacks on
1168 * @param func The function to call
1169
1170 * A call to this function will set a callback on an Ecore_Evas, causing
1171 * @p func to be called just before the evas in @p ee is rendered.
1172 *
1173 * @warning If and when this function is called depends on the underlying
1174 * windowing system.
1175 */
1176EAPI void ecore_evas_callback_pre_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1177/**
1178 * Set a callback for Ecore_Evas mouse post render events.
1179 * @param ee The Ecore_Evas to set callbacks on
1180 * @param func The function to call
1181
1182 * A call to this function will set a callback on an Ecore_Evas, causing
1183 * @p func to be called just after the evas in @p ee is rendered.
1184 *
1185 * @warning If and when this function is called depends on the underlying
1186 * windowing system.
1187 */
1188EAPI void ecore_evas_callback_post_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1189/**
1190 * Set a callback for Ecore_Evas pre-free event.
1191 * @param ee The Ecore_Evas to set callbacks on
1192 * @param func The function to call
1193 *
1194 * A call to this function will set a callback on an Ecore_Evas, causing
1195 * @p func to be called just before the instance @p ee is freed.
1196 *
1197 * @warning If and when this function is called depends on the underlying
1198 * windowing system.
1199 */
1200EAPI void ecore_evas_callback_pre_free_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
1201EAPI Evas *ecore_evas_get(const Ecore_Evas *ee);
1202EAPI void ecore_evas_managed_move(Ecore_Evas *ee, int x, int y);
1203EAPI void ecore_evas_shaped_set(Ecore_Evas *ee, Eina_Bool shaped);
1204EAPI Eina_Bool ecore_evas_shaped_get(const Ecore_Evas *ee);
1205/**
1206 * @brief Show an Ecore_Evas' window
1207 *
1208 * @param ee The Ecore_Evas to show.
1209 *
1210 * This function makes @p ee visible.
1211 */
1212EAPI void ecore_evas_show(Ecore_Evas *ee);
1213/**
1214 * @brief Hide an Ecore_Evas' window
1215 *
1216 * @param ee The Ecore_Evas to hide.
1217 *
1218 * This function makes @p ee hidden(not visible).
1219 */
1220EAPI void ecore_evas_hide(Ecore_Evas *ee);
1221EAPI void ecore_evas_activate(Ecore_Evas *ee);
1222
1223
1224/**
1225 * Set the minimum size of a given @c Ecore_Evas window
1226 *
1227 * @param ee An @c Ecore_Evas window's handle
1228 * @param w The minimum width
1229 * @param h The minimum height
1230 *
1231 * This function sets the minimum size of @p ee to be @p w x @p h.
1232 * One won't be able to resize that window to dimensions smaller than
1233 * the ones set.
1234 *
1235 * @note When base sizes are set, via ecore_evas_size_base_set(),
1236 * they'll be used to calculate a window's minimum size, instead of
1237 * those set by this function.
1238 *
1239 * @see ecore_evas_size_min_get()
1240 */
1241EAPI void ecore_evas_size_min_set(Ecore_Evas *ee, int w, int h);
1242
1243/**
1244 * Get the minimum size set for a given @c Ecore_Evas window
1245 *
1246 * @param ee An @c Ecore_Evas window's handle
1247 * @param w A pointer to an int to place the minimum width in.
1248 * @param h A pointer to an int to place the minimum height in.
1249 *
1250 * @note Use @c NULL pointers on the size components you're not
1251 * interested in: they'll be ignored by the function.
1252 *
1253 * @see ecore_evas_size_min_set() for more details
1254 */
1255EAPI void ecore_evas_size_min_get(const Ecore_Evas *ee, int *w, int *h);
1256
1257/**
1258 * Set the maximum size of a given @c Ecore_Evas window
1259 *
1260 * @param ee An @c Ecore_Evas window's handle
1261 * @param w The maximum width
1262 * @param h The maximum height
1263 *
1264 * This function sets the maximum size of @p ee to be @p w x @p h.
1265 * One won't be able to resize that window to dimensions bigger than
1266 * the ones set.
1267 *
1268 * @see ecore_evas_size_max_get()
1269 */
1270EAPI void ecore_evas_size_max_set(Ecore_Evas *ee, int w, int h);
1271
1272/**
1273 * Get the maximum size set for a given @c Ecore_Evas window
1274 *
1275 * @param ee An @c Ecore_Evas window's handle
1276 * @param w A pointer to an int to place the maximum width in.
1277 * @param h A pointer to an int to place the maximum height in.
1278 *
1279 * @note Use @c NULL pointers on the size components you're not
1280 * interested in: they'll be ignored by the function.
1281 *
1282 * @see ecore_evas_size_max_set() for more details
1283 */
1284EAPI void ecore_evas_size_max_get(const Ecore_Evas *ee, int *w, int *h);
1285
1286/**
1287 * Set the base size for a given @c Ecore_Evas window
1288 *
1289 * @param ee An @c Ecore_Evas window's handle
1290 * @param w The base width
1291 * @param h The base height
1292 *
1293 * This function sets the @b base size of @p ee to be @p w x @p h.
1294 * When base sizes are set, they'll be used to calculate a window's
1295 * @b minimum size, instead of those set by ecore_evas_size_min_get().
1296 *
1297 * @see ecore_evas_size_base_get()
1298 */
1299EAPI void ecore_evas_size_base_set(Ecore_Evas *ee, int w, int h);
1300
1301/**
1302 * Get the base size set for a given @c Ecore_Evas window
1303 *
1304 * @param ee An @c Ecore_Evas window's handle
1305 * @param w A pointer to an int to place the base width in.
1306 * @param h A pointer to an int to place the base height in.
1307 *
1308 * @note Use @c NULL pointers on the size components you're not
1309 * interested in: they'll be ignored by the function.
1310 *
1311 * @see ecore_evas_size_base_set() for more details
1312 */
1313EAPI void ecore_evas_size_base_get(const Ecore_Evas *ee, int *w, int *h);
1314
1315/**
1316 * Set the "size step" for a given @c Ecore_Evas window
1317 *
1318 * @param ee An @c Ecore_Evas window's handle
1319 * @param w The step width
1320 * @param h The step height
1321 *
1322 * This function sets the size steps of @p ee to be @p w x @p h. This
1323 * limits the size of this @cEcore_Evas window to be @b always an
1324 * integer multiple of the step size, for each axis.
1325 */
1326EAPI void ecore_evas_size_step_set(Ecore_Evas *ee, int w, int h);
1327
1328/**
1329 * Get the "size step" set for a given @c Ecore_Evas window
1330 *
1331 * @param ee An @c Ecore_Evas window's handle
1332 * @param w A pointer to an int to place the step width in.
1333 * @param h A pointer to an int to place the step height in.
1334 *
1335 * @note Use @c NULL pointers on the size components you're not
1336 * interested in: they'll be ignored by the function.
1337 *
1338 * @see ecore_evas_size_base_set() for more details
1339 */
1340EAPI void ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h);
1341
1342/**
1343 * @brief Set the cursor of an Ecore_Evas.
1344 *
1345 * @param ee The Ecore_Evas
1346 * @param file The path to an image file for the cursor.
1347 * @param layer The layer in which the cursor will appear.
1348 * @param hot_x The x coordinate of the cursor's hot spot.
1349 * @param hot_y The y coordinate of the cursor's hot spot.
1350 *
1351 * This function makes the mouse cursor over @p ee be the image specified by
1352 * @p file. The actual point within the image that the mouse is at is specified
1353 * by @p hot_x and @p hot_y, which are coordinates with respect to the top left
1354 * corner of the cursor image.
1355 *
1356 * @note This function creates an object from the image and uses
1357 * ecore_evas_object_cursor_set().
1358 *
1359 * @see ecore_evas_object_cursor_set()
1360 */
1361EAPI void ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y);
1362/**
1363 * @brief Get information about an Ecore_Evas' cursor
1364 *
1365 * @param ee The Ecore_Evas to set
1366 * @param obj A pointer to an Evas_Object to place the cursor Evas_Object.
1367 * @param layer A pointer to an int to place the cursor's layer in.
1368 * @param hot_x A pointer to an int to place the cursor's hot_x coordinate in.
1369 * @param hot_y A pointer to an int to place the cursor's hot_y coordinate in.
1370 *
1371 * This function queries information about an Ecore_Evas' cursor.
1372 *
1373 * @see ecore_evas_cursor_set()
1374 * @see ecore_evas_object_cursor_set()
1375 */
1376EAPI void ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y);
1377/**
1378 * @brief Set the cursor of an Ecore_Evas
1379 *
1380 * @param ee The Ecore_Evas
1381 *
1382 * @param obj The Evas_Object which will be the cursor.
1383 * @param layer The layer in which the cursor will appear.
1384 * @param hot_x The x coordinate of the cursor's hot spot.
1385 * @param hot_y The y coordinate of the cursor's hot spot.
1386 *
1387 * This function makes the mouse cursor over @p ee be the object specified by
1388 * @p obj. The actual point within the object that the mouse is at is specified
1389 * by @p hot_x and @p hot_y, which are coordinates with respect to the top left
1390 * corner of the cursor object.
1391 *
1392 * @see ecore_evas_cursor_set()
1393 */
1394EAPI void ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
1395EAPI void ecore_evas_override_set(Ecore_Evas *ee, Eina_Bool on);
1396EAPI Eina_Bool ecore_evas_override_get(const Ecore_Evas *ee);
1397EAPI void ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on);
1398EAPI Ecore_Evas_Avoid_Damage_Type ecore_evas_avoid_damage_get(const Ecore_Evas *ee);
1399EAPI void ecore_evas_withdrawn_set(Ecore_Evas *ee, Eina_Bool withdrawn);
1400EAPI Eina_Bool ecore_evas_withdrawn_get(const Ecore_Evas *ee);
1401EAPI void ecore_evas_sticky_set(Ecore_Evas *ee, Eina_Bool sticky);
1402EAPI Eina_Bool ecore_evas_sticky_get(const Ecore_Evas *ee);
1403EAPI void ecore_evas_manual_render_set(Ecore_Evas *ee, Eina_Bool manual_render);
1404EAPI Eina_Bool ecore_evas_manual_render_get(const Ecore_Evas *ee);
1405
1406/**
1407 * @brief Registers an @c Ecore_Evas to receive events through ecore_input_evas.
1408 *
1409 * @param ee The @c Ecore_Evas handle.
1410 *
1411 * This function calls ecore_event_window_register() with the @p ee as its @c
1412 * id argument, @c window argument, and uses its @c Evas too. It is useful when
1413 * no @c window information is available on a given @c Ecore_Evas backend.
1414 *
1415 * @see ecore_evas_input_event_unregister()
1416 * @since 1.1
1417 */
1418EAPI void ecore_evas_input_event_register(Ecore_Evas *ee);
1419/**
1420 * @brief Unregisters an @c Ecore_Evas receiving events through ecore_input_evas.
1421 *
1422 * @param ee The @c Ecore_Evas handle.
1423 *
1424 * @see ecore_evas_input_event_register()
1425 * @since 1.1
1426 */
1427EAPI void ecore_evas_input_event_unregister(Ecore_Evas *ee);
1428
1429/**
1430 * @brief Force immediate rendering on a given @c Ecore_Evas window
1431 *
1432 * @param ee An @c Ecore_Evas handle
1433 *
1434 * Use this call to forcefully flush the @p ee's canvas rendering
1435 * pipeline, thus bring its window to an up to date state.
1436 */
1437EAPI void ecore_evas_manual_render(Ecore_Evas *ee);
1438EAPI void ecore_evas_comp_sync_set(Ecore_Evas *ee, Eina_Bool do_sync);
1439EAPI Eina_Bool ecore_evas_comp_sync_get(const Ecore_Evas *ee);
1440/**
1441 * @brief Get geometry of screen associated with this Ecore_Evas.
1442 *
1443 * @param ee The Ecore_Evas whose window's to query container screen geometry.
1444 * @param x where to return the horizontal offset value. May be NULL.
1445 * @param y where to return the vertical offset value. May be NULL.
1446 * @param w where to return the width value. May be NULL.
1447 * @param h where to return the height value. May be NULL.
1448 *
1449 * @since 1.1
1450 */
1451EAPI void ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
1452
1453/**
1454 * @brief Associate the given object to this ecore evas.
1455 *
1456 * @param ee The Ecore_Evas to associate to @a obj
1457 * @param obj The object to associate to @a ee
1458 * @param flags The association flags.
1459 * @return EINA_TRUE on success, EINA_FALSE otherwise.
1460 *
1461 * Association means that operations on one will affect the other, for
1462 * example moving the object will move the window, resize the object will
1463 * also affect the ecore evas window, hide and show applies as well.
1464 *
1465 * This is meant to simplify development, since you often need to associate
1466 * these events with your "base" objects, background or bottom-most object.
1467 *
1468 * Be aware that some methods might not be what you would like, deleting
1469 * either the window or the object will delete the other. If you want to
1470 * change that behavior, let's say to hide window when it's closed, you
1471 * must use ecore_evas_callback_delete_request_set() and set your own code,
1472 * like ecore_evas_hide(). Just remember that if you override delete_request
1473 * and still want to delete the window/object, you must do that yourself.
1474 *
1475 * Since we now define delete_request, deleting windows will not quit
1476 * main loop, if you wish to do so, you should listen for EVAS_CALLBACK_FREE
1477 * on the object, that way you get notified and you can call
1478 * ecore_main_loop_quit().
1479 *
1480 * Flags can be OR'ed of:
1481 * @li ECORE_EVAS_OBJECT_ASSOCIATE_BASE (or 0): to listen to basic events
1482 * like delete, resize and move, but no stacking or layer are used.
1483 * @li ECORE_EVAS_OBJECT_ASSOCIATE_STACK: stacking operations will act
1484 * on the Ecore_Evas, not the object. So evas_object_raise() will
1485 * call ecore_evas_raise(). Relative operations (stack_above, stack_below)
1486 * are still not implemented.
1487 * @li ECORE_EVAS_OBJECT_ASSOCIATE_LAYER: stacking operations will act
1488 * on the Ecore_Evas, not the object. So evas_object_layer_set() will
1489 * call ecore_evas_layer_set().
1490 * @li ECORE_EVAS_OBJECT_ASSOCIATE_DEL: the object delete will delete the
1491 * ecore_evas as well as delete_requests on the ecore_evas will delete
1492 * etc.
1493 */
1494EAPI Eina_Bool ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags);
1495/**
1496 * @brief Cancel the association set with ecore_evas_object_associate().
1497 *
1498 * @param ee The Ecore_Evas to dissociate from @a obj
1499 * @param obj The object to dissociate from @a ee
1500 * @return EINA_TRUE on success, EINA_FALSE otherwise.
1501 */
1502EAPI Eina_Bool ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj);
1503/**
1504 * @brief Get the object associated with @p ee
1505 *
1506 * @param ee The Ecore_Evas to get the object from.
1507 * @return The associated object, or NULL if there is no associated object.
1508 */
1509EAPI Evas_Object *ecore_evas_object_associate_get(const Ecore_Evas *ee);
1510
1511/* helper function to be used with ECORE_GETOPT_CALLBACK_*() */
1512EAPI unsigned char ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage);
1513
1514/**
1515 * @brief Get a list of all the ecore_evases.
1516 *
1517 * @return A list of ecore_evases.
1518 *
1519 * The returned list of ecore evases is only valid until the canvases are
1520 * destroyed (and should not be cached for instance). The list can be freed by
1521 * just deleting the list.
1522 */
1523EAPI Eina_List *ecore_evas_ecore_evas_list_get(void);
1524
1525/* specific calls to an x11 environment ecore_evas */
1526EAPI void ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win);
1527EAPI Ecore_X_Window ecore_evas_x11_leader_get(Ecore_Evas *ee);
1528EAPI void ecore_evas_x11_leader_default_set(Ecore_Evas *ee);
1529EAPI void ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h);
1530EAPI void ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h);
1531EAPI void ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h);
1532EAPI void ecore_evas_x11_shape_input_empty(Ecore_Evas *ee);
1533EAPI void ecore_evas_x11_shape_input_reset(Ecore_Evas *ee);
1534EAPI void ecore_evas_x11_shape_input_apply(Ecore_Evas *ee);
1535
1536/**
1537 * @defgroup Ecore_Evas_Ews Ecore_Evas Single Process Windowing System.
1538 *
1539 * These are global scope functions to manage the EWS to be used by
1540 * ecore_evas_ews_new().
1541 *
1542 * @since 1.1
1543 * @{
1544 */
1545
1546/**
1547 * Sets the engine to be used by the backing store engine.
1548 *
1549 * @return EINA_TRUE on success, EINA_FALSE if ews is already in use.
1550 * @since 1.1
1551 */
1552EAPI Eina_Bool ecore_evas_ews_engine_set(const char *engine, const char *options);
1553
1554/**
1555 * Reconfigure the backing store used.
1556 * @since 1.1
1557 */
1558EAPI Eina_Bool ecore_evas_ews_setup(int x, int y, int w, int h);
1559
1560/**
1561 * Return the internal backing store in use.
1562 *
1563 * @note this will foced it to be created, making future calls to
1564 * ecore_evas_ews_engine_set() void.
1565 *
1566 * @see ecore_evas_ews_evas_get()
1567 * @since 1.1
1568 */
1569EAPI Ecore_Evas *ecore_evas_ews_ecore_evas_get(void);
1570
1571/**
1572 * Return the internal backing store in use.
1573 *
1574 * @note this will foced it to be created, making future calls to
1575 * ecore_evas_ews_engine_set() void.
1576 *
1577 * @see ecore_evas_ews_ecore_evas_get()
1578 * @since 1.1
1579 */
1580EAPI Evas *ecore_evas_ews_evas_get(void);
1581
1582/**
1583 * Get the current background.
1584 */
1585EAPI Evas_Object *ecore_evas_ews_background_get(void);
1586
1587/**
1588 * Set the current background, must be created at evas ecore_evas_ews_evas_get()
1589 *
1590 * It will be kept at lowest layer (EVAS_LAYER_MIN) and below
1591 * everything else. You can set any object, default is a black
1592 * rectangle.
1593 *
1594 * @note previous object will be deleted!
1595 */
1596EAPI void ecore_evas_ews_background_set(Evas_Object *o);
1597
1598/**
1599 * Return all Ecore_Evas* created by EWS.
1600 *
1601 * @note do not change the returned list or its contents.
1602 * @since 1.1
1603 */
1604EAPI const Eina_List *ecore_evas_ews_children_get(void);
1605
1606/**
1607 * Set the identifier of the manager taking care of internal windows.
1608 *
1609 * The ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE event is issued. Consider
1610 * handling it to know if you should stop handling events yourself
1611 * (ie: another manager took over)
1612 *
1613 * @param manager any unique identifier address.
1614 *
1615 * @see ecore_evas_ews_manager_get()
1616 * @since 1.1
1617 */
1618EAPI void ecore_evas_ews_manager_set(const void *manager);
1619
1620/**
1621 * Get the identifier of the manager taking care of internal windows.
1622 *
1623 * @return the value set by ecore_evas_ews_manager_set()
1624 * @since 1.1
1625 */
1626EAPI const void *ecore_evas_ews_manager_get(void);
1627
1628EAPI extern int ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE; /**< manager was changed */
1629EAPI extern int ECORE_EVAS_EWS_EVENT_ADD; /**< window was created */
1630EAPI extern int ECORE_EVAS_EWS_EVENT_DEL; /**< window was deleted, pointer is already invalid but may be used as reference for further cleanup work. */
1631EAPI extern int ECORE_EVAS_EWS_EVENT_RESIZE; /**< window was resized */
1632EAPI extern int ECORE_EVAS_EWS_EVENT_MOVE; /**< window was moved */
1633EAPI extern int ECORE_EVAS_EWS_EVENT_SHOW; /**< window become visible */
1634EAPI extern int ECORE_EVAS_EWS_EVENT_HIDE; /**< window become hidden */
1635EAPI extern int ECORE_EVAS_EWS_EVENT_FOCUS; /**< window was focused */
1636EAPI extern int ECORE_EVAS_EWS_EVENT_UNFOCUS; /**< window lost focus */
1637EAPI extern int ECORE_EVAS_EWS_EVENT_RAISE; /**< window was raised */
1638EAPI extern int ECORE_EVAS_EWS_EVENT_LOWER; /**< window was lowered */
1639EAPI extern int ECORE_EVAS_EWS_EVENT_ACTIVATE; /**< window was activated */
1640
1641EAPI extern int ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE; /**< window minimized/iconified changed */
1642EAPI extern int ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE; /**< window maximized changed */
1643EAPI extern int ECORE_EVAS_EWS_EVENT_LAYER_CHANGE; /**< window layer changed */
1644EAPI extern int ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE; /**< window fullscreen changed */
1645EAPI extern int ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE; /**< some other window property changed (title, name, class, alpha, transparent, shaped...) */
1646
1647/**
1648 * @}
1649 */
1650
1651
1652/**
1653 * @}
1654 */
1655
1656#ifdef __cplusplus
1657}
1658#endif
1659
1660#endif
diff --git a/libraries/ecore/src/lib/ecore_evas/Makefile.am b/libraries/ecore/src/lib/ecore_evas/Makefile.am
new file mode 100644
index 0000000..fbb7190
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/Makefile.am
@@ -0,0 +1,131 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3if BUILD_ECORE_X
4ECORE_X_INC = -I$(top_srcdir)/src/lib/ecore_x @x_cflags@ @ECORE_XCB_CFLAGS@
5ECORE_X_LIB = $(top_builddir)/src/lib/ecore_x/libecore_x.la @x_libs@ @ECORE_XCB_LIBS@
6else
7ECORE_X_INC =
8ECORE_X_LIB =
9endif
10
11if BUILD_ECORE_FB
12ECORE_FB_INC = -I$(top_srcdir)/src/lib/ecore_fb
13ECORE_FB_LIB = $(top_builddir)/src/lib/ecore_fb/libecore_fb.la
14else
15ECORE_FB_INC =
16ECORE_FB_LIB =
17endif
18
19if BUILD_ECORE_DIRECTFB
20ECORE_DIRECTFB_INC = -I$(top_srcdir)/src/lib/ecore_directfb -I@DIRECTFB_CFLAGS@
21ECORE_DIRECTFB_LIB = $(top_builddir)/src/lib/ecore_directfb/libecore_directfb.la
22else
23ECORE_DIRECTFB_INC =
24ECORE_DIRECTFB_LIB =
25endif
26
27if BUILD_ECORE_WIN32
28ECORE_WIN32_INC = -I$(top_srcdir)/src/lib/ecore_win32
29ECORE_WIN32_LIB = $(top_builddir)/src/lib/ecore_win32/libecore_win32.la
30else
31ECORE_WIN32_INC =
32ECORE_WIN32_LIB =
33endif
34
35if BUILD_ECORE_SDL
36ECORE_SDL_INC = -I$(top_srcdir)/src/lib/ecore_sdl @SDL_CFLAGS@
37ECORE_SDL_LIB = $(top_builddir)/src/lib/ecore_sdl/libecore_sdl.la
38ECORE_SDL_LIBADD = @SDL_LIBS@ $(ECORE_SDL_LIB)
39else
40ECORE_SDL_INC =
41ECORE_SDL_LIB =
42ECORE_SDL_LIBADD =
43endif
44
45if BUILD_ECORE_COCOA
46ECORE_COCOA_INC = -I$(top_srcdir)/src/lib/ecore_cocoa
47ECORE_COCOA_LIB = $(top_builddir)/src/lib/ecore_cocoa/libecore_cocoa.la
48else
49ECORE_COCOA_INC =
50ECORE_COCOA_LIB =
51endif
52
53if BUILD_ECORE_WINCE
54ECORE_WINCE_INC = -I$(top_srcdir)/src/lib/ecore_wince
55ECORE_WINCE_LIB = $(top_builddir)/src/lib/ecore_wince/libecore_wince.la
56else
57ECORE_WINCE_INC =
58ECORE_WINCE_LIB =
59endif
60
61if BUILD_ECORE_PSL1GHT
62ECORE_PSL1GHT_INC = -I$(top_srcdir)/src/lib/ecore_psl1ght
63ECORE_PSL1GHT_LIB = $(top_builddir)/src/lib/ecore_psl1ght/libecore_psl1ght.la
64else
65ECORE_PSL1GHT_INC =
66ECORE_PSL1GHT_LIB =
67endif
68
69AM_CPPFLAGS = \
70-I$(top_srcdir)/src/lib/ecore \
71-I$(top_srcdir)/src/lib/ecore_evas \
72-I$(top_srcdir)/src/lib/ecore_input \
73-I$(top_srcdir)/src/lib/ecore_input_evas \
74-I$(top_builddir)/src/lib/ecore \
75-I$(top_builddir)/src/lib/ecore_evas \
76-I$(top_builddir)/src/lib/ecore_input \
77-I$(top_builddir)/src/lib/ecore_input_evas \
78@EFL_ECORE_EVAS_BUILD@ \
79$(ECORE_X_INC) \
80$(ECORE_FB_INC) \
81$(ECORE_DIRECTFB_INC) \
82$(ECORE_WIN32_INC) \
83$(ECORE_SDL_INC) \
84$(ECORE_COCOA_INC) \
85$(ECORE_WINCE_INC) \
86$(ECORE_PSL1GHT_INC) \
87@EVAS_CFLAGS@ \
88@EINA_CFLAGS@ \
89@EVIL_CFLAGS@
90
91AM_CFLAGS = @WIN32_CFLAGS@
92
93lib_LTLIBRARIES = libecore_evas.la
94includes_HEADERS = Ecore_Evas.h
95includesdir = $(includedir)/ecore-@VMAJ@
96
97libecore_evas_la_SOURCES = \
98ecore_evas.c \
99ecore_evas_util.c \
100ecore_evas_x.c \
101ecore_evas_fb.c \
102ecore_evas_buffer.c \
103ecore_evas_directfb.c \
104ecore_evas_win32.c \
105ecore_evas_sdl.c \
106ecore_evas_cocoa.c \
107ecore_evas_wince.c \
108ecore_evas_ews.c \
109ecore_evas_psl1ght.c
110
111libecore_evas_la_LIBADD = \
112$(ECORE_X_LIB) \
113$(ECORE_FB_LIB) \
114$(ECORE_DIRECTFB_LIB) \
115$(ECORE_WIN32_LIB) \
116$(ECORE_SDL_LIB) \
117$(ECORE_SDL_LIBADD) \
118$(ECORE_COCOA_LIB) \
119$(ECORE_WINCE_LIB) \
120$(ECORE_PSL1GHT_LIB) \
121$(top_builddir)/src/lib/ecore_input/libecore_input.la \
122$(top_builddir)/src/lib/ecore_input_evas/libecore_input_evas.la \
123$(top_builddir)/src/lib/ecore/libecore.la \
124@EVAS_LIBS@ \
125@EINA_LIBS@ \
126@EVIL_LIBS@
127
128libecore_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
129
130EXTRA_DIST = \
131ecore_evas_private.h
diff --git a/libraries/ecore/src/lib/ecore_evas/Makefile.in b/libraries/ecore/src/lib/ecore_evas/Makefile.in
new file mode 100644
index 0000000..793e59d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/Makefile.in
@@ -0,0 +1,921 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_evas
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89@BUILD_ECORE_X_TRUE@am__DEPENDENCIES_1 = $(top_builddir)/src/lib/ecore_x/libecore_x.la
90@BUILD_ECORE_FB_TRUE@am__DEPENDENCIES_2 = $(top_builddir)/src/lib/ecore_fb/libecore_fb.la
91@BUILD_ECORE_DIRECTFB_TRUE@am__DEPENDENCIES_3 = $(top_builddir)/src/lib/ecore_directfb/libecore_directfb.la
92@BUILD_ECORE_WIN32_TRUE@am__DEPENDENCIES_4 = $(top_builddir)/src/lib/ecore_win32/libecore_win32.la
93@BUILD_ECORE_SDL_TRUE@am__DEPENDENCIES_5 = $(top_builddir)/src/lib/ecore_sdl/libecore_sdl.la
94@BUILD_ECORE_SDL_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_5)
95@BUILD_ECORE_COCOA_TRUE@am__DEPENDENCIES_7 = $(top_builddir)/src/lib/ecore_cocoa/libecore_cocoa.la
96@BUILD_ECORE_WINCE_TRUE@am__DEPENDENCIES_8 = $(top_builddir)/src/lib/ecore_wince/libecore_wince.la
97@BUILD_ECORE_PSL1GHT_TRUE@am__DEPENDENCIES_9 = $(top_builddir)/src/lib/ecore_psl1ght/libecore_psl1ght.la
98libecore_evas_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
99 $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \
100 $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_5) \
101 $(am__DEPENDENCIES_6) $(am__DEPENDENCIES_7) \
102 $(am__DEPENDENCIES_8) $(am__DEPENDENCIES_9) \
103 $(top_builddir)/src/lib/ecore_input/libecore_input.la \
104 $(top_builddir)/src/lib/ecore_input_evas/libecore_input_evas.la \
105 $(top_builddir)/src/lib/ecore/libecore.la
106am_libecore_evas_la_OBJECTS = ecore_evas.lo ecore_evas_util.lo \
107 ecore_evas_x.lo ecore_evas_fb.lo ecore_evas_buffer.lo \
108 ecore_evas_directfb.lo ecore_evas_win32.lo ecore_evas_sdl.lo \
109 ecore_evas_cocoa.lo ecore_evas_wince.lo ecore_evas_ews.lo \
110 ecore_evas_psl1ght.lo
111libecore_evas_la_OBJECTS = $(am_libecore_evas_la_OBJECTS)
112AM_V_lt = $(am__v_lt_$(V))
113am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
114am__v_lt_0 = --silent
115libecore_evas_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
116 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
117 $(AM_CFLAGS) $(CFLAGS) $(libecore_evas_la_LDFLAGS) $(LDFLAGS) \
118 -o $@
119DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
120depcomp = $(SHELL) $(top_srcdir)/depcomp
121am__depfiles_maybe = depfiles
122am__mv = mv -f
123COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
124 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
125LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
126 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
127 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
128 $(AM_CFLAGS) $(CFLAGS)
129AM_V_CC = $(am__v_CC_$(V))
130am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
131am__v_CC_0 = @echo " CC " $@;
132AM_V_at = $(am__v_at_$(V))
133am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
134am__v_at_0 = @
135CCLD = $(CC)
136LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
137 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
138 $(AM_LDFLAGS) $(LDFLAGS) -o $@
139AM_V_CCLD = $(am__v_CCLD_$(V))
140am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
141am__v_CCLD_0 = @echo " CCLD " $@;
142AM_V_GEN = $(am__v_GEN_$(V))
143am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
144am__v_GEN_0 = @echo " GEN " $@;
145SOURCES = $(libecore_evas_la_SOURCES)
146DIST_SOURCES = $(libecore_evas_la_SOURCES)
147HEADERS = $(includes_HEADERS)
148ETAGS = etags
149CTAGS = ctags
150DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
151ACLOCAL = @ACLOCAL@
152ALLOCA = @ALLOCA@
153AMTAR = @AMTAR@
154AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
155AR = @AR@
156AS = @AS@
157AUTOCONF = @AUTOCONF@
158AUTOHEADER = @AUTOHEADER@
159AUTOMAKE = @AUTOMAKE@
160AWK = @AWK@
161CARES_CFLAGS = @CARES_CFLAGS@
162CARES_LIBS = @CARES_LIBS@
163CC = @CC@
164CCDEPMODE = @CCDEPMODE@
165CFLAGS = @CFLAGS@
166CHECK_CFLAGS = @CHECK_CFLAGS@
167CHECK_LIBS = @CHECK_LIBS@
168CPP = @CPP@
169CPPFLAGS = @CPPFLAGS@
170CURL_CFLAGS = @CURL_CFLAGS@
171CURL_LIBS = @CURL_LIBS@
172CXX = @CXX@
173CXXCPP = @CXXCPP@
174CXXDEPMODE = @CXXDEPMODE@
175CXXFLAGS = @CXXFLAGS@
176CYGPATH_W = @CYGPATH_W@
177DEFS = @DEFS@
178DEPDIR = @DEPDIR@
179DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
180DIRECTFB_LIBS = @DIRECTFB_LIBS@
181DLLTOOL = @DLLTOOL@
182DSYMUTIL = @DSYMUTIL@
183DUMPBIN = @DUMPBIN@
184ECHO_C = @ECHO_C@
185ECHO_N = @ECHO_N@
186ECHO_T = @ECHO_T@
187ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
188ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
189EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
190EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
191EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
192EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
193EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
194EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
195EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
196EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
197EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
198EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
199EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
200EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
201EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
202EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
203EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
204EGREP = @EGREP@
205EINA_CFLAGS = @EINA_CFLAGS@
206EINA_LIBS = @EINA_LIBS@
207ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
208ESCAPE_LIBS = @ESCAPE_LIBS@
209EVAS_CFLAGS = @EVAS_CFLAGS@
210EVAS_LIBS = @EVAS_LIBS@
211EVIL_CFLAGS = @EVIL_CFLAGS@
212EVIL_LIBS = @EVIL_LIBS@
213EXEEXT = @EXEEXT@
214FGREP = @FGREP@
215GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
216GLIB_CFLAGS = @GLIB_CFLAGS@
217GLIB_LIBS = @GLIB_LIBS@
218GMSGFMT = @GMSGFMT@
219GMSGFMT_015 = @GMSGFMT_015@
220GREP = @GREP@
221INSTALL = @INSTALL@
222INSTALL_DATA = @INSTALL_DATA@
223INSTALL_PROGRAM = @INSTALL_PROGRAM@
224INSTALL_SCRIPT = @INSTALL_SCRIPT@
225INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
226INTLLIBS = @INTLLIBS@
227INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
228KEYSYMDEFS = @KEYSYMDEFS@
229LD = @LD@
230LDFLAGS = @LDFLAGS@
231LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
232LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
233LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
234LIBICONV = @LIBICONV@
235LIBINTL = @LIBINTL@
236LIBOBJS = @LIBOBJS@
237LIBS = @LIBS@
238LIBTOOL = @LIBTOOL@
239LIPO = @LIPO@
240LN_S = @LN_S@
241LTLIBICONV = @LTLIBICONV@
242LTLIBINTL = @LTLIBINTL@
243LTLIBOBJS = @LTLIBOBJS@
244MAKEINFO = @MAKEINFO@
245MKDIR_P = @MKDIR_P@
246MSGFMT = @MSGFMT@
247MSGFMT_015 = @MSGFMT_015@
248MSGMERGE = @MSGMERGE@
249NM = @NM@
250NMEDIT = @NMEDIT@
251OBJC = @OBJC@
252OBJCDEPMODE = @OBJCDEPMODE@
253OBJCFLAGS = @OBJCFLAGS@
254OBJDUMP = @OBJDUMP@
255OBJEXT = @OBJEXT@
256OTOOL = @OTOOL@
257OTOOL64 = @OTOOL64@
258PACKAGE = @PACKAGE@
259PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
260PACKAGE_NAME = @PACKAGE_NAME@
261PACKAGE_STRING = @PACKAGE_STRING@
262PACKAGE_TARNAME = @PACKAGE_TARNAME@
263PACKAGE_URL = @PACKAGE_URL@
264PACKAGE_VERSION = @PACKAGE_VERSION@
265PATH_SEPARATOR = @PATH_SEPARATOR@
266PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
267PIXMAN_LIBS = @PIXMAN_LIBS@
268PKG_CONFIG = @PKG_CONFIG@
269PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
270PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
271POSUB = @POSUB@
272RANLIB = @RANLIB@
273SDL_CFLAGS = @SDL_CFLAGS@
274SDL_CONFIG = @SDL_CONFIG@
275SDL_LIBS = @SDL_LIBS@
276SED = @SED@
277SET_MAKE = @SET_MAKE@
278SHELL = @SHELL@
279SSL_CFLAGS = @SSL_CFLAGS@
280SSL_LIBS = @SSL_LIBS@
281STRIP = @STRIP@
282TLS2_CFLAGS = @TLS2_CFLAGS@
283TLS2_LIBS = @TLS2_LIBS@
284TLS_CFLAGS = @TLS_CFLAGS@
285TLS_LIBS = @TLS_LIBS@
286TSLIB_CFLAGS = @TSLIB_CFLAGS@
287TSLIB_LIBS = @TSLIB_LIBS@
288USE_NLS = @USE_NLS@
289VERSION = @VERSION@
290VMAJ = @VMAJ@
291WIN32_CFLAGS = @WIN32_CFLAGS@
292WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
293WIN32_LIBS = @WIN32_LIBS@
294XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
295XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
296XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
297XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
298XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
299XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
300XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
301XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
302XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
303XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
304XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
305XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
306XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
307XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
308XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
309XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
310XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
311XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
312XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
313XCB_X11_LIBS = @XCB_X11_LIBS@
314XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
315XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
316XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
317XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
318XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
319XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
320XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
321XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
322XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
323XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
324XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
325XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
326XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
327XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
328XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
329XDAMAGE_LIBS = @XDAMAGE_LIBS@
330XDPMS_CFLAGS = @XDPMS_CFLAGS@
331XDPMS_LIBS = @XDPMS_LIBS@
332XFIXES_CFLAGS = @XFIXES_CFLAGS@
333XFIXES_LIBS = @XFIXES_LIBS@
334XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
335XGESTURE_LIBS = @XGESTURE_LIBS@
336XGETTEXT = @XGETTEXT@
337XGETTEXT_015 = @XGETTEXT_015@
338XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
339XI2_CFLAGS = @XI2_CFLAGS@
340XI2_LIBS = @XI2_LIBS@
341XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
342XINERAMA_LIBS = @XINERAMA_LIBS@
343XKB_CFLAGS = @XKB_CFLAGS@
344XKB_LIBS = @XKB_LIBS@
345XMKMF = @XMKMF@
346XPRINT_CFLAGS = @XPRINT_CFLAGS@
347XPRINT_LIBS = @XPRINT_LIBS@
348XRANDR_CFLAGS = @XRANDR_CFLAGS@
349XRANDR_LIBS = @XRANDR_LIBS@
350XRENDER_CFLAGS = @XRENDER_CFLAGS@
351XRENDER_LIBS = @XRENDER_LIBS@
352XSS_CFLAGS = @XSS_CFLAGS@
353XSS_LIBS = @XSS_LIBS@
354XTEST_CFLAGS = @XTEST_CFLAGS@
355XTEST_LIBS = @XTEST_LIBS@
356X_CFLAGS = @X_CFLAGS@
357X_EXTRA_LIBS = @X_EXTRA_LIBS@
358X_LIBS = @X_LIBS@
359X_PRE_LIBS = @X_PRE_LIBS@
360Xcursor_cflags = @Xcursor_cflags@
361Xcursor_libs = @Xcursor_libs@
362abs_builddir = @abs_builddir@
363abs_srcdir = @abs_srcdir@
364abs_top_builddir = @abs_top_builddir@
365abs_top_srcdir = @abs_top_srcdir@
366ac_ct_CC = @ac_ct_CC@
367ac_ct_CXX = @ac_ct_CXX@
368ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
369ac_ct_OBJC = @ac_ct_OBJC@
370am__include = @am__include@
371am__leading_dot = @am__leading_dot@
372am__quote = @am__quote@
373am__tar = @am__tar@
374am__untar = @am__untar@
375bindir = @bindir@
376build = @build@
377build_alias = @build_alias@
378build_cpu = @build_cpu@
379build_os = @build_os@
380build_vendor = @build_vendor@
381builddir = @builddir@
382cocoa_ldflags = @cocoa_ldflags@
383datadir = @datadir@
384datarootdir = @datarootdir@
385dlopen_libs = @dlopen_libs@
386docdir = @docdir@
387dvidir = @dvidir@
388ecore_cocoa_cflags = @ecore_cocoa_cflags@
389ecore_cocoa_libs = @ecore_cocoa_libs@
390ecore_con_cflags = @ecore_con_cflags@
391ecore_con_libs = @ecore_con_libs@
392ecore_directfb_cflags = @ecore_directfb_cflags@
393ecore_directfb_libs = @ecore_directfb_libs@
394ecore_evas_cflags = @ecore_evas_cflags@
395ecore_evas_libs = @ecore_evas_libs@
396ecore_fb_cflags = @ecore_fb_cflags@
397ecore_fb_libs = @ecore_fb_libs@
398ecore_file_cflags = @ecore_file_cflags@
399ecore_file_libs = @ecore_file_libs@
400ecore_imf_cflags = @ecore_imf_cflags@
401ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
402ecore_imf_evas_libs = @ecore_imf_evas_libs@
403ecore_imf_libs = @ecore_imf_libs@
404ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
405ecore_imf_xim_libs = @ecore_imf_xim_libs@
406ecore_input_cflags = @ecore_input_cflags@
407ecore_input_evas_cflags = @ecore_input_evas_cflags@
408ecore_input_evas_libs = @ecore_input_evas_libs@
409ecore_input_libs = @ecore_input_libs@
410ecore_ipc_cflags = @ecore_ipc_cflags@
411ecore_ipc_libs = @ecore_ipc_libs@
412ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
413ecore_psl1ght_libs = @ecore_psl1ght_libs@
414ecore_sdl_cflags = @ecore_sdl_cflags@
415ecore_sdl_libs = @ecore_sdl_libs@
416ecore_win32_cflags = @ecore_win32_cflags@
417ecore_win32_libs = @ecore_win32_libs@
418ecore_wince_cflags = @ecore_wince_cflags@
419ecore_wince_libs = @ecore_wince_libs@
420ecore_x_cflags = @ecore_x_cflags@
421ecore_x_libs = @ecore_x_libs@
422ecore_x_libs_private = @ecore_x_libs_private@
423efl_doxygen = @efl_doxygen@
424efl_have_doxygen = @efl_have_doxygen@
425exec_prefix = @exec_prefix@
426have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
427host = @host@
428host_alias = @host_alias@
429host_cpu = @host_cpu@
430host_os = @host_os@
431host_vendor = @host_vendor@
432htmldir = @htmldir@
433includedir = @includedir@
434infodir = @infodir@
435install_sh = @install_sh@
436libdir = @libdir@
437libexecdir = @libexecdir@
438localedir = @localedir@
439localstatedir = @localstatedir@
440lt_ECHO = @lt_ECHO@
441lt_enable_auto_import = @lt_enable_auto_import@
442mandir = @mandir@
443mkdir_p = @mkdir_p@
444oldincludedir = @oldincludedir@
445pdfdir = @pdfdir@
446pkgconfig_requires_private = @pkgconfig_requires_private@
447prefix = @prefix@
448program_transform_name = @program_transform_name@
449psdir = @psdir@
450release_info = @release_info@
451requirements_ecore = @requirements_ecore@
452requirements_ecore_cocoa = @requirements_ecore_cocoa@
453requirements_ecore_con = @requirements_ecore_con@
454requirements_ecore_directfb = @requirements_ecore_directfb@
455requirements_ecore_evas = @requirements_ecore_evas@
456requirements_ecore_fb = @requirements_ecore_fb@
457requirements_ecore_file = @requirements_ecore_file@
458requirements_ecore_imf = @requirements_ecore_imf@
459requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
460requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
461requirements_ecore_input = @requirements_ecore_input@
462requirements_ecore_input_evas = @requirements_ecore_input_evas@
463requirements_ecore_ipc = @requirements_ecore_ipc@
464requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
465requirements_ecore_sdl = @requirements_ecore_sdl@
466requirements_ecore_win32 = @requirements_ecore_win32@
467requirements_ecore_wince = @requirements_ecore_wince@
468requirements_ecore_x = @requirements_ecore_x@
469rt_libs = @rt_libs@
470sbindir = @sbindir@
471sharedstatedir = @sharedstatedir@
472srcdir = @srcdir@
473sysconfdir = @sysconfdir@
474target_alias = @target_alias@
475top_build_prefix = @top_build_prefix@
476top_builddir = @top_builddir@
477top_srcdir = @top_srcdir@
478version_info = @version_info@
479x_cflags = @x_cflags@
480x_includes = @x_includes@
481x_libs = @x_libs@
482MAINTAINERCLEANFILES = Makefile.in
483@BUILD_ECORE_X_FALSE@ECORE_X_INC =
484@BUILD_ECORE_X_TRUE@ECORE_X_INC = -I$(top_srcdir)/src/lib/ecore_x @x_cflags@ @ECORE_XCB_CFLAGS@
485@BUILD_ECORE_X_FALSE@ECORE_X_LIB =
486@BUILD_ECORE_X_TRUE@ECORE_X_LIB = $(top_builddir)/src/lib/ecore_x/libecore_x.la @x_libs@ @ECORE_XCB_LIBS@
487@BUILD_ECORE_FB_FALSE@ECORE_FB_INC =
488@BUILD_ECORE_FB_TRUE@ECORE_FB_INC = -I$(top_srcdir)/src/lib/ecore_fb
489@BUILD_ECORE_FB_FALSE@ECORE_FB_LIB =
490@BUILD_ECORE_FB_TRUE@ECORE_FB_LIB = $(top_builddir)/src/lib/ecore_fb/libecore_fb.la
491@BUILD_ECORE_DIRECTFB_FALSE@ECORE_DIRECTFB_INC =
492@BUILD_ECORE_DIRECTFB_TRUE@ECORE_DIRECTFB_INC = -I$(top_srcdir)/src/lib/ecore_directfb -I@DIRECTFB_CFLAGS@
493@BUILD_ECORE_DIRECTFB_FALSE@ECORE_DIRECTFB_LIB =
494@BUILD_ECORE_DIRECTFB_TRUE@ECORE_DIRECTFB_LIB = $(top_builddir)/src/lib/ecore_directfb/libecore_directfb.la
495@BUILD_ECORE_WIN32_FALSE@ECORE_WIN32_INC =
496@BUILD_ECORE_WIN32_TRUE@ECORE_WIN32_INC = -I$(top_srcdir)/src/lib/ecore_win32
497@BUILD_ECORE_WIN32_FALSE@ECORE_WIN32_LIB =
498@BUILD_ECORE_WIN32_TRUE@ECORE_WIN32_LIB = $(top_builddir)/src/lib/ecore_win32/libecore_win32.la
499@BUILD_ECORE_SDL_FALSE@ECORE_SDL_INC =
500@BUILD_ECORE_SDL_TRUE@ECORE_SDL_INC = -I$(top_srcdir)/src/lib/ecore_sdl @SDL_CFLAGS@
501@BUILD_ECORE_SDL_FALSE@ECORE_SDL_LIB =
502@BUILD_ECORE_SDL_TRUE@ECORE_SDL_LIB = $(top_builddir)/src/lib/ecore_sdl/libecore_sdl.la
503@BUILD_ECORE_SDL_FALSE@ECORE_SDL_LIBADD =
504@BUILD_ECORE_SDL_TRUE@ECORE_SDL_LIBADD = @SDL_LIBS@ $(ECORE_SDL_LIB)
505@BUILD_ECORE_COCOA_FALSE@ECORE_COCOA_INC =
506@BUILD_ECORE_COCOA_TRUE@ECORE_COCOA_INC = -I$(top_srcdir)/src/lib/ecore_cocoa
507@BUILD_ECORE_COCOA_FALSE@ECORE_COCOA_LIB =
508@BUILD_ECORE_COCOA_TRUE@ECORE_COCOA_LIB = $(top_builddir)/src/lib/ecore_cocoa/libecore_cocoa.la
509@BUILD_ECORE_WINCE_FALSE@ECORE_WINCE_INC =
510@BUILD_ECORE_WINCE_TRUE@ECORE_WINCE_INC = -I$(top_srcdir)/src/lib/ecore_wince
511@BUILD_ECORE_WINCE_FALSE@ECORE_WINCE_LIB =
512@BUILD_ECORE_WINCE_TRUE@ECORE_WINCE_LIB = $(top_builddir)/src/lib/ecore_wince/libecore_wince.la
513@BUILD_ECORE_PSL1GHT_FALSE@ECORE_PSL1GHT_INC =
514@BUILD_ECORE_PSL1GHT_TRUE@ECORE_PSL1GHT_INC = -I$(top_srcdir)/src/lib/ecore_psl1ght
515@BUILD_ECORE_PSL1GHT_FALSE@ECORE_PSL1GHT_LIB =
516@BUILD_ECORE_PSL1GHT_TRUE@ECORE_PSL1GHT_LIB = $(top_builddir)/src/lib/ecore_psl1ght/libecore_psl1ght.la
517AM_CPPFLAGS = \
518-I$(top_srcdir)/src/lib/ecore \
519-I$(top_srcdir)/src/lib/ecore_evas \
520-I$(top_srcdir)/src/lib/ecore_input \
521-I$(top_srcdir)/src/lib/ecore_input_evas \
522-I$(top_builddir)/src/lib/ecore \
523-I$(top_builddir)/src/lib/ecore_evas \
524-I$(top_builddir)/src/lib/ecore_input \
525-I$(top_builddir)/src/lib/ecore_input_evas \
526@EFL_ECORE_EVAS_BUILD@ \
527$(ECORE_X_INC) \
528$(ECORE_FB_INC) \
529$(ECORE_DIRECTFB_INC) \
530$(ECORE_WIN32_INC) \
531$(ECORE_SDL_INC) \
532$(ECORE_COCOA_INC) \
533$(ECORE_WINCE_INC) \
534$(ECORE_PSL1GHT_INC) \
535@EVAS_CFLAGS@ \
536@EINA_CFLAGS@ \
537@EVIL_CFLAGS@
538
539AM_CFLAGS = @WIN32_CFLAGS@
540lib_LTLIBRARIES = libecore_evas.la
541includes_HEADERS = Ecore_Evas.h
542includesdir = $(includedir)/ecore-@VMAJ@
543libecore_evas_la_SOURCES = \
544ecore_evas.c \
545ecore_evas_util.c \
546ecore_evas_x.c \
547ecore_evas_fb.c \
548ecore_evas_buffer.c \
549ecore_evas_directfb.c \
550ecore_evas_win32.c \
551ecore_evas_sdl.c \
552ecore_evas_cocoa.c \
553ecore_evas_wince.c \
554ecore_evas_ews.c \
555ecore_evas_psl1ght.c
556
557libecore_evas_la_LIBADD = \
558$(ECORE_X_LIB) \
559$(ECORE_FB_LIB) \
560$(ECORE_DIRECTFB_LIB) \
561$(ECORE_WIN32_LIB) \
562$(ECORE_SDL_LIB) \
563$(ECORE_SDL_LIBADD) \
564$(ECORE_COCOA_LIB) \
565$(ECORE_WINCE_LIB) \
566$(ECORE_PSL1GHT_LIB) \
567$(top_builddir)/src/lib/ecore_input/libecore_input.la \
568$(top_builddir)/src/lib/ecore_input_evas/libecore_input_evas.la \
569$(top_builddir)/src/lib/ecore/libecore.la \
570@EVAS_LIBS@ \
571@EINA_LIBS@ \
572@EVIL_LIBS@
573
574libecore_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
575EXTRA_DIST = \
576ecore_evas_private.h
577
578all: all-am
579
580.SUFFIXES:
581.SUFFIXES: .c .lo .o .obj
582$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
583 @for dep in $?; do \
584 case '$(am__configure_deps)' in \
585 *$$dep*) \
586 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
587 && { if test -f $@; then exit 0; else break; fi; }; \
588 exit 1;; \
589 esac; \
590 done; \
591 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_evas/Makefile'; \
592 $(am__cd) $(top_srcdir) && \
593 $(AUTOMAKE) --gnu src/lib/ecore_evas/Makefile
594.PRECIOUS: Makefile
595Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
596 @case '$?' in \
597 *config.status*) \
598 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
599 *) \
600 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
601 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
602 esac;
603
604$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
605 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
606
607$(top_srcdir)/configure: $(am__configure_deps)
608 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
609$(ACLOCAL_M4): $(am__aclocal_m4_deps)
610 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
611$(am__aclocal_m4_deps):
612install-libLTLIBRARIES: $(lib_LTLIBRARIES)
613 @$(NORMAL_INSTALL)
614 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
615 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
616 list2=; for p in $$list; do \
617 if test -f $$p; then \
618 list2="$$list2 $$p"; \
619 else :; fi; \
620 done; \
621 test -z "$$list2" || { \
622 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
623 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
624 }
625
626uninstall-libLTLIBRARIES:
627 @$(NORMAL_UNINSTALL)
628 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
629 for p in $$list; do \
630 $(am__strip_dir) \
631 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
632 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
633 done
634
635clean-libLTLIBRARIES:
636 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
637 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
638 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
639 test "$$dir" != "$$p" || dir=.; \
640 echo "rm -f \"$${dir}/so_locations\""; \
641 rm -f "$${dir}/so_locations"; \
642 done
643libecore_evas.la: $(libecore_evas_la_OBJECTS) $(libecore_evas_la_DEPENDENCIES)
644 $(AM_V_CCLD)$(libecore_evas_la_LINK) -rpath $(libdir) $(libecore_evas_la_OBJECTS) $(libecore_evas_la_LIBADD) $(LIBS)
645
646mostlyclean-compile:
647 -rm -f *.$(OBJEXT)
648
649distclean-compile:
650 -rm -f *.tab.c
651
652@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas.Plo@am__quote@
653@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_buffer.Plo@am__quote@
654@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_cocoa.Plo@am__quote@
655@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_directfb.Plo@am__quote@
656@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_ews.Plo@am__quote@
657@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_fb.Plo@am__quote@
658@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_psl1ght.Plo@am__quote@
659@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_sdl.Plo@am__quote@
660@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_util.Plo@am__quote@
661@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_win32.Plo@am__quote@
662@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_wince.Plo@am__quote@
663@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_evas_x.Plo@am__quote@
664
665.c.o:
666@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
667@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
668@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
669@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
670@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
671@am__fastdepCC_FALSE@ $(COMPILE) -c $<
672
673.c.obj:
674@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
675@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
676@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
677@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
678@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
679@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
680
681.c.lo:
682@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
683@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
684@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
685@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
686@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
687@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
688
689mostlyclean-libtool:
690 -rm -f *.lo
691
692clean-libtool:
693 -rm -rf .libs _libs
694install-includesHEADERS: $(includes_HEADERS)
695 @$(NORMAL_INSTALL)
696 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
697 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
698 for p in $$list; do \
699 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
700 echo "$$d$$p"; \
701 done | $(am__base_list) | \
702 while read files; do \
703 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
704 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
705 done
706
707uninstall-includesHEADERS:
708 @$(NORMAL_UNINSTALL)
709 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
710 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
711 test -n "$$files" || exit 0; \
712 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
713 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
714
715ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
716 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
717 unique=`for i in $$list; do \
718 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
719 done | \
720 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
721 END { if (nonempty) { for (i in files) print i; }; }'`; \
722 mkid -fID $$unique
723tags: TAGS
724
725TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
726 $(TAGS_FILES) $(LISP)
727 set x; \
728 here=`pwd`; \
729 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
730 unique=`for i in $$list; do \
731 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
732 done | \
733 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
734 END { if (nonempty) { for (i in files) print i; }; }'`; \
735 shift; \
736 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
737 test -n "$$unique" || unique=$$empty_fix; \
738 if test $$# -gt 0; then \
739 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
740 "$$@" $$unique; \
741 else \
742 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
743 $$unique; \
744 fi; \
745 fi
746ctags: CTAGS
747CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
748 $(TAGS_FILES) $(LISP)
749 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
750 unique=`for i in $$list; do \
751 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
752 done | \
753 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
754 END { if (nonempty) { for (i in files) print i; }; }'`; \
755 test -z "$(CTAGS_ARGS)$$unique" \
756 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
757 $$unique
758
759GTAGS:
760 here=`$(am__cd) $(top_builddir) && pwd` \
761 && $(am__cd) $(top_srcdir) \
762 && gtags -i $(GTAGS_ARGS) "$$here"
763
764distclean-tags:
765 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
766
767distdir: $(DISTFILES)
768 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
769 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
770 list='$(DISTFILES)'; \
771 dist_files=`for file in $$list; do echo $$file; done | \
772 sed -e "s|^$$srcdirstrip/||;t" \
773 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
774 case $$dist_files in \
775 */*) $(MKDIR_P) `echo "$$dist_files" | \
776 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
777 sort -u` ;; \
778 esac; \
779 for file in $$dist_files; do \
780 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
781 if test -d $$d/$$file; then \
782 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
783 if test -d "$(distdir)/$$file"; then \
784 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
785 fi; \
786 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
787 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
788 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
789 fi; \
790 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
791 else \
792 test -f "$(distdir)/$$file" \
793 || cp -p $$d/$$file "$(distdir)/$$file" \
794 || exit 1; \
795 fi; \
796 done
797check-am: all-am
798check: check-am
799all-am: Makefile $(LTLIBRARIES) $(HEADERS)
800installdirs:
801 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
802 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
803 done
804install: install-am
805install-exec: install-exec-am
806install-data: install-data-am
807uninstall: uninstall-am
808
809install-am: all-am
810 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
811
812installcheck: installcheck-am
813install-strip:
814 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
815 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
816 `test -z '$(STRIP)' || \
817 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
818mostlyclean-generic:
819
820clean-generic:
821
822distclean-generic:
823 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
824 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
825
826maintainer-clean-generic:
827 @echo "This command is intended for maintainers to use"
828 @echo "it deletes files that may require special tools to rebuild."
829 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
830clean: clean-am
831
832clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
833 mostlyclean-am
834
835distclean: distclean-am
836 -rm -rf ./$(DEPDIR)
837 -rm -f Makefile
838distclean-am: clean-am distclean-compile distclean-generic \
839 distclean-tags
840
841dvi: dvi-am
842
843dvi-am:
844
845html: html-am
846
847html-am:
848
849info: info-am
850
851info-am:
852
853install-data-am: install-includesHEADERS
854
855install-dvi: install-dvi-am
856
857install-dvi-am:
858
859install-exec-am: install-libLTLIBRARIES
860
861install-html: install-html-am
862
863install-html-am:
864
865install-info: install-info-am
866
867install-info-am:
868
869install-man:
870
871install-pdf: install-pdf-am
872
873install-pdf-am:
874
875install-ps: install-ps-am
876
877install-ps-am:
878
879installcheck-am:
880
881maintainer-clean: maintainer-clean-am
882 -rm -rf ./$(DEPDIR)
883 -rm -f Makefile
884maintainer-clean-am: distclean-am maintainer-clean-generic
885
886mostlyclean: mostlyclean-am
887
888mostlyclean-am: mostlyclean-compile mostlyclean-generic \
889 mostlyclean-libtool
890
891pdf: pdf-am
892
893pdf-am:
894
895ps: ps-am
896
897ps-am:
898
899uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
900
901.MAKE: install-am install-strip
902
903.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
904 clean-libLTLIBRARIES clean-libtool ctags distclean \
905 distclean-compile distclean-generic distclean-libtool \
906 distclean-tags distdir dvi dvi-am html html-am info info-am \
907 install install-am install-data install-data-am install-dvi \
908 install-dvi-am install-exec install-exec-am install-html \
909 install-html-am install-includesHEADERS install-info \
910 install-info-am install-libLTLIBRARIES install-man install-pdf \
911 install-pdf-am install-ps install-ps-am install-strip \
912 installcheck installcheck-am installdirs maintainer-clean \
913 maintainer-clean-generic mostlyclean mostlyclean-compile \
914 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
915 tags uninstall uninstall-am uninstall-includesHEADERS \
916 uninstall-libLTLIBRARIES
917
918
919# Tell versions [3.59,3.63) of GNU make to not export all variables.
920# Otherwise a system limit (for SysV at least) may be exceeded.
921.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas.c
new file mode 100644
index 0000000..dc42f92
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas.c
@@ -0,0 +1,2588 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6#include <sys/types.h>
7#include <errno.h>
8
9#ifndef _MSC_VER
10# include <unistd.h>
11#endif
12
13#ifdef HAVE_EVIL
14# include <Evil.h>
15#endif
16
17#include "Ecore.h"
18#include "ecore_private.h"
19#include "Ecore_Input.h"
20
21#include "ecore_evas_private.h"
22#include "Ecore_Evas.h"
23
24Eina_Bool _ecore_evas_app_comp_sync = 1;
25int _ecore_evas_log_dom = -1;
26static int _ecore_evas_init_count = 0;
27static Ecore_Fd_Handler *_ecore_evas_async_events_fd = NULL;
28static Eina_Bool _ecore_evas_async_events_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
29
30static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
31static Ecore_Evas *ecore_evases = NULL;
32static int _ecore_evas_fps_debug = 0;
33
34static Eina_Bool
35_ecore_evas_idle_enter(void *data __UNUSED__)
36{
37 Ecore_Evas *ee;
38 double t1 = 0.0;
39 double t2 = 0.0;
40 int rend = 0;
41
42 if (!ecore_evases) return ECORE_CALLBACK_RENEW;
43 if (_ecore_evas_fps_debug)
44 {
45 t1 = ecore_time_get();
46 }
47 EINA_INLIST_FOREACH(ecore_evases, ee)
48 {
49 if (!ee->manual_render)
50 {
51 if (ee->engine.func->fn_render)
52 rend |= ee->engine.func->fn_render(ee);
53 }
54 }
55 if (_ecore_evas_fps_debug)
56 {
57 t2 = ecore_time_get();
58 if (rend)
59 _ecore_evas_fps_debug_rendertime_add(t2 - t1);
60 }
61 return ECORE_CALLBACK_RENEW;
62}
63
64/**
65 * Query if a particular renginering engine target has support
66 * @param engine The engine to check support for
67 * @return 1 if the particular engine is supported, 0 if it is not
68 *
69 * Query if engine @param engine is supported by ecore_evas. 1 is returned if
70 * it is, and 0 is returned if it is not supported.
71 */
72EAPI int
73ecore_evas_engine_type_supported_get(Ecore_Evas_Engine_Type engine)
74{
75 switch (engine)
76 {
77 case ECORE_EVAS_ENGINE_SOFTWARE_BUFFER:
78#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
79 return EINA_TRUE;
80#else
81 return EINA_FALSE;
82#endif
83 case ECORE_EVAS_ENGINE_SOFTWARE_XLIB:
84#ifdef BUILD_ECORE_EVAS_SOFTWARE_XLIB
85 return EINA_TRUE;
86#else
87 return EINA_FALSE;
88#endif
89 case ECORE_EVAS_ENGINE_XRENDER_X11:
90 return EINA_FALSE;
91 case ECORE_EVAS_ENGINE_OPENGL_X11:
92#ifdef BUILD_ECORE_EVAS_OPENGL_X11
93 return EINA_TRUE;
94#else
95 return EINA_FALSE;
96#endif
97 case ECORE_EVAS_ENGINE_SOFTWARE_XCB:
98#ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
99 return EINA_TRUE;
100#else
101 return EINA_FALSE;
102#endif
103 case ECORE_EVAS_ENGINE_XRENDER_XCB:
104 return EINA_FALSE;
105 case ECORE_EVAS_ENGINE_SOFTWARE_GDI:
106#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
107 return EINA_TRUE;
108#else
109 return EINA_FALSE;
110#endif
111 case ECORE_EVAS_ENGINE_SOFTWARE_DDRAW:
112#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
113 return EINA_TRUE;
114#else
115 return EINA_FALSE;
116#endif
117 case ECORE_EVAS_ENGINE_DIRECT3D:
118#ifdef BUILD_ECORE_EVAS_DIRECT3D
119 return EINA_TRUE;
120#else
121 return EINA_FALSE;
122#endif
123 case ECORE_EVAS_ENGINE_OPENGL_GLEW:
124#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
125 return EINA_TRUE;
126#else
127 return EINA_FALSE;
128#endif
129 case ECORE_EVAS_ENGINE_SOFTWARE_SDL:
130#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
131 return EINA_TRUE;
132#else
133 return EINA_FALSE;
134#endif
135 case ECORE_EVAS_ENGINE_OPENGL_SDL:
136#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
137 return EINA_TRUE;
138#else
139 return EINA_FALSE;
140#endif
141 case ECORE_EVAS_ENGINE_DIRECTFB:
142#ifdef BUILD_ECORE_EVAS_DIRECTFB
143 return EINA_TRUE;
144#else
145 return EINA_FALSE;
146#endif
147 case ECORE_EVAS_ENGINE_SOFTWARE_FB:
148#ifdef BUILD_ECORE_EVAS_FB
149 return EINA_TRUE;
150#else
151 return EINA_FALSE;
152#endif
153
154 case ECORE_EVAS_ENGINE_SOFTWARE_8_X11:
155#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
156 return EINA_TRUE;
157#else
158 return EINA_FALSE;
159#endif
160
161 case ECORE_EVAS_ENGINE_SOFTWARE_16_X11:
162#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
163 return EINA_TRUE;
164#else
165 return EINA_FALSE;
166#endif
167 case ECORE_EVAS_ENGINE_SOFTWARE_16_DDRAW:
168#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
169 return EINA_TRUE;
170#else
171 return EINA_FALSE;
172#endif
173 case ECORE_EVAS_ENGINE_SOFTWARE_16_WINCE:
174#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
175 return EINA_TRUE;
176#else
177 return EINA_FALSE;
178#endif
179 case ECORE_EVAS_ENGINE_OPENGL_COCOA:
180#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
181 return EINA_TRUE;
182#else
183 return EINA_FALSE;
184#endif
185 case ECORE_EVAS_ENGINE_EWS:
186#ifdef BUILD_ECORE_EVAS_EWS
187 return EINA_TRUE;
188#else
189 return EINA_FALSE;
190#endif
191 case ECORE_EVAS_ENGINE_PSL1GHT:
192#ifdef BUILD_ECORE_EVAS_PSL1GHT
193 return EINA_TRUE;
194#else
195 return EINA_FALSE;
196#endif
197 default:
198 return EINA_FALSE;
199 };
200}
201
202EAPI int
203ecore_evas_init(void)
204{
205 int fd;
206
207 if (++_ecore_evas_init_count != 1)
208 return _ecore_evas_init_count;
209
210 if (!evas_init())
211 return --_ecore_evas_init_count;
212
213 if (!ecore_init())
214 goto shutdown_evas;
215
216 _ecore_evas_log_dom = eina_log_domain_register
217 ("ecore_evas", ECORE_EVAS_DEFAULT_LOG_COLOR);
218 if(_ecore_evas_log_dom < 0)
219 {
220 EINA_LOG_ERR("Impossible to create a log domain for Ecore_Evas.");
221 goto shutdown_ecore;
222 }
223
224 fd = evas_async_events_fd_get();
225 if (fd > 0)
226 _ecore_evas_async_events_fd = ecore_main_fd_handler_add(fd,
227 ECORE_FD_READ,
228 _ecore_evas_async_events_fd_handler, NULL,
229 NULL, NULL);
230
231 ecore_evas_idle_enterer =
232 ecore_idle_enterer_add(_ecore_evas_idle_enter, NULL);
233 if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
234 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
235
236#ifdef BUILD_ECORE_EVAS_EWS
237 _ecore_evas_ews_events_init();
238#endif
239
240 if (getenv("ECORE_EVAS_COMP_NOSYNC"))
241 _ecore_evas_app_comp_sync = 0;
242 return _ecore_evas_init_count;
243
244 shutdown_ecore:
245 ecore_shutdown();
246 shutdown_evas:
247 evas_shutdown();
248
249 return --_ecore_evas_init_count;
250}
251
252EAPI int
253ecore_evas_shutdown(void)
254{
255 if (--_ecore_evas_init_count != 0)
256 return _ecore_evas_init_count;
257
258 while (ecore_evases) _ecore_evas_free(ecore_evases);
259
260 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
261 ecore_idle_enterer_del(ecore_evas_idle_enterer);
262 ecore_evas_idle_enterer = NULL;
263
264#ifdef BUILD_ECORE_EVAS_X11
265 while (_ecore_evas_x_shutdown());
266#endif
267#ifdef BUILD_ECORE_EVAS_WIN32
268 while (_ecore_evas_win32_shutdown());
269#endif
270#ifdef BUILD_ECORE_EVAS_FB
271 while (_ecore_evas_fb_shutdown());
272#endif
273#ifdef BUILD_ECORE_EVAS_EWS
274 while (_ecore_evas_ews_shutdown());
275#endif
276#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
277 while (_ecore_evas_buffer_shutdown());
278#endif
279#ifdef BUILD_ECORE_EVAS_DIRECTFB
280 while (_ecore_evas_directfb_shutdown());
281#endif
282#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
283 while (_ecore_evas_wince_shutdown());
284#endif
285 if (_ecore_evas_async_events_fd)
286 ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
287
288 eina_log_domain_unregister(_ecore_evas_log_dom);
289 _ecore_evas_log_dom = -1;
290 ecore_shutdown();
291 evas_shutdown();
292
293 return _ecore_evas_init_count;
294}
295
296EAPI void
297ecore_evas_app_comp_sync_set(Eina_Bool do_sync)
298{
299 _ecore_evas_app_comp_sync = do_sync;
300}
301
302EAPI Eina_Bool
303ecore_evas_app_comp_sync_get(void)
304{
305 return _ecore_evas_app_comp_sync;
306}
307
308struct ecore_evas_engine {
309 const char *name;
310 Ecore_Evas *(*constructor)(int x, int y, int w, int h, const char *extra_options);
311};
312
313/* inline is just to avoid need to ifdef around it */
314static inline const char *
315_ecore_evas_parse_extra_options_str(const char *extra_options, const char *key, char **value)
316{
317 int len = strlen(key);
318
319 while (extra_options)
320 {
321 const char *p;
322
323 if (strncmp(extra_options, key, len) != 0)
324 {
325 extra_options = strchr(extra_options, ';');
326 if (extra_options)
327 extra_options++;
328 continue;
329 }
330
331 extra_options += len;
332 p = strchr(extra_options, ';');
333 if (p)
334 {
335 len = p - extra_options;
336 *value = malloc(len + 1);
337 memcpy(*value, extra_options, len);
338 (*value)[len] = '\0';
339 extra_options = p + 1;
340 }
341 else
342 {
343 *value = strdup(extra_options);
344 extra_options = NULL;
345 }
346 }
347 return extra_options;
348}
349
350/* inline is just to avoid need to ifdef around it */
351static inline const char *
352_ecore_evas_parse_extra_options_uint(const char *extra_options, const char *key, unsigned int *value)
353{
354 int len = strlen(key);
355
356 while (extra_options)
357 {
358 const char *p;
359
360 if (strncmp(extra_options, key, len) != 0)
361 {
362 extra_options = strchr(extra_options, ';');
363 if (extra_options)
364 extra_options++;
365 continue;
366 }
367
368 extra_options += len;
369 *value = strtol(extra_options, NULL, 0);
370
371 p = strchr(extra_options, ';');
372 if (p)
373 extra_options = p + 1;
374 else
375 extra_options = NULL;
376 }
377 return extra_options;
378}
379
380/* inline is just to avoid need to ifdef around it */
381static inline const char *
382_ecore_evas_parse_extra_options_x(const char *extra_options, char **disp_name, unsigned int *parent)
383{
384 _ecore_evas_parse_extra_options_str(extra_options, "display=", disp_name);
385 _ecore_evas_parse_extra_options_uint(extra_options, "parent=", parent);
386 return extra_options;
387}
388
389#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
390static Ecore_Evas *
391_ecore_evas_constructor_software_x11(int x, int y, int w, int h, const char *extra_options)
392{
393 unsigned int parent = 0;
394 char *disp_name = NULL;
395 Ecore_Evas *ee;
396
397 _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
398 ee = ecore_evas_software_x11_new(disp_name, parent, x, y, w, h);
399 free(disp_name);
400
401 return ee;
402}
403#endif
404
405#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
406static Ecore_Evas *
407_ecore_evas_constructor_cocoa(int x, int y, int w, int h, const char *extra_options)
408{
409 char *name = NULL;
410 Ecore_Evas *ee;
411
412 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
413 ee = ecore_evas_cocoa_new(NULL, x, y, w, h);
414 free(name);
415
416 if (ee) ecore_evas_move(ee, x, y);
417 return ee;
418}
419#endif
420
421#ifdef BUILD_ECORE_EVAS_OPENGL_X11
422static Ecore_Evas *
423_ecore_evas_constructor_opengl_x11(int x, int y, int w, int h, const char *extra_options)
424{
425 Ecore_X_Window parent = 0;
426 char *disp_name = NULL;
427 Ecore_Evas *ee;
428
429 _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
430 ee = ecore_evas_gl_x11_new(disp_name, parent, x, y, w, h);
431 free(disp_name);
432
433 return ee;
434}
435#endif
436
437#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
438static Ecore_Evas *
439_ecore_evas_constructor_software_8_x11(int x, int y, int w, int h, const char *extra_options)
440{
441 Ecore_X_Window parent = 0;
442 char *disp_name = NULL;
443 Ecore_Evas *ee;
444
445 _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
446 ee = ecore_evas_software_x11_8_new(disp_name, parent, x, y, w, h);
447 free(disp_name);
448
449 return ee;
450}
451#endif
452
453#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
454static Ecore_Evas *
455_ecore_evas_constructor_software_16_x11(int x, int y, int w, int h, const char *extra_options)
456{
457 Ecore_X_Window parent = 0;
458 char *disp_name = NULL;
459 Ecore_Evas *ee;
460
461 _ecore_evas_parse_extra_options_x(extra_options, &disp_name, &parent);
462 ee = ecore_evas_software_x11_16_new(disp_name, parent, x, y, w, h);
463 free(disp_name);
464
465 return ee;
466}
467#endif
468
469#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
470static Ecore_Evas *
471_ecore_evas_constructor_sdl(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
472{
473 Ecore_Evas *ee;
474 unsigned int fullscreen = 0, hwsurface = 0, noframe = 0, alpha = 0;
475 char *name = NULL;
476
477 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
478 _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
479 _ecore_evas_parse_extra_options_uint(extra_options, "hwsurface=", &hwsurface);
480 _ecore_evas_parse_extra_options_uint(extra_options, "noframe=", &noframe);
481 _ecore_evas_parse_extra_options_uint(extra_options, "alpha=", &alpha);
482
483 ee = ecore_evas_sdl_new(name, w, h, fullscreen, hwsurface, noframe, alpha);
484 free(name);
485
486 return ee;
487}
488
489static Ecore_Evas *
490_ecore_evas_constructor_sdl16(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
491{
492 Ecore_Evas *ee;
493 unsigned int fullscreen = 0, hwsurface = 0, noframe = 0, alpha = 0;
494 char *name = NULL;
495
496 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
497 _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
498 _ecore_evas_parse_extra_options_uint(extra_options, "hwsurface=", &hwsurface);
499 _ecore_evas_parse_extra_options_uint(extra_options, "alpha=", &alpha);
500
501 ee = ecore_evas_sdl16_new(name, w, h, fullscreen, hwsurface, noframe, alpha);
502 free(name);
503
504 return ee;
505}
506#endif
507
508#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
509static Ecore_Evas *
510_ecore_evas_constructor_opengl_sdl(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
511{
512 Ecore_Evas *ee;
513 unsigned int fullscreen = 0, noframe = 0;
514 char *name = NULL;
515
516 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
517 _ecore_evas_parse_extra_options_uint(extra_options, "fullscreen=", &fullscreen);
518 _ecore_evas_parse_extra_options_uint(extra_options, "noframe=", &noframe);
519
520 ee = ecore_evas_gl_sdl_new(name, w, h, fullscreen, noframe);
521 free(name);
522
523 return ee;
524}
525#endif
526
527#ifdef BUILD_ECORE_EVAS_DIRECTFB
528static Ecore_Evas *
529_ecore_evas_constructor_directfb(int x, int y, int w, int h, const char *extra_options)
530{
531 Ecore_Evas *ee;
532 char *disp_name = NULL;
533 unsigned int windowed = 1;
534
535 _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
536 _ecore_evas_parse_extra_options_uint(extra_options, "windowed=", &windowed);
537
538 ee = ecore_evas_directfb_new(disp_name, windowed, x, y, w, h);
539 free(disp_name);
540
541 return ee;
542}
543#endif
544
545#ifdef BUILD_ECORE_EVAS_FB
546static Ecore_Evas *
547_ecore_evas_constructor_fb(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
548{
549 Ecore_Evas *ee;
550 char *disp_name = NULL;
551 unsigned int rotation = 0;
552
553 _ecore_evas_parse_extra_options_str(extra_options, "display=", &disp_name);
554 _ecore_evas_parse_extra_options_uint(extra_options, "rotation=", &rotation);
555
556 ee = ecore_evas_fb_new(disp_name, rotation, w, h);
557 free(disp_name);
558
559 return ee;
560}
561#endif
562
563
564#ifdef BUILD_ECORE_EVAS_PSL1GHT
565static Ecore_Evas *
566_ecore_evas_constructor_psl1ght(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options)
567{
568 Ecore_Evas *ee;
569 char *name = NULL;
570
571 _ecore_evas_parse_extra_options_str(extra_options, "name=", &name);
572 ee = ecore_evas_psl1ght_new(name, w, h);
573 free(name);
574
575 if (ee) ecore_evas_move(ee, x, y);
576 return ee;
577}
578#endif
579
580#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
581static Ecore_Evas *
582_ecore_evas_constructor_software_gdi(int x, int y, int w, int h, const char *extra_options)
583{
584 return ecore_evas_software_gdi_new(NULL, x, y, w, h);
585}
586#endif
587
588#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
589static Ecore_Evas *
590_ecore_evas_constructor_software_ddraw(int x, int y, int w, int h, const char *extra_options)
591{
592 return ecore_evas_software_ddraw_new(NULL, x, y, w, h);
593}
594#endif
595
596#ifdef BUILD_ECORE_EVAS_DIRECT3D
597static Ecore_Evas *
598_ecore_evas_constructor_direct3d(int x, int y, int w, int h, const char *extra_options)
599{
600 return ecore_evas_direct3d_new(NULL, x, y, w, h);
601}
602#endif
603
604#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
605static Ecore_Evas *
606_ecore_evas_constructor_opengl_glew(int x, int y, int w, int h, const char *extra_options)
607{
608 return ecore_evas_gl_glew_new(NULL, x, y, w, h);
609}
610#endif
611
612#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
613static Ecore_Evas *
614_ecore_evas_constructor_software_16_ddraw(int x, int y, int w, int h, const char *extra_options)
615{
616 return ecore_evas_software_16_ddraw_new(NULL, x, y, w, h);
617}
618#endif
619
620#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
621static Ecore_Evas *
622_ecore_evas_constructor_software_16_wince(int x, int y, int w, int h, const char *extra_options __UNUSED__)
623{
624 return ecore_evas_software_wince_new(NULL, x, y, w, h);
625}
626
627static Ecore_Evas *
628_ecore_evas_constructor_software_16_wince_fb(int x, int y, int w, int h, const char *extra_options __UNUSED__)
629{
630 return ecore_evas_software_wince_fb_new(NULL, x, y, w, h);
631}
632
633static Ecore_Evas *
634_ecore_evas_constructor_software_16_wince_gapi(int x, int y, int w, int h, const char *extra_options __UNUSED__)
635{
636 return ecore_evas_software_wince_gapi_new(NULL, x, y, w, h);
637}
638
639static Ecore_Evas *
640_ecore_evas_constructor_software_16_wince_gdi(int x, int y, int w, int h, const char *extra_options __UNUSED__)
641{
642 return ecore_evas_software_wince_gdi_new(NULL, x, y, w, h);
643}
644#endif
645
646#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
647static Ecore_Evas *
648_ecore_evas_constructor_buffer(int x __UNUSED__, int y __UNUSED__, int w, int h, const char *extra_options __UNUSED__)
649{
650 return ecore_evas_buffer_new(w, h);
651}
652#endif
653
654#ifdef BUILD_ECORE_EVAS_EWS
655static Ecore_Evas *
656_ecore_evas_constructor_ews(int x, int y, int w, int h, const char *extra_options __UNUSED__)
657{
658 return ecore_evas_ews_new(x, y, w, h);
659}
660#endif
661
662/* note: keep sorted by priority, highest first */
663static const struct ecore_evas_engine _engines[] = {
664 /* unix */
665#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
666 {"software_x11", _ecore_evas_constructor_software_x11},
667#endif
668#ifdef BUILD_ECORE_EVAS_OPENGL_X11
669 {"opengl_x11", _ecore_evas_constructor_opengl_x11},
670#endif
671#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
672 {"software_8_x11", _ecore_evas_constructor_software_8_x11},
673#endif
674#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
675 {"software_16_x11", _ecore_evas_constructor_software_16_x11},
676#endif
677#ifdef BUILD_ECORE_EVAS_DIRECTFB
678 {"directfb", _ecore_evas_constructor_directfb},
679#endif
680#ifdef BUILD_ECORE_EVAS_FB
681 {"fb", _ecore_evas_constructor_fb},
682#endif
683
684 /* windows */
685#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
686 {"software_gdi", _ecore_evas_constructor_software_gdi},
687#endif
688#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
689 {"software_ddraw", _ecore_evas_constructor_software_ddraw},
690#endif
691#ifdef BUILD_ECORE_EVAS_DIRECT3D
692 {"direct3d", _ecore_evas_constructor_direct3d},
693#endif
694#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
695 {"opengl_glew", _ecore_evas_constructor_opengl_glew},
696#endif
697#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
698 {"software_16_ddraw", _ecore_evas_constructor_software_16_ddraw},
699#endif
700#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
701 {"software_16_wince", _ecore_evas_constructor_software_16_wince},
702 {"software_16_wince_fb", _ecore_evas_constructor_software_16_wince_fb},
703 {"software_16_wince_gapi", _ecore_evas_constructor_software_16_wince_gapi},
704 {"software_16_wince_gdi", _ecore_evas_constructor_software_16_wince_gdi},
705#endif
706
707 /* Apple */
708#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
709 {"opengl_cocoa", _ecore_evas_constructor_cocoa},
710#endif
711
712 /* PS3 support */
713#ifdef BUILD_ECORE_EVAS_PSL1GHT
714 {"psl1ght", _ecore_evas_constructor_psl1ght},
715#endif
716
717 /* Last chance to have a window */
718#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
719 {"opengl_sdl", _ecore_evas_constructor_opengl_sdl},
720#endif
721
722#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
723 {"sdl", _ecore_evas_constructor_sdl},
724 {"software_16_sdl", _ecore_evas_constructor_sdl16},
725#endif
726
727 /* independent */
728#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
729 {"buffer", _ecore_evas_constructor_buffer},
730#endif
731
732#ifdef BUILD_ECORE_EVAS_EWS
733 {"ews", _ecore_evas_constructor_ews},
734#endif
735 {NULL, NULL}
736};
737
738EAPI Eina_List *
739ecore_evas_engines_get(void)
740{
741 const struct ecore_evas_engine *itr;
742 Eina_List *lst = NULL;
743
744 for (itr = _engines; itr->name; itr++)
745 lst = eina_list_append(lst, itr->name);
746
747 return lst;
748}
749
750EAPI void
751ecore_evas_engines_free(Eina_List *engines)
752{
753 eina_list_free(engines);
754}
755
756static Ecore_Evas *
757_ecore_evas_new_auto_discover(int x, int y, int w, int h, const char *extra_options)
758{
759 const struct ecore_evas_engine *itr;
760
761 DBG("auto discover engine");
762
763 for (itr = _engines; itr->constructor; itr++)
764 {
765 Ecore_Evas *ee = itr->constructor(x, y, w, h, extra_options);
766 if (ee)
767 {
768 INF("auto discovered '%s'", itr->name);
769 return ee;
770 }
771 }
772
773 WRN("could not auto discover.");
774 return NULL;
775}
776
777EAPI Ecore_Evas *
778ecore_evas_new(const char *engine_name, int x, int y, int w, int h, const char *extra_options)
779{
780 const struct ecore_evas_engine *itr;
781
782 if (!engine_name)
783 {
784 engine_name = getenv("ECORE_EVAS_ENGINE");
785 if (engine_name)
786 DBG("no engine_name provided, using ECORE_EVAS_ENGINE='%s'",
787 engine_name);
788 }
789 if (!engine_name)
790 return _ecore_evas_new_auto_discover(x, y, w, h, extra_options);
791
792 for (itr = _engines; itr->name; itr++)
793 if (strcmp(itr->name, engine_name) == 0)
794 {
795 INF("using engine '%s', extra_options=%s",
796 engine_name, extra_options ? extra_options : "(null)");
797 return itr->constructor(x, y, w, h, extra_options);
798 }
799
800 WRN("unknown engine '%s'", engine_name);
801 return NULL;
802}
803
804EAPI const char *
805ecore_evas_engine_name_get(const Ecore_Evas *ee)
806{
807 if (!ee)
808 return NULL;
809 return ee->driver;
810}
811
812EAPI Ecore_Evas *
813ecore_evas_ecore_evas_get(const Evas *e)
814{
815 Ecore_Evas *ee = evas_data_attach_get(e);
816 if (!ee) return NULL;
817 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
818 {
819 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, "ecore_evas_ecore_evas_get");
820 return NULL;
821 }
822 return ee;
823}
824
825EAPI void
826ecore_evas_free(Ecore_Evas *ee)
827{
828 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
829 {
830 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
831 "ecore_evas_free");
832 return;
833 }
834 _ecore_evas_free(ee);
835 return;
836}
837
838EAPI void *
839ecore_evas_data_get(const Ecore_Evas *ee, const char *key)
840{
841 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
842 {
843 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
844 "ecore_evas_data_get");
845 return NULL;
846 }
847
848 if (!key) return NULL;
849 if (!ee->data) return NULL;
850
851 return eina_hash_find(ee->data, key);
852}
853
854EAPI void
855ecore_evas_data_set(Ecore_Evas *ee, const char *key, const void *data)
856{
857 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
858 {
859 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
860 "ecore_evas_data_set");
861 return;
862 }
863
864 if (!key) return;
865
866 if (ee->data)
867 eina_hash_del(ee->data, key, NULL);
868 if (data)
869 {
870 if (!ee->data)
871 ee->data = eina_hash_string_superfast_new(NULL);
872 eina_hash_add(ee->data, key, data);
873 }
874}
875
876#define IFC(_ee, _fn) if (_ee->engine.func->_fn) {_ee->engine.func->_fn
877#define IFE return;}
878
879EAPI void
880ecore_evas_callback_resize_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
881{
882 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
883 {
884 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
885 "ecore_evas_callback_resize_set");
886 return;
887 }
888 IFC(ee, fn_callback_resize_set) (ee, func);
889 IFE;
890 ee->func.fn_resize = func;
891}
892
893EAPI void
894ecore_evas_callback_move_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
895{
896 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
897 {
898 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
899 "ecore_evas_callback_move_set");
900 return;
901 }
902 IFC(ee, fn_callback_move_set) (ee, func);
903 IFE;
904 ee->func.fn_move = func;
905}
906
907EAPI void
908ecore_evas_callback_show_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
909{
910 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
911 {
912 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
913 "ecore_evas_callback_show_set");
914 return;
915 }
916 IFC(ee, fn_callback_show_set) (ee, func);
917 IFE;
918 ee->func.fn_show = func;
919}
920
921EAPI void
922ecore_evas_callback_hide_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
923{
924 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
925 {
926 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
927 "ecore_evas_callback_hide_set");
928 return;
929 }
930 IFC(ee, fn_callback_hide_set) (ee, func);
931 IFE;
932 ee->func.fn_hide = func;
933}
934
935EAPI void
936ecore_evas_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
937{
938 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
939 {
940 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
941 "ecore_evas_callback_delete_request_set");
942 return;
943 }
944 IFC(ee, fn_callback_delete_request_set) (ee, func);
945 IFE;
946 ee->func.fn_delete_request = func;
947}
948
949EAPI void
950ecore_evas_callback_destroy_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
951{
952 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
953 {
954 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
955 "ecore_evas_callback_destroy_set");
956 return;
957 }
958 IFC(ee, fn_callback_destroy_set) (ee, func);
959 IFE;
960 ee->func.fn_destroy = func;
961}
962
963EAPI void
964ecore_evas_callback_focus_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
965{
966 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
967 {
968 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
969 "ecore_evas_callback_focus_in_set");
970 return;
971 }
972 IFC(ee, fn_callback_focus_in_set) (ee, func);
973 IFE;
974 ee->func.fn_focus_in = func;
975}
976
977EAPI void
978ecore_evas_callback_focus_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
979{
980 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
981 {
982 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
983 "ecore_evas_callback_focus_out_set");
984 return;
985 }
986 IFC(ee, fn_callback_focus_out_set) (ee, func);
987 IFE;
988 ee->func.fn_focus_out = func;
989}
990
991EAPI void
992ecore_evas_callback_sticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
993{
994 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
995 {
996 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
997 "ecore_evas_callback_sticky_set");
998 return;
999 }
1000 IFC(ee, fn_callback_sticky_set) (ee, func);
1001 IFE;
1002 ee->func.fn_sticky = func;
1003}
1004
1005EAPI void
1006ecore_evas_callback_unsticky_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1007{
1008 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1009 {
1010 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1011 "ecore_evas_callback_unsticky_set");
1012 return;
1013 }
1014 IFC(ee, fn_callback_unsticky_set) (ee, func);
1015 IFE;
1016 ee->func.fn_unsticky = func;
1017}
1018
1019EAPI void
1020ecore_evas_callback_mouse_in_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1021{
1022 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1023 {
1024 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1025 "ecore_evas_callback_mouse_in_set");
1026 return;
1027 }
1028 IFC(ee, fn_callback_mouse_in_set) (ee, func);
1029 IFE;
1030 ee->func.fn_mouse_in = func;
1031}
1032
1033EAPI void
1034ecore_evas_callback_mouse_out_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1035{
1036 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1037 {
1038 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1039 "ecore_evas_callback_mouse_out_set");
1040 return;
1041 }
1042 IFC(ee, fn_callback_mouse_out_set) (ee, func);
1043 IFE;
1044 ee->func.fn_mouse_out = func;
1045}
1046
1047EAPI void
1048ecore_evas_callback_pre_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1049{
1050 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1051 {
1052 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1053 "ecore_evas_callback_pre_render_set");
1054 return;
1055 }
1056 IFC(ee, fn_callback_pre_render_set) (ee, func);
1057 IFE;
1058 ee->func.fn_pre_render = func;
1059}
1060
1061EAPI void
1062ecore_evas_callback_post_render_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1063{
1064 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1065 {
1066 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1067 "ecore_evas_callback_post_render_set");
1068 return;
1069 }
1070 IFC(ee, fn_callback_post_render_set) (ee, func);
1071 IFE;
1072 ee->func.fn_post_render = func;
1073}
1074
1075EAPI void
1076ecore_evas_callback_pre_free_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1077{
1078 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1079 {
1080 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1081 "ecore_evas_callback_pre_free_set");
1082 return;
1083 }
1084 ee->func.fn_pre_free = func;
1085}
1086
1087/**
1088 * Get an Ecore_Evas's Evas
1089 * @param ee The Ecore_Evas whose Evas you wish to get
1090 * @return The Evas wrapped by @p ee
1091 *
1092 * This function returns the Evas contained within @p ee.
1093 */
1094EAPI Evas *
1095ecore_evas_get(const Ecore_Evas *ee)
1096{
1097 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1098 {
1099 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1100 "ecore_evas_get");
1101 return NULL;
1102 }
1103 return ee->evas;
1104}
1105
1106EAPI void
1107ecore_evas_move(Ecore_Evas *ee, int x, int y)
1108{
1109 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1110 {
1111 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1112 "ecore_evas_move");
1113 return;
1114 }
1115 if (ee->prop.fullscreen) return;
1116 IFC(ee, fn_move) (ee, x, y);
1117 IFE;
1118}
1119
1120/**
1121 * Provide Managed move co-ordinates for an Ecore_Evas
1122 * @param ee The Ecore_Evas to move
1123 * @param x The x coordinate to set as the managed location
1124 * @param y The y coordinate to set as the managed location
1125 *
1126 * This sets the managed geometry position of the @p ee to (@p x, @p y)
1127 */
1128EAPI void
1129ecore_evas_managed_move(Ecore_Evas *ee, int x, int y)
1130{
1131 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1132 {
1133 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1134 "ecore_evas_move");
1135 return;
1136 }
1137 IFC(ee, fn_managed_move) (ee, x, y);
1138 IFE;
1139}
1140
1141EAPI void
1142ecore_evas_resize(Ecore_Evas *ee, int w, int h)
1143{
1144 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1145 {
1146 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1147 "ecore_evas_resize");
1148 return;
1149 }
1150 if (ee->prop.fullscreen) return;
1151 if (w < 1) w = 1;
1152 if (h < 1) h = 1;
1153 if ((ee->rotation == 90) || (ee->rotation == 270))
1154 {
1155 IFC(ee, fn_resize) (ee, h, w);
1156 IFE;
1157 }
1158 else
1159 {
1160 IFC(ee, fn_resize) (ee, w, h);
1161 IFE;
1162 }
1163}
1164
1165EAPI void
1166ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1167{
1168 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1169 {
1170 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1171 "ecore_evas_move_resize");
1172 return;
1173 }
1174 if (ee->prop.fullscreen) return;
1175 if (w < 1) w = 1;
1176 if (h < 1) h = 1;
1177 if ((ee->rotation == 90) || (ee->rotation == 270))
1178 {
1179 IFC(ee, fn_move_resize) (ee, x, y, h, w);
1180 IFE;
1181 }
1182 else
1183 {
1184 IFC(ee, fn_move_resize) (ee, x, y, w, h);
1185 IFE;
1186 }
1187}
1188
1189EAPI void
1190ecore_evas_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
1191{
1192 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1193 {
1194 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1195 "ecore_evas_geometry_get");
1196 return;
1197 }
1198 if ((ee->rotation == 90) || (ee->rotation == 270))
1199 {
1200 if (x) *x = ee->x;
1201 if (y) *y = ee->y;
1202 if (w) *w = ee->h;
1203 if (h) *h = ee->w;
1204 }
1205 else
1206 {
1207 if (x) *x = ee->x;
1208 if (y) *y = ee->y;
1209 if (w) *w = ee->w;
1210 if (h) *h = ee->h;
1211 }
1212}
1213
1214EAPI void
1215ecore_evas_request_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
1216{
1217 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1218 {
1219 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1220 "ecore_evas_request_geometry_get");
1221 return;
1222 }
1223 if ((ee->rotation == 90) || (ee->rotation == 270))
1224 {
1225 if (x) *x = ee->req.x;
1226 if (y) *y = ee->req.y;
1227 if (w) *w = ee->req.h;
1228 if (h) *h = ee->req.w;
1229 }
1230 else
1231 {
1232 if (x) *x = ee->req.x;
1233 if (y) *y = ee->req.y;
1234 if (w) *w = ee->req.w;
1235 if (h) *h = ee->req.h;
1236 }
1237}
1238
1239EAPI void
1240ecore_evas_rotation_set(Ecore_Evas *ee, int rot)
1241{
1242 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1243 {
1244 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1245 "ecore_evas_rotation_set");
1246 return;
1247 }
1248 rot = rot % 360;
1249 while (rot < 0) rot += 360;
1250 while (rot >= 360) rot -= 360;
1251 IFC(ee, fn_rotation_set) (ee, rot, 0);
1252 /* make sure everything gets redrawn */
1253 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1254 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1255 IFE;
1256}
1257
1258EAPI void
1259ecore_evas_rotation_with_resize_set(Ecore_Evas *ee, int rot)
1260{
1261 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1262 {
1263 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1264 "ecore_evas_rotation_set");
1265 return;
1266 }
1267 rot = rot % 360;
1268 while (rot < 0) rot += 360;
1269 while (rot >= 360) rot -= 360;
1270 IFC(ee, fn_rotation_set) (ee, rot, 1);
1271 /* make sure everything gets redrawn */
1272 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1273 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1274 IFE;
1275}
1276
1277EAPI int
1278ecore_evas_rotation_get(const Ecore_Evas *ee)
1279{
1280 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1281 {
1282 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1283 "ecore_evas_rotation_get");
1284 return 0;
1285 }
1286 return ee->rotation;
1287}
1288
1289/**
1290 * Set whether an Ecore_Evas is shaped or not.
1291 * @param ee The Ecore_Evas to shape
1292 * @param shaped EINA_TRUE to shape, EINA_FALSE to not
1293 *
1294 * This function allows one to make an Ecore_Evas shaped to the contents of the
1295 * evas. If @p shaped is EINA_TRUE, @p ee will be transparent in parts of the evas that
1296 * contain no objects. If @p shaped is EINA_FALSE, then @p ee will be rectangular, and
1297 * and parts with no data will show random framebuffer artifacting. For
1298 * non-shaped Ecore_Evases, it is recommend to cover the entire evas with a
1299 * background object.
1300 */
1301EAPI void
1302ecore_evas_shaped_set(Ecore_Evas *ee, Eina_Bool shaped)
1303{
1304 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1305 {
1306 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1307 "ecore_evas_shaped_set");
1308 return;
1309 }
1310 IFC(ee, fn_shaped_set) (ee, shaped);
1311 IFE;
1312}
1313
1314/**
1315 * Query whether an Ecore_Evas is shaped or not.
1316 * @param ee The Ecore_Evas to query.
1317 * @return EINA_TRUE if shaped, EINA_FALSE if not.
1318 *
1319 * This function returns EINA_TRUE if @p ee is shaped, and EINA_FALSE if not.
1320 */
1321EAPI Eina_Bool
1322ecore_evas_shaped_get(const Ecore_Evas *ee)
1323{
1324 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1325 {
1326 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1327 "ecore_evas_shaped_get");
1328 return EINA_FALSE;
1329 }
1330 return ee->shaped ? EINA_TRUE : EINA_FALSE;
1331}
1332
1333EAPI void
1334ecore_evas_alpha_set(Ecore_Evas *ee, Eina_Bool alpha)
1335{
1336 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1337 {
1338 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1339 "ecore_evas_alpha_set");
1340 return;
1341 }
1342 IFC(ee, fn_alpha_set) (ee, alpha);
1343 IFE;
1344}
1345
1346EAPI Eina_Bool
1347ecore_evas_alpha_get(const Ecore_Evas *ee)
1348{
1349 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1350 {
1351 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1352 "ecore_evas_alpha_get");
1353 return EINA_FALSE;
1354 }
1355 return ee->alpha ? EINA_TRUE : EINA_FALSE;
1356}
1357
1358EAPI void
1359ecore_evas_transparent_set(Ecore_Evas *ee, Eina_Bool transparent)
1360{
1361 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1362 {
1363 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1364 "ecore_evas_transparent_set");
1365 return;
1366 }
1367 IFC(ee, fn_transparent_set) (ee, transparent);
1368 IFE;
1369}
1370
1371EAPI Eina_Bool
1372ecore_evas_transparent_get(const Ecore_Evas *ee)
1373{
1374 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1375 {
1376 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1377 "ecore_evas_transparent_get");
1378 return EINA_FALSE;
1379 }
1380 return ee->transparent ? EINA_TRUE : 0;
1381}
1382
1383EAPI void
1384ecore_evas_show(Ecore_Evas *ee)
1385{
1386 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1387 {
1388 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1389 "ecore_evas_show");
1390 return;
1391 }
1392 IFC(ee, fn_show) (ee);
1393 IFE;
1394}
1395
1396EAPI void
1397ecore_evas_hide(Ecore_Evas *ee)
1398{
1399 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1400 {
1401 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1402 "ecore_evas_hide");
1403 return;
1404 }
1405 IFC(ee, fn_hide) (ee);
1406 IFE;
1407}
1408
1409 EAPI int
1410ecore_evas_visibility_get(const Ecore_Evas *ee)
1411{
1412 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1413 {
1414 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1415 "ecore_evas_visibility_get");
1416 return 0;
1417 }
1418 return ee->visible ? 1:0;
1419}
1420
1421EAPI void
1422ecore_evas_raise(Ecore_Evas *ee)
1423{
1424 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1425 {
1426 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1427 "ecore_evas_raise");
1428 return;
1429 }
1430 IFC(ee, fn_raise) (ee);
1431 IFE;
1432}
1433
1434EAPI void
1435ecore_evas_lower(Ecore_Evas *ee)
1436{
1437 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1438 {
1439 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1440 "ecore_evas_lower");
1441 return;
1442 }
1443 IFC(ee, fn_lower) (ee);
1444 IFE;
1445}
1446
1447/**
1448 * Activate (set focus to, via the window manager) an Ecore_Evas' window.
1449 * @param ee The Ecore_Evas to activate.
1450 *
1451 * This functions activates the Ecore_Evas.
1452 */
1453EAPI void
1454ecore_evas_activate(Ecore_Evas *ee)
1455{
1456 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1457 {
1458 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1459 "ecore_evas_activate");
1460 return;
1461 }
1462 IFC(ee, fn_activate) (ee);
1463 IFE;
1464}
1465
1466EAPI void
1467ecore_evas_title_set(Ecore_Evas *ee, const char *t)
1468{
1469 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1470 {
1471 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1472 "ecore_evas_title_set");
1473 return;
1474 }
1475 IFC(ee, fn_title_set) (ee, t);
1476 IFE;
1477}
1478
1479EAPI const char *
1480ecore_evas_title_get(const Ecore_Evas *ee)
1481{
1482 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1483 {
1484 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1485 "ecore_evas_title_get");
1486 return NULL;
1487 }
1488 return ee->prop.title;
1489}
1490
1491EAPI void
1492ecore_evas_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
1493{
1494 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1495 {
1496 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1497 "ecore_evas_name_class_set");
1498 return;
1499 }
1500 IFC(ee, fn_name_class_set) (ee, n, c);
1501 IFE;
1502}
1503
1504EAPI void
1505ecore_evas_name_class_get(const Ecore_Evas *ee, const char **n, const char **c)
1506{
1507 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1508 {
1509 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1510 "ecore_evas_name_class_get");
1511 return;
1512 }
1513 if (n) *n = ee->prop.name;
1514 if (c) *c = ee->prop.clas;
1515}
1516
1517EAPI void
1518ecore_evas_size_min_set(Ecore_Evas *ee, int w, int h)
1519{
1520 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1521 {
1522 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1523 "ecore_evas_size_min_set");
1524 return;
1525 }
1526 if (w < 0) w = 0;
1527 if (h < 0) h = 0;
1528 if ((ee->rotation == 90) || (ee->rotation == 270))
1529 {
1530 IFC(ee, fn_size_min_set) (ee, h, w);
1531 IFE;
1532 }
1533 else
1534 {
1535 IFC(ee, fn_size_min_set) (ee, w, h);
1536 IFE;
1537 }
1538}
1539
1540EAPI void
1541ecore_evas_size_min_get(const Ecore_Evas *ee, int *w, int *h)
1542{
1543 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1544 {
1545 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1546 "ecore_evas_size_min_get");
1547 return;
1548 }
1549 if ((ee->rotation == 90) || (ee->rotation == 270))
1550 {
1551 if (w) *w = ee->prop.min.h;
1552 if (h) *h = ee->prop.min.w;
1553 }
1554 else
1555 {
1556 if (w) *w = ee->prop.min.w;
1557 if (h) *h = ee->prop.min.h;
1558 }
1559}
1560
1561EAPI void
1562ecore_evas_size_max_set(Ecore_Evas *ee, int w, int h)
1563{
1564 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1565 {
1566 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1567 "ecore_evas_size_max_set");
1568 return;
1569 }
1570 if (w < 0) w = 0;
1571 if (h < 0) h = 0;
1572 if ((ee->rotation == 90) || (ee->rotation == 270))
1573 {
1574 IFC(ee, fn_size_max_set) (ee, h, w);
1575 IFE;
1576 }
1577 else
1578 {
1579 IFC(ee, fn_size_max_set) (ee, w, h);
1580 IFE;
1581 }
1582}
1583
1584EAPI void
1585ecore_evas_size_max_get(const Ecore_Evas *ee, int *w, int *h)
1586{
1587 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1588 {
1589 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1590 "ecore_evas_size_max_get");
1591 return;
1592 }
1593 if ((ee->rotation == 90) || (ee->rotation == 270))
1594 {
1595 if (w) *w = ee->prop.max.h;
1596 if (h) *h = ee->prop.max.w;
1597 }
1598 else
1599 {
1600 if (w) *w = ee->prop.max.w;
1601 if (h) *h = ee->prop.max.h;
1602 }
1603}
1604
1605EAPI void
1606ecore_evas_size_base_set(Ecore_Evas *ee, int w, int h)
1607{
1608 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1609 {
1610 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1611 "ecore_evas_size_base_set");
1612 return;
1613 }
1614 if (w < 0) w = 0;
1615 if (h < 0) h = 0;
1616 if ((ee->rotation == 90) || (ee->rotation == 270))
1617 {
1618 IFC(ee, fn_size_base_set) (ee, h, w);
1619 IFE;
1620 }
1621 else
1622 {
1623 IFC(ee, fn_size_base_set) (ee, w, h);
1624 IFE;
1625 }
1626}
1627
1628EAPI void
1629ecore_evas_size_base_get(const Ecore_Evas *ee, int *w, int *h)
1630{
1631 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1632 {
1633 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1634 "ecore_evas_size_base_get");
1635 return;
1636 }
1637 if ((ee->rotation == 90) || (ee->rotation == 270))
1638 {
1639 if (w) *w = ee->prop.base.h;
1640 if (h) *h = ee->prop.base.w;
1641 }
1642 else
1643 {
1644 if (w) *w = ee->prop.base.w;
1645 if (h) *h = ee->prop.base.h;
1646 }
1647}
1648
1649EAPI void
1650ecore_evas_size_step_set(Ecore_Evas *ee, int w, int h)
1651{
1652 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1653 {
1654 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1655 "ecore_evas_size_step_set");
1656 return;
1657 }
1658 if (w < 0) w = 0;
1659 if (h < 0) h = 0;
1660 if ((ee->rotation == 90) || (ee->rotation == 270))
1661 {
1662 IFC(ee, fn_size_step_set) (ee, h, w);
1663 IFE;
1664 }
1665 else
1666 {
1667 IFC(ee, fn_size_step_set) (ee, w, h);
1668 IFE;
1669 }
1670}
1671
1672EAPI void
1673ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h)
1674{
1675 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1676 {
1677 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1678 "ecore_evas_size_step_get");
1679 return;
1680 }
1681 if ((ee->rotation == 90) || (ee->rotation == 270))
1682 {
1683 if (w) *w = ee->prop.step.h;
1684 if (h) *h = ee->prop.step.w;
1685 }
1686 else
1687 {
1688 if (w) *w = ee->prop.step.w;
1689 if (h) *h = ee->prop.step.h;
1690 }
1691}
1692
1693EAPI void
1694ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y)
1695{
1696 Evas_Object *obj = NULL;
1697
1698 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1699 {
1700 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1701 "ecore_evas_cursor_set");
1702 return;
1703 }
1704
1705 if (file)
1706 {
1707 int x, y;
1708
1709 obj = evas_object_image_add(ee->evas);
1710 evas_object_image_file_set(obj, file, NULL);
1711 evas_object_image_size_get(obj, &x, &y);
1712 evas_object_resize(obj, x, y);
1713 evas_object_image_fill_set(obj, 0, 0, x, y);
1714 }
1715
1716 IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
1717 IFE;
1718}
1719
1720EAPI void
1721ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
1722{
1723 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1724 {
1725 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1726 "ecore_evas_cursor_set");
1727 return;
1728 }
1729 IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
1730 IFE;
1731}
1732
1733EAPI void
1734ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y)
1735{
1736 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1737 {
1738 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1739 "ecore_evas_cursor_get");
1740 return;
1741 }
1742 if (obj) *obj = ee->prop.cursor.object;
1743 if (layer) *layer = ee->prop.cursor.layer;
1744 if (hot_x) *hot_x = ee->prop.cursor.hot.x;
1745 if (hot_y) *hot_y = ee->prop.cursor.hot.y;
1746}
1747
1748EAPI void
1749ecore_evas_layer_set(Ecore_Evas *ee, int layer)
1750{
1751 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1752 {
1753 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1754 "ecore_evas_layer_set");
1755 return;
1756 }
1757 IFC(ee, fn_layer_set) (ee, layer);
1758 IFE;
1759}
1760
1761EAPI int
1762ecore_evas_layer_get(const Ecore_Evas *ee)
1763{
1764 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1765 {
1766 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1767 "ecore_evas_layer_get");
1768 return 0;
1769 }
1770 return ee->prop.layer;
1771}
1772
1773EAPI void
1774ecore_evas_focus_set(Ecore_Evas *ee, Eina_Bool on)
1775{
1776 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1777 {
1778 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1779 "ecore_evas_focus_set");
1780 return;
1781 }
1782 IFC(ee, fn_focus_set) (ee, on);
1783 IFE;
1784}
1785
1786EAPI Eina_Bool
1787ecore_evas_focus_get(const Ecore_Evas *ee)
1788{
1789 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1790 {
1791 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1792 "ecore_evas_focus_get");
1793 return EINA_FALSE;
1794 }
1795 return ee->prop.focused ? EINA_TRUE : EINA_FALSE;
1796}
1797
1798EAPI void
1799ecore_evas_iconified_set(Ecore_Evas *ee, Eina_Bool on)
1800{
1801 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1802 {
1803 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1804 "ecore_evas_iconified_set");
1805 return;
1806 }
1807 IFC(ee, fn_iconified_set) (ee, on);
1808 IFE;
1809}
1810
1811EAPI Eina_Bool
1812ecore_evas_iconified_get(const Ecore_Evas *ee)
1813{
1814 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1815 {
1816 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1817 "ecore_evas_iconified_get");
1818 return EINA_FALSE;
1819 }
1820 return ee->prop.iconified ? EINA_TRUE : EINA_FALSE;
1821}
1822
1823EAPI void
1824ecore_evas_borderless_set(Ecore_Evas *ee, Eina_Bool on)
1825{
1826 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1827 {
1828 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1829 "ecore_evas_borderless_set");
1830 return;
1831 }
1832 IFC(ee, fn_borderless_set) (ee, on);
1833 IFE;
1834}
1835
1836EAPI Eina_Bool
1837ecore_evas_borderless_get(const Ecore_Evas *ee)
1838{
1839 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1840 {
1841 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1842 "ecore_evas_borderless_get");
1843 return EINA_FALSE;
1844 }
1845 return ee->prop.borderless ? EINA_TRUE : EINA_FALSE;
1846}
1847
1848/**
1849 * Tell the WM whether or not to ignore an Ecore_Evas' window
1850 * @param ee The Ecore_Evas
1851 * @param on EINA_TRUE to ignore, EINA_FALSE to not.
1852 *
1853 * This function causes the window manager to ignore @p ee if @p on is EINA_TRUE,
1854 * or not ignore @p ee if @p on is EINA_FALSE.
1855 */
1856EAPI void
1857ecore_evas_override_set(Ecore_Evas *ee, Eina_Bool on)
1858{
1859 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1860 {
1861 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1862 "ecore_evas_override_set");
1863 return;
1864 }
1865 IFC(ee, fn_override_set) (ee, on);
1866 IFE;
1867}
1868
1869/**
1870 * Query whether an Ecore_Evas' window is overridden or not
1871 * @param ee The Ecore_Evas to set
1872 * @return EINA_TRUE if @p ee is overridden, EINA_FALSE if not.
1873 *
1874 */
1875EAPI Eina_Bool
1876ecore_evas_override_get(const Ecore_Evas *ee)
1877{
1878 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1879 {
1880 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1881 "ecore_evas_override_get");
1882 return EINA_FALSE;
1883 }
1884 return ee->prop.override ? EINA_TRUE : EINA_FALSE;
1885}
1886
1887EAPI void
1888ecore_evas_maximized_set(Ecore_Evas *ee, Eina_Bool on)
1889{
1890 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1891 {
1892 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1893 "ecore_evas_maximized_set");
1894 return;
1895 }
1896 IFC(ee, fn_maximized_set) (ee, on);
1897 IFE;
1898}
1899
1900EAPI Eina_Bool
1901ecore_evas_maximized_get(const Ecore_Evas *ee)
1902{
1903 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1904 {
1905 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1906 "ecore_evas_maximized_get");
1907 return EINA_FALSE;
1908 }
1909 return ee->prop.maximized ? EINA_TRUE : EINA_FALSE;
1910}
1911
1912EAPI void
1913ecore_evas_fullscreen_set(Ecore_Evas *ee, Eina_Bool on)
1914{
1915 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1916 {
1917 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1918 "ecore_evas_fullscreen_set");
1919 return;
1920 }
1921 IFC(ee, fn_fullscreen_set) (ee, on);
1922 IFE;
1923}
1924
1925EAPI Eina_Bool
1926ecore_evas_fullscreen_get(const Ecore_Evas *ee)
1927{
1928 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1929 {
1930 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1931 "ecore_evas_fullscreen_get");
1932 return EINA_FALSE;
1933 }
1934 return ee->prop.fullscreen ? EINA_TRUE : EINA_FALSE;
1935}
1936
1937/**
1938 * Set whether or not an Ecore_Evas' window should avoid damage
1939 *
1940 * @param ee The Ecore_Evas
1941 * @param The type of the damage management
1942 *
1943 * This function causes @p ee to be drawn to a pixmap to avoid recalculations.
1944 * On expose events it will copy from the pixmap to the window.
1945 */
1946EAPI void
1947ecore_evas_avoid_damage_set(Ecore_Evas *ee, Ecore_Evas_Avoid_Damage_Type on)
1948{
1949 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1950 {
1951 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1952 "ecore_evas_avoid_damage_set");
1953 return;
1954 }
1955 IFC(ee, fn_avoid_damage_set) (ee, on);
1956 IFE;
1957}
1958
1959/**
1960 * Query whether an Ecore_Evas' window avoids damage or not
1961 * @param ee The Ecore_Evas to set
1962 * @return The type of the damage management
1963 *
1964 */
1965EAPI Ecore_Evas_Avoid_Damage_Type
1966ecore_evas_avoid_damage_get(const Ecore_Evas *ee)
1967{
1968 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1969 {
1970 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1971 "ecore_evas_avoid_damage_get");
1972 return ECORE_EVAS_AVOID_DAMAGE_NONE;
1973 }
1974 return ee->prop.avoid_damage;
1975}
1976
1977/**
1978 * Set the withdrawn state of an Ecore_Evas' window.
1979 * @param ee The Ecore_Evas whose window's withdrawn state is set.
1980 * @param withdrawn The Ecore_Evas window's new withdrawn state.
1981 *
1982 */
1983EAPI void
1984ecore_evas_withdrawn_set(Ecore_Evas *ee, Eina_Bool withdrawn)
1985{
1986 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1987 {
1988 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1989 "ecore_evas_withdrawn_set");
1990 return;
1991 }
1992
1993 IFC(ee, fn_withdrawn_set) (ee, withdrawn);
1994 IFE;
1995}
1996
1997/**
1998 * Returns the withdrawn state of an Ecore_Evas' window.
1999 * @param ee The Ecore_Evas whose window's withdrawn state is returned.
2000 * @return The Ecore_Evas window's withdrawn state.
2001 *
2002 */
2003EAPI Eina_Bool
2004ecore_evas_withdrawn_get(const Ecore_Evas *ee)
2005{
2006 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2007 {
2008 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2009 "ecore_evas_withdrawn_get");
2010 return EINA_FALSE;
2011 } else
2012 return ee->prop.withdrawn ? EINA_TRUE : EINA_FALSE;
2013}
2014
2015/**
2016 * Set the sticky state of an Ecore_Evas window.
2017 *
2018 * @param ee The Ecore_Evas whose window's sticky state is set.
2019 * @param sticky The Ecore_Evas window's new sticky state.
2020 *
2021 */
2022EAPI void
2023ecore_evas_sticky_set(Ecore_Evas *ee, Eina_Bool sticky)
2024{
2025 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2026 {
2027 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2028 "ecore_evas_sticky_set");
2029 return;
2030 }
2031
2032 IFC(ee, fn_sticky_set) (ee, sticky);
2033 IFE;
2034}
2035
2036/**
2037 * Returns the sticky state of an Ecore_Evas' window.
2038 *
2039 * @param ee The Ecore_Evas whose window's sticky state is returned.
2040 * @return The Ecore_Evas window's sticky state.
2041 *
2042 */
2043EAPI Eina_Bool
2044ecore_evas_sticky_get(const Ecore_Evas *ee)
2045{
2046 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2047 {
2048 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2049 "ecore_evas_sticky_get");
2050 return EINA_FALSE;
2051 } else
2052 return ee->prop.sticky ? EINA_TRUE : EINA_FALSE;
2053}
2054
2055EAPI void
2056ecore_evas_ignore_events_set(Ecore_Evas *ee, Eina_Bool ignore)
2057{
2058 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2059 {
2060 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2061 "ecore_evas_ignore_events_set");
2062 return;
2063 }
2064
2065 IFC(ee, fn_ignore_events_set) (ee, ignore);
2066 IFE;
2067}
2068
2069EAPI Eina_Bool
2070ecore_evas_ignore_events_get(const Ecore_Evas *ee)
2071{
2072 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2073 {
2074 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2075 "ecore_evas_ignore_events_get");
2076 return EINA_FALSE;
2077 }
2078 return ee->ignore_events ? EINA_TRUE : EINA_FALSE;
2079}
2080
2081EAPI void
2082ecore_evas_manual_render_set(Ecore_Evas *ee, Eina_Bool manual_render)
2083{
2084 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2085 {
2086 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2087 "ecore_evas_manual_render_set");
2088 return;
2089 }
2090 ee->manual_render = manual_render;
2091}
2092
2093EAPI Eina_Bool
2094ecore_evas_manual_render_get(const Ecore_Evas *ee)
2095{
2096 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2097 {
2098 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2099 "ecore_evas_manual_render_get");
2100 return EINA_FALSE;
2101 }
2102 return ee->manual_render ? EINA_TRUE : EINA_FALSE;
2103}
2104
2105EAPI void
2106ecore_evas_manual_render(Ecore_Evas *ee)
2107{
2108 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2109 {
2110 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2111 "ecore_evas_manual_render");
2112 return;
2113 }
2114 if (ee->engine.func->fn_render)
2115 ee->engine.func->fn_render(ee);
2116}
2117
2118EAPI void
2119ecore_evas_comp_sync_set(Ecore_Evas *ee, Eina_Bool do_sync)
2120{
2121 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2122 {
2123 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2124 "ecore_evas_comp_sync_set");
2125 return;
2126 }
2127 ee->no_comp_sync = !do_sync;
2128}
2129
2130EAPI Eina_Bool
2131ecore_evas_comp_sync_get(const Ecore_Evas *ee)
2132{
2133 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2134 {
2135 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2136 "ecore_evas_comp_sync_get");
2137 return EINA_FALSE;
2138 }
2139 return !ee->no_comp_sync;
2140}
2141
2142EAPI Ecore_Window
2143ecore_evas_window_get(const Ecore_Evas *ee)
2144{
2145 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2146 {
2147 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2148 "ecore_evas_window_get");
2149 return 0;
2150 }
2151
2152 return ee->prop.window;
2153}
2154
2155EAPI void
2156ecore_evas_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
2157{
2158 if (x) *x = 0;
2159 if (y) *y = 0;
2160 if (w) *w = 0;
2161 if (h) *h = 0;
2162 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
2163 {
2164 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
2165 "ecore_evas_screen_geometry_get");
2166 return;
2167 }
2168
2169 IFC(ee, fn_screen_geometry_get) (ee, x, y, w, h);
2170 IFE;
2171}
2172
2173/* fps debug calls - for debugging how much time your app actually spends */
2174/* rendering graphics... :) */
2175
2176static int _ecore_evas_fps_debug_init_count = 0;
2177static int _ecore_evas_fps_debug_fd = -1;
2178unsigned int *_ecore_evas_fps_rendertime_mmap = NULL;
2179
2180void
2181_ecore_evas_fps_debug_init(void)
2182{
2183 char buf[4096];
2184 const char *tmp;
2185
2186 _ecore_evas_fps_debug_init_count++;
2187 if (_ecore_evas_fps_debug_init_count > 1) return;
2188
2189#ifndef HAVE_EVIL
2190 tmp = "/tmp";
2191#else
2192 tmp = evil_tmpdir_get ();
2193#endif /* HAVE_EVIL */
2194 snprintf(buf, sizeof(buf), "%s/.ecore_evas_fps_debug-%i", tmp, (int)getpid());
2195 _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
2196 if (_ecore_evas_fps_debug_fd < 0)
2197 {
2198 unlink(buf);
2199 _ecore_evas_fps_debug_fd = open(buf, O_CREAT | O_TRUNC | O_RDWR, 0644);
2200 }
2201 if (_ecore_evas_fps_debug_fd >= 0)
2202 {
2203 unsigned int zero = 0;
2204 char *buf2 = (char *)&zero;
2205 ssize_t todo = sizeof(unsigned int);
2206
2207 while (todo > 0)
2208 {
2209 ssize_t r = write(_ecore_evas_fps_debug_fd, buf2, todo);
2210 if (r > 0)
2211 {
2212 todo -= r;
2213 buf2 += r;
2214 }
2215 else if ((r < 0) && (errno == EINTR))
2216 continue;
2217 else
2218 {
2219 ERR("could not write to file '%s' fd %d: %s",
2220 buf, _ecore_evas_fps_debug_fd, strerror(errno));
2221 close(_ecore_evas_fps_debug_fd);
2222 _ecore_evas_fps_debug_fd = -1;
2223 return;
2224 }
2225 }
2226 _ecore_evas_fps_rendertime_mmap = mmap(NULL, sizeof(unsigned int),
2227 PROT_READ | PROT_WRITE,
2228 MAP_SHARED,
2229 _ecore_evas_fps_debug_fd, 0);
2230 if (_ecore_evas_fps_rendertime_mmap == MAP_FAILED)
2231 _ecore_evas_fps_rendertime_mmap = NULL;
2232 }
2233}
2234
2235void
2236_ecore_evas_fps_debug_shutdown(void)
2237{
2238 _ecore_evas_fps_debug_init_count--;
2239 if (_ecore_evas_fps_debug_init_count > 0) return;
2240 if (_ecore_evas_fps_debug_fd >= 0)
2241 {
2242 char buf[4096];
2243
2244 snprintf(buf, sizeof(buf), "/tmp/.ecore_evas_fps_debug-%i", (int)getpid());
2245 unlink(buf);
2246 if (_ecore_evas_fps_rendertime_mmap)
2247 {
2248 munmap(_ecore_evas_fps_rendertime_mmap, sizeof(int));
2249 _ecore_evas_fps_rendertime_mmap = NULL;
2250 }
2251 close(_ecore_evas_fps_debug_fd);
2252 _ecore_evas_fps_debug_fd = -1;
2253 }
2254}
2255
2256void
2257_ecore_evas_fps_debug_rendertime_add(double t)
2258{
2259 static double rtime = 0.0;
2260 static double rlapse = 0.0;
2261 static int frames = 0;
2262 static int flapse = 0;
2263 double tim;
2264
2265 tim = ecore_time_get();
2266 rtime += t;
2267 frames++;
2268 if (rlapse == 0.0)
2269 {
2270 rlapse = tim;
2271 flapse = frames;
2272 }
2273 else if ((tim - rlapse) >= 0.5)
2274 {
2275 printf("FRAME: %i, FPS: %3.1f, RTIME %3.0f%%\n",
2276 frames,
2277 (frames - flapse) / (tim - rlapse),
2278 (100.0 * rtime) / (tim - rlapse)
2279 );
2280 rlapse = tim;
2281 flapse = frames;
2282 rtime = 0.0;
2283 }
2284}
2285
2286void
2287_ecore_evas_register(Ecore_Evas *ee)
2288{
2289 ee->registered = 1;
2290 ecore_evases = (Ecore_Evas *)eina_inlist_prepend
2291 (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
2292}
2293
2294void
2295_ecore_evas_ref(Ecore_Evas *ee)
2296{
2297 ee->refcount++;
2298}
2299
2300void
2301_ecore_evas_unref(Ecore_Evas *ee)
2302{
2303 ee->refcount--;
2304 if (ee->refcount == 0)
2305 {
2306 if (ee->deleted) _ecore_evas_free(ee);
2307 }
2308 else if (ee->refcount < -1)
2309 ERR("Ecore_Evas %p->refcount=%d < 0", ee, ee->refcount);
2310}
2311
2312void
2313_ecore_evas_free(Ecore_Evas *ee)
2314{
2315 ee->deleted = EINA_TRUE;
2316 if (ee->refcount > 0) return;
2317
2318 if (ee->func.fn_pre_free) ee->func.fn_pre_free(ee);
2319 while (ee->sub_ecore_evas)
2320 {
2321 _ecore_evas_free(ee->sub_ecore_evas->data);
2322 }
2323 if (ee->data) eina_hash_free(ee->data);
2324 ee->data = NULL;
2325 if (ee->name) free(ee->name);
2326 ee->name = NULL;
2327 if (ee->prop.title) free(ee->prop.title);
2328 ee->prop.title = NULL;
2329 if (ee->prop.name) free(ee->prop.name);
2330 ee->prop.name = NULL;
2331 if (ee->prop.clas) free(ee->prop.clas);
2332 ee->prop.clas = NULL;
2333 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2334 ee->prop.cursor.object = NULL;
2335 if (ee->evas) evas_free(ee->evas);
2336 ee->evas = NULL;
2337 ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
2338 ee->driver = NULL;
2339 if (ee->engine.idle_flush_timer)
2340 ecore_timer_del(ee->engine.idle_flush_timer);
2341 if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee);
2342 if (ee->registered)
2343 {
2344 ecore_evases = (Ecore_Evas *)eina_inlist_remove
2345 (EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
2346 }
2347 free(ee);
2348}
2349
2350static Eina_Bool
2351_ecore_evas_cb_idle_flush(void *data)
2352{
2353 Ecore_Evas *ee;
2354
2355 ee = (Ecore_Evas *)data;
2356 evas_render_idle_flush(ee->evas);
2357 ee->engine.idle_flush_timer = NULL;
2358 return ECORE_CALLBACK_CANCEL;
2359}
2360
2361static Eina_Bool
2362_ecore_evas_async_events_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
2363{
2364 evas_async_events_process();
2365
2366 return ECORE_CALLBACK_RENEW;
2367}
2368
2369void
2370_ecore_evas_idle_timeout_update(Ecore_Evas *ee)
2371{
2372 if (ee->engine.idle_flush_timer)
2373 ecore_timer_del(ee->engine.idle_flush_timer);
2374 ee->engine.idle_flush_timer = ecore_timer_add(IDLE_FLUSH_TIME,
2375 _ecore_evas_cb_idle_flush,
2376 ee);
2377}
2378
2379void
2380_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
2381{
2382 ee->mouse.x = x;
2383 ee->mouse.y = y;
2384 if (ee->prop.cursor.object)
2385 {
2386 evas_object_show(ee->prop.cursor.object);
2387 if (ee->rotation == 0)
2388 evas_object_move(ee->prop.cursor.object,
2389 x - ee->prop.cursor.hot.x,
2390 y - ee->prop.cursor.hot.y);
2391 else if (ee->rotation == 90)
2392 evas_object_move(ee->prop.cursor.object,
2393 ee->h - y - 1 - ee->prop.cursor.hot.x,
2394 x - ee->prop.cursor.hot.y);
2395 else if (ee->rotation == 180)
2396 evas_object_move(ee->prop.cursor.object,
2397 ee->w - x - 1 - ee->prop.cursor.hot.x,
2398 ee->h - y - 1 - ee->prop.cursor.hot.y);
2399 else if (ee->rotation == 270)
2400 evas_object_move(ee->prop.cursor.object,
2401 y - ee->prop.cursor.hot.x,
2402 ee->w - x - 1 - ee->prop.cursor.hot.y);
2403 }
2404 if (ee->rotation == 0)
2405 evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
2406 else if (ee->rotation == 90)
2407 evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
2408 else if (ee->rotation == 180)
2409 evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
2410 else if (ee->rotation == 270)
2411 evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
2412}
2413
2414void
2415_ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
2416 int x, int y,
2417 double radius,
2418 double radius_x, double radius_y,
2419 double pressure,
2420 double angle,
2421 double mx, double my,
2422 unsigned int timestamp)
2423{
2424 if (ee->rotation == 0)
2425 evas_event_feed_multi_move(ee->evas, device,
2426 x, y,
2427 radius,
2428 radius_x, radius_y,
2429 pressure,
2430 angle - ee->rotation,
2431 mx, my,
2432 timestamp, NULL);
2433 else if (ee->rotation == 90)
2434 evas_event_feed_multi_move(ee->evas, device,
2435 ee->h - y - 1, x,
2436 radius,
2437 radius_y, radius_x,
2438 pressure,
2439 angle - ee->rotation,
2440 ee->h - my - 1, mx,
2441 timestamp, NULL);
2442 else if (ee->rotation == 180)
2443 evas_event_feed_multi_move(ee->evas, device,
2444 ee->w - x - 1, ee->h - y - 1,
2445 radius,
2446 radius_x, radius_y,
2447 pressure,
2448 angle - ee->rotation,
2449 ee->w - mx - 1, ee->h - my - 1,
2450 timestamp, NULL);
2451 else if (ee->rotation == 270)
2452 evas_event_feed_multi_move(ee->evas, device,
2453 y, ee->w - x - 1,
2454 radius,
2455 radius_y, radius_x,
2456 pressure,
2457 angle - ee->rotation,
2458 my, ee->w - mx - 1,
2459 timestamp, NULL);
2460}
2461
2462void
2463_ecore_evas_mouse_multi_down_process(Ecore_Evas *ee, int device,
2464 int x, int y,
2465 double radius,
2466 double radius_x, double radius_y,
2467 double pressure,
2468 double angle,
2469 double mx, double my,
2470 Evas_Button_Flags flags,
2471 unsigned int timestamp)
2472{
2473 if (ee->rotation == 0)
2474 evas_event_feed_multi_down(ee->evas, device,
2475 x, y,
2476 radius,
2477 radius_x, radius_y,
2478 pressure,
2479 angle - ee->rotation,
2480 mx, my,
2481 flags, timestamp, NULL);
2482 else if (ee->rotation == 90)
2483 evas_event_feed_multi_down(ee->evas, device,
2484 ee->h - y - 1, x,
2485 radius,
2486 radius_y, radius_x,
2487 pressure,
2488 angle - ee->rotation,
2489 ee->h - my - 1, mx,
2490 flags, timestamp, NULL);
2491 else if (ee->rotation == 180)
2492 evas_event_feed_multi_down(ee->evas, device,
2493 ee->w - x - 1, ee->h - y - 1,
2494 radius,
2495 radius_x, radius_y,
2496 pressure,
2497 angle - ee->rotation,
2498 ee->w - mx - 1, ee->h - my - 1,
2499 flags, timestamp, NULL);
2500 else if (ee->rotation == 270)
2501 evas_event_feed_multi_down(ee->evas, device,
2502 y, ee->w - x - 1,
2503 radius,
2504 radius_y, radius_x,
2505 pressure,
2506 angle - ee->rotation,
2507 my, ee->w - mx - 1,
2508 flags, timestamp, NULL);
2509}
2510
2511void
2512_ecore_evas_mouse_multi_up_process(Ecore_Evas *ee, int device,
2513 int x, int y,
2514 double radius,
2515 double radius_x, double radius_y,
2516 double pressure,
2517 double angle,
2518 double mx, double my,
2519 Evas_Button_Flags flags,
2520 unsigned int timestamp)
2521{
2522 if (ee->rotation == 0)
2523 evas_event_feed_multi_up(ee->evas, device,
2524 x, y,
2525 radius,
2526 radius_x, radius_y,
2527 pressure,
2528 angle - ee->rotation,
2529 mx, my,
2530 flags, timestamp, NULL);
2531 else if (ee->rotation == 90)
2532 evas_event_feed_multi_up(ee->evas, device,
2533 ee->h - y - 1, x,
2534 radius,
2535 radius_y, radius_x,
2536 pressure,
2537 angle - ee->rotation,
2538 ee->h - my - 1, mx,
2539 flags, timestamp, NULL);
2540 else if (ee->rotation == 180)
2541 evas_event_feed_multi_up(ee->evas, device,
2542 ee->w - x - 1, ee->h - y - 1,
2543 radius,
2544 radius_x, radius_y,
2545 pressure,
2546 angle - ee->rotation,
2547 ee->w - mx - 1, ee->h - my - 1,
2548 flags, timestamp, NULL);
2549 else if (ee->rotation == 270)
2550 evas_event_feed_multi_up(ee->evas, device,
2551 y, ee->w - x - 1,
2552 radius,
2553 radius_y, radius_x,
2554 pressure,
2555 angle - ee->rotation,
2556 my, ee->w - mx - 1,
2557 flags, timestamp, NULL);
2558}
2559
2560EAPI Eina_List *
2561ecore_evas_ecore_evas_list_get(void)
2562{
2563 Ecore_Evas *ee;
2564 Eina_List *l = NULL;
2565
2566 EINA_INLIST_FOREACH(ecore_evases, ee)
2567 {
2568 l = eina_list_append(l, ee);
2569 }
2570
2571 return l;
2572}
2573
2574EAPI void
2575ecore_evas_input_event_register(Ecore_Evas *ee)
2576{
2577 ecore_event_window_register((Ecore_Window)ee, ee, ee->evas,
2578 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2579 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2580 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2581 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2582}
2583
2584EAPI void
2585ecore_evas_input_event_unregister(Ecore_Evas *ee)
2586{
2587 ecore_event_window_unregister((Ecore_Window)ee);
2588}
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_buffer.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_buffer.c
new file mode 100644
index 0000000..a3e49d6
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_buffer.c
@@ -0,0 +1,827 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
6
7#include <Ecore.h>
8#include "ecore_private.h"
9#include <Ecore_Input.h>
10
11#include "ecore_evas_private.h"
12#include "Ecore_Evas.h"
13
14#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
15static int _ecore_evas_init_count = 0;
16
17static int
18_ecore_evas_buffer_init(void)
19{
20 _ecore_evas_init_count++;
21 return _ecore_evas_init_count;
22}
23
24static void
25_ecore_evas_buffer_free(Ecore_Evas *ee)
26{
27 if (ee->engine.buffer.image)
28 {
29 Ecore_Evas *ee2;
30
31 ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
32 evas_object_del(ee->engine.buffer.image);
33 ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
34 }
35 else
36 {
37 ee->engine.buffer.free_func(ee->engine.buffer.data,
38 ee->engine.buffer.pixels);
39 }
40 _ecore_evas_buffer_shutdown();
41}
42
43static void
44_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
45{
46 Evas_Engine_Info_Buffer *einfo;
47 int stride = 0;
48
49 if (w < 1) w = 1;
50 if (h < 1) h = 1;
51 ee->req.w = w;
52 ee->req.h = h;
53 if ((w == ee->w) && (h == ee->h)) return;
54 ee->w = w;
55 ee->h = h;
56 evas_output_size_set(ee->evas, ee->w, ee->h);
57 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
58 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
59
60 if (ee->engine.buffer.image)
61 {
62 ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
63 stride = evas_object_image_stride_get(ee->engine.buffer.image);
64 }
65 else
66 {
67 if (ee->engine.buffer.pixels)
68 ee->engine.buffer.free_func(ee->engine.buffer.data,
69 ee->engine.buffer.pixels);
70 ee->engine.buffer.pixels =
71 ee->engine.buffer.alloc_func(ee->engine.buffer.data,
72 ee->w * ee->h * sizeof(int));
73 stride = ee->w * sizeof(int);
74 }
75
76 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
77 if (einfo)
78 {
79 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
80 einfo->info.dest_buffer = ee->engine.buffer.pixels;
81 einfo->info.dest_buffer_row_bytes = stride;
82 einfo->info.use_color_key = 0;
83 einfo->info.alpha_threshold = 0;
84 einfo->info.func.new_update_region = NULL;
85 einfo->info.func.free_update_region = NULL;
86 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
87 {
88 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
89 }
90 }
91 if (ee->engine.buffer.image)
92 evas_object_image_data_set(ee->engine.buffer.image, ee->engine.buffer.pixels);
93 if (ee->func.fn_resize) ee->func.fn_resize(ee);
94}
95
96int
97_ecore_evas_buffer_shutdown(void)
98{
99 _ecore_evas_init_count--;
100 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
101 return _ecore_evas_init_count;
102}
103
104static void
105_ecore_evas_show(Ecore_Evas *ee)
106{
107 if (ee->engine.buffer.image) return;
108 if (ee->prop.focused) return;
109 ee->prop.focused = 1;
110 evas_focus_in(ee->evas);
111 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
112}
113
114int
115_ecore_evas_buffer_render(Ecore_Evas *ee)
116{
117 Eina_List *updates = NULL, *l, *ll;
118 Ecore_Evas *ee2;
119 int rend = 0;
120
121 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
122 {
123 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
124 if (ee2->engine.func->fn_render)
125 rend |= ee2->engine.func->fn_render(ee2);
126 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
127 }
128 if (ee->engine.buffer.image)
129 {
130 int w, h;
131
132 evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
133 if ((w != ee->w) || (h != ee->h))
134 _ecore_evas_resize(ee, w, h);
135 ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
136 }
137 if (ee->engine.buffer.pixels)
138 {
139 updates = evas_render_updates(ee->evas);
140 }
141 if (ee->engine.buffer.image)
142 {
143 Eina_Rectangle *r;
144
145 evas_object_image_data_set(ee->engine.buffer.image, ee->engine.buffer.pixels);
146 EINA_LIST_FOREACH(updates, l, r)
147 evas_object_image_data_update_add(ee->engine.buffer.image,
148 r->x, r->y, r->w, r->h);
149 }
150 if (updates)
151 {
152 evas_render_updates_free(updates);
153 _ecore_evas_idle_timeout_update(ee);
154 }
155
156 return updates ? 1 : rend;
157}
158
159// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
160static void
161_ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
162{
163 Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
164
165 evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, &ww, &hh);
166 evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
167
168 if (fw < 1) fw = 1;
169 if (fh < 1) fh = 1;
170
171 if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
172 {
173 *x = (ee->w * (*x - xx)) / fw;
174 *y = (ee->h * (*y - yy)) / fh;
175 }
176 else
177 {
178 xx = (*x - xx) - fx;
179 while (xx < 0) xx += fw;
180 while (xx > fw) xx -= fw;
181 *x = (ee->w * xx) / fw;
182
183 yy = (*y - yy) - fy;
184 while (yy < 0) yy += fh;
185 while (yy > fh) yy -= fh;
186 *y = (ee->h * yy) / fh;
187 }
188}
189
190static void
191_ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
192{
193 Ecore_Evas *ee;
194 Evas_Event_Mouse_In *ev;
195
196 ee = data;
197 ev = event_info;
198 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
199}
200
201static void
202_ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
203{
204 Ecore_Evas *ee;
205 Evas_Event_Mouse_Out *ev;
206
207 ee = data;
208 ev = event_info;
209 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
210}
211
212static void
213_ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
214{
215 Ecore_Evas *ee;
216 Evas_Event_Mouse_Down *ev;
217
218 ee = data;
219 ev = event_info;
220 evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
221}
222
223static void
224_ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
225{
226 Ecore_Evas *ee;
227 Evas_Event_Mouse_Up *ev;
228
229 ee = data;
230 ev = event_info;
231 evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
232}
233
234static void
235_ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
236{
237 Ecore_Evas *ee;
238 Evas_Event_Mouse_Move *ev;
239 Evas_Coord x, y;
240
241 ee = data;
242 ev = event_info;
243 x = ev->cur.canvas.x;
244 y = ev->cur.canvas.y;
245 _ecore_evas_buffer_coord_translate(ee, &x, &y);
246 _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
247}
248
249static void
250_ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
251{
252 Ecore_Evas *ee;
253 Evas_Event_Mouse_Wheel *ev;
254
255 ee = data;
256 ev = event_info;
257 evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
258}
259
260static void
261_ecore_evas_buffer_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
262{
263 Ecore_Evas *ee;
264 Evas_Event_Multi_Down *ev;
265 Evas_Coord x, y, xx, yy;
266 double xf, yf;
267
268 ee = data;
269 ev = event_info;
270 x = ev->canvas.x;
271 y = ev->canvas.y;
272 xx = x;
273 yy = y;
274 _ecore_evas_buffer_coord_translate(ee, &x, &y);
275 xf = (ev->canvas.xsub - (double)xx) + (double)x;
276 yf = (ev->canvas.ysub - (double)yy) + (double)y;
277 evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
278}
279
280static void
281_ecore_evas_buffer_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
282{
283 Ecore_Evas *ee;
284 Evas_Event_Multi_Up *ev;
285 Evas_Coord x, y, xx, yy;
286 double xf, yf;
287
288 ee = data;
289 ev = event_info;
290 x = ev->canvas.x;
291 y = ev->canvas.y;
292 xx = x;
293 yy = y;
294 _ecore_evas_buffer_coord_translate(ee, &x, &y);
295 xf = (ev->canvas.xsub - (double)xx) + (double)x;
296 yf = (ev->canvas.ysub - (double)yy) + (double)y;
297 evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
298}
299
300static void
301_ecore_evas_buffer_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
302{
303 Ecore_Evas *ee;
304 Evas_Event_Multi_Move *ev;
305 Evas_Coord x, y, xx, yy;
306 double xf, yf;
307
308 ee = data;
309 ev = event_info;
310 x = ev->cur.canvas.x;
311 y = ev->cur.canvas.y;
312 xx = x;
313 yy = y;
314 _ecore_evas_buffer_coord_translate(ee, &x, &y);
315 xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
316 yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
317 evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->timestamp, NULL);
318}
319
320static void
321_ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
322{
323 Ecore_Evas *ee;
324
325 ee = data;
326 if (ee->driver) _ecore_evas_free(ee);
327}
328
329static void
330_ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
331{
332 Ecore_Evas *ee;
333 Evas_Event_Key_Down *ev;
334
335 ee = data;
336 ev = event_info;
337 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
338 evas_key_modifier_on(ee->evas, "Shift");
339 else
340 evas_key_modifier_off(ee->evas, "Shift");
341 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
342 evas_key_modifier_on(ee->evas, "Control");
343 else
344 evas_key_modifier_off(ee->evas, "Control");
345 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
346 evas_key_modifier_on(ee->evas, "Alt");
347 else
348 evas_key_modifier_off(ee->evas, "Alt");
349 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
350 evas_key_modifier_on(ee->evas, "Meta");
351 else
352 evas_key_modifier_off(ee->evas, "Meta");
353 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
354 evas_key_modifier_on(ee->evas, "Hyper");
355 else
356 evas_key_modifier_off(ee->evas, "Hyper");
357 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
358 evas_key_modifier_on(ee->evas, "Super");
359 else
360 evas_key_modifier_off(ee->evas, "Super");
361 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
362 evas_key_lock_on(ee->evas, "Scroll_Lock");
363 else
364 evas_key_lock_off(ee->evas, "Scroll_Lock");
365 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
366 evas_key_lock_on(ee->evas, "Num_Lock");
367 else
368 evas_key_lock_off(ee->evas, "Num_Lock");
369 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
370 evas_key_lock_on(ee->evas, "Caps_Lock");
371 else
372 evas_key_lock_off(ee->evas, "Caps_Lock");
373 evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
374}
375
376static void
377_ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
378{
379 Ecore_Evas *ee;
380 Evas_Event_Key_Up *ev;
381
382 ee = data;
383 ev = event_info;
384 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
385 evas_key_modifier_on(ee->evas, "Shift");
386 else
387 evas_key_modifier_off(ee->evas, "Shift");
388 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
389 evas_key_modifier_on(ee->evas, "Control");
390 else
391 evas_key_modifier_off(ee->evas, "Control");
392 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
393 evas_key_modifier_on(ee->evas, "Alt");
394 else
395 evas_key_modifier_off(ee->evas, "Alt");
396 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
397 evas_key_modifier_on(ee->evas, "Meta");
398 else
399 evas_key_modifier_off(ee->evas, "Meta");
400 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
401 evas_key_modifier_on(ee->evas, "Hyper");
402 else
403 evas_key_modifier_off(ee->evas, "Hyper");
404 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
405 evas_key_modifier_on(ee->evas, "Super");
406 else
407 evas_key_modifier_off(ee->evas, "Super");
408 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
409 evas_key_lock_on(ee->evas, "Scroll_Lock");
410 else
411 evas_key_lock_off(ee->evas, "Scroll_Lock");
412 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
413 evas_key_lock_on(ee->evas, "Num_Lock");
414 else
415 evas_key_lock_off(ee->evas, "Num_Lock");
416 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
417 evas_key_lock_on(ee->evas, "Caps_Lock");
418 else
419 evas_key_lock_off(ee->evas, "Caps_Lock");
420 evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
421}
422
423static void
424_ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
425{
426 Ecore_Evas *ee;
427
428 ee = data;
429 ee->prop.focused = 1;
430 evas_focus_in(ee->evas);
431 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
432}
433
434static void
435_ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
436{
437 Ecore_Evas *ee;
438
439 ee = data;
440 ee->prop.focused = 0;
441 evas_focus_out(ee->evas);
442 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
443}
444
445static void
446_ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
447{
448 Ecore_Evas *ee;
449
450 ee = data;
451 ee->visible = 1;
452 if (ee->func.fn_show) ee->func.fn_show(ee);
453}
454
455static void
456_ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
457{
458 Ecore_Evas *ee;
459
460 ee = data;
461 ee->visible = 0;
462 if (ee->func.fn_hide) ee->func.fn_hide(ee);
463}
464
465static void
466_ecore_evas_buffer_alpha_set(Ecore_Evas *ee, int alpha)
467{
468 if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
469 ee->alpha = alpha;
470 if (ee->engine.buffer.image)
471 evas_object_image_alpha_set(ee->engine.buffer.image, ee->alpha);
472}
473
474static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
475{
476 _ecore_evas_buffer_free,
477 NULL,
478 NULL,
479 NULL,
480 NULL,
481 NULL,
482 NULL,
483 NULL,
484 NULL,
485 NULL,
486 NULL,
487 NULL,
488 NULL,
489 NULL,
490 NULL,
491 NULL,
492 NULL,
493 _ecore_evas_resize,
494 NULL,
495 NULL,
496 NULL,
497 _ecore_evas_show,
498 NULL,
499 NULL,
500 NULL,
501 NULL,
502 NULL,
503 NULL,
504 NULL,
505 NULL,
506 NULL,
507 NULL,
508 NULL,
509 NULL,
510 NULL,
511 NULL,
512 NULL,
513 NULL,
514 NULL,
515 NULL,
516 NULL,
517 NULL,
518 NULL,
519 NULL,
520 _ecore_evas_buffer_alpha_set,
521 NULL, //transparent
522
523 NULL, // render
524 NULL // screen_geometry_get
525};
526#endif
527
528static void *
529_ecore_evas_buffer_pix_alloc(void *data __UNUSED__, int size)
530{
531 return malloc(size);
532}
533
534static void
535_ecore_evas_buffer_pix_free(void *data __UNUSED__, void *pix)
536{
537 free(pix);
538}
539
540EAPI Ecore_Evas *
541ecore_evas_buffer_new(int w, int h)
542{
543 return ecore_evas_buffer_allocfunc_new
544 (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
545}
546
547EAPI Ecore_Evas *
548ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data)
549{
550// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
551#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
552 Evas_Engine_Info_Buffer *einfo;
553 Ecore_Evas *ee;
554 int rmethod;
555
556 if ((!alloc_func) || (!free_func)) return NULL;
557 rmethod = evas_render_method_lookup("buffer");
558 if (!rmethod) return NULL;
559 ee = calloc(1, sizeof(Ecore_Evas));
560 if (!ee) return NULL;
561
562 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
563
564 _ecore_evas_buffer_init();
565
566 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
567 ee->engine.buffer.alloc_func = alloc_func;
568 ee->engine.buffer.free_func = free_func;
569 ee->engine.buffer.data = (void *)data;
570
571 ee->driver = "buffer";
572
573 if (w < 1) w = 1;
574 if (h < 1) h = 1;
575 ee->rotation = 0;
576 ee->visible = 1;
577 ee->w = w;
578 ee->h = h;
579 ee->req.w = ee->w;
580 ee->req.h = ee->h;
581
582 ee->prop.max.w = 0;
583 ee->prop.max.h = 0;
584 ee->prop.layer = 0;
585 ee->prop.focused = 1;
586 ee->prop.borderless = 1;
587 ee->prop.override = 1;
588 ee->prop.maximized = 1;
589 ee->prop.fullscreen = 0;
590 ee->prop.withdrawn = 0;
591 ee->prop.sticky = 0;
592
593 /* init evas here */
594 ee->evas = evas_new();
595 evas_data_attach_set(ee->evas, ee);
596 evas_output_method_set(ee->evas, rmethod);
597 evas_output_size_set(ee->evas, w, h);
598 evas_output_viewport_set(ee->evas, 0, 0, w, h);
599
600 ee->engine.buffer.pixels =
601 ee->engine.buffer.alloc_func
602 (ee->engine.buffer.data, w * h * sizeof(int));
603
604 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
605 if (einfo)
606 {
607 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
608 einfo->info.dest_buffer = ee->engine.buffer.pixels;
609 einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
610 einfo->info.use_color_key = 0;
611 einfo->info.alpha_threshold = 0;
612 einfo->info.func.new_update_region = NULL;
613 einfo->info.func.free_update_region = NULL;
614 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
615 {
616 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
617 ecore_evas_free(ee);
618 return NULL;
619 }
620 }
621 else
622 {
623 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
624 ecore_evas_free(ee);
625 return NULL;
626 }
627 evas_key_modifier_add(ee->evas, "Shift");
628 evas_key_modifier_add(ee->evas, "Control");
629 evas_key_modifier_add(ee->evas, "Alt");
630 evas_key_modifier_add(ee->evas, "Meta");
631 evas_key_modifier_add(ee->evas, "Hyper");
632 evas_key_modifier_add(ee->evas, "Super");
633 evas_key_lock_add(ee->evas, "Caps_Lock");
634 evas_key_lock_add(ee->evas, "Num_Lock");
635 evas_key_lock_add(ee->evas, "Scroll_Lock");
636
637 evas_event_feed_mouse_in(ee->evas, 0, NULL);
638
639 ee->engine.func->fn_render = _ecore_evas_buffer_render;
640 _ecore_evas_register(ee);
641
642 evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
643
644 return ee;
645#else
646 return NULL;
647#endif
648}
649
650EAPI const void *
651ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
652{
653#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
654 _ecore_evas_buffer_render(ee);
655 return ee->engine.buffer.pixels;
656#else
657 return NULL;
658#endif
659}
660
661EAPI Evas *
662ecore_evas_object_evas_get(Evas_Object *obj)
663{
664 Ecore_Evas *ee;
665
666 ee = evas_object_data_get(obj, "Ecore_Evas");
667 if (!ee) return NULL;
668
669 return ecore_evas_get(ee);
670}
671
672EAPI Ecore_Evas *
673ecore_evas_object_ecore_evas_get(Evas_Object *obj)
674{
675 return evas_object_data_get(obj, "Ecore_Evas");
676}
677
678EAPI Evas_Object *
679ecore_evas_object_image_new(Ecore_Evas *ee_target)
680{
681// NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
682#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
683 Evas_Object *o;
684 Evas_Engine_Info_Buffer *einfo;
685 Ecore_Evas *ee;
686 int rmethod;
687 int w = 1, h = 1;
688
689 rmethod = evas_render_method_lookup("buffer");
690 if (!rmethod) return NULL;
691 ee = calloc(1, sizeof(Ecore_Evas));
692 if (!ee) return NULL;
693
694 o = evas_object_image_add(ee_target->evas);
695 evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
696 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
697 evas_object_image_alpha_set(o, 0);
698 evas_object_image_size_set(o, w, h);
699
700 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
701
702 _ecore_evas_buffer_init();
703
704 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
705
706 ee->driver = "buffer";
707
708 ee->rotation = 0;
709 ee->visible = 0;
710 ee->w = w;
711 ee->h = h;
712 ee->req.w = ee->w;
713 ee->req.h = ee->h;
714
715 ee->prop.max.w = 0;
716 ee->prop.max.h = 0;
717 ee->prop.layer = 0;
718 ee->prop.focused = 0;
719 ee->prop.borderless = 1;
720 ee->prop.override = 1;
721 ee->prop.maximized = 0;
722 ee->prop.fullscreen = 0;
723 ee->prop.withdrawn = 0;
724 ee->prop.sticky = 0;
725
726 /* init evas here */
727 ee->evas = evas_new();
728 evas_data_attach_set(ee->evas, ee);
729 evas_output_method_set(ee->evas, rmethod);
730 evas_output_size_set(ee->evas, w, h);
731 evas_output_viewport_set(ee->evas, 0, 0, w, h);
732
733 ee->engine.buffer.image = o;
734 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
735 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
736 evas_object_event_callback_add(ee->engine.buffer.image,
737 EVAS_CALLBACK_MOUSE_IN,
738 _ecore_evas_buffer_cb_mouse_in, ee);
739 evas_object_event_callback_add(ee->engine.buffer.image,
740 EVAS_CALLBACK_MOUSE_OUT,
741 _ecore_evas_buffer_cb_mouse_out, ee);
742 evas_object_event_callback_add(ee->engine.buffer.image,
743 EVAS_CALLBACK_MOUSE_DOWN,
744 _ecore_evas_buffer_cb_mouse_down, ee);
745 evas_object_event_callback_add(ee->engine.buffer.image,
746 EVAS_CALLBACK_MOUSE_UP,
747 _ecore_evas_buffer_cb_mouse_up, ee);
748 evas_object_event_callback_add(ee->engine.buffer.image,
749 EVAS_CALLBACK_MOUSE_MOVE,
750 _ecore_evas_buffer_cb_mouse_move, ee);
751 evas_object_event_callback_add(ee->engine.buffer.image,
752 EVAS_CALLBACK_MOUSE_WHEEL,
753 _ecore_evas_buffer_cb_mouse_wheel, ee);
754 evas_object_event_callback_add(ee->engine.buffer.image,
755 EVAS_CALLBACK_MULTI_DOWN,
756 _ecore_evas_buffer_cb_multi_down, ee);
757 evas_object_event_callback_add(ee->engine.buffer.image,
758 EVAS_CALLBACK_MULTI_UP,
759 _ecore_evas_buffer_cb_multi_up, ee);
760 evas_object_event_callback_add(ee->engine.buffer.image,
761 EVAS_CALLBACK_MULTI_MOVE,
762 _ecore_evas_buffer_cb_multi_move, ee);
763 evas_object_event_callback_add(ee->engine.buffer.image,
764 EVAS_CALLBACK_FREE,
765 _ecore_evas_buffer_cb_free, ee);
766 evas_object_event_callback_add(ee->engine.buffer.image,
767 EVAS_CALLBACK_KEY_DOWN,
768 _ecore_evas_buffer_cb_key_down, ee);
769 evas_object_event_callback_add(ee->engine.buffer.image,
770 EVAS_CALLBACK_KEY_UP,
771 _ecore_evas_buffer_cb_key_up, ee);
772 evas_object_event_callback_add(ee->engine.buffer.image,
773 EVAS_CALLBACK_FOCUS_IN,
774 _ecore_evas_buffer_cb_focus_in, ee);
775 evas_object_event_callback_add(ee->engine.buffer.image,
776 EVAS_CALLBACK_FOCUS_OUT,
777 _ecore_evas_buffer_cb_focus_out, ee);
778 evas_object_event_callback_add(ee->engine.buffer.image,
779 EVAS_CALLBACK_SHOW,
780 _ecore_evas_buffer_cb_show, ee);
781 evas_object_event_callback_add(ee->engine.buffer.image,
782 EVAS_CALLBACK_HIDE,
783 _ecore_evas_buffer_cb_hide, ee);
784 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
785 if (einfo)
786 {
787 ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
788 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
789 einfo->info.dest_buffer = ee->engine.buffer.pixels;
790 einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
791 einfo->info.use_color_key = 0;
792 einfo->info.alpha_threshold = 0;
793 einfo->info.func.new_update_region = NULL;
794 einfo->info.func.free_update_region = NULL;
795 evas_object_image_data_set(o, ee->engine.buffer.pixels);
796 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
797 {
798 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
799 ecore_evas_free(ee);
800 return NULL;
801 }
802 }
803 else
804 {
805 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
806 ecore_evas_free(ee);
807 return NULL;
808 }
809 evas_key_modifier_add(ee->evas, "Shift");
810 evas_key_modifier_add(ee->evas, "Control");
811 evas_key_modifier_add(ee->evas, "Alt");
812 evas_key_modifier_add(ee->evas, "Meta");
813 evas_key_modifier_add(ee->evas, "Hyper");
814 evas_key_modifier_add(ee->evas, "Super");
815 evas_key_lock_add(ee->evas, "Caps_Lock");
816 evas_key_lock_add(ee->evas, "Num_Lock");
817 evas_key_lock_add(ee->evas, "Scroll_Lock");
818
819 ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
820
821 ee->engine.func->fn_render = _ecore_evas_buffer_render;
822
823 return o;
824#else
825 return NULL;
826#endif
827}
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c
new file mode 100644
index 0000000..1f946d5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_cocoa.c
@@ -0,0 +1,574 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "Ecore.h"
6#include "ecore_private.h"
7#include "Ecore_Input.h"
8#include "Ecore_Input_Evas.h"
9
10#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
11#include <Ecore_Cocoa.h>
12#include <Evas_Engine_Gl_Cocoa.h>
13#endif
14
15#include "ecore_evas_private.h"
16#include "Ecore_Evas.h"
17
18
19#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
20
21// FIXME: this engine has lots of problems. only 1 window at a time, drawRect looks wrong, doesnt handle resizes and more
22
23static int _ecore_evas_init_count = 0;
24static Ecore_Evas *ecore_evases = NULL;
25static Ecore_Event_Handler *ecore_evas_event_handlers[4] = {
26 NULL, NULL, NULL, NULL
27};
28static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
29static Ecore_Poller *ecore_evas_event = NULL;
30
31static const char *ecore_evas_cocoa_default = "EFL Cocoa";
32
33
34static int
35_ecore_evas_cocoa_render(Ecore_Evas *ee)
36{
37 int rend = 0;
38 Eina_List *updates = NULL;
39 Eina_List *ll;
40 Ecore_Evas *ee2;
41
42 DBG("Render");
43
44 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
45 {
46 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
47 if (ee2->engine.func->fn_render)
48 rend |= ee2->engine.func->fn_render(ee2);
49 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
50 }
51
52 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
53 updates = evas_render_updates(ee->evas);
54 if (ee->prop.avoid_damage)
55 {
56 updates = evas_render_updates(ee->evas);
57 if (updates) evas_render_updates_free(updates);
58 }
59 else if ((ee->visible) ||
60 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
61 ((ee->should_be_visible) && (ee->prop.override)))
62 {
63 if (ee->shaped)
64 {
65 updates = evas_render_updates(ee->evas);
66 if (updates) evas_render_updates_free(updates);
67 }
68 else
69 {
70 updates = evas_render_updates(ee->evas);
71 if (updates) evas_render_updates_free(updates);
72 }
73 }
74 else
75 evas_norender(ee->evas);
76 if (updates) rend = 1;
77 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
78
79 if (rend)
80 {
81 static int frames = 0;
82 static double t0 = 0.0;
83 double t, td;
84
85 t = ecore_time_get();
86 frames++;
87 if ((t - t0) > 1.0)
88 {
89 td = t - t0;
90 printf("FPS: %3.3f\n", (double)frames / td);
91 frames = 0;
92 t0 = t;
93 }
94 }
95
96 return rend;
97}
98
99
100static Ecore_Evas *
101_ecore_evas_cocoa_match(void)
102{
103 DBG("Match");
104 return ecore_evases;
105}
106
107static int
108_ecore_evas_cocoa_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
109{
110 Ecore_Evas *ee;
111
112 DBG("Got Focus");
113
114 ee = _ecore_evas_cocoa_match();
115
116 if (!ee) return ECORE_CALLBACK_PASS_ON;
117 ee->prop.focused = 1;
118 evas_focus_in(ee->evas);
119 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
120
121 return ECORE_CALLBACK_PASS_ON;
122}
123
124static int
125_ecore_evas_cocoa_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
126{
127 Ecore_Evas *ee;
128
129 DBG("Lost Focus");
130
131 ee = _ecore_evas_cocoa_match();
132
133 if (!ee) return ECORE_CALLBACK_PASS_ON;
134 evas_focus_out(ee->evas);
135 ee->prop.focused = 0;
136 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
137
138 return ECORE_CALLBACK_PASS_ON;
139}
140
141static int
142_ecore_evas_cocoa_event_video_resize(void *data __UNUSED__, int type __UNUSED__, void *event)
143{
144 /*Ecore_Cocoa_Event_Video_Resize *e;
145 Ecore_Evas *ee;
146
147 e = event;
148 ee = _ecore_evas_cocoa_match();
149
150 if (!ee) return 1; // pass on event
151 evas_output_size_set(ee->evas, e->w, e->h);
152
153 return 0;*/
154
155 DBG("Video Resize");
156 return ECORE_CALLBACK_PASS_ON;
157}
158
159static int
160_ecore_evas_cocoa_event_video_expose(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
161{
162 Ecore_Evas *ee;
163 int w;
164 int h;
165
166 DBG("Video Expose");
167
168 ee = _ecore_evas_cocoa_match();
169
170 if (!ee) return ECORE_CALLBACK_PASS_ON;
171 evas_output_size_get(ee->evas, &w, &h);
172 evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
173
174 return ECORE_CALLBACK_PASS_ON;
175}
176
177static int
178_ecore_evas_idle_enter(void *data __UNUSED__)
179{
180 Ecore_Evas *ee;
181 double t1 = 0.;
182 double t2 = 0.;
183
184 DBG("Idle enter");
185
186 EINA_INLIST_FOREACH(ecore_evases, ee)
187 {
188 if (ee->visible)
189 evas_render(ee->evas);
190 else
191 evas_norender(ee->evas);
192 }
193
194 return EINA_TRUE;
195}
196
197static int
198_ecore_evas_cocoa_event(void *data)
199{
200 // ecore_cocoa_feed_events();
201
202 DBG("Cocoa Event");
203
204 return 1;
205}
206
207static int
208_ecore_evas_cocoa_init(void)
209{
210 DBG("Cocoa Init");
211 _ecore_evas_init_count++;
212 if (_ecore_evas_init_count > 1)
213 return _ecore_evas_init_count;
214
215 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_COCOA_EVENT_GOT_FOCUS, _ecore_evas_cocoa_event_got_focus, NULL);
216 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_COCOA_EVENT_LOST_FOCUS, _ecore_evas_cocoa_event_lost_focus, NULL);
217 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_COCOA_EVENT_RESIZE, _ecore_evas_cocoa_event_video_resize, NULL);
218 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_COCOA_EVENT_EXPOSE, _ecore_evas_cocoa_event_video_expose, NULL);
219
220 ecore_event_evas_init();
221 return _ecore_evas_init_count;
222}
223
224static int
225_ecore_evas_cocoa_shutdown(void)
226{
227 DBG("Cocoa SHutodwn");
228 _ecore_evas_init_count--;
229 if (_ecore_evas_init_count == 0)
230 {
231 int i;
232
233 while (ecore_evases) _ecore_evas_free(ecore_evases);
234
235 for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++)
236 ecore_event_handler_del(ecore_evas_event_handlers[i]);
237 ecore_event_evas_shutdown();
238 ecore_idle_enterer_del(ecore_evas_idle_enterer);
239 ecore_evas_idle_enterer = NULL;
240 ecore_poller_del(ecore_evas_event);
241 ecore_evas_event = NULL;
242
243 ecore_event_evas_shutdown();
244 }
245 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
246 return _ecore_evas_init_count;
247}
248
249static void
250_ecore_evas_cocoa_free(Ecore_Evas *ee)
251{
252 DBG("Cocoa Free");
253 ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
254 ecore_event_window_unregister(0);
255 _ecore_evas_cocoa_shutdown();
256 ecore_cocoa_shutdown();
257}
258
259static void
260_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
261{
262 DBG("Resize");
263 if ((w == ee->w) && (h == ee->h)) return;
264 ee->w = w;
265 ee->h = h;
266
267 printf("Ecore_Evas Resize %d %d\n", w, h);
268
269 ecore_cocoa_window_resize(ee->prop.window, w, h);
270
271 evas_output_size_set(ee->evas, ee->w, ee->h);
272 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
273 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
274
275 if (ee->func.fn_resize) ee->func.fn_resize(ee);
276}
277
278static void
279_ecore_evas_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
280{
281 DBG("Move Resize");
282 if ((w == ee->w) && (h == ee->h)) return;
283 ee->w = w;
284 ee->h = h;
285
286 ecore_cocoa_window_move_resize(ee->prop.window, x, y, w, h);
287
288 evas_output_size_set(ee->evas, ee->w, ee->h);
289 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
290 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
291
292 if (ee->func.fn_resize) ee->func.fn_resize(ee);
293}
294
295
296static void
297_ecore_evas_show(Ecore_Evas *ee, int x, int y, int w, int h)
298{
299 DBG("Show");
300 ee->should_be_visible = 1;
301 if (ee->prop.avoid_damage)
302 _ecore_evas_cocoa_render(ee);
303
304 ecore_cocoa_window_show(ee->prop.window);
305 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
306}
307
308
309static void
310_ecore_evas_hide(Ecore_Evas *ee, int x, int y, int w, int h)
311{
312 DBG("Hide");
313
314 ecore_cocoa_window_hide(ee->prop.window);
315 ee->should_be_visible = 0;
316}
317
318static void
319_ecore_evas_title_set(Ecore_Evas *ee, const char *title)
320{
321 INF("ecore evas title set");
322
323 if (ee->prop.title) free(ee->prop.title);
324 ee->prop.title = NULL;
325 if (title) ee->prop.title = strdup(title);
326 ecore_cocoa_window_title_set(ee->prop.window,
327 ee->prop.title);
328}
329
330static void
331_ecore_evas_object_cursor_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
332{
333 Ecore_Evas *ee;
334
335 DBG("Cursor DEL");
336
337 ee = data;
338 if (ee)
339 ee->prop.cursor.object = NULL;
340}
341
342static void
343_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
344{
345 int x, y;
346 DBG("Cursor Set");
347 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
348
349 if (obj == NULL)
350 {
351 ee->prop.cursor.object = NULL;
352 ee->prop.cursor.layer = 0;
353 ee->prop.cursor.hot.x = 0;
354 ee->prop.cursor.hot.y = 0;
355 return;
356 }
357
358 ee->prop.cursor.object = obj;
359 ee->prop.cursor.layer = layer;
360 ee->prop.cursor.hot.x = hot_x;
361 ee->prop.cursor.hot.y = hot_y;
362
363 evas_pointer_output_xy_get(ee->evas, &x, &y);
364 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
365 evas_object_move(ee->prop.cursor.object,
366 x - ee->prop.cursor.hot.x,
367 y - ee->prop.cursor.hot.y);
368
369 evas_object_pass_events_set(ee->prop.cursor.object, 1);
370
371 if (evas_pointer_inside_get(ee->evas))
372 evas_object_show(ee->prop.cursor.object);
373
374 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
375}
376
377static int
378_ecore_evas_engine_cocoa_init(Ecore_Evas *ee)
379{
380 Evas_Engine_Info_GL_Cocoa *einfo;
381 const char *driver;
382 int rmethod;
383
384 DBG("Cocoa Init");
385
386 driver = "gl_cocoa";
387
388 rmethod = evas_render_method_lookup(driver);
389 if (!rmethod)
390 return 0;
391
392 ee->driver = driver;
393 evas_output_method_set(ee->evas, rmethod);
394
395 einfo = (Evas_Engine_Info_GL_Cocoa *)evas_engine_info_get(ee->evas);
396 if (einfo)
397 {
398 /* FIXME: REDRAW_DEBUG missing for now */
399 einfo->window = ee->prop.window;
400 //einfo->info.depth = ecore_win32_screen_depth_get();
401 //einfo->info.rotation = 0;
402 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
403 {
404 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
405 return 0;
406 }
407 ecore_cocoa_window_view_set(einfo->window, einfo->view);
408 }
409 else
410 {
411 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
412 return 0;
413 }
414
415 return 1;
416}
417
418static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
419 {
420 _ecore_evas_cocoa_free,
421 NULL,
422 NULL,
423 NULL,
424 NULL,
425 NULL,
426 NULL,
427 NULL,
428 NULL,
429 NULL,
430 NULL,
431 NULL,
432 NULL,
433 NULL,
434 NULL,
435 NULL, //move
436 NULL,
437 _ecore_evas_resize,
438 _ecore_evas_move_resize,
439 NULL, //rotation
440 NULL, //shaped
441 _ecore_evas_show,
442 _ecore_evas_hide,
443 NULL, //raise
444 NULL, //lower
445 NULL, //activate
446 _ecore_evas_title_set,
447 NULL,
448 NULL,
449 NULL,
450 NULL,
451 NULL,
452 _ecore_evas_object_cursor_set,
453 NULL,
454 NULL,
455 NULL,
456 NULL,
457 NULL,
458 NULL,
459 NULL,
460 NULL,
461 NULL,
462 NULL,
463 NULL,
464 NULL,
465 NULL, //transparent
466 NULL, // render
467 NULL
468 };
469#endif
470
471EAPI Ecore_Evas *
472ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
473{
474#ifdef BUILD_ECORE_EVAS_OPENGL_COCOA
475 Evas_Engine_Info_GL_Cocoa *einfo;
476 Ecore_Evas *ee;
477 int rmethod;
478
479 DBG("Cocoa new");
480
481 if (!ecore_cocoa_init())
482 return NULL;
483
484 ee = calloc(1, sizeof(Ecore_Evas));
485 if (!ee)
486 goto shutdown_ecore_cocoa;
487
488 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
489
490 _ecore_evas_cocoa_init();
491
492 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_cocoa_engine_func;
493
494 if (w < 1) w = 1;
495 if (h < 1) h = 1;
496 ee->visible = 1;
497 ee->x = x;
498 ee->y = y;
499 ee->w = w;
500 ee->h = h;
501 ee->req.x = ee->x;
502 ee->req.y = ee->y;
503 ee->req.w = ee->w;
504 ee->req.h = ee->h;
505
506 ee->semi_sync = 1;
507
508
509 ee->prop.max.w = 32767;
510 ee->prop.max.h = 32767;
511 ee->prop.layer = 4;
512 ee->prop.request_pos = 0;
513 ee->prop.sticky = 0;
514 ee->prop.window = 0;
515
516 printf("Create New Evas\n");
517
518 ee->evas = evas_new();
519
520 if (!ee->evas)
521 goto free_name;
522
523 evas_data_attach_set(ee->evas, ee);
524 evas_output_method_set(ee->evas, rmethod);
525 evas_output_size_set(ee->evas, w, h);
526 evas_output_viewport_set(ee->evas, 0, 0, w, h);
527
528 printf("Create New Cocoa Window\n");
529 ee->prop.window = (Ecore_Cocoa_Window*)ecore_cocoa_window_new(x, y, w, h);
530 printf("Window Created %p\n", ee->prop.window);
531 if (!ee->prop.window)
532 {
533 _ecore_evas_cocoa_shutdown();
534 free(ee);
535 return NULL;
536 }
537
538 printf("Init Evas engine cocoa\n");
539 if (!_ecore_evas_engine_cocoa_init(ee))
540 {
541 _ecore_evas_cocoa_shutdown();
542 free(ee);
543 return NULL;
544 }
545
546
547 ee->engine.func->fn_render = _ecore_evas_cocoa_render;
548 _ecore_evas_register(ee);
549 ecore_event_window_register(0, ee, ee->evas, NULL, NULL, NULL, NULL);
550
551 evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
552 printf("Ecore Evas returned : %p\n", ee);
553 return ee;
554
555 free_window:
556 /* FIXME: free window here */
557 free_evas:
558 free(ee->evas);
559 free_name:
560 free(ee->name);
561 free_ee:
562 _ecore_evas_cocoa_shutdown();
563 free(ee);
564 shutdown_ecore_cocoa:
565 ecore_cocoa_shutdown();
566
567 return NULL;
568#else
569 ERR("Cocoa support in ecore-evas not enabled");
570 return NULL;
571 parent = NULL;
572 x = y = w = h = 0;
573#endif
574}
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_directfb.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_directfb.c
new file mode 100644
index 0000000..457f9e9
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_directfb.c
@@ -0,0 +1,596 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6
7#include <Ecore.h>
8#include "ecore_private.h"
9#ifdef BUILD_ECORE_EVAS_DIRECTFB
10#include <Ecore_DirectFB.h>
11#endif
12
13#include "ecore_evas_private.h"
14#include "Ecore_Evas.h"
15
16#ifdef BUILD_ECORE_EVAS_DIRECTFB
17static int _ecore_evas_init_count = 0;
18static Ecore_Event_Handler *ecore_evas_event_handlers[13];
19
20static Eina_Hash *ecore_evases_hash = NULL;
21
22static int
23_ecore_evas_directfb_render(Ecore_Evas *ee)
24{
25 Eina_List *updates, *ll;
26 Ecore_Evas *ee2;
27 int rend = 0;
28
29 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
30 {
31 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
32 if (ee2->engine.func->fn_render)
33 rend |= ee2->engine.func->fn_render(ee2);
34 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
35 }
36
37 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
38 updates = evas_render_updates(ee->evas);
39 if (updates)
40 {
41 evas_render_updates_free(updates);
42 _ecore_evas_idle_timeout_update(ee);
43 }
44 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
45
46 return updates ? 1 : rend;
47}
48
49static char *
50_ecore_evas_directfb_winid_str_get(Ecore_X_Window win)
51{
52 const char *vals = "qWeRtYuIoP5$&<~";
53 static char id[9];
54 unsigned int val;
55 val = (unsigned int)win;
56 id[0] = vals[(val >> 28) & 0xf];
57 id[1] = vals[(val >> 24) & 0xf];
58 id[2] = vals[(val >> 20) & 0xf];
59 id[3] = vals[(val >> 16) & 0xf];
60 id[4] = vals[(val >> 12) & 0xf];
61 id[5] = vals[(val >> 8) & 0xf];
62 id[6] = vals[(val >> 4) & 0xf];
63 id[7] = vals[(val ) & 0xf];
64 id[8] = 0;
65 return id;
66}
67
68static Ecore_Evas *
69_ecore_evas_directfb_match(DFBWindowID win)
70{
71 Ecore_Evas *ee;
72
73 ee = eina_hash_find(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(win));
74 return ee;
75}
76
77static Eina_Bool
78_ecore_evas_directfb_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
79{
80 Ecore_Evas *ee;
81 Ecore_DirectFB_Event_Key_Down *e;
82
83 e = event;
84 ee = _ecore_evas_directfb_match(e->win);
85
86 if (!ee) return EINA_TRUE; /* pass on event */
87 evas_event_feed_key_down(ee->evas, e->name, e->name, e->string,
88 e->key_compose, e->time, NULL);
89 return EINA_TRUE;
90}
91
92static Eina_Bool
93_ecore_evas_directfb_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
94{
95 Ecore_Evas *ee;
96 Ecore_DirectFB_Event_Key_Up *e;
97
98 e = event;
99 ee = _ecore_evas_directfb_match(e->win);
100
101 if (!ee) return EINA_TRUE; /* pass on event */
102 evas_event_feed_key_up(ee->evas, e->name, e->name, e->string,
103 e->key_compose, e->time, NULL);
104 return EINA_TRUE;
105}
106
107static Eina_Bool
108_ecore_evas_directfb_event_motion(void *data __UNUSED__, int type __UNUSED__, void *event)
109{
110 Ecore_Evas *ee;
111 Ecore_DirectFB_Event_Motion *e;
112
113 e = event;
114 ee = _ecore_evas_directfb_match(e->win);
115
116 if (!ee) return EINA_TRUE; /* pass on event */
117 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
118 return EINA_TRUE;
119}
120
121static Eina_Bool
122_ecore_evas_directfb_event_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
123{
124 Ecore_Evas *ee;
125 Ecore_DirectFB_Event_Button_Down *e;
126
127 e = event;
128 ee = _ecore_evas_directfb_match(e->win);
129
130 if (!ee) return EINA_TRUE; /* pass on event */
131 // _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
132 evas_event_feed_mouse_down(ee->evas, e->button, EVAS_BUTTON_NONE, e->time, NULL);
133 return EINA_TRUE;
134}
135
136static Eina_Bool
137_ecore_evas_directfb_event_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
138{
139 Ecore_Evas *ee;
140 Ecore_DirectFB_Event_Button_Up *e;
141 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
142
143 e = event;
144 ee = _ecore_evas_directfb_match(e->win);
145
146 if (!ee) return EINA_TRUE; /* pass on event */
147 //_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
148 evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
149 return EINA_TRUE;
150}
151
152static Eina_Bool
153_ecore_evas_directfb_event_enter(void *data __UNUSED__, int type __UNUSED__, void *event)
154{
155 Ecore_Evas *ee;
156 Ecore_DirectFB_Event_Enter *e;
157
158 e = event;
159 ee = _ecore_evas_directfb_match(e->win);
160
161 if (!ee) return EINA_TRUE; /* pass on event */
162 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
163 //_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
164 return EINA_TRUE;
165}
166
167static Eina_Bool
168_ecore_evas_directfb_event_leave(void *data __UNUSED__, int type __UNUSED__, void *event)
169{
170 Ecore_Evas *ee;
171 Ecore_DirectFB_Event_Leave *e;
172
173 e = event;
174 ee = _ecore_evas_directfb_match(e->win);
175
176 if (!ee) return EINA_TRUE; /* pass on event */
177 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
178 //_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
179 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
180 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
181 return EINA_TRUE;
182}
183
184static Eina_Bool
185_ecore_evas_directfb_event_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
186{
187 Ecore_Evas *ee;
188 Ecore_DirectFB_Event_Wheel *e;
189
190 e = event;
191 ee = _ecore_evas_directfb_match(e->win);
192
193 if (!ee) return EINA_TRUE; /* pass on event */
194 evas_event_feed_mouse_wheel(ee->evas, e->direction, e->z, e->time, NULL);
195 return EINA_TRUE;
196}
197
198static Eina_Bool
199_ecore_evas_directfb_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
200{
201 Ecore_Evas *ee;
202 Ecore_DirectFB_Event_Got_Focus *e;
203
204 e = event;
205 ee = _ecore_evas_directfb_match(e->win);
206
207 if (!ee) return EINA_TRUE; /* pass on event */
208 ee->prop.focused = 1;
209 return EINA_TRUE;
210}
211
212static Eina_Bool
213_ecore_evas_directfb_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event)
214{
215 Ecore_Evas *ee;
216 Ecore_DirectFB_Event_Lost_Focus *e;
217
218 e = event;
219 ee = _ecore_evas_directfb_match(e->win);
220
221 if (!ee) return EINA_TRUE; /* pass on event */
222 ee->prop.focused = 0;
223 return EINA_TRUE;
224}
225
226int
227_ecore_evas_directfb_shutdown(void)
228{
229 _ecore_evas_init_count--;
230 if (_ecore_evas_init_count == 0)
231 {
232 int i;
233
234 for (i = 0; i < 8; i++)
235 ecore_event_handler_del(ecore_evas_event_handlers[i]);
236 }
237 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
238 return _ecore_evas_init_count;
239}
240
241
242
243
244
245int
246_ecore_evas_directfb_init(void)
247{
248 _ecore_evas_init_count++;
249 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
250
251 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_DOWN, _ecore_evas_directfb_event_key_down, NULL);
252 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_KEY_UP, _ecore_evas_directfb_event_key_up, NULL);
253 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_BUTTON_DOWN, _ecore_evas_directfb_event_button_down, NULL);
254 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_BUTTON_UP, _ecore_evas_directfb_event_button_up, NULL);
255 ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_MOTION, _ecore_evas_directfb_event_motion, NULL);
256 ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_ENTER, _ecore_evas_directfb_event_enter, NULL);
257 ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_LEAVE, _ecore_evas_directfb_event_leave, NULL);
258 ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_WHEEL, _ecore_evas_directfb_event_wheel, NULL);
259 ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_GOT_FOCUS, _ecore_evas_directfb_event_got_focus, NULL);
260 ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_DIRECTFB_EVENT_LOST_FOCUS, _ecore_evas_directfb_event_lost_focus, NULL);
261 ecore_evas_event_handlers[10] = NULL;
262 ecore_evas_event_handlers[11] = NULL;
263 ecore_evas_event_handlers[12] = NULL;
264
265 return _ecore_evas_init_count;
266}
267
268/* engine functions */
269/********************/
270
271static void
272_ecore_evas_directfb_free(Ecore_Evas *ee)
273{
274 eina_hash_del(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
275 ecore_directfb_window_free(ee->engine.directfb.window);
276 _ecore_evas_directfb_shutdown();
277 ecore_directfb_shutdown();
278}
279
280static void
281_ecore_evas_directfb_move(Ecore_Evas *ee, int x, int y)
282{
283 ecore_directfb_window_move(ee->engine.directfb.window, x, y);
284}
285
286static void
287_ecore_evas_directfb_resize(Ecore_Evas *ee, int w, int h)
288{
289 ee->req.w = w;
290 ee->req.h = h;
291 if ((w == ee->w) && (h == ee->h)) return;
292 ecore_directfb_window_resize(ee->engine.directfb.window, w, h);
293 ee->w = w;
294 ee->h = h;
295 if ((ee->rotation == 90) || (ee->rotation == 270))
296 {
297 evas_output_size_set(ee->evas, ee->h, ee->w);
298 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
299 }
300 else
301 {
302 evas_output_size_set(ee->evas, ee->w, ee->h);
303 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
304 }
305}
306
307static void
308_ecore_evas_directfb_focus_set(Ecore_Evas *ee, int on __UNUSED__)
309{
310 ecore_directfb_window_focus(ee->engine.directfb.window);
311}
312
313static void
314_ecore_evas_directfb_hide(Ecore_Evas *ee)
315{
316 ecore_directfb_window_hide(ee->engine.directfb.window);
317 ee->should_be_visible = 0;
318}
319
320static void
321_ecore_evas_directfb_show(Ecore_Evas *ee)
322{
323 ecore_directfb_window_show(ee->engine.directfb.window);
324 ee->should_be_visible = 1;
325}
326
327static void
328_ecore_evas_directfb_shaped_set(Ecore_Evas *ee, int shaped)
329{
330 if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
331 return;
332 ee->shaped = shaped;
333 if(ee->shaped)
334 ecore_directfb_window_shaped_set(ee->engine.directfb.window, 1);
335 else
336 ecore_directfb_window_shaped_set(ee->engine.directfb.window, 0);
337
338}
339
340static void
341_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
342{
343 Ecore_Evas *ee;
344
345 ee = data;
346 if (ee)
347 ee->prop.cursor.object = NULL;
348}
349
350static void
351_ecore_evas_directfb_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
352{
353 int x, y;
354
355 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
356
357 if (!obj)
358 {
359 ee->prop.cursor.object = NULL;
360 ee->prop.cursor.layer = 0;
361 ee->prop.cursor.hot.x = 0;
362 ee->prop.cursor.hot.y = 0;
363 ecore_directfb_window_cursor_show(ee->engine.directfb.window, 1);
364 return;
365
366 }
367
368 ee->prop.cursor.object = obj;
369 ee->prop.cursor.layer = layer;
370 ee->prop.cursor.hot.x = hot_x;
371 ee->prop.cursor.hot.y = hot_y;
372
373 ecore_directfb_window_cursor_show(ee->engine.directfb.window, 0);
374
375 evas_pointer_output_xy_get(ee->evas, &x, &y);
376 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
377 evas_object_move(ee->prop.cursor.object,x - ee->prop.cursor.hot.x,y - ee->prop.cursor.hot.y);
378 evas_object_pass_events_set(ee->prop.cursor.object, 1);
379 if (evas_pointer_inside_get(ee->evas))
380 evas_object_show(ee->prop.cursor.object);
381
382 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
383}
384
385static void
386_ecore_evas_directfb_fullscreen_set(Ecore_Evas *ee, int on)
387{
388 Evas_Engine_Info_DirectFB *einfo;
389 int w;
390 int h;
391 int resized = 0;
392
393 if (((ee->prop.fullscreen) && (on)) || ((!ee->prop.fullscreen) && (!on)))
394 return;
395
396 if (on)
397 ecore_directfb_window_fullscreen_set(ee->engine.directfb.window, 1);
398 else
399 ecore_directfb_window_fullscreen_set(ee->engine.directfb.window, 0);
400 /* set the new size of the evas */
401 ecore_directfb_window_size_get(ee->engine.directfb.window, &w, &h);
402 if( (ee->w != w) || (ee->h != h))
403 {
404 resized = 1;
405 ee->w = w;
406 ee->h = h;
407 ee->req.w = ee->w;
408 ee->req.h = ee->h;
409 if ((ee->rotation == 90) || (ee->rotation == 270))
410 {
411 evas_output_size_set(ee->evas, ee->h, ee->w);
412 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
413 }
414 else
415 {
416 evas_output_size_set(ee->evas, ee->w, ee->h);
417 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
418 }
419 }
420 einfo = (Evas_Engine_Info_DirectFB *)evas_engine_info_get(ee->evas);
421 if (einfo)
422 {
423 einfo->info.surface = ee->engine.directfb.window->surface;
424 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
425 {
426 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
427 }
428 }
429 ee->prop.fullscreen = on;
430 if (resized)
431 {
432 if(ee->func.fn_resize) ee->func.fn_resize(ee);
433 }
434}
435
436static void *
437_ecore_evas_directfb_window_get(const Ecore_Evas *ee)
438{
439 return ee->engine.directfb.window;
440}
441#endif
442
443#ifdef BUILD_ECORE_EVAS_DIRECTFB
444static Ecore_Evas_Engine_Func _ecore_directfb_engine_func =
445{
446 _ecore_evas_directfb_free, /* free an ecore_evas */
447 NULL, /* cb resize */
448 NULL, /* cb move */
449 NULL, /* cb show */
450 NULL, /* cb hide */
451 NULL, /* cb delete request */
452 NULL, /* cb destroy */
453 NULL, /* cb focus in */
454 NULL, /* cb focus out */
455 NULL, /* cb sticky */
456 NULL, /* cb unsticky */
457 NULL, /* cb mouse in */
458 NULL, /* cb mouse out */
459 NULL, /* cb pre render */
460 NULL, /* cb post render */
461 _ecore_evas_directfb_move, /* move */
462 NULL, /* managed move */
463 _ecore_evas_directfb_resize, /* resize */
464 NULL, /* move resize */
465 NULL,//_ecore_evas_directfb_rotation_set,/* rotation */
466 _ecore_evas_directfb_shaped_set, /* shaped */
467 _ecore_evas_directfb_show, /* show */
468 _ecore_evas_directfb_hide, /* hide */
469 NULL, /* raise */
470 NULL, /* lower */
471 NULL, /* activate */
472 NULL, /* title set */
473 NULL, /* name class set */
474 NULL, /* size min */
475 NULL, /* size max */
476 NULL, /* size base */
477 NULL, /* size step */
478 _ecore_evas_directfb_object_cursor_set, /* set cursor to an evas object */
479 NULL, /* layer set */
480 _ecore_evas_directfb_focus_set, /* focus */
481 NULL, /* iconified */
482 NULL, /* borderless */
483 NULL, /* override */
484 NULL, /* maximized */
485 _ecore_evas_directfb_fullscreen_set,/* fullscreen */
486 NULL, /* avoid damage */
487 NULL, /* withdrawn */
488 NULL, /* sticky */
489 NULL, /* ignore events */
490 NULL, /* alpha */
491 NULL, //transparent
492
493 NULL, // render
494 NULL // screen_geometry_get
495};
496#endif
497
498/* api */
499/*******/
500
501#ifdef BUILD_ECORE_EVAS_DIRECTFB
502EAPI Ecore_Evas *
503ecore_evas_directfb_new(const char *disp_name, int windowed, int x, int y, int w, int h)
504{
505 Evas_Engine_Info_DirectFB *einfo;
506 Ecore_Evas *ee;
507 Ecore_DirectFB_Window *window;
508 int rmethod;
509
510 rmethod = evas_render_method_lookup("directfb");
511 if (!rmethod) return NULL;
512 if (!ecore_directfb_init(disp_name)) return NULL;
513 ee = calloc(1, sizeof(Ecore_Evas));
514 if (!ee) return NULL;
515
516 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
517 _ecore_evas_directfb_init();
518 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_directfb_engine_func;
519
520 ee->driver = "directfb";
521 if (disp_name) ee->name = strdup(disp_name);
522
523 if (w < 1) w = 1;
524 if (h < 1) h = 1;
525
526 ee->rotation = 0;
527 ee->visible = 1;
528 ee->x = x;
529 ee->y = y;
530 ee->w = w;
531 ee->h = h;
532 ee->req.x = ee->x;
533 ee->req.y = ee->y;
534 ee->req.w = ee->w;
535 ee->req.h = ee->h;
536 ee->prop.layer = 1;
537 ee->prop.fullscreen = 0;
538
539 /* init evas here */
540 ee->evas = evas_new();
541 evas_data_attach_set(ee->evas, ee);
542 evas_output_method_set(ee->evas, rmethod);
543 evas_output_size_set(ee->evas, w, h);
544 evas_output_viewport_set(ee->evas, 0, 0, w, h);
545 einfo = (Evas_Engine_Info_DirectFB *)evas_engine_info_get(ee->evas);
546
547 window = ecore_directfb_window_new(x,y,w,h);
548 ee->engine.directfb.window = window;
549 if (einfo)
550 {
551 einfo->info.dfb = ecore_directfb_interface_get();
552 einfo->info.surface = window->surface;
553 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
554 {
555 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
556 ecore_evas_free(ee);
557 return NULL;
558 }
559 }
560 else
561 {
562 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
563 ecore_evas_free(ee);
564 return NULL;
565 }
566
567 ee->engine.func->fn_render = _ecore_evas_directfb_render;
568 _ecore_evas_register(ee);
569
570 if (!ecore_evases_hash)
571 ecore_evases_hash = eina_hash_string_superfast_new(NULL);
572 eina_hash_add(ecore_evases_hash, _ecore_evas_directfb_winid_str_get(ee->engine.directfb.window->id), ee);
573
574 return ee;
575}
576#else
577EAPI Ecore_Evas *
578ecore_evas_directfb_new(const char *disp_name __UNUSED__, int windowed __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
579{
580 return NULL;
581}
582#endif
583
584#ifdef BUILD_ECORE_EVAS_DIRECTFB
585EAPI Ecore_DirectFB_Window *
586ecore_evas_directfb_window_get(const Ecore_Evas *ee)
587{
588 return (Ecore_DirectFB_Window *) _ecore_evas_directfb_window_get(ee);
589}
590#else
591EAPI Ecore_DirectFB_Window *
592ecore_evas_directfb_window_get(const Ecore_Evas *ee __UNUSED__)
593{
594 return NULL;
595}
596#endif
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_ews.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_ews.c
new file mode 100644
index 0000000..e19fb05
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_ews.c
@@ -0,0 +1,1454 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <Ecore.h>
6#include "ecore_private.h"
7#include <Ecore_Input.h>
8
9#include "ecore_evas_private.h"
10#include "Ecore_Evas.h"
11
12EAPI int ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = 0;
13EAPI int ECORE_EVAS_EWS_EVENT_ADD = 0;
14EAPI int ECORE_EVAS_EWS_EVENT_DEL = 0;
15EAPI int ECORE_EVAS_EWS_EVENT_RESIZE = 0;
16EAPI int ECORE_EVAS_EWS_EVENT_MOVE = 0;
17EAPI int ECORE_EVAS_EWS_EVENT_SHOW = 0;
18EAPI int ECORE_EVAS_EWS_EVENT_HIDE = 0;
19EAPI int ECORE_EVAS_EWS_EVENT_FOCUS = 0;
20EAPI int ECORE_EVAS_EWS_EVENT_UNFOCUS = 0;
21EAPI int ECORE_EVAS_EWS_EVENT_RAISE = 0;
22EAPI int ECORE_EVAS_EWS_EVENT_LOWER = 0;
23EAPI int ECORE_EVAS_EWS_EVENT_ACTIVATE = 0;
24
25EAPI int ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = 0;
26EAPI int ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = 0;
27EAPI int ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = 0;
28EAPI int ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = 0;
29EAPI int ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = 0;
30
31#ifdef BUILD_ECORE_EVAS_EWS
32static int _ecore_evas_init_count = 0;
33
34static Ecore_Evas *_ews_ee = NULL;
35static Evas_Object *_ews_bg = NULL;
36static Eina_List *_ews_children = NULL;
37static const void *_ews_manager = NULL;
38static char *_ews_engine = NULL;
39static char *_ews_options = NULL;
40static int _ews_x = 0;
41static int _ews_y = 0;
42static int _ews_w = 1024;
43static int _ews_h = 768;
44static Eina_Bool _ews_defaults_engine = EINA_TRUE;
45static Eina_Bool _ews_defaults_geo = EINA_TRUE;
46
47static const char EWS_ENGINE_NAME[] = "ews";
48
49static void
50_ecore_evas_ews_pre_free(Ecore_Evas *ee __UNUSED__)
51{
52 DBG("EWS backing store free'd");
53 _ews_children = eina_list_free(_ews_children);
54 _ews_ee = NULL;
55 _ews_bg = NULL;
56}
57
58static void
59_ecore_evas_ews_del_request(Ecore_Evas *ee __UNUSED__)
60{
61 INF("EWS backing store deletion is forbidden!");
62}
63
64static Ecore_Evas *
65_ecore_evas_ews_ee_new(void)
66{
67 Ecore_Evas *ee = ecore_evas_new(_ews_engine, _ews_x, _ews_y, _ews_w, _ews_h,
68 _ews_options);
69 if (!ee)
70 ERR("Failed: ecore_evas_new(%s, %d, %d, %d, %d, %s)",
71 _ews_engine, _ews_x, _ews_y, _ews_w, _ews_h, _ews_options);
72 else
73 {
74 ecore_evas_size_min_set(ee, _ews_w, _ews_h);
75 ecore_evas_size_max_set(ee, _ews_w, _ews_h);
76 ecore_evas_callback_pre_free_set(ee, _ecore_evas_ews_pre_free);
77 ecore_evas_callback_delete_request_set(ee, _ecore_evas_ews_del_request);
78 ecore_evas_name_class_set(ee, "ecore_evas_ews", "ews");
79 ecore_evas_title_set
80 (ee, "EWS: Ecore + Evas Single Process Windowing System");
81 ecore_evas_show(ee);
82 }
83
84 return ee;
85}
86
87static void
88_ecore_evas_ews_env_setup(void)
89{
90 const char *env = getenv("ECORE_EVAS_EWS");
91 char *p, *n, *tmp;
92
93 if (_ews_defaults_engine)
94 {
95 free(_ews_engine);
96 _ews_engine = NULL;
97 free(_ews_options);
98 _ews_options = NULL;
99 }
100 if (_ews_defaults_geo)
101 {
102 _ews_x = 0;
103 _ews_y = 0;
104 _ews_w = 1024;
105 _ews_h = 768;
106 }
107
108 if ((!env) || (!*env)) return;
109
110 p = tmp = strdup(env);
111 if (!tmp) return;
112
113 n = strchr(p, ':');
114 if (n) *n = '\0';
115 if (_ews_defaults_engine) _ews_engine = strdup(p);
116 if (!n) goto end;
117
118 p = n + 1;
119 n = strchr(p, ':');
120 if (!n) goto end;
121 *n = '\0';
122 if (_ews_defaults_geo) _ews_x = atoi(p);
123
124 p = n + 1;
125 n = strchr(p, ':');
126 if (!n) goto end;
127 *n = '\0';
128 if (_ews_defaults_geo) _ews_y = atoi(p);
129
130 p = n + 1;
131 n = strchr(p, ':');
132 if (!n) goto end;
133 *n = '\0';
134 if (_ews_defaults_geo) _ews_w = atoi(p);
135
136 p = n + 1;
137 n = strchr(p, ':');
138 if (n) *n = '\0';
139 if (_ews_defaults_geo) _ews_h = atoi(p);
140 if (!n) goto end;
141
142 p = n + 1;
143 if (_ews_defaults_engine) _ews_options = strdup(p);
144
145 end:
146 free(tmp);
147}
148
149static void
150_ecore_evas_ews_event_free(void *data __UNUSED__, void *ev)
151{
152 Ecore_Evas *ee = ev;
153 _ecore_evas_unref(ee);
154}
155
156static void
157_ecore_evas_ews_event(Ecore_Evas *ee, int event)
158{
159 _ecore_evas_ref(ee);
160 ecore_event_add(event, ee, _ecore_evas_ews_event_free, NULL);
161}
162
163static void
164_ecore_evas_ews_event_free_del(void *data __UNUSED__, void *ev __UNUSED__)
165{
166 _ecore_evas_ews_shutdown();
167}
168
169static void
170_ecore_evas_ews_free(Ecore_Evas *ee)
171{
172 evas_object_del(ee->engine.ews.image);
173 _ews_ee->sub_ecore_evas = eina_list_remove(_ews_ee->sub_ecore_evas, ee);
174
175 ecore_event_add(ECORE_EVAS_EWS_EVENT_DEL, ee, _ecore_evas_ews_event_free_del, NULL);
176}
177
178static void
179_ecore_evas_ews_move(Ecore_Evas *ee, int x, int y)
180{
181 ee->req.x = x;
182 ee->req.y = y;
183
184 if ((x == ee->x) && (y == ee->y)) return;
185 ee->x = x;
186 ee->y = y;
187 evas_object_move(ee->engine.ews.image, x, y);
188 if (ee->func.fn_move) ee->func.fn_move(ee);
189
190 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MOVE);
191}
192
193static void
194_ecore_evas_ews_managed_move(Ecore_Evas *ee, int x, int y)
195{
196 ee->req.x = x;
197 ee->req.y = y;
198
199 if ((x == ee->x) && (y == ee->y)) return;
200 ee->x = x;
201 ee->y = y;
202 if (ee->func.fn_move) ee->func.fn_move(ee);
203 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MOVE);
204}
205
206static void
207_ecore_evas_ews_resize_internal(Ecore_Evas *ee, int w, int h)
208{
209 Evas_Engine_Info_Buffer *einfo;
210 void *pixels;
211 int stride;
212
213 evas_output_size_set(ee->evas, w, h);
214 evas_output_viewport_set(ee->evas, 0, 0, w, h);
215 evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
216
217 evas_object_image_size_set(ee->engine.ews.image, w, h);
218 evas_object_image_fill_set(ee->engine.ews.image, 0, 0, w, h);
219 evas_object_resize(ee->engine.ews.image, w, h);
220
221 pixels = evas_object_image_data_get(ee->engine.ews.image, 1);
222 evas_object_image_data_set(ee->engine.ews.image, pixels); // refcount
223 stride = evas_object_image_stride_get(ee->engine.ews.image);
224
225 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
226 EINA_SAFETY_ON_NULL_RETURN(einfo);
227
228 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
229 einfo->info.dest_buffer = pixels;
230 einfo->info.dest_buffer_row_bytes = stride;
231 einfo->info.use_color_key = 0;
232 einfo->info.alpha_threshold = 0;
233 einfo->info.func.new_update_region = NULL;
234 einfo->info.func.free_update_region = NULL;
235 evas_object_image_data_set(ee->engine.ews.image, pixels);
236 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
237 {
238 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
239 }
240}
241
242static void
243_ecore_evas_ews_resize(Ecore_Evas *ee, int w, int h)
244{
245 if (w < 1) w = 1;
246 if (h < 1) h = 1;
247
248 ee->req.w = w;
249 ee->req.h = h;
250
251 if ((w == ee->w) && (h == ee->h)) return;
252 ee->w = w;
253 ee->h = h;
254 _ecore_evas_ews_resize_internal(ee, w, h);
255 if (ee->func.fn_resize) ee->func.fn_resize(ee);
256 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_RESIZE);
257}
258
259static void
260_ecore_evas_ews_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
261{
262 _ecore_evas_ews_move(ee, x, y);
263 _ecore_evas_ews_resize(ee, w, h);
264}
265
266static void
267_ecore_evas_ews_rotation_set(Ecore_Evas *ee, int rot, int resize)
268{
269 if (ee->rotation == rot) return;
270 ee->rotation = rot;
271
272 ERR("TODO: rot=%d, resize=%d", rot, resize);
273
274 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
275}
276
277static void
278_ecore_evas_ews_shaped_set(Ecore_Evas *ee, int val)
279{
280 if (ee->shaped == val) return;
281 ee->shaped = val;
282 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
283}
284
285static void
286_ecore_evas_ews_show(Ecore_Evas *ee)
287{
288 ee->should_be_visible = EINA_TRUE;
289 evas_object_show(ee->engine.ews.image);
290 if (ee->prop.fullscreen)
291 evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
292
293 if (ee->func.fn_show) ee->func.fn_show(ee);
294 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_SHOW);
295}
296
297static void
298_ecore_evas_ews_hide(Ecore_Evas *ee)
299{
300 ee->should_be_visible = EINA_FALSE;
301 evas_object_hide(ee->engine.ews.image);
302
303 if (ee->func.fn_hide) ee->func.fn_hide(ee);
304 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_HIDE);
305}
306
307static void
308_ecore_evas_ews_raise(Ecore_Evas *ee)
309{
310 evas_object_raise(ee->engine.ews.image);
311 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_RAISE);
312}
313
314static void
315_ecore_evas_ews_lower(Ecore_Evas *ee)
316{
317 evas_object_lower(ee->engine.ews.image);
318 evas_object_lower(_ews_bg);
319 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_LOWER);
320}
321
322static void
323_ecore_evas_ews_activate(Ecore_Evas *ee)
324{
325 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ACTIVATE);
326}
327
328static void
329_ecore_evas_ews_title_set(Ecore_Evas *ee, const char *t)
330{
331 if (ee->prop.title) free(ee->prop.title);
332 ee->prop.title = NULL;
333 if (t) ee->prop.title = strdup(t);
334 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
335}
336
337static void
338_ecore_evas_ews_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
339{
340 if (ee->prop.name) free(ee->prop.name);
341 if (ee->prop.clas) free(ee->prop.clas);
342 ee->prop.name = NULL;
343 ee->prop.clas = NULL;
344 if (n) ee->prop.name = strdup(n);
345 if (c) ee->prop.clas = strdup(c);
346 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
347}
348
349static void
350_ecore_evas_ews_size_min_set(Ecore_Evas *ee, int w, int h)
351{
352 if (w < 0) w = 0;
353 if (h < 0) h = 0;
354 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
355 ee->prop.min.w = w;
356 ee->prop.min.h = h;
357 evas_object_size_hint_min_set(ee->engine.ews.image, w, h);
358 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
359}
360
361static void
362_ecore_evas_ews_size_max_set(Ecore_Evas *ee, int w, int h)
363{
364 if (w < 0) w = 0;
365 if (h < 0) h = 0;
366 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
367 ee->prop.max.w = w;
368 ee->prop.max.h = h;
369 evas_object_size_hint_max_set(ee->engine.ews.image, w, h);
370 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
371}
372
373static void
374_ecore_evas_ews_size_base_set(Ecore_Evas *ee, int w, int h)
375{
376 if (w < 0) w = 0;
377 if (h < 0) h = 0;
378 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
379 ee->prop.base.w = w;
380 ee->prop.base.h = h;
381 evas_object_size_hint_request_set(ee->engine.ews.image, w, h);
382 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
383}
384
385static void
386_ecore_evas_ews_size_step_set(Ecore_Evas *ee, int w, int h)
387{
388 if (w < 1) w = 1;
389 if (h < 1) h = 1;
390 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
391 ee->prop.step.w = w;
392 ee->prop.step.h = h;
393 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
394}
395
396static void
397_ecore_evas_ews_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
398{
399 Ecore_Evas *ee = data;
400 ee->prop.cursor.object = NULL;
401}
402
403static void
404_ecore_evas_ews_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
405{
406 int x, y;
407
408 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
409
410 if (!obj)
411 {
412 ee->prop.cursor.object = NULL;
413 ee->prop.cursor.layer = 0;
414 ee->prop.cursor.hot.x = 0;
415 ee->prop.cursor.hot.y = 0;
416 return;
417 }
418
419 ee->prop.cursor.object = obj;
420 ee->prop.cursor.layer = layer;
421 ee->prop.cursor.hot.x = hot_x;
422 ee->prop.cursor.hot.y = hot_y;
423 evas_pointer_output_xy_get(ee->evas, &x, &y);
424 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
425 evas_object_move(ee->prop.cursor.object,
426 x - ee->prop.cursor.hot.x,
427 y - ee->prop.cursor.hot.y);
428 evas_object_pass_events_set(ee->prop.cursor.object, 1);
429 if (evas_pointer_inside_get(ee->evas))
430 evas_object_show(ee->prop.cursor.object);
431
432 evas_object_event_callback_add
433 (obj, EVAS_CALLBACK_DEL, _ecore_evas_ews_object_cursor_del, ee);
434
435 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
436}
437
438static void
439_ecore_evas_ews_layer_set(Ecore_Evas *ee, int layer)
440{
441 if (layer < EVAS_LAYER_MIN + 1)
442 layer = EVAS_LAYER_MIN + 1;
443 else if (layer > EVAS_LAYER_MAX)
444 layer = EVAS_LAYER_MAX;
445
446 if (ee->prop.layer == layer) return;
447 ee->prop.layer = layer;
448 evas_object_layer_set(ee->engine.ews.image, layer);
449 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_LAYER_CHANGE);
450}
451
452static void
453_ecore_evas_ews_focus_set(Ecore_Evas *ee, int val)
454{
455 evas_object_focus_set(ee->engine.ews.image, val);
456 ee->prop.focused = val;
457 if (val)
458 {
459 evas_focus_in(ee->evas);
460 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
461 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_FOCUS);
462 }
463 else
464 {
465 evas_focus_out(ee->evas);
466 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
467 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_UNFOCUS);
468 }
469}
470
471static void
472_ecore_evas_ews_iconified_set(Ecore_Evas *ee, int val)
473{
474 if (ee->prop.iconified == val) return;
475 ee->prop.iconified = val;
476 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE);
477}
478
479static void
480_ecore_evas_ews_borderless_set(Ecore_Evas *ee, int val)
481{
482 if (ee->prop.borderless == val) return;
483 ee->prop.borderless = val;
484 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
485}
486
487static void
488_ecore_evas_ews_override_set(Ecore_Evas *ee, int val)
489{
490 if (ee->prop.override == val) return;
491 if (ee->visible) evas_object_show(ee->engine.ews.image);
492 if (ee->prop.focused) evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
493 ee->prop.override = val;
494 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
495}
496
497static void
498_ecore_evas_ews_maximized_set(Ecore_Evas *ee, int val)
499{
500 if (ee->prop.maximized == val) return;
501 ee->prop.maximized = val;
502 if (val) evas_object_show(ee->engine.ews.image);
503 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE);
504}
505
506static void
507_ecore_evas_ews_fullscreen_set(Ecore_Evas *ee, int val)
508{
509 if (ee->prop.fullscreen == val) return;
510 ee->prop.fullscreen = val;
511
512 if (!val)
513 {
514 evas_object_move(ee->engine.ews.image, ee->x, ee->y);
515 evas_object_resize(ee->engine.ews.image, ee->w, ee->h);
516 }
517 else
518 {
519 Evas_Coord w, h;
520 ecore_evas_geometry_get(_ews_ee, NULL, NULL, &w, &h);
521 evas_object_move(ee->engine.ews.image, 0, 0);
522 evas_object_resize(ee->engine.ews.image, w, h);
523 evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
524 }
525
526 if (ee->should_be_visible)
527 evas_object_show(ee->engine.ews.image);
528 else
529 evas_object_hide(ee->engine.ews.image);
530
531 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE);
532}
533
534static void
535_ecore_evas_ews_avoid_damage_set(Ecore_Evas *ee, int val)
536{
537 if (ee->prop.avoid_damage == val) return;
538 ee->prop.avoid_damage = val;
539 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
540}
541
542static void
543_ecore_evas_ews_withdrawn_set(Ecore_Evas *ee, int val)
544{
545 if (ee->prop.withdrawn == val) return;
546 ee->prop.withdrawn = val;
547 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
548}
549
550static void
551_ecore_evas_ews_sticky_set(Ecore_Evas *ee, int val)
552{
553 if (ee->prop.sticky == val) return;
554 ee->prop.sticky = val;
555 if ((val) && (ee->func.fn_sticky)) ee->func.fn_sticky(ee);
556 else if ((!val) && (ee->func.fn_unsticky)) ee->func.fn_unsticky(ee);
557 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
558}
559
560static void
561_ecore_evas_ews_ignore_events_set(Ecore_Evas *ee, int val)
562{
563 if (ee->ignore_events == val) return;
564 ee->ignore_events = val;
565 evas_object_pass_events_set(ee->engine.ews.image, val);
566 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
567}
568
569static void
570_ecore_evas_ews_alpha_set(Ecore_Evas *ee, int val)
571{
572 if (ee->alpha == val) return;
573 ee->alpha = val;
574 evas_object_image_alpha_set(ee->engine.ews.image, val);
575 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
576}
577
578static void
579_ecore_evas_ews_transparent_set(Ecore_Evas *ee, int val)
580{
581 if (ee->transparent == val) return;
582 ee->transparent = val;
583 evas_object_image_alpha_set(ee->engine.ews.image, val);
584 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
585}
586
587static int
588_ecore_evas_ews_render(Ecore_Evas *ee)
589{
590 Eina_List *updates = NULL, *l, *ll;
591 Ecore_Evas *ee2;
592 Eina_Rectangle *r;
593 int w, h, rend = 0;
594 void *pixels;
595
596 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
597 {
598 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
599 rend |= _ecore_evas_ews_render(ee2);
600 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
601 }
602
603 evas_object_image_size_get(ee->engine.ews.image, &w, &h);
604 if ((w != ee->w) || (h != ee->h))
605 ecore_evas_resize(ee, w, h);
606
607 pixels = evas_object_image_data_get(ee->engine.ews.image, 1);
608 if (pixels)
609 {
610 updates = evas_render_updates(ee->evas);
611 }
612 evas_object_image_data_set(ee->engine.ews.image, pixels);
613
614 EINA_LIST_FOREACH(updates, l, r)
615 evas_object_image_data_update_add(ee->engine.ews.image,
616 r->x, r->y, r->w, r->h);
617
618 if (updates)
619 {
620 evas_render_updates_free(updates);
621 _ecore_evas_idle_timeout_update(ee);
622 }
623
624 return updates ? 1 : rend;
625}
626
627static void
628_ecore_evas_ews_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
629{
630 ecore_evas_geometry_get(_ews_ee, x, y, w, h);
631}
632
633static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
634{
635 _ecore_evas_ews_free,
636 NULL,
637 NULL,
638 NULL,
639 NULL,
640 NULL,
641 NULL,
642 NULL,
643 NULL,
644 NULL,
645 NULL,
646 NULL,
647 NULL,
648 NULL,
649 NULL,
650 _ecore_evas_ews_move,
651 _ecore_evas_ews_managed_move,
652 _ecore_evas_ews_resize,
653 _ecore_evas_ews_move_resize,
654 _ecore_evas_ews_rotation_set,
655 _ecore_evas_ews_shaped_set,
656 _ecore_evas_ews_show,
657 _ecore_evas_ews_hide,
658 _ecore_evas_ews_raise,
659 _ecore_evas_ews_lower,
660 _ecore_evas_ews_activate,
661 _ecore_evas_ews_title_set,
662 _ecore_evas_ews_name_class_set,
663 _ecore_evas_ews_size_min_set,
664 _ecore_evas_ews_size_max_set,
665 _ecore_evas_ews_size_base_set,
666 _ecore_evas_ews_size_step_set,
667 _ecore_evas_ews_object_cursor_set,
668 _ecore_evas_ews_layer_set,
669 _ecore_evas_ews_focus_set,
670 _ecore_evas_ews_iconified_set,
671 _ecore_evas_ews_borderless_set,
672 _ecore_evas_ews_override_set,
673 _ecore_evas_ews_maximized_set,
674 _ecore_evas_ews_fullscreen_set,
675 _ecore_evas_ews_avoid_damage_set,
676 _ecore_evas_ews_withdrawn_set,
677 _ecore_evas_ews_sticky_set,
678 _ecore_evas_ews_ignore_events_set,
679 _ecore_evas_ews_alpha_set,
680 _ecore_evas_ews_transparent_set,
681 _ecore_evas_ews_render,
682 _ecore_evas_ews_screen_geometry_get
683};
684
685void
686_ecore_evas_ews_events_init(void)
687{
688 if (ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE != 0) return;
689 ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = ecore_event_type_new();
690 ECORE_EVAS_EWS_EVENT_ADD = ecore_event_type_new();
691 ECORE_EVAS_EWS_EVENT_DEL = ecore_event_type_new();
692 ECORE_EVAS_EWS_EVENT_RESIZE = ecore_event_type_new();
693 ECORE_EVAS_EWS_EVENT_MOVE = ecore_event_type_new();
694 ECORE_EVAS_EWS_EVENT_SHOW = ecore_event_type_new();
695 ECORE_EVAS_EWS_EVENT_HIDE = ecore_event_type_new();
696 ECORE_EVAS_EWS_EVENT_FOCUS = ecore_event_type_new();
697 ECORE_EVAS_EWS_EVENT_UNFOCUS = ecore_event_type_new();
698 ECORE_EVAS_EWS_EVENT_RAISE = ecore_event_type_new();
699 ECORE_EVAS_EWS_EVENT_LOWER = ecore_event_type_new();
700 ECORE_EVAS_EWS_EVENT_ACTIVATE = ecore_event_type_new();
701 ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = ecore_event_type_new();
702 ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = ecore_event_type_new();
703 ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = ecore_event_type_new();
704 ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = ecore_event_type_new();
705 ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = ecore_event_type_new();
706}
707
708static int
709_ecore_evas_ews_init(void)
710{
711 _ecore_evas_init_count++;
712 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
713
714 _ecore_evas_ews_env_setup();
715
716 return _ecore_evas_init_count;
717}
718
719int
720_ecore_evas_ews_shutdown(void)
721{
722 _ecore_evas_init_count--;
723 if (_ecore_evas_init_count == 0)
724 {
725 if (_ews_ee)
726 {
727 ecore_evas_free(_ews_ee);
728 _ews_ee = NULL;
729 }
730 if (_ews_children)
731 {
732 eina_list_free(_ews_children);
733 _ews_children = NULL;
734 }
735
736 free(_ews_engine);
737 _ews_engine = NULL;
738 free(_ews_options);
739 _ews_options = NULL;
740 _ews_defaults_engine = EINA_TRUE;
741 _ews_defaults_geo = EINA_TRUE;
742
743 }
744 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
745 return _ecore_evas_init_count;
746}
747
748static void
749_ecore_evas_ews_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
750{
751 Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
752
753 evas_object_geometry_get(ee->engine.ews.image, &xx, &yy, &ww, &hh);
754 evas_object_image_fill_get(ee->engine.ews.image, &fx, &fy, &fw, &fh);
755
756 if (fw < 1) fw = 1;
757 if (fh < 1) fh = 1;
758
759 if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
760 {
761 *x = (ee->w * (*x - xx)) / fw;
762 *y = (ee->h * (*y - yy)) / fh;
763 }
764 else
765 {
766 xx = (*x - xx) - fx;
767 while (xx < 0) xx += fw;
768 while (xx > fw) xx -= fw;
769 *x = (ee->w * xx) / fw;
770
771 yy = (*y - yy) - fy;
772 while (yy < 0) yy += fh;
773 while (yy > fh) yy -= fh;
774 *y = (ee->h * yy) / fh;
775 }
776}
777
778static void
779_ecore_evas_ews_modifiers_apply(Ecore_Evas *ee, const Evas_Modifier *modifier)
780{
781 Evas *e = ee->evas;
782
783 if (evas_key_modifier_is_set(modifier, "Shift"))
784 evas_key_modifier_on(e, "Shift");
785 else evas_key_modifier_off(e, "Shift");
786
787 if (evas_key_modifier_is_set(modifier, "Control"))
788 evas_key_modifier_on(e, "Control");
789 else evas_key_modifier_off(e, "Control");
790
791 if (evas_key_modifier_is_set(modifier, "Alt"))
792 evas_key_modifier_on(e, "Alt");
793 else evas_key_modifier_off(e, "Alt");
794
795 if (evas_key_modifier_is_set(modifier, "Super"))
796 evas_key_modifier_on(e, "Super");
797 else evas_key_modifier_off(e, "Super");
798
799 if (evas_key_modifier_is_set(modifier, "Hyper"))
800 evas_key_modifier_on(e, "Hyper");
801 else evas_key_modifier_off(e, "Hyper");
802
803 if (evas_key_modifier_is_set(modifier, "Scroll_Lock"))
804 evas_key_lock_on(e, "Scroll_Lock");
805 else evas_key_lock_off(e, "Scroll_Lock");
806
807 if (evas_key_modifier_is_set(modifier, "Num_Lock"))
808 evas_key_lock_on(e, "Num_Lock");
809 else evas_key_lock_off(e, "Num_Lock");
810
811 if (evas_key_modifier_is_set(modifier, "Caps_Lock"))
812 evas_key_lock_on(e, "Caps_Lock");
813 else evas_key_lock_off(e, "Caps_Lock");
814
815 if (evas_key_modifier_is_set(modifier, "Shift_Lock"))
816 evas_key_lock_on(e, "Shift_Lock");
817 else evas_key_lock_off(e, "Shift_Lock");
818}
819
820static void
821_ecore_evas_ews_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
822{
823 Ecore_Evas *ee = data;
824 Evas_Event_Mouse_In *ev = event_info;
825 Evas_Coord x = ev->canvas.x;
826 Evas_Coord y = ev->canvas.y;
827 _ecore_evas_ews_coord_translate(ee, &x, &y);
828 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
829 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
830 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
831 _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
832}
833
834static void
835_ecore_evas_ews_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
836{
837 Ecore_Evas *ee = data;
838 Evas_Event_Mouse_Out *ev = event_info;
839 Evas_Coord x = ev->canvas.x;
840 Evas_Coord y = ev->canvas.y;
841 // TODO: consider grab mode in EWS
842 _ecore_evas_ews_coord_translate(ee, &x, &y);
843 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
844 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
845 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
846 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
847 _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
848}
849
850static void
851_ecore_evas_ews_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
852{
853 Ecore_Evas *ee = data;
854 Evas_Event_Mouse_Down *ev = event_info;
855 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
856 evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
857}
858
859static void
860_ecore_evas_ews_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
861{
862 Ecore_Evas *ee = data;
863 Evas_Event_Mouse_Up *ev = event_info;
864 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
865 evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
866}
867
868static void
869_ecore_evas_ews_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
870{
871 Ecore_Evas *ee = data;
872 Evas_Event_Mouse_Move *ev = event_info;
873 Evas_Coord x = ev->cur.canvas.x;
874 Evas_Coord y = ev->cur.canvas.y;
875 _ecore_evas_ews_coord_translate(ee, &x, &y);
876 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
877 _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
878}
879
880static void
881_ecore_evas_ews_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
882{
883 Ecore_Evas *ee = data;
884 Evas_Event_Mouse_Wheel *ev = event_info;
885 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
886 evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
887}
888
889static void
890_ecore_evas_ews_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
891{
892 Ecore_Evas *ee = data;
893 Evas_Event_Multi_Down *ev = event_info;
894 Evas_Coord x, y, xx, yy;
895 double xf, yf;
896
897 x = ev->canvas.x;
898 y = ev->canvas.y;
899 xx = x;
900 yy = y;
901 _ecore_evas_ews_coord_translate(ee, &x, &y);
902 xf = (ev->canvas.xsub - (double)xx) + (double)x;
903 yf = (ev->canvas.ysub - (double)yy) + (double)y;
904 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
905 evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
906}
907
908static void
909_ecore_evas_ews_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
910{
911 Ecore_Evas *ee = data;
912 Evas_Event_Multi_Up *ev = event_info;
913 Evas_Coord x, y, xx, yy;
914 double xf, yf;
915
916 x = ev->canvas.x;
917 y = ev->canvas.y;
918 xx = x;
919 yy = y;
920 _ecore_evas_ews_coord_translate(ee, &x, &y);
921 xf = (ev->canvas.xsub - (double)xx) + (double)x;
922 yf = (ev->canvas.ysub - (double)yy) + (double)y;
923 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
924 evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
925}
926
927static void
928_ecore_evas_ews_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
929{
930 Ecore_Evas *ee = data;
931 Evas_Event_Multi_Move *ev = event_info;
932 Evas_Coord x, y, xx, yy;
933 double xf, yf;
934
935 x = ev->cur.canvas.x;
936 y = ev->cur.canvas.y;
937 xx = x;
938 yy = y;
939 _ecore_evas_ews_coord_translate(ee, &x, &y);
940 xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
941 yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
942 _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
943 evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->timestamp, NULL);
944}
945
946static void
947_ecore_evas_ews_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
948{
949 Ecore_Evas *ee = data;
950 if (ee->driver) _ecore_evas_free(ee);
951}
952
953static void
954_ecore_evas_ews_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
955{
956 Ecore_Evas *ee = data;
957 Evas_Event_Key_Down *ev = event_info;
958
959 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
960 evas_key_modifier_on(ee->evas, "Shift");
961 else
962 evas_key_modifier_off(ee->evas, "Shift");
963 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
964 evas_key_modifier_on(ee->evas, "Control");
965 else
966 evas_key_modifier_off(ee->evas, "Control");
967 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
968 evas_key_modifier_on(ee->evas, "Alt");
969 else
970 evas_key_modifier_off(ee->evas, "Alt");
971 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
972 evas_key_modifier_on(ee->evas, "Meta");
973 else
974 evas_key_modifier_off(ee->evas, "Meta");
975 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
976 evas_key_modifier_on(ee->evas, "Hyper");
977 else
978 evas_key_modifier_off(ee->evas, "Hyper");
979 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
980 evas_key_modifier_on(ee->evas, "Super");
981 else
982 evas_key_modifier_off(ee->evas, "Super");
983 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
984 evas_key_lock_on(ee->evas, "Scroll_Lock");
985 else
986 evas_key_lock_off(ee->evas, "Scroll_Lock");
987 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
988 evas_key_lock_on(ee->evas, "Num_Lock");
989 else
990 evas_key_lock_off(ee->evas, "Num_Lock");
991 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
992 evas_key_lock_on(ee->evas, "Caps_Lock");
993 else
994 evas_key_lock_off(ee->evas, "Caps_Lock");
995 evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
996}
997
998static void
999_ecore_evas_ews_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
1000{
1001 Ecore_Evas *ee = data;
1002 Evas_Event_Key_Up *ev = event_info;
1003
1004 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
1005 evas_key_modifier_on(ee->evas, "Shift");
1006 else
1007 evas_key_modifier_off(ee->evas, "Shift");
1008 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
1009 evas_key_modifier_on(ee->evas, "Control");
1010 else
1011 evas_key_modifier_off(ee->evas, "Control");
1012 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
1013 evas_key_modifier_on(ee->evas, "Alt");
1014 else
1015 evas_key_modifier_off(ee->evas, "Alt");
1016 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
1017 evas_key_modifier_on(ee->evas, "Meta");
1018 else
1019 evas_key_modifier_off(ee->evas, "Meta");
1020 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
1021 evas_key_modifier_on(ee->evas, "Hyper");
1022 else
1023 evas_key_modifier_off(ee->evas, "Hyper");
1024 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
1025 evas_key_modifier_on(ee->evas, "Super");
1026 else
1027 evas_key_modifier_off(ee->evas, "Super");
1028 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
1029 evas_key_lock_on(ee->evas, "Scroll_Lock");
1030 else
1031 evas_key_lock_off(ee->evas, "Scroll_Lock");
1032 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
1033 evas_key_lock_on(ee->evas, "Num_Lock");
1034 else
1035 evas_key_lock_off(ee->evas, "Num_Lock");
1036 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
1037 evas_key_lock_on(ee->evas, "Caps_Lock");
1038 else
1039 evas_key_lock_off(ee->evas, "Caps_Lock");
1040 evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
1041}
1042
1043static void
1044_ecore_evas_ews_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1045{
1046 Ecore_Evas *ee = data;
1047 ecore_evas_focus_set(ee, EINA_TRUE);
1048}
1049
1050static void
1051_ecore_evas_ews_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1052{
1053 Ecore_Evas *ee = data;
1054 if (ee->deleted) return;
1055 ecore_evas_focus_set(ee, EINA_FALSE);
1056}
1057
1058static void
1059_ecore_evas_ews_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1060{
1061 Ecore_Evas *ee = data;
1062 ecore_evas_show(ee);
1063}
1064
1065static void
1066_ecore_evas_ews_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1067{
1068 Ecore_Evas *ee = data;
1069 if (ee->deleted) return;
1070 ecore_evas_hide(ee);
1071}
1072#endif
1073
1074EAPI Ecore_Evas *
1075ecore_evas_ews_new(int x, int y, int w, int h)
1076{
1077// basically a copy of ecore_evas_buffer_new() keep in sync...
1078#ifdef BUILD_ECORE_EVAS_EWS
1079 Evas_Object *o;
1080 Evas_Engine_Info_Buffer *einfo;
1081 Ecore_Evas *ee;
1082 int rmethod;
1083
1084 if (_ecore_evas_ews_init() < 1) return NULL;
1085
1086 if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
1087 if (!_ews_ee)
1088 {
1089 ERR("Could not create EWS backing store");
1090 _ecore_evas_ews_shutdown();
1091 return NULL;
1092 }
1093
1094 rmethod = evas_render_method_lookup("buffer");
1095 if (!rmethod) return NULL;
1096 ee = calloc(1, sizeof(Ecore_Evas));
1097 if (!ee) return NULL;
1098
1099 if (w < 1) w = 1;
1100 if (h < 1) h = 1;
1101
1102 o = evas_object_image_add(_ews_ee->evas);
1103 evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
1104 evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1105 evas_object_image_size_set(o, w, h);
1106 evas_object_image_alpha_set(o, 1);
1107
1108 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1109
1110 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_ews_engine_func;
1111
1112 ee->driver = EWS_ENGINE_NAME;
1113
1114 ee->x = 0;
1115 ee->y = 0;
1116 ee->w = w;
1117 ee->h = h;
1118 ee->req.x = ee->x;
1119 ee->req.y = ee->y;
1120 ee->req.w = ee->w;
1121 ee->req.h = ee->h;
1122
1123 /* init evas here */
1124 ee->evas = evas_new();
1125 evas_data_attach_set(ee->evas, ee);
1126 evas_output_method_set(ee->evas, rmethod);
1127 evas_output_size_set(ee->evas, w, h);
1128 evas_output_viewport_set(ee->evas, 0, 0, w, h);
1129
1130 evas_object_move(o, x, y);
1131 evas_object_resize(o, w, h);
1132 evas_object_image_fill_set(o, 0, 0, w, h);
1133
1134 ee->engine.ews.image = o;
1135 evas_object_data_set(ee->engine.ews.image, "Ecore_Evas", ee);
1136 evas_object_event_callback_add(ee->engine.ews.image,
1137 EVAS_CALLBACK_MOUSE_IN,
1138 _ecore_evas_ews_cb_mouse_in, ee);
1139 evas_object_event_callback_add(ee->engine.ews.image,
1140 EVAS_CALLBACK_MOUSE_OUT,
1141 _ecore_evas_ews_cb_mouse_out, ee);
1142 evas_object_event_callback_add(ee->engine.ews.image,
1143 EVAS_CALLBACK_MOUSE_DOWN,
1144 _ecore_evas_ews_cb_mouse_down, ee);
1145 evas_object_event_callback_add(ee->engine.ews.image,
1146 EVAS_CALLBACK_MOUSE_UP,
1147 _ecore_evas_ews_cb_mouse_up, ee);
1148 evas_object_event_callback_add(ee->engine.ews.image,
1149 EVAS_CALLBACK_MOUSE_MOVE,
1150 _ecore_evas_ews_cb_mouse_move, ee);
1151 evas_object_event_callback_add(ee->engine.ews.image,
1152 EVAS_CALLBACK_MOUSE_WHEEL,
1153 _ecore_evas_ews_cb_mouse_wheel, ee);
1154 evas_object_event_callback_add(ee->engine.ews.image,
1155 EVAS_CALLBACK_MULTI_DOWN,
1156 _ecore_evas_ews_cb_multi_down, ee);
1157 evas_object_event_callback_add(ee->engine.ews.image,
1158 EVAS_CALLBACK_MULTI_UP,
1159 _ecore_evas_ews_cb_multi_up, ee);
1160 evas_object_event_callback_add(ee->engine.ews.image,
1161 EVAS_CALLBACK_MULTI_MOVE,
1162 _ecore_evas_ews_cb_multi_move, ee);
1163 evas_object_event_callback_add(ee->engine.ews.image,
1164 EVAS_CALLBACK_FREE,
1165 _ecore_evas_ews_cb_free, ee);
1166 evas_object_event_callback_add(ee->engine.ews.image,
1167 EVAS_CALLBACK_KEY_DOWN,
1168 _ecore_evas_ews_cb_key_down, ee);
1169 evas_object_event_callback_add(ee->engine.ews.image,
1170 EVAS_CALLBACK_KEY_UP,
1171 _ecore_evas_ews_cb_key_up, ee);
1172 evas_object_event_callback_add(ee->engine.ews.image,
1173 EVAS_CALLBACK_FOCUS_IN,
1174 _ecore_evas_ews_cb_focus_in, ee);
1175 evas_object_event_callback_add(ee->engine.ews.image,
1176 EVAS_CALLBACK_FOCUS_OUT,
1177 _ecore_evas_ews_cb_focus_out, ee);
1178 evas_object_event_callback_add(ee->engine.ews.image,
1179 EVAS_CALLBACK_SHOW,
1180 _ecore_evas_ews_cb_show, ee);
1181 evas_object_event_callback_add(ee->engine.ews.image,
1182 EVAS_CALLBACK_HIDE,
1183 _ecore_evas_ews_cb_hide, ee);
1184 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1185 if (einfo)
1186 {
1187 void *pixels = evas_object_image_data_get(o, 1);
1188 evas_object_image_data_set(o, pixels); // refcount
1189 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1190 einfo->info.dest_buffer = pixels;
1191 einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
1192 einfo->info.use_color_key = 0;
1193 einfo->info.alpha_threshold = 0;
1194 einfo->info.func.new_update_region = NULL;
1195 einfo->info.func.free_update_region = NULL;
1196 evas_object_image_data_set(o, pixels);
1197 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1198 {
1199 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1200 ecore_evas_free(ee);
1201 return NULL;
1202 }
1203 }
1204 else
1205 {
1206 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1207 ecore_evas_free(ee);
1208 return NULL;
1209 }
1210 evas_key_modifier_add(ee->evas, "Shift");
1211 evas_key_modifier_add(ee->evas, "Control");
1212 evas_key_modifier_add(ee->evas, "Alt");
1213 evas_key_modifier_add(ee->evas, "Meta");
1214 evas_key_modifier_add(ee->evas, "Hyper");
1215 evas_key_modifier_add(ee->evas, "Super");
1216 evas_key_lock_add(ee->evas, "Caps_Lock");
1217 evas_key_lock_add(ee->evas, "Num_Lock");
1218 evas_key_lock_add(ee->evas, "Scroll_Lock");
1219
1220 _ews_ee->sub_ecore_evas = eina_list_append(_ews_ee->sub_ecore_evas, ee);
1221 _ews_children = eina_list_append(_ews_children, ee);
1222
1223 _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ADD);
1224
1225 return ee;
1226#else
1227 return NULL;
1228 (void)x;
1229 (void)y;
1230 (void)w;
1231 (void)h;
1232#endif
1233}
1234
1235EAPI Evas_Object *
1236ecore_evas_ews_backing_store_get(const Ecore_Evas *ee)
1237{
1238#ifdef BUILD_ECORE_EVAS_EWS
1239 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1240 {
1241 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1242 "ecore_evas_ews_backing_store_get");
1243 return NULL;
1244 }
1245 return ee->engine.ews.image;
1246#else
1247 return NULL;
1248 (void)ee;
1249#endif
1250}
1251
1252EAPI void
1253ecore_evas_ews_delete_request(Ecore_Evas *ee)
1254{
1255#ifdef BUILD_ECORE_EVAS_EWS
1256 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1257 {
1258 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1259 "ecore_evas_ews_delete_request");
1260 return;
1261 }
1262 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1263 else ecore_evas_free(ee);
1264#else
1265 (void)ee;
1266#endif
1267}
1268
1269
1270EAPI Eina_Bool
1271ecore_evas_ews_engine_set(const char *engine, const char *options)
1272{
1273#ifdef BUILD_ECORE_EVAS_EWS
1274 if (_ews_ee) return EINA_FALSE;
1275
1276 free(_ews_engine);
1277 free(_ews_options);
1278
1279 _ews_engine = engine ? strdup(engine) : NULL;
1280 _ews_options = options ? strdup(options) : NULL;
1281
1282 if ((engine) && (!_ews_engine)) return EINA_FALSE;
1283 if ((options) && (!_ews_options)) return EINA_FALSE;
1284
1285 _ews_defaults_engine = EINA_FALSE;
1286 return EINA_TRUE;
1287#else
1288 return EINA_FALSE;
1289 (void)engine;
1290 (void)options;
1291#endif
1292}
1293
1294EAPI Eina_Bool
1295ecore_evas_ews_setup(int x, int y, int w, int h)
1296{
1297#ifdef BUILD_ECORE_EVAS_EWS
1298 Eina_Bool ret = EINA_TRUE;
1299
1300 _ews_defaults_geo = EINA_FALSE;
1301 _ews_x = x;
1302 _ews_y = y;
1303 _ews_w = w;
1304 _ews_h = h;
1305
1306 if (!_ews_ee) return EINA_TRUE;
1307
1308 /* move-resize is not as implemented as move + resize */
1309 ecore_evas_move(_ews_ee, x, y);
1310 ecore_evas_size_min_set(_ews_ee, w, h);
1311 ecore_evas_size_max_set(_ews_ee, w, h);
1312 ecore_evas_resize(_ews_ee, w, h);
1313
1314 ecore_evas_geometry_get(_ews_ee, &x, &y, &w, &h);
1315
1316#define TST(n) if ((n != _ews_##n)) \
1317 { \
1318 WRN("Asked %d, got %d for "#n, _ews_##n, n); \
1319 ret = EINA_FALSE; \
1320 }
1321 TST(x);
1322 TST(y);
1323 TST(w);
1324 TST(h);
1325#undef TST
1326 return ret;
1327#else
1328 return EINA_FALSE;
1329 (void)x;
1330 (void)y;
1331 (void)w;
1332 (void)h;
1333#endif
1334}
1335
1336EAPI Ecore_Evas *
1337ecore_evas_ews_ecore_evas_get(void)
1338{
1339#ifdef BUILD_ECORE_EVAS_EWS
1340 if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
1341 return _ews_ee;
1342#else
1343 return NULL;
1344#endif
1345}
1346
1347EAPI Evas *
1348ecore_evas_ews_evas_get(void)
1349{
1350#ifdef BUILD_ECORE_EVAS_EWS
1351 return ecore_evas_get(ecore_evas_ews_ecore_evas_get());
1352#else
1353 return NULL;
1354#endif
1355}
1356
1357EAPI Evas_Object *
1358ecore_evas_ews_background_get(void)
1359{
1360#ifdef BUILD_ECORE_EVAS_EWS
1361 return _ews_bg;
1362#else
1363 return NULL;
1364#endif
1365}
1366
1367#ifdef BUILD_ECORE_EVAS_EWS
1368static void
1369_ecore_evas_ews_background_free(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
1370{
1371 _ews_bg = NULL;
1372 ecore_evas_ews_background_set(NULL);
1373}
1374#endif
1375
1376EAPI void
1377ecore_evas_ews_background_set(Evas_Object *o)
1378{
1379#ifdef BUILD_ECORE_EVAS_EWS
1380 if ((o) && (o == _ews_bg)) return;
1381
1382 if (_ews_bg)
1383 {
1384 evas_object_del(_ews_bg);
1385 _ews_bg = NULL;
1386 }
1387
1388 if ((!o) && (_ews_ee))
1389 {
1390 o = evas_object_rectangle_add(ecore_evas_get(_ews_ee));
1391 evas_object_color_set(o, 0, 0, 0, 255);
1392 }
1393
1394 if (_ews_ee)
1395 {
1396 Evas_Coord w, h;
1397 Evas *e = ecore_evas_get(_ews_ee);
1398
1399 if (e != evas_object_evas_get(o))
1400 {
1401 ERR("background not in ecore_evas_ews_evas_get() canvas!");
1402 return;
1403 }
1404
1405 evas_output_viewport_get(e, NULL, NULL, &w, &h);
1406 evas_object_move(o, 0, 0);
1407 evas_object_resize(o, w, h);
1408 evas_object_layer_set(o, EVAS_LAYER_MIN);
1409 evas_object_lower(o);
1410 evas_object_show(o);
1411
1412 evas_object_event_callback_add
1413 (o, EVAS_CALLBACK_FREE, _ecore_evas_ews_background_free, NULL);
1414 }
1415
1416 _ews_bg = o;
1417#else
1418 return;
1419 (void)o;
1420#endif
1421}
1422
1423
1424EAPI const Eina_List *
1425ecore_evas_ews_children_get(void)
1426{
1427#ifdef BUILD_ECORE_EVAS_EWS
1428 return _ews_children;
1429#else
1430 return NULL;
1431#endif
1432}
1433
1434EAPI void
1435ecore_evas_ews_manager_set(const void *manager)
1436{
1437#ifdef BUILD_ECORE_EVAS_EWS
1438 if (_ews_manager == manager) return;
1439 _ews_manager = manager;
1440 ecore_event_add(ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE, NULL, NULL, NULL);
1441#else
1442 (void)manager;
1443#endif
1444}
1445
1446EAPI const void *
1447ecore_evas_ews_manager_get(void)
1448{
1449#ifdef BUILD_ECORE_EVAS_EWS
1450 return _ews_manager;
1451#else
1452 return NULL;
1453#endif
1454}
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_fb.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_fb.c
new file mode 100644
index 0000000..3ee913e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_fb.c
@@ -0,0 +1,659 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <sys/types.h>
6#include <dirent.h>
7
8#include <Ecore.h>
9#include "ecore_private.h"
10#ifdef BUILD_ECORE_EVAS_FB
11#include <Ecore_Fb.h>
12#include <ecore_fb_private.h>
13#endif
14
15#include "ecore_evas_private.h"
16#include "Ecore_Evas.h"
17
18#ifdef BUILD_ECORE_EVAS_FB
19static int _ecore_evas_init_count = 0;
20
21static char *ecore_evas_default_display = "0";
22static Eina_List *ecore_evas_input_devices = NULL;
23static Ecore_Event_Handler *ecore_evas_event_handlers[4] = {NULL, NULL, NULL, NULL};
24
25static void
26_ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y)
27{
28 int fbw, fbh;
29
30 ee->mouse.x = x;
31 ee->mouse.y = y;
32 ecore_fb_size_get(&fbw, &fbh);
33 if (ee->prop.cursor.object)
34 {
35 evas_object_show(ee->prop.cursor.object);
36 if (ee->rotation == 0)
37 evas_object_move(ee->prop.cursor.object,
38 x - ee->prop.cursor.hot.x,
39 y - ee->prop.cursor.hot.y);
40 else if (ee->rotation == 90)
41 evas_object_move(ee->prop.cursor.object,
42 (fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.x,
43 x - ee->prop.cursor.hot.y);
44 else if (ee->rotation == 180)
45 evas_object_move(ee->prop.cursor.object,
46 (fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.x,
47 (fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.y);
48 else if (ee->rotation == 270)
49 evas_object_move(ee->prop.cursor.object,
50 y - ee->prop.cursor.hot.x,
51 (fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.y);
52 }
53}
54
55static Ecore_Evas *fb_ee = NULL;
56
57static Ecore_Evas *
58_ecore_evas_fb_match(void)
59{
60 return fb_ee;
61}
62
63static void
64_ecore_evas_fb_lose(void *data __UNUSED__)
65{
66 Eina_List *ll;
67 Ecore_Fb_Input_Device *dev;
68
69 if (fb_ee) fb_ee->visible = 0;
70
71 EINA_LIST_FOREACH(ecore_evas_input_devices, ll, dev)
72 ecore_fb_input_device_listen(dev, 0);
73}
74
75static void
76_ecore_evas_fb_gain(void *data __UNUSED__)
77{
78 Ecore_Evas *ee;
79 Eina_List *ll;
80 Ecore_Fb_Input_Device *dev;
81
82 if (fb_ee)
83 {
84 ee = fb_ee;
85
86 ee->visible = 1;
87 if ((ee->rotation == 90) || (ee->rotation == 270))
88 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
89 else
90 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
91 }
92
93 EINA_LIST_FOREACH(ecore_evas_input_devices, ll, dev)
94 ecore_fb_input_device_listen(dev, 1);
95}
96
97static Eina_Bool
98_ecore_evas_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
99{
100 Ecore_Evas *ee;
101 Ecore_Event_Mouse_Button *e;
102
103 e = event;
104 ee = _ecore_evas_fb_match();
105 if (!ee) return ECORE_CALLBACK_PASS_ON;
106 _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
107 return ECORE_CALLBACK_PASS_ON;
108}
109
110static Eina_Bool
111_ecore_evas_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
112{
113 Ecore_Evas *ee;
114 Ecore_Event_Mouse_Button *e;
115
116 e = event;
117 ee = _ecore_evas_fb_match();
118 if (!ee) return ECORE_CALLBACK_PASS_ON;
119 _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
120 return ECORE_CALLBACK_PASS_ON;
121}
122
123static Eina_Bool
124_ecore_evas_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
125{
126 Ecore_Evas *ee;
127 Ecore_Event_Mouse_Move *e;
128
129 e = event;
130 ee = _ecore_evas_fb_match();
131 if (!ee) return ECORE_CALLBACK_PASS_ON;
132 _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
133 return ECORE_CALLBACK_PASS_ON;
134}
135
136static Eina_Bool
137_ecore_evas_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
138{
139 Ecore_Evas *ee;
140 Ecore_Event_Mouse_Wheel *e;
141
142 e = event;
143 ee = _ecore_evas_fb_match();
144 if (!ee) return ECORE_CALLBACK_PASS_ON;
145 _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
146 return ECORE_CALLBACK_PASS_ON;
147}
148
149static int
150_ecore_evas_fb_render(Ecore_Evas *ee)
151{
152 int rend = 0;
153
154 if (ee->visible)
155 {
156 Eina_List *updates;
157
158 Eina_List *ll;
159 Ecore_Evas *ee2;
160 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
161
162 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
163 {
164 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
165 if (ee2->engine.func->fn_render)
166 rend |= ee2->engine.func->fn_render(ee2);
167 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
168 }
169
170 updates = evas_render_updates(ee->evas);
171 if (updates)
172 {
173 evas_render_updates_free(updates);
174 _ecore_evas_idle_timeout_update(ee);
175 rend = 1;
176 }
177 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
178 }
179 else
180 evas_norender(ee->evas);
181 return rend;
182}
183
184static int
185_ecore_evas_fb_init(Ecore_Evas *ee, int w, int h)
186{
187 Ecore_Fb_Input_Device *device;
188 Ecore_Fb_Input_Device_Cap caps;
189 int mouse_handled = 0;
190
191 DIR *input_dir;
192 struct dirent *input_entry;
193
194 _ecore_evas_init_count++;
195 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
196
197 ecore_event_evas_init();
198
199 /* register all input devices */
200 input_dir = opendir("/dev/input/");
201 if (!input_dir) return _ecore_evas_init_count;
202
203 while ((input_entry = readdir(input_dir)))
204 {
205 char device_path[256];
206
207 if (strncmp(input_entry->d_name, "event", 5) != 0)
208 continue;
209
210 snprintf(device_path, 256, "/dev/input/%s", input_entry->d_name);
211 if (!(device = ecore_fb_input_device_open(device_path)))
212 continue;
213 ecore_fb_input_device_window_set(device, ee);
214
215 caps = ecore_fb_input_device_cap_get(device);
216
217 /* Mouse */
218#ifdef HAVE_TSLIB
219 if (caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE)
220#else
221 if ((caps & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE) || (caps & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE))
222#endif
223 {
224 ecore_fb_input_device_axis_size_set(device, w, h);
225 ecore_fb_input_device_listen(device,1);
226 ecore_evas_input_devices = eina_list_append(ecore_evas_input_devices, device);
227 if (!mouse_handled)
228 {
229 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_event_mouse_button_down, NULL);
230 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _ecore_evas_event_mouse_button_up, NULL);
231 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _ecore_evas_event_mouse_move, NULL);
232 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL, _ecore_evas_event_mouse_wheel, NULL);
233 mouse_handled = 1;
234 }
235 }
236 /* Keyboard */
237 else if ((caps & ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS) && !(caps & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE))
238 {
239 ecore_fb_input_device_listen(device,1);
240 ecore_evas_input_devices = eina_list_append(ecore_evas_input_devices, device);
241 }
242 }
243 closedir(input_dir);
244
245 if (!mouse_handled)
246 {
247 if (ecore_fb_ts_init())
248 {
249 ecore_fb_ts_event_window_set(ee);
250 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_event_mouse_button_down, NULL);
251 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _ecore_evas_event_mouse_button_up, NULL);
252 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _ecore_evas_event_mouse_move, NULL);
253 mouse_handled = 1;
254 }
255 }
256 return _ecore_evas_init_count;
257}
258
259static void
260_ecore_evas_fb_free(Ecore_Evas *ee)
261{
262 ecore_evas_input_event_unregister(ee);
263 if (fb_ee == ee) fb_ee = NULL;
264 _ecore_evas_fb_shutdown();
265 ecore_fb_shutdown();
266}
267
268static void
269_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
270{
271 ee->req.w = w;
272 ee->req.h = h;
273 if ((w == ee->w) && (h == ee->h)) return;
274 ee->w = w;
275 ee->h = h;
276 if ((ee->rotation == 90) || (ee->rotation == 270))
277 {
278 evas_output_size_set(ee->evas, ee->h, ee->w);
279 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
280 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
281 }
282 else
283 {
284 evas_output_size_set(ee->evas, ee->w, ee->h);
285 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
286 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
287 }
288 if (ee->func.fn_resize) ee->func.fn_resize(ee);
289}
290
291static void
292_ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
293{
294 ee->req.w = w;
295 ee->req.h = h;
296 if ((w == ee->w) && (h == ee->h)) return;
297 ee->w = w;
298 ee->h = h;
299 if ((ee->rotation == 90) || (ee->rotation == 270))
300 {
301 evas_output_size_set(ee->evas, ee->h, ee->w);
302 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
303 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
304 }
305 else
306 {
307 evas_output_size_set(ee->evas, ee->w, ee->h);
308 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
309 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
310 }
311 if (ee->func.fn_resize) ee->func.fn_resize(ee);
312}
313
314static void
315_ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize __UNUSED__)
316{
317 Evas_Engine_Info_FB *einfo;
318 int rot_dif;
319
320 if (ee->rotation == rotation) return;
321 einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
322 if (!einfo) return;
323 rot_dif = ee->rotation - rotation;
324 if (rot_dif < 0) rot_dif = -rot_dif;
325 if (rot_dif != 180)
326 {
327
328 einfo->info.rotation = rotation;
329 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
330 {
331 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
332 }
333 if (!ee->prop.fullscreen)
334 {
335 int tmp;
336
337 tmp = ee->w;
338 ee->w = ee->h;
339 ee->h = tmp;
340 ee->req.w = ee->w;
341 ee->req.h = ee->h;
342 }
343 else
344 {
345 if ((rotation == 0) || (rotation == 180))
346 {
347 evas_output_size_set(ee->evas, ee->w, ee->h);
348 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
349 }
350 else
351 {
352 evas_output_size_set(ee->evas, ee->h, ee->w);
353 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
354 }
355 }
356 ee->rotation = rotation;
357 }
358 else
359 {
360 einfo->info.rotation = rotation;
361 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
362 {
363 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
364 }
365 ee->rotation = rotation;
366 }
367 if ((ee->rotation == 90) || (ee->rotation == 270))
368 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
369 else
370 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
371 _ecore_evas_mouse_move_process_fb(ee, ee->mouse.x, ee->mouse.y);
372 if (ee->func.fn_resize) ee->func.fn_resize(ee);
373}
374
375static void
376_ecore_evas_show(Ecore_Evas *ee)
377{
378 if (ee->prop.focused) return;
379 ee->prop.focused = 1;
380 evas_focus_in(ee->evas);
381 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
382}
383
384static void
385_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
386{
387 Ecore_Evas *ee;
388
389 ee = data;
390 if (ee)
391 ee->prop.cursor.object = NULL;
392}
393
394static void
395_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
396{
397 int x, y;
398
399 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
400
401 if (!obj)
402 {
403 ee->prop.cursor.object = NULL;
404 ee->prop.cursor.layer = 0;
405 ee->prop.cursor.hot.x = 0;
406 ee->prop.cursor.hot.y = 0;
407 return;
408 }
409
410 ee->prop.cursor.object = obj;
411 ee->prop.cursor.layer = layer;
412 ee->prop.cursor.hot.x = hot_x;
413 ee->prop.cursor.hot.y = hot_y;
414 evas_pointer_output_xy_get(ee->evas, &x, &y);
415 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
416 evas_object_move(ee->prop.cursor.object,
417 x - ee->prop.cursor.hot.x,
418 y - ee->prop.cursor.hot.y);
419 evas_object_pass_events_set(ee->prop.cursor.object, 1);
420 if (evas_pointer_inside_get(ee->evas))
421 evas_object_show(ee->prop.cursor.object);
422
423 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
424}
425
426static void
427_ecore_evas_fullscreen_set(Ecore_Evas *ee, int on)
428{
429 Eina_List *l;
430 Ecore_Fb_Input_Device *dev;
431 int resized = 0;
432
433 if (((ee->prop.fullscreen) && (on)) ||
434 ((!ee->prop.fullscreen) && (!on))) return;
435 if (on)
436 {
437 int w, h;
438
439 ee->engine.fb.real_w = ee->w;
440 ee->engine.fb.real_h = ee->h;
441 w = ee->w;
442 h = ee->h;
443 ecore_fb_size_get(&w, &h);
444 if ((w == 0) && (h == 0))
445 {
446 w = ee->w;
447 h = ee->h;
448 }
449 if ((w != ee->w) || (h != ee->h)) resized = 1;
450 ee->w = w;
451 ee->h = h;
452 ee->req.w = ee->w;
453 ee->req.h = ee->h;
454 evas_output_size_set(ee->evas, ee->w, ee->h);
455 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
456 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
457 }
458 else
459 {
460 if ((ee->engine.fb.real_w != ee->w) || (ee->engine.fb.real_h != ee->h)) resized = 1;
461 ee->w = ee->engine.fb.real_w;
462 ee->h = ee->engine.fb.real_h;
463 ee->req.w = ee->w;
464 ee->req.h = ee->h;
465 evas_output_size_set(ee->evas, ee->w, ee->h);
466 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
467 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
468 }
469 ee->prop.fullscreen = on;
470 EINA_LIST_FOREACH(ecore_evas_input_devices, l, dev)
471 ecore_fb_input_device_axis_size_set(dev, ee->w, ee->h);
472 /* rescale the input device area */
473 if (resized)
474 {
475 if (ee->func.fn_resize) ee->func.fn_resize(ee);
476 }
477}
478
479int
480_ecore_evas_fb_shutdown(void)
481{
482 _ecore_evas_init_count--;
483 if (_ecore_evas_init_count == 0)
484 {
485 int i;
486
487 for (i = 0; i < 4; i++)
488 {
489 if (ecore_evas_event_handlers[i])
490 ecore_event_handler_del(ecore_evas_event_handlers[i]);
491 }
492 ecore_fb_ts_shutdown();
493 ecore_event_evas_shutdown();
494 }
495 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
496 return _ecore_evas_init_count;
497}
498
499static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
500{
501 _ecore_evas_fb_free,
502 NULL,
503 NULL,
504 NULL,
505 NULL,
506 NULL,
507 NULL,
508 NULL,
509 NULL,
510 NULL,
511 NULL,
512 NULL,
513 NULL,
514 NULL,
515 NULL,
516 NULL,
517 NULL,
518 _ecore_evas_resize,
519 _ecore_evas_move_resize,
520 _ecore_evas_rotation_set,
521 NULL,
522 _ecore_evas_show,
523 NULL,
524 NULL,
525 NULL,
526 NULL,
527 NULL,
528 NULL,
529 NULL,
530 NULL,
531 NULL,
532 NULL,
533 _ecore_evas_object_cursor_set,
534 NULL,
535 NULL,
536 NULL,
537 NULL,
538 NULL,
539 NULL,
540 _ecore_evas_fullscreen_set,
541 NULL,
542 NULL,
543 NULL,
544 NULL,
545 NULL,
546 NULL, //transparent
547
548 NULL, // render
549 NULL // screen_geometry_get
550};
551#endif
552
553/**
554 * To be documented.
555 *
556 * FIXME: To be fixed.
557 */
558#ifdef BUILD_ECORE_EVAS_FB
559EAPI Ecore_Evas *
560ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
561{
562 Evas_Engine_Info_FB *einfo;
563 Ecore_Evas *ee;
564
565 int rmethod;
566
567 if (!disp_name)
568 disp_name = ecore_evas_default_display;
569
570 rmethod = evas_render_method_lookup("fb");
571 if (!rmethod) return NULL;
572
573 if (!ecore_fb_init(disp_name)) return NULL;
574 ecore_fb_callback_gain_set(_ecore_evas_fb_gain, NULL);
575 ecore_fb_callback_lose_set(_ecore_evas_fb_lose, NULL);
576 ee = calloc(1, sizeof(Ecore_Evas));
577 if (!ee) return NULL;
578
579 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
580
581 _ecore_evas_fb_init(ee, w, h);
582
583 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_fb_engine_func;
584
585 ee->driver = "fb";
586 if (disp_name) ee->name = strdup(disp_name);
587
588 if (w < 1) w = 1;
589 if (h < 1) h = 1;
590 ee->rotation = rotation;
591 ee->visible = 1;
592 ee->w = w;
593 ee->h = h;
594 ee->req.w = ee->w;
595 ee->req.h = ee->h;
596
597 ee->prop.max.w = 0;
598 ee->prop.max.h = 0;
599 ee->prop.layer = 0;
600 ee->prop.focused = 1;
601 ee->prop.borderless = 1;
602 ee->prop.override = 1;
603 ee->prop.maximized = 1;
604 ee->prop.fullscreen = 0;
605 ee->prop.withdrawn = 0;
606 ee->prop.sticky = 0;
607
608 /* init evas here */
609 ee->evas = evas_new();
610 evas_data_attach_set(ee->evas, ee);
611 evas_output_method_set(ee->evas, rmethod);
612
613 if ((rotation == 90) || (rotation == 270))
614 {
615 evas_output_size_set(ee->evas, h, w);
616 evas_output_viewport_set(ee->evas, 0, 0, h, w);
617 }
618 else
619 {
620 evas_output_size_set(ee->evas, w, h);
621 evas_output_viewport_set(ee->evas, 0, 0, w, h);
622 }
623
624 einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
625 if (einfo)
626 {
627 einfo->info.virtual_terminal = 0;
628 einfo->info.device_number = strtol(disp_name, NULL, 10);
629 einfo->info.refresh = 0;
630 einfo->info.rotation = ee->rotation;
631 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
632 {
633 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
634 ecore_evas_free(ee);
635 return NULL;
636 }
637 }
638 else
639 {
640 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
641 ecore_evas_free(ee);
642 return NULL;
643 }
644
645 ecore_evas_input_event_register(ee);
646
647 ee->engine.func->fn_render = _ecore_evas_fb_render;
648 _ecore_evas_register(ee);
649 fb_ee = ee;
650 evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
651 return ee;
652}
653#else
654EAPI Ecore_Evas *
655ecore_evas_fb_new(const char *disp_name __UNUSED__, int rotation __UNUSED__, int w __UNUSED__, int h __UNUSED__)
656{
657 return NULL;
658}
659#endif
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_private.h b/libraries/ecore/src/lib/ecore_evas/ecore_evas_private.h
new file mode 100644
index 0000000..2c20761
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_private.h
@@ -0,0 +1,433 @@
1#ifndef _ECORE_EVAS_PRIVATE_H
2#define _ECORE_EVAS_PRIVATE_H
3
4#ifdef HAVE_CONFIG_H
5# include <config.h>
6#endif
7
8#include <sys/types.h>
9#include <sys/stat.h>
10#include <fcntl.h>
11
12#ifdef HAVE_SYS_MMAN_H
13# include <sys/mman.h>
14#endif
15
16#include <Evas.h>
17#include <Ecore.h>
18#include <ecore_private.h>
19#include <Ecore_Input.h>
20#include <Ecore_Input_Evas.h>
21
22#define ECORE_MAGIC_EVAS 0x76543211
23
24#ifdef BUILD_ECORE_EVAS_X11
25# include <Ecore_X.h>
26# include <Ecore_X_Atoms.h>
27# ifdef HAVE_ECORE_X_XCB
28# include <xcb/xcb.h>
29# endif
30# ifdef HAVE_ECORE_X_XLIB
31# include <X11/Xlib.h>
32# include <X11/Xutil.h>
33# endif
34#endif
35
36#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
37# include <Evas_Engine_Software_X11.h>
38#endif
39
40#ifdef BUILD_ECORE_EVAS_OPENGL_X11
41# include <Evas_Engine_GL_X11.h>
42#endif
43
44#ifdef BUILD_ECORE_EVAS_SOFTWARE_8_X11
45# include <Evas_Engine_Software_8_X11.h>
46#endif
47
48#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_X11
49# include <Evas_Engine_Software_16_X11.h>
50#endif
51
52#ifdef BUILD_ECORE_EVAS_FB
53# include <Evas_Engine_FB.h>
54#endif
55
56#ifdef BUILD_ECORE_EVAS_DIRECTFB
57# include <Evas_Engine_DirectFB.h>
58# include "Ecore_DirectFB.h"
59#endif
60
61#if defined(BUILD_ECORE_EVAS_SOFTWARE_BUFFER) || defined(BUILD_ECORE_EVAS_EWS)
62# include <Evas_Engine_Buffer.h>
63#endif
64
65#ifdef BUILD_ECORE_EVAS_WIN32
66# include "Ecore_Win32.h"
67# ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
68# include <Evas_Engine_Software_Gdi.h>
69# endif
70# ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
71# include <Evas_Engine_Software_DDraw.h>
72# endif
73# ifdef BUILD_ECORE_EVAS_DIRECT3D
74# include <Evas_Engine_Direct3D.h>
75# endif
76# ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
77# include <Evas_Engine_GL_Glew.h>
78# endif
79# ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
80# include <Evas_Engine_Software_16_DDraw.h>
81# endif
82#endif
83
84#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
85# include "Ecore_WinCE.h"
86# include <Evas_Engine_Software_16_WinCE.h>
87#endif
88
89#ifdef BUILD_ECORE_EVAS_GL_COCOA
90# include "Ecore_Cocoa.h"
91# include <Evas_Engine_Gl_Cocoa.h>
92#endif
93
94/**
95 Log domain macros and variable
96 **/
97
98extern int _ecore_evas_log_dom;
99
100#ifdef ECORE_EVAS_DEFAULT_LOG_COLOR
101# undef ECORE_EVAS_DEFAULT_LOG_COLOR
102#endif
103#define ECORE_EVAS_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
104
105#ifdef ERR
106# undef ERR
107#endif
108#define ERR(...) EINA_LOG_DOM_ERR(_ecore_evas_log_dom, __VA_ARGS__)
109#ifdef DBG
110# undef DBG
111#endif
112#define DBG(...) EINA_LOG_DOM_DBG(_ecore_evas_log_dom, __VA_ARGS__)
113#ifdef INF
114# undef INF
115#endif
116#define INF(...) EINA_LOG_DOM_INFO(_ecore_evas_log_dom, __VA_ARGS__)
117#ifdef WRN
118# undef WRN
119#endif
120#define WRN(...) EINA_LOG_DOM_WARN(_ecore_evas_log_dom, __VA_ARGS__)
121#ifdef CRIT
122# undef CRIT
123#endif
124#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_evas_log_dom, __VA_ARGS__)
125
126
127#define IDLE_FLUSH_TIME 0.5
128#ifndef _ECORE_EVAS_H
129typedef struct _Ecore_Evas Ecore_Evas;
130#endif
131
132typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine;
133typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func;
134
135struct _Ecore_Evas_Engine_Func
136{
137 void (*fn_free) (Ecore_Evas *ee);
138 void (*fn_callback_resize_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
139 void (*fn_callback_move_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
140 void (*fn_callback_show_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
141 void (*fn_callback_hide_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
142 void (*fn_callback_delete_request_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
143 void (*fn_callback_destroy_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
144 void (*fn_callback_focus_in_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
145 void (*fn_callback_focus_out_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
146 void (*fn_callback_mouse_in_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
147 void (*fn_callback_mouse_out_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
148 void (*fn_callback_sticky_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
149 void (*fn_callback_unsticky_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
150 void (*fn_callback_pre_render_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
151 void (*fn_callback_post_render_set) (Ecore_Evas *ee, void (*func) (Ecore_Evas *ee));
152 void (*fn_move) (Ecore_Evas *ee, int x, int y);
153 void (*fn_managed_move) (Ecore_Evas *ee, int x, int y);
154 void (*fn_resize) (Ecore_Evas *ee, int w, int h);
155 void (*fn_move_resize) (Ecore_Evas *ee, int x, int y, int w, int h);
156 void (*fn_rotation_set) (Ecore_Evas *ee, int rot, int resize);
157 void (*fn_shaped_set) (Ecore_Evas *ee, int shaped);
158 void (*fn_show) (Ecore_Evas *ee);
159 void (*fn_hide) (Ecore_Evas *ee);
160 void (*fn_raise) (Ecore_Evas *ee);
161 void (*fn_lower) (Ecore_Evas *ee);
162 void (*fn_activate) (Ecore_Evas *ee);
163 void (*fn_title_set) (Ecore_Evas *ee, const char *t);
164 void (*fn_name_class_set) (Ecore_Evas *ee, const char *n, const char *c);
165 void (*fn_size_min_set) (Ecore_Evas *ee, int w, int h);
166 void (*fn_size_max_set) (Ecore_Evas *ee, int w, int h);
167 void (*fn_size_base_set) (Ecore_Evas *ee, int w, int h);
168 void (*fn_size_step_set) (Ecore_Evas *ee, int w, int h);
169 void (*fn_object_cursor_set) (Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
170 void (*fn_layer_set) (Ecore_Evas *ee, int layer);
171 void (*fn_focus_set) (Ecore_Evas *ee, int on);
172 void (*fn_iconified_set) (Ecore_Evas *ee, int on);
173 void (*fn_borderless_set) (Ecore_Evas *ee, int on);
174 void (*fn_override_set) (Ecore_Evas *ee, int on);
175 void (*fn_maximized_set) (Ecore_Evas *ee, int on);
176 void (*fn_fullscreen_set) (Ecore_Evas *ee, int on);
177 void (*fn_avoid_damage_set) (Ecore_Evas *ee, int on);
178 void (*fn_withdrawn_set) (Ecore_Evas *ee, int withdrawn);
179 void (*fn_sticky_set) (Ecore_Evas *ee, int sticky);
180 void (*fn_ignore_events_set) (Ecore_Evas *ee, int ignore);
181 void (*fn_alpha_set) (Ecore_Evas *ee, int alpha);
182 void (*fn_transparent_set) (Ecore_Evas *ee, int transparent);
183
184 int (*fn_render) (Ecore_Evas *ee);
185 void (*fn_screen_geometry_get) (const Ecore_Evas *ee, int *x, int *y, int *w, int *h);
186};
187
188struct _Ecore_Evas_Engine
189{
190 Ecore_Evas_Engine_Func *func;
191
192/* TODO: UGLY! This should be an union or inheritance! */
193#ifdef BUILD_ECORE_EVAS_X11
194 struct
195 {
196 Ecore_X_Window win_root;
197 Eina_List *win_extra;
198 Ecore_X_Pixmap pmap;
199 Ecore_X_Pixmap mask;
200 Ecore_X_GC gc;
201 Ecore_X_XRegion *damages;
202 Ecore_X_Sync_Counter sync_counter;
203 Ecore_X_Window leader;
204 Ecore_X_Sync_Counter netwm_sync_counter;
205 int netwm_sync_val_hi;
206 unsigned int netwm_sync_val_lo;
207 int sync_val; // bigger! this will screw up at 2 billion frames (414 days of continual rendering @ 60fps)
208 int screen_num;
209 int px, py, pw, ph;
210 unsigned char direct_resize : 1;
211 unsigned char using_bg_pixmap : 1;
212 unsigned char managed : 1;
213 unsigned char sync_began : 1;
214 unsigned char sync_cancel : 1;
215 unsigned char netwm_sync_set : 1;
216 unsigned char configure_coming : 1;
217 struct {
218 unsigned char modal : 1;
219 unsigned char sticky : 1;
220 unsigned char maximized_v : 1;
221 unsigned char maximized_h : 1;
222 unsigned char shaded : 1;
223 unsigned char skip_taskbar : 1;
224 unsigned char skip_pager : 1;
225 unsigned char fullscreen : 1;
226 unsigned char above : 1;
227 unsigned char below : 1;
228 } state;
229 Ecore_X_Window win_shaped_input;
230 } x;
231#endif
232#ifdef BUILD_ECORE_EVAS_FB
233 struct {
234 int real_w;
235 int real_h;
236 } fb;
237#endif
238#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
239 struct {
240 void *pixels;
241 Evas_Object *image;
242 void (*free_func) (void *data, void *pix);
243 void *(*alloc_func) (void *data, int size);
244 void *data;
245 } buffer;
246#endif
247#ifdef BUILD_ECORE_EVAS_DIRECTFB
248 struct {
249 Ecore_DirectFB_Window *window;
250 } directfb;
251#endif
252#ifdef BUILD_ECORE_EVAS_WIN32
253 struct {
254 Ecore_Win32_Window *parent;
255 struct {
256 unsigned char region : 1;
257 unsigned char fullscreen : 1;
258 } state;
259 } win32;
260#endif
261#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
262 struct {
263 Ecore_WinCE_Window *window;
264 struct {
265 unsigned char fullscreen : 1;
266 } state;
267 } wince;
268#endif
269#ifdef BUILD_ECORE_EVAS_EWS
270 struct {
271 Evas_Object *image;
272 } ews;
273#endif
274
275 Ecore_Timer *idle_flush_timer;
276};
277
278struct _Ecore_Evas
279{
280 EINA_INLIST;
281 ECORE_MAGIC;
282 Evas *evas;
283 const char *driver;
284 char *name;
285 int x, y, w, h;
286 short rotation;
287 Eina_Bool shaped : 1;
288 Eina_Bool visible : 1;
289 Eina_Bool draw_ok : 1;
290 Eina_Bool should_be_visible : 1;
291 Eina_Bool alpha : 1;
292 Eina_Bool transparent : 1;
293
294 Eina_Hash *data;
295
296 struct {
297 int x, y, w, h;
298 } req;
299
300 struct {
301 int x, y;
302 } mouse;
303
304 struct {
305 int w, h;
306 } expecting_resize;
307
308 struct {
309 char *title;
310 char *name;
311 char *clas;
312 struct {
313 int w, h;
314 } min,
315 max,
316 base,
317 step;
318 struct {
319 Evas_Object *object;
320 int layer;
321 struct {
322 int x, y;
323 } hot;
324 } cursor;
325 int layer;
326 Ecore_Window window;
327 unsigned char avoid_damage;
328 char focused : 1;
329 char iconified : 1;
330 char borderless : 1;
331 char override : 1;
332 char maximized : 1;
333 char fullscreen : 1;
334 char withdrawn : 1;
335 char sticky : 1;
336 char request_pos : 1;
337 } prop;
338
339 struct {
340 void (*fn_resize) (Ecore_Evas *ee);
341 void (*fn_move) (Ecore_Evas *ee);
342 void (*fn_show) (Ecore_Evas *ee);
343 void (*fn_hide) (Ecore_Evas *ee);
344 void (*fn_delete_request) (Ecore_Evas *ee);
345 void (*fn_destroy) (Ecore_Evas *ee);
346 void (*fn_focus_in) (Ecore_Evas *ee);
347 void (*fn_focus_out) (Ecore_Evas *ee);
348 void (*fn_sticky) (Ecore_Evas *ee);
349 void (*fn_unsticky) (Ecore_Evas *ee);
350 void (*fn_mouse_in) (Ecore_Evas *ee);
351 void (*fn_mouse_out) (Ecore_Evas *ee);
352 void (*fn_pre_render) (Ecore_Evas *ee);
353 void (*fn_post_render) (Ecore_Evas *ee);
354 void (*fn_pre_free) (Ecore_Evas *ee);
355 } func;
356
357 Ecore_Evas_Engine engine;
358 Eina_List *sub_ecore_evas;
359
360 int refcount;
361
362 unsigned char ignore_events : 1;
363 unsigned char manual_render : 1;
364 unsigned char registered : 1;
365 unsigned char no_comp_sync : 1;
366 unsigned char semi_sync : 1;
367 unsigned char deleted : 1;
368};
369
370void _ecore_evas_ref(Ecore_Evas *ee);
371void _ecore_evas_unref(Ecore_Evas *ee);
372
373#ifdef BUILD_ECORE_EVAS_X11
374int _ecore_evas_x_shutdown(void);
375#endif
376#ifdef BUILD_ECORE_EVAS_FB
377int _ecore_evas_fb_shutdown(void);
378#endif
379#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
380int _ecore_evas_buffer_shutdown(void);
381int _ecore_evas_buffer_render(Ecore_Evas *ee);
382#endif
383#ifdef BUILD_ECORE_EVAS_DIRECTFB
384int _ecore_evas_directfb_shutdown(void);
385#endif
386#ifdef BUILD_ECORE_EVAS_WIN32
387int _ecore_evas_win32_shutdown(void);
388#endif
389#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
390int _ecore_evas_wince_shutdown(void);
391#endif
392#ifdef BUILD_ECORE_EVAS_EWS
393void _ecore_evas_ews_events_init(void);
394int _ecore_evas_ews_shutdown(void);
395#endif
396
397void _ecore_evas_fps_debug_init(void);
398void _ecore_evas_fps_debug_shutdown(void);
399void _ecore_evas_fps_debug_rendertime_add(double t);
400void _ecore_evas_register(Ecore_Evas *ee);
401void _ecore_evas_free(Ecore_Evas *ee);
402void _ecore_evas_idle_timeout_update(Ecore_Evas *ee);
403void _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp);
404void _ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
405 int x, int y,
406 double radius,
407 double radius_x, double radius_y,
408 double pressure,
409 double angle,
410 double mx, double my,
411 unsigned int timestamp);
412void _ecore_evas_mouse_multi_down_process(Ecore_Evas *ee, int device,
413 int x, int y,
414 double radius,
415 double radius_x, double radius_y,
416 double pressure,
417 double angle,
418 double mx, double my,
419 Evas_Button_Flags flags,
420 unsigned int timestamp);
421void _ecore_evas_mouse_multi_up_process(Ecore_Evas *ee, int device,
422 int x, int y,
423 double radius,
424 double radius_x, double radius_y,
425 double pressure,
426 double angle,
427 double mx, double my,
428 Evas_Button_Flags flags,
429 unsigned int timestamp);
430
431extern Eina_Bool _ecore_evas_app_comp_sync;
432
433#endif
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c
new file mode 100644
index 0000000..0849c79
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_psl1ght.c
@@ -0,0 +1,476 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <Ecore.h>
6#include <Ecore_Input.h>
7#include <Ecore_Input_Evas.h>
8
9#include "ecore_evas_private.h"
10#include "Ecore_Evas.h"
11
12#ifdef BUILD_ECORE_EVAS_PSL1GHT
13#include <Ecore_Psl1ght.h>
14#include <Evas_Engine_PSL1GHT.h>
15
16static int _ecore_evas_init_count = 0;
17
18static Ecore_Evas *psl1ght_ee = NULL;
19static Ecore_Event_Handler *ecore_evas_event_handlers[4] = {
20 NULL, NULL, NULL, NULL
21};
22
23static const char *ecore_evas_psl1ght_default = "EFL PSL1GHT";
24static int _ecore_evas_fps_debug = 0;
25static Ecore_Poller *ecore_evas_event;
26
27static unsigned int
28_ecore_evas_time_get()
29{
30 return (unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff;
31}
32
33static Ecore_Evas *
34_ecore_evas_psl1ght_match(void)
35{
36 return psl1ght_ee;
37}
38
39static Eina_Bool
40_ecore_evas_psl1ght_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
41{
42 Ecore_Evas *ee;
43
44 ee = _ecore_evas_psl1ght_match();
45
46 if (!ee) return ECORE_CALLBACK_PASS_ON;
47 /* pass on event */
48 ee->prop.focused = 1;
49 evas_focus_in(ee->evas);
50 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
51
52 return ECORE_CALLBACK_PASS_ON;
53}
54
55static Eina_Bool
56_ecore_evas_psl1ght_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
57{
58 Ecore_Evas *ee;
59
60 ee = _ecore_evas_psl1ght_match();
61
62 if (!ee) return ECORE_CALLBACK_PASS_ON;
63 /* pass on event */
64 evas_focus_out(ee->evas);
65 ee->prop.focused = 0;
66 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
67
68 return ECORE_CALLBACK_PASS_ON;
69}
70
71static Eina_Bool
72_ecore_evas_psl1ght_event_video_expose(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
73{
74 Ecore_Evas *ee;
75 int w;
76 int h;
77
78 ee = _ecore_evas_psl1ght_match();
79
80 if (!ee) return ECORE_CALLBACK_PASS_ON;
81 evas_output_size_get(ee->evas, &w, &h);
82 evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
83
84 return ECORE_CALLBACK_PASS_ON;
85}
86
87static Eina_Bool
88_ecore_evas_psl1ght_event_key_modifiers(void *data __UNUSED__, int type __UNUSED__, void *event)
89{
90 Ecore_Evas *ee;
91 Ecore_Psl1ght_Event_Key_Modifiers *e = event;
92
93 ee = _ecore_evas_psl1ght_match();
94
95 if (!ee) return ECORE_CALLBACK_PASS_ON;
96 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
97
98 return ECORE_CALLBACK_PASS_ON;
99}
100
101static int
102_ecore_evas_render(Ecore_Evas *ee)
103{
104 Eina_List *updates;
105
106 updates = evas_render_updates(ee->evas);
107 if (updates)
108 {
109 evas_render_updates_free(updates);
110 _ecore_evas_idle_timeout_update(ee);
111 }
112 return updates ? 1 : 0;
113}
114
115static int
116_ecore_evas_psl1ght_render(Ecore_Evas *ee)
117{
118 int rend = 0;
119
120#ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
121 Eina_List *ll;
122 Ecore_Evas *ee2;
123
124 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
125 {
126 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
127 rend |= _ecore_evas_buffer_render(ee2);
128 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
129 }
130#endif
131
132 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
133
134 if (ee->prop.avoid_damage) rend = _ecore_evas_render(ee);
135 else if ((ee->visible) ||
136 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
137 ((ee->should_be_visible) && (ee->prop.override)))
138 rend |= _ecore_evas_render(ee);
139 else
140 evas_norender(ee->evas);
141
142 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
143 return rend;
144}
145
146static Eina_Bool
147_ecore_evas_psl1ght_event(void *data __UNUSED__)
148{
149 ecore_psl1ght_poll_events();
150 return ECORE_CALLBACK_RENEW;
151}
152
153static int
154_ecore_evas_psl1ght_init(int w __UNUSED__, int h __UNUSED__)
155{
156 _ecore_evas_init_count++;
157 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
158
159 _ecore_evas_fps_debug = 1;
160
161 // this is pretty bad: poller? and set poll time? pol time is meant to be
162 // adjustable for things like polling battery state, or amoutn of spare
163 // memory etc.
164 //
165 ecore_evas_event = ecore_poller_add(ECORE_POLLER_CORE, 1, _ecore_evas_psl1ght_event, NULL);
166 ecore_poller_poll_interval_set(ECORE_POLLER_CORE, 0.006);
167
168 if (_ecore_evas_fps_debug)
169 _ecore_evas_fps_debug_init();
170
171 ecore_event_evas_init();
172
173 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_PSL1GHT_EVENT_GOT_FOCUS, _ecore_evas_psl1ght_event_got_focus, NULL);
174 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_PSL1GHT_EVENT_LOST_FOCUS, _ecore_evas_psl1ght_event_lost_focus, NULL);
175 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_PSL1GHT_EVENT_EXPOSE, _ecore_evas_psl1ght_event_video_expose, NULL);
176 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_PSL1GHT_EVENT_KEY_MODIFIERS, _ecore_evas_psl1ght_event_key_modifiers, NULL);
177
178 return _ecore_evas_init_count;
179}
180
181static int
182_ecore_evas_psl1ght_shutdown(void)
183{
184 _ecore_evas_init_count--;
185 if (_ecore_evas_init_count == 0)
186 {
187 unsigned int i;
188
189 for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler *); i++)
190 ecore_event_handler_del(ecore_evas_event_handlers[i]);
191 ecore_event_evas_shutdown();
192 ecore_poller_del(ecore_evas_event);
193 ecore_evas_event = NULL;
194 if (_ecore_evas_fps_debug)
195 _ecore_evas_fps_debug_shutdown();
196 }
197 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
198 return _ecore_evas_init_count;
199}
200
201static void
202_ecore_evas_psl1ght_free(Ecore_Evas *ee)
203{
204 if (psl1ght_ee == ee) psl1ght_ee = NULL;
205
206 ecore_event_window_unregister(0);
207 _ecore_evas_psl1ght_shutdown();
208 ecore_psl1ght_shutdown();
209}
210
211static void
212_ecore_evas_screen_resized(Ecore_Evas *ee)
213{
214 int w, h;
215
216 /* Do not resize if the window is not fullscreen */
217 if (ee->prop.fullscreen == 0) return;
218
219 ecore_psl1ght_screen_resolution_get (&w, &h);
220
221 if (w != ee->w || h != ee->h)
222 {
223 ee->req.w = ee->w = w;
224 ee->req.h = ee->h = h;
225 evas_output_size_set(ee->evas, ee->w, ee->h);
226 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
227 ecore_psl1ght_resolution_set (w, h);
228 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
229
230 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
231 _ecore_evas_time_get());
232 if (ee->func.fn_resize) ee->func.fn_resize(ee);
233 }
234}
235
236static void
237_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
238{
239 if ((w == ee->w) && (h == ee->h)) return;
240 ee->w = w;
241 ee->h = h;
242
243 evas_output_size_set(ee->evas, ee->w, ee->h);
244
245 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
246 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
247
248 ecore_psl1ght_resolution_set (w, h);
249
250 if (ee->func.fn_resize) ee->func.fn_resize(ee);
251
252 _ecore_evas_screen_resized (ee);
253}
254
255static void
256_ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
257{
258 _ecore_evas_resize (ee, w, h);
259}
260
261static void
262_ecore_evas_show(Ecore_Evas *ee)
263{
264 if (ee->prop.focused) return;
265 ee->prop.focused = 1;
266 evas_focus_in(ee->evas);
267 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
268}
269
270static void
271_ecore_evas_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
272{
273 if (x) *x = 0;
274 if (y) *y = 0;
275 ecore_psl1ght_screen_resolution_get (w, h);
276}
277
278static void
279_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
280{
281 Ecore_Evas *ee;
282
283 ee = data;
284 if (ee)
285 ee->prop.cursor.object = NULL;
286}
287
288static void
289_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
290{
291 int x, y;
292
293 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
294
295 if (!obj)
296 {
297 ee->prop.cursor.object = NULL;
298 ee->prop.cursor.layer = 0;
299 ee->prop.cursor.hot.x = 0;
300 ee->prop.cursor.hot.y = 0;
301 return;
302 }
303
304 ee->prop.cursor.object = obj;
305 ee->prop.cursor.layer = layer;
306 ee->prop.cursor.hot.x = hot_x;
307 ee->prop.cursor.hot.y = hot_y;
308 evas_pointer_output_xy_get(ee->evas, &x, &y);
309 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
310 evas_object_move(ee->prop.cursor.object,
311 x - ee->prop.cursor.hot.x,
312 y - ee->prop.cursor.hot.y);
313 evas_object_pass_events_set(ee->prop.cursor.object, 1);
314 if (evas_pointer_inside_get(ee->evas))
315 evas_object_show(ee->prop.cursor.object);
316
317 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
318}
319
320static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
321{
322 _ecore_evas_psl1ght_free,
323 NULL,
324 NULL,
325 NULL,
326 NULL,
327 NULL,
328 NULL,
329 NULL,
330 NULL,
331 NULL,
332 NULL,
333 NULL,
334 NULL,
335 NULL,
336 NULL,
337 NULL,
338 NULL,
339 _ecore_evas_resize,
340 _ecore_evas_move_resize,
341 NULL,
342 NULL,
343 _ecore_evas_show,
344 NULL,
345 NULL,
346 NULL,
347 NULL,
348 NULL,
349 NULL,
350 NULL,
351 NULL,
352 NULL,
353 NULL,
354 _ecore_evas_object_cursor_set,
355 NULL,
356 NULL,
357 NULL,
358 NULL,
359 NULL,
360 NULL,
361 NULL,
362 NULL,
363 NULL,
364 NULL,
365 NULL,
366 NULL,
367 NULL, //transparent
368
369 NULL, // render
370 _ecore_evas_screen_geometry_get // screen_geometry_get
371};
372
373EAPI Ecore_Evas *
374ecore_evas_psl1ght_new(const char *name, int w, int h)
375{
376 void *einfo;
377 Ecore_Evas *ee;
378
379 if (!name)
380 name = ecore_evas_psl1ght_default;
381
382 ee = calloc(1, sizeof(Ecore_Evas));
383 if (!ee) return NULL;
384
385 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
386
387 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_psl1ght_engine_func;
388
389 ee->driver = "psl1ght";
390 if (name) ee->name = strdup(name);
391
392 if (w < 1) w = 1;
393 if (h < 1) h = 1;
394 ee->visible = 1;
395 ee->w = w;
396 ee->h = h;
397
398 ee->prop.max.w = 0;
399 ee->prop.max.h = 0;
400 ee->prop.layer = 0;
401 ee->prop.focused = 1;
402 ee->prop.borderless = 1;
403 ee->prop.override = 1;
404 ee->prop.maximized = 1;
405 ee->prop.fullscreen = 0;
406 ee->prop.withdrawn = 0;
407 ee->prop.sticky = 0;
408 ee->prop.window = 0;
409
410 /* init evas here */
411 ee->evas = evas_new();
412 evas_data_attach_set(ee->evas, ee);
413 evas_output_method_set(ee->evas, evas_render_method_lookup("psl1ght"));
414
415 evas_output_size_set(ee->evas, w, h);
416 evas_output_viewport_set(ee->evas, 0, 0, w, h);
417
418 einfo = evas_engine_info_get(ee->evas);
419 if (einfo)
420 {
421 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
422 {
423 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
424 ecore_evas_free(ee);
425 return NULL;
426 }
427 }
428 else
429 {
430 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
431 ecore_evas_free(ee);
432 return NULL;
433 }
434
435 if (!ecore_psl1ght_init(name))
436 {
437 evas_free(ee->evas);
438 if (ee->name) free(ee->name);
439 free(ee);
440 return NULL;
441 }
442 ecore_psl1ght_resolution_set (w, h);
443
444 _ecore_evas_psl1ght_init(w, h);
445
446 ecore_event_window_register(0, ee, ee->evas,
447 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
448 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
449 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
450 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
451
452 ee->engine.func->fn_render = _ecore_evas_psl1ght_render;
453 _ecore_evas_register(ee);
454
455 psl1ght_ee = ee;
456
457 _ecore_evas_screen_resized (ee);
458
459 if (getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"))
460 ecore_evas_cursor_set(ee, getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"), EVAS_LAYER_MAX, 0, 0);
461
462 evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
463
464 return ee;
465}
466
467#else /* BUILD_ECORE_EVAS_PSL1GHT */
468
469EAPI Ecore_Evas *
470ecore_evas_psl1ght_new(const char *name __UNUSED__, int w __UNUSED__, int h __UNUSED__)
471{
472 ERR("OUTCH !");
473 return NULL;
474}
475
476#endif /* BUILD_ECORE_EVAS_PSL1GHT */
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c
new file mode 100644
index 0000000..b333d96
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c
@@ -0,0 +1,542 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <Ecore.h>
6#include <Ecore_Input.h>
7#include <Ecore_Input_Evas.h>
8#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
9# include <Ecore_Sdl.h>
10# ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
11# include <Evas_Engine_SDL.h>
12# endif
13# ifdef BUILD_ECORE_EVAS_OPENGL_SDL
14# include <Evas_Engine_GL_SDL.h>
15# endif
16#endif
17
18#include "ecore_evas_private.h"
19#include "Ecore_Evas.h"
20
21// fixme: 1 sdl window only at a time? seems wrong
22
23#if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL)
24
25/* static char *ecore_evas_default_display = "0"; */
26/* static Ecore_List *ecore_evas_input_devices = NULL; */
27
28static int _ecore_evas_init_count = 0;
29
30static Ecore_Evas *sdl_ee = NULL;
31static Ecore_Event_Handler *ecore_evas_event_handlers[4] = {
32 NULL, NULL, NULL, NULL
33};
34
35static const char *ecore_evas_sdl_default = "EFL SDL";
36static int _ecore_evas_fps_debug = 0;
37static Ecore_Poller *ecore_evas_event;
38
39static Ecore_Evas *
40_ecore_evas_sdl_match(void)
41{
42 return sdl_ee;
43}
44
45static Eina_Bool
46_ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
47{
48 Ecore_Evas *ee;
49
50 ee = _ecore_evas_sdl_match();
51
52 if (!ee) return ECORE_CALLBACK_PASS_ON;
53 /* pass on event */
54 ee->prop.focused = 1;
55 evas_focus_in(ee->evas);
56 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
57 return ECORE_CALLBACK_PASS_ON;
58}
59
60static Eina_Bool
61_ecore_evas_sdl_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
62{
63 Ecore_Evas *ee;
64
65 ee = _ecore_evas_sdl_match();
66
67 if (!ee) return ECORE_CALLBACK_PASS_ON;
68 /* pass on event */
69 ee->prop.focused = 0;
70 evas_focus_out(ee->evas);
71 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
72 return ECORE_CALLBACK_PASS_ON;
73}
74
75static Eina_Bool
76_ecore_evas_sdl_event_video_resize(void *data __UNUSED__, int type __UNUSED__, void *event)
77{
78 Ecore_Sdl_Event_Video_Resize *e;
79 Ecore_Evas *ee;
80
81 e = event;
82 ee = _ecore_evas_sdl_match();
83
84 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
85 evas_output_size_set(ee->evas, e->w, e->h);
86
87 return ECORE_CALLBACK_PASS_ON;
88}
89
90static Eina_Bool
91_ecore_evas_sdl_event_video_expose(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
92{
93 Ecore_Evas *ee;
94 int w;
95 int h;
96
97 ee = _ecore_evas_sdl_match();
98
99 if (!ee) return ECORE_CALLBACK_PASS_ON;
100 evas_output_size_get(ee->evas, &w, &h);
101 evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
102
103 return ECORE_CALLBACK_PASS_ON;
104}
105
106static int
107_ecore_evas_render(Ecore_Evas *ee)
108{
109 Eina_List *updates;
110
111 updates = evas_render_updates(ee->evas);
112 if (updates)
113 {
114 evas_render_updates_free(updates);
115 _ecore_evas_idle_timeout_update(ee);
116 }
117 return updates ? 1 : 0;
118}
119
120static int
121_ecore_evas_sdl_render(Ecore_Evas *ee)
122{
123 int rend = 0;
124 Eina_List *ll;
125 Ecore_Evas *ee2;
126
127 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
128 {
129 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
130 if (ee2->engine.func->fn_render)
131 rend |= ee2->engine.func->fn_render(ee2);
132 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
133 }
134
135 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
136
137 if (ee->prop.avoid_damage) rend = _ecore_evas_render(ee);
138 else if ((ee->visible) ||
139 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
140 ((ee->should_be_visible) && (ee->prop.override)))
141 rend |= _ecore_evas_render(ee);
142 else
143 evas_norender(ee->evas);
144
145 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
146 return rend;
147}
148
149static Eina_Bool
150_ecore_evas_sdl_event(void *data __UNUSED__)
151{
152 ecore_sdl_feed_events();
153 return ECORE_CALLBACK_RENEW;
154}
155
156static int
157_ecore_evas_sdl_init(int w __UNUSED__, int h __UNUSED__)
158{
159 _ecore_evas_init_count++;
160 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
161
162#ifndef _WIN32
163 if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
164#endif /* _WIN32 */
165 // this is pretty bad: poller? and set poll time? pol time is meant to be
166 // adjustable for things like polling battery state, or amoutn of spare
167 // memory etc.
168 //
169 ecore_evas_event = ecore_poller_add(ECORE_POLLER_CORE, 1, _ecore_evas_sdl_event, NULL);
170 ecore_poller_poll_interval_set(ECORE_POLLER_CORE, 0.006);
171#ifndef _WIN32
172 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
173#endif /* _WIN32 */
174
175 ecore_event_evas_init();
176
177 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_SDL_EVENT_GOT_FOCUS, _ecore_evas_sdl_event_got_focus, NULL);
178 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_SDL_EVENT_LOST_FOCUS, _ecore_evas_sdl_event_lost_focus, NULL);
179 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_SDL_EVENT_RESIZE, _ecore_evas_sdl_event_video_resize, NULL);
180 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_SDL_EVENT_EXPOSE, _ecore_evas_sdl_event_video_expose, NULL);
181
182 return _ecore_evas_init_count;
183}
184
185static int
186_ecore_evas_sdl_shutdown(void)
187{
188 _ecore_evas_init_count--;
189 if (_ecore_evas_init_count == 0)
190 {
191 int i;
192
193 for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++)
194 ecore_event_handler_del(ecore_evas_event_handlers[i]);
195 ecore_event_evas_shutdown();
196 ecore_poller_del(ecore_evas_event);
197 ecore_evas_event = NULL;
198#ifndef _WIN32
199 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
200#endif /* _WIN32 */
201 }
202 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
203 return _ecore_evas_init_count;
204}
205
206static void
207_ecore_evas_sdl_free(Ecore_Evas *ee)
208{
209 if (sdl_ee == ee) sdl_ee = NULL;
210
211 ecore_event_window_unregister(0);
212 _ecore_evas_sdl_shutdown();
213 ecore_sdl_shutdown();
214}
215
216static void
217_ecore_evas_resize(Ecore_Evas *ee, int w, int h)
218{
219 if ((w == ee->w) && (h == ee->h)) return;
220 ee->w = w;
221 ee->h = h;
222
223 evas_output_size_set(ee->evas, ee->w, ee->h);
224 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
225 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
226
227 if (ee->func.fn_resize) ee->func.fn_resize(ee);
228}
229
230static void
231_ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int w, int h)
232{
233 if ((w == ee->w) && (h == ee->h)) return;
234 ee->w = w;
235 ee->h = h;
236
237 evas_output_size_set(ee->evas, ee->w, ee->h);
238 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
239 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
240
241 if (ee->func.fn_resize) ee->func.fn_resize(ee);
242}
243
244static void
245_ecore_evas_show(Ecore_Evas *ee)
246{
247 if (ee->prop.focused) return;
248 ee->prop.focused = 1;
249 evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
250}
251
252static void
253_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
254{
255 Ecore_Evas *ee;
256
257 ee = data;
258 if (ee) ee->prop.cursor.object = NULL;
259}
260
261static void
262_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
263{
264 int x, y;
265
266 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
267
268 if (!obj)
269 {
270 ee->prop.cursor.object = NULL;
271 ee->prop.cursor.layer = 0;
272 ee->prop.cursor.hot.x = 0;
273 ee->prop.cursor.hot.y = 0;
274 return;
275 }
276
277 ee->prop.cursor.object = obj;
278 ee->prop.cursor.layer = layer;
279 ee->prop.cursor.hot.x = hot_x;
280 ee->prop.cursor.hot.y = hot_y;
281 evas_pointer_output_xy_get(ee->evas, &x, &y);
282 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
283 evas_object_move(ee->prop.cursor.object,
284 x - ee->prop.cursor.hot.x,
285 y - ee->prop.cursor.hot.y);
286 evas_object_pass_events_set(ee->prop.cursor.object, 1);
287 if (evas_pointer_inside_get(ee->evas))
288 evas_object_show(ee->prop.cursor.object);
289
290 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
291}
292
293static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
294{
295 _ecore_evas_sdl_free,
296 NULL,
297 NULL,
298 NULL,
299 NULL,
300 NULL,
301 NULL,
302 NULL,
303 NULL,
304 NULL,
305 NULL,
306 NULL,
307 NULL,
308 NULL,
309 NULL,
310 NULL,
311 NULL,
312 _ecore_evas_resize,
313 _ecore_evas_move_resize,
314 NULL,
315 NULL,
316 _ecore_evas_show,
317 NULL,
318 NULL,
319 NULL,
320 NULL,
321 NULL,
322 NULL,
323 NULL,
324 NULL,
325 NULL,
326 NULL,
327 _ecore_evas_object_cursor_set,
328 NULL,
329 NULL,
330 NULL,
331 NULL,
332 NULL,
333 NULL,
334 NULL,
335 NULL,
336 NULL,
337 NULL,
338 NULL,
339 NULL,
340 NULL, //transparent
341
342 NULL, // render
343 NULL // screen_geometry_get
344};
345
346static Ecore_Evas*
347_ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
348{
349 void *einfo;
350 Ecore_Evas *ee;
351
352 if (!name)
353 name = ecore_evas_sdl_default;
354
355 ee = calloc(1, sizeof(Ecore_Evas));
356 if (!ee) return NULL;
357
358 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
359
360 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_sdl_engine_func;
361
362 ee->driver = "sdl";
363 if (name) ee->name = strdup(name);
364
365 if (w < 1) w = 1;
366 if (h < 1) h = 1;
367 ee->visible = 1;
368 ee->w = w;
369 ee->h = h;
370
371 ee->prop.max.w = 0;
372 ee->prop.max.h = 0;
373 ee->prop.layer = 0;
374 ee->prop.focused = 1;
375 ee->prop.borderless = 1;
376 ee->prop.override = 1;
377 ee->prop.maximized = 1;
378 ee->prop.fullscreen = fullscreen;
379 ee->prop.withdrawn = 0;
380 ee->prop.sticky = 0;
381 ee->prop.window = 0;
382
383 /* init evas here */
384 ee->evas = evas_new();
385 evas_data_attach_set(ee->evas, ee);
386 evas_output_method_set(ee->evas, rmethod);
387
388 evas_output_size_set(ee->evas, w, h);
389 evas_output_viewport_set(ee->evas, 0, 0, w, h);
390
391 if (rmethod == evas_render_method_lookup("software_sdl") ||
392 rmethod == evas_render_method_lookup("software_16_sdl") )
393 {
394#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
395 einfo = evas_engine_info_get(ee->evas);
396 if (einfo)
397 {
398 ((Evas_Engine_Info_SDL *)einfo)->info.rotation = 0;
399 ((Evas_Engine_Info_SDL *)einfo)->info.fullscreen = fullscreen;
400 ((Evas_Engine_Info_SDL *)einfo)->info.hwsurface = hwsurface;
401 ((Evas_Engine_Info_SDL *)einfo)->info.noframe = noframe;
402 ((Evas_Engine_Info_SDL *)einfo)->info.alpha = alpha;
403 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
404 {
405 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
406 ecore_evas_free(ee);
407 return NULL;
408 }
409 }
410 else
411 {
412 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
413 ecore_evas_free(ee);
414 return NULL;
415 }
416#endif
417 }
418 else if (rmethod == evas_render_method_lookup("gl_sdl"))
419 {
420#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
421 einfo = evas_engine_info_get(ee->evas);
422 if (einfo)
423 {
424 ((Evas_Engine_Info_GL_SDL *)einfo)->flags.fullscreen = fullscreen;
425 ((Evas_Engine_Info_GL_SDL *)einfo)->flags.noframe = noframe;
426 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
427 {
428 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
429 ecore_evas_free(ee);
430 return NULL;
431 }
432 }
433 else
434 {
435 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
436 ecore_evas_free(ee);
437 return NULL;
438 }
439#endif
440 }
441 else
442 {
443 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
444 ecore_evas_free(ee);
445 return NULL;
446 }
447
448 if (!ecore_sdl_init(name))
449 {
450 evas_free(ee->evas);
451 if (ee->name) free(ee->name);
452 free(ee);
453 return NULL;
454 }
455
456 _ecore_evas_sdl_init(w, h);
457
458 ecore_event_window_register(0, ee, ee->evas,
459 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
460 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
461 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
462 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
463
464 SDL_ShowCursor(SDL_DISABLE);
465
466 ee->engine.func->fn_render = _ecore_evas_sdl_render;
467 _ecore_evas_register(ee);
468
469 sdl_ee = ee;
470 return ee;
471}
472#endif
473
474#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
475EAPI Ecore_Evas*
476ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
477{
478 Ecore_Evas *ee;
479 int rmethod;
480
481 rmethod = evas_render_method_lookup("software_sdl");
482 if (!rmethod) return NULL;
483
484 ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha);
485 ee->driver = "sdl";
486 return ee;
487}
488#else
489EAPI Ecore_Evas*
490ecore_evas_sdl_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int hwsurface __UNUSED__, int noframe __UNUSED__, int alpha __UNUSED__)
491{
492 ERR("OUTCH !");
493 return NULL;
494}
495#endif
496
497#ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL
498EAPI Ecore_Evas*
499ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha)
500{
501 Ecore_Evas *ee;
502 int rmethod;
503
504 rmethod = evas_render_method_lookup("software_16_sdl");
505 if (!rmethod) return NULL;
506
507 ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha);
508 ee->driver = "software_16_sdl";
509 return ee;
510}
511#else
512EAPI Ecore_Evas*
513ecore_evas_sdl16_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int hwsurface __UNUSED__, int noframe __UNUSED__, int alpha __UNUSED__)
514{
515 ERR("OUTCH !");
516 return NULL;
517}
518#endif
519
520#ifdef BUILD_ECORE_EVAS_OPENGL_SDL
521EAPI Ecore_Evas*
522ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe)
523{
524 Ecore_Evas *ee;
525 int rmethod;
526
527 rmethod = evas_render_method_lookup("gl_sdl");
528 if (!rmethod) return NULL;
529
530 ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, 0, noframe, 0);
531 ee->driver = "gl_sdl";
532 return ee;
533}
534#else
535EAPI Ecore_Evas*
536ecore_evas_gl_sdl_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int noframe __UNUSED__)
537{
538 ERR("OUTCH !");
539 return NULL;
540}
541#endif
542
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_util.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_util.c
new file mode 100644
index 0000000..95b6d22
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_util.c
@@ -0,0 +1,437 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6
7#include <Ecore.h>
8#include "ecore_private.h"
9
10#include "ecore_evas_private.h"
11#include "Ecore_Evas.h"
12
13static const char ASSOCIATE_KEY[] = "__Ecore_Evas_Associate";
14
15static void _ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags);
16static void _ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj);
17
18
19static Evas_Object *
20_ecore_evas_associate_get(const Ecore_Evas *ee)
21{
22 return ecore_evas_data_get(ee, ASSOCIATE_KEY);
23}
24
25static void
26_ecore_evas_associate_set(Ecore_Evas *ee, Evas_Object *obj)
27{
28 ecore_evas_data_set(ee, ASSOCIATE_KEY, obj);
29}
30
31static void
32_ecore_evas_associate_del(Ecore_Evas *ee)
33{
34 ecore_evas_data_set(ee, ASSOCIATE_KEY, NULL);
35}
36
37static Ecore_Evas *
38_evas_object_associate_get(const Evas_Object *obj)
39{
40 return evas_object_data_get(obj, ASSOCIATE_KEY);
41}
42
43static void
44_evas_object_associate_set(Evas_Object *obj, Ecore_Evas *ee)
45{
46 evas_object_data_set(obj, ASSOCIATE_KEY, ee);
47}
48
49static void
50_evas_object_associate_del(Evas_Object *obj)
51{
52 evas_object_data_del(obj, ASSOCIATE_KEY);
53}
54
55/** Associated Events: ******************************************************/
56
57/* Interceptors Callbacks */
58
59static void
60_ecore_evas_obj_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y)
61{
62 Ecore_Evas *ee = data;
63 // FIXME: account for frame
64 ecore_evas_move(ee, x, y);
65 if (ecore_evas_override_get(ee)) evas_object_move(obj, x, y);
66}
67
68static void
69_ecore_evas_obj_intercept_raise(void *data, Evas_Object *obj __UNUSED__)
70{
71 Ecore_Evas *ee = data;
72 ecore_evas_raise(ee);
73}
74
75static void
76_ecore_evas_obj_intercept_lower(void *data, Evas_Object *obj __UNUSED__)
77{
78 Ecore_Evas *ee = data;
79 ecore_evas_lower(ee);
80}
81
82static void
83_ecore_evas_obj_intercept_stack_above(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *above __UNUSED__)
84{
85 INF("TODO: %s", __FUNCTION__);
86}
87
88static void
89_ecore_evas_obj_intercept_stack_below(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Evas_Object *below __UNUSED__)
90{
91 INF("TODO: %s", __FUNCTION__);
92}
93
94static void
95_ecore_evas_obj_intercept_layer_set(void *data, Evas_Object *obj __UNUSED__, int l)
96{
97 Ecore_Evas *ee = data;
98 ecore_evas_layer_set(ee, l);
99}
100
101/* Event Callbacks */
102
103static void
104_ecore_evas_obj_callback_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
105{
106 Ecore_Evas *ee = data;
107 ecore_evas_show(ee);
108}
109
110static void
111_ecore_evas_obj_callback_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
112{
113 Ecore_Evas *ee = data;
114 ecore_evas_hide(ee);
115}
116
117static void
118_ecore_evas_obj_callback_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
119{
120 Ecore_Evas *ee = data;
121 Evas_Coord ow, oh, w, h;
122
123 evas_object_geometry_get(obj, NULL, NULL, &ow, &oh);
124 ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
125 /*if ((w != ow) || (h != oh))*/ /* avoid recursion on ecore_evas_resize side */
126 ecore_evas_resize(ee, ow, oh);
127}
128
129static void
130_ecore_evas_obj_callback_changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
131{
132 Ecore_Evas *ee = data;
133 Evas_Coord w, h;
134
135 evas_object_size_hint_min_get(obj, &w, &h);
136 ecore_evas_size_min_set(ee, w, h);
137
138 evas_object_size_hint_max_get(obj, &w, &h);
139 if (w < 1) w = -1;
140 if (h < 1) h = -1;
141 ecore_evas_size_max_set(ee, w, h);
142}
143
144static void
145_ecore_evas_obj_callback_del(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
146{
147 Ecore_Evas *ee = data;
148 _ecore_evas_object_dissociate(ee, obj);
149 ecore_evas_free(ee);
150}
151
152static void
153_ecore_evas_obj_callback_del_dissociate(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
154{
155 Ecore_Evas *ee = data;
156 _ecore_evas_object_dissociate(ee, obj);
157}
158
159static void
160_ecore_evas_delete_request(Ecore_Evas *ee)
161{
162 Evas_Object *obj = _ecore_evas_associate_get(ee);
163 _ecore_evas_object_dissociate(ee, obj);
164 evas_object_del(obj);
165 ecore_evas_free(ee);
166}
167
168static void
169_ecore_evas_destroy(Ecore_Evas *ee)
170{
171 Evas_Object *obj = _ecore_evas_associate_get(ee);
172 if (!obj)
173 return;
174 _ecore_evas_object_dissociate(ee, obj);
175 evas_object_del(obj);
176}
177
178static void
179_ecore_evas_resize(Ecore_Evas *ee)
180{
181 Evas_Object *obj = _ecore_evas_associate_get(ee);
182 Evas_Coord w, h;
183 ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
184 evas_object_resize(obj, w, h);
185}
186
187static void
188_ecore_evas_pre_free(Ecore_Evas *ee)
189{
190 Evas_Object *obj = _ecore_evas_associate_get(ee);
191 if (!obj)
192 return;
193 _ecore_evas_object_dissociate(ee, obj);
194 evas_object_del(obj);
195}
196
197static int
198_ecore_evas_object_evas_check(const char *function, const Ecore_Evas *ee, const Evas_Object *obj)
199{
200 const char *name, *type;
201 Evas *e;
202
203 e = evas_object_evas_get(obj);
204 if (e == ee->evas)
205 return 1;
206
207 name = evas_object_name_get(obj);
208 type = evas_object_type_get(obj);
209
210 ERR("ERROR: %s(): object %p (name=\"%s\", type=\"%s\") evas "
211 "is not the same as this Ecore_Evas evas: %p != %p",
212 function, obj,
213 name ? name : "", type ? type : "", e, ee->evas);
214 fflush(stderr);
215 if (getenv("ECORE_ERROR_ABORT")) abort();
216
217 return 0;
218}
219
220EAPI Eina_Bool
221ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags)
222{
223 Ecore_Evas *old_ee;
224 Evas_Object *old_obj;
225
226 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
227 {
228 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
229 return EINA_FALSE;
230 }
231
232 CHECK_PARAM_POINTER_RETURN("obj", obj, EINA_FALSE);
233 if (!_ecore_evas_object_evas_check(__FUNCTION__, ee, obj))
234 return EINA_FALSE;
235
236 old_ee = _evas_object_associate_get(obj);;
237 if (old_ee)
238 ecore_evas_object_dissociate(old_ee, obj);
239
240 old_obj = _ecore_evas_associate_get(ee);
241 if (old_obj)
242 ecore_evas_object_dissociate(ee, old_obj);
243
244 _ecore_evas_object_associate(ee, obj, flags);
245 return EINA_TRUE;
246}
247
248EAPI Eina_Bool
249ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj)
250{
251 Ecore_Evas *old_ee;
252 Evas_Object *old_obj;
253
254 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
255 {
256 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
257 return EINA_FALSE;
258 }
259
260 CHECK_PARAM_POINTER_RETURN("obj", obj, EINA_FALSE);
261 old_ee = _evas_object_associate_get(obj);
262 if (ee != old_ee) {
263 ERR("ERROR: trying to dissociate object that is not using "
264 "this Ecore_Evas: %p != %p", ee, old_ee);
265 return EINA_FALSE;
266 }
267
268 old_obj = _ecore_evas_associate_get(ee);
269 if (old_obj != obj) {
270 ERR("ERROR: trying to dissociate object that is not being "
271 "used by this Ecore_Evas: %p != %p", old_obj, obj);
272 return EINA_FALSE;
273 }
274
275 _ecore_evas_object_dissociate(ee, obj);
276
277 return EINA_TRUE;
278}
279
280EAPI Evas_Object *
281ecore_evas_object_associate_get(const Ecore_Evas *ee)
282{
283 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
284 {
285 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
286 return NULL;
287 }
288 return _ecore_evas_associate_get(ee);
289}
290
291static void
292_ecore_evas_object_associate(Ecore_Evas *ee, Evas_Object *obj, Ecore_Evas_Object_Associate_Flags flags)
293{
294 evas_object_event_callback_add
295 (obj, EVAS_CALLBACK_SHOW,
296 _ecore_evas_obj_callback_show, ee);
297 evas_object_event_callback_add
298 (obj, EVAS_CALLBACK_HIDE,
299 _ecore_evas_obj_callback_hide, ee);
300 evas_object_event_callback_add
301 (obj, EVAS_CALLBACK_RESIZE,
302 _ecore_evas_obj_callback_resize, ee);
303 evas_object_event_callback_add
304 (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
305 _ecore_evas_obj_callback_changed_size_hints, ee);
306 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_DEL)
307 evas_object_event_callback_add
308 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del, ee);
309 else
310 evas_object_event_callback_add
311 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del_dissociate, ee);
312
313 evas_object_intercept_move_callback_add
314 (obj, _ecore_evas_obj_intercept_move, ee);
315
316 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_STACK)
317 {
318 evas_object_intercept_raise_callback_add
319 (obj, _ecore_evas_obj_intercept_raise, ee);
320 evas_object_intercept_lower_callback_add
321 (obj, _ecore_evas_obj_intercept_lower, ee);
322 evas_object_intercept_stack_above_callback_add
323 (obj, _ecore_evas_obj_intercept_stack_above, ee);
324 evas_object_intercept_stack_below_callback_add
325 (obj, _ecore_evas_obj_intercept_stack_below, ee);
326 }
327
328 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_LAYER)
329 evas_object_intercept_layer_set_callback_add
330 (obj, _ecore_evas_obj_intercept_layer_set, ee);
331
332 if (flags & ECORE_EVAS_OBJECT_ASSOCIATE_DEL)
333 {
334 ecore_evas_callback_delete_request_set(ee, _ecore_evas_delete_request);
335 ecore_evas_callback_destroy_set(ee, _ecore_evas_destroy);
336 }
337 ecore_evas_callback_pre_free_set(ee, _ecore_evas_pre_free);
338 ecore_evas_callback_resize_set(ee, _ecore_evas_resize);
339
340 _evas_object_associate_set(obj, ee);
341 _ecore_evas_associate_set(ee, obj);
342}
343
344static void
345_ecore_evas_object_dissociate(Ecore_Evas *ee, Evas_Object *obj)
346{
347 evas_object_event_callback_del_full
348 (obj, EVAS_CALLBACK_SHOW,
349 _ecore_evas_obj_callback_show, ee);
350 evas_object_event_callback_del_full
351 (obj, EVAS_CALLBACK_HIDE,
352 _ecore_evas_obj_callback_hide, ee);
353 evas_object_event_callback_del_full
354 (obj, EVAS_CALLBACK_RESIZE,
355 _ecore_evas_obj_callback_resize, ee);
356 evas_object_event_callback_del_full
357 (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
358 _ecore_evas_obj_callback_changed_size_hints, ee);
359 evas_object_event_callback_del_full
360 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del, ee);
361 evas_object_event_callback_del_full
362 (obj, EVAS_CALLBACK_DEL, _ecore_evas_obj_callback_del_dissociate, ee);
363
364 evas_object_intercept_move_callback_del
365 (obj, _ecore_evas_obj_intercept_move);
366
367 evas_object_intercept_raise_callback_del
368 (obj, _ecore_evas_obj_intercept_raise);
369 evas_object_intercept_lower_callback_del
370 (obj, _ecore_evas_obj_intercept_lower);
371 evas_object_intercept_stack_above_callback_del
372 (obj, _ecore_evas_obj_intercept_stack_above);
373 evas_object_intercept_stack_below_callback_del
374 (obj, _ecore_evas_obj_intercept_stack_below);
375
376 evas_object_intercept_layer_set_callback_del
377 (obj, _ecore_evas_obj_intercept_layer_set);
378
379 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
380 {
381 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS, __FUNCTION__);
382 }
383 else
384 {
385 if (ee->func.fn_delete_request == _ecore_evas_delete_request)
386 ecore_evas_callback_delete_request_set(ee, NULL);
387 if (ee->func.fn_destroy == _ecore_evas_destroy)
388 ecore_evas_callback_destroy_set(ee, NULL);
389 if (ee->func.fn_resize == _ecore_evas_resize)
390 ecore_evas_callback_resize_set(ee, NULL);
391 if (ee->func.fn_pre_free == _ecore_evas_pre_free)
392 ecore_evas_callback_pre_free_set(ee, NULL);
393
394 _ecore_evas_associate_del(ee);
395 }
396
397 _evas_object_associate_del(obj);
398}
399
400/**
401 * Helper ecore_getopt callback to list available Ecore_Evas engines.
402 *
403 * This will list all available engines except buffer, this is useful
404 * for applications to let user choose how they should create windows
405 * with ecore_evas_new().
406 *
407 * @c callback_data value is used as @c FILE* and says where to output
408 * messages, by default it is @c stdout. You can specify this value
409 * with ECORE_GETOPT_CALLBACK_FULL() or ECORE_GETOPT_CALLBACK_ARGS().
410 *
411 * If there is a boolean storage provided, then it is marked with 1
412 * when this option is executed.
413 */
414unsigned char
415ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc __UNUSED__, const char *str __UNUSED__, void *data, Ecore_Getopt_Value *storage)
416{
417 Eina_List *lst, *n;
418 const char *engine;
419 FILE *fp = data;
420
421 if (!fp)
422 fp = stdout;
423
424 lst = ecore_evas_engines_get();
425
426 fputs("supported engines:\n", fp);
427 EINA_LIST_FOREACH(lst, n, engine)
428 if (strcmp(engine, "buffer") != 0)
429 fprintf(fp, "\t%s\n", engine);
430
431 ecore_evas_engines_free(lst);
432
433 if (storage->boolp)
434 *storage->boolp = 1;
435
436 return 1;
437}
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_win32.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_win32.c
new file mode 100644
index 0000000..2ca7cb0
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_win32.c
@@ -0,0 +1,1451 @@
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include <stdlib.h> /* for NULL */
6
7#include <Ecore.h>
8#include "ecore_private.h"
9#ifdef BUILD_ECORE_EVAS_WIN32
10# define WIN32_LEAN_AND_MEAN
11# include <windows.h>
12# undef WIN32_LEAN_AND_MEAN
13# include <Ecore_Win32.h>
14# include <ecore_win32_private.h>
15#endif /* BUILD_ECORE_EVAS_WIN32 */
16
17#include "ecore_evas_private.h"
18#include "Ecore_Evas.h"
19
20#ifdef BUILD_ECORE_EVAS_WIN32
21
22#define ECORE_EVAS_EVENT_COUNT 10
23
24static int _ecore_evas_init_count = 0;
25
26static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
27
28static Eina_Bool _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
29
30static Eina_Bool _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
31
32static Eina_Bool _ecore_evas_win32_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
33
34static Eina_Bool _ecore_evas_win32_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
35
36static Eina_Bool _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
37
38static Eina_Bool _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
39
40static Eina_Bool _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
41
42static Eina_Bool _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
43
44static Eina_Bool _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
45
46static Eina_Bool _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
47
48/* Private functions */
49
50static int
51_ecore_evas_win32_render(Ecore_Evas *ee)
52{
53 int rend = 0;
54 Eina_List *updates = NULL;
55 Eina_List *ll;
56 Ecore_Evas *ee2;
57
58 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
59 {
60 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
61 if (ee2->engine.func->fn_render)
62 rend |= ee2->engine.func->fn_render(ee2);
63 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
64 }
65
66 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
67 if (ee->prop.avoid_damage)
68 {
69 updates = evas_render_updates(ee->evas);
70 if (updates) evas_render_updates_free(updates);
71 }
72 else if ((ee->visible) ||
73 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
74 ((ee->should_be_visible) && (ee->prop.override)))
75 {
76 if (ee->shaped)
77 {
78 updates = evas_render_updates(ee->evas);
79 if (updates) evas_render_updates_free(updates);
80 }
81 else
82 {
83 updates = evas_render_updates(ee->evas);
84 if (updates) evas_render_updates_free(updates);
85 }
86 }
87 else
88 evas_norender(ee->evas);
89 if (updates) rend = 1;
90 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
91 return rend;
92}
93
94static int
95_ecore_evas_win32_init(void)
96{
97 _ecore_evas_init_count++;
98 if (_ecore_evas_init_count > 1)
99 return _ecore_evas_init_count;
100
101 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_IN, _ecore_evas_win32_event_mouse_in, NULL);
102 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_OUT, _ecore_evas_win32_event_mouse_out, NULL);
103 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, _ecore_evas_win32_event_window_focus_in, NULL);
104 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_win32_event_window_focus_out, NULL);
105 ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, _ecore_evas_win32_event_window_damage, NULL);
106 ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, _ecore_evas_win32_event_window_destroy, NULL);
107 ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_SHOW, _ecore_evas_win32_event_window_show, NULL);
108 ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_HIDE, _ecore_evas_win32_event_window_hide, NULL);
109 ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, _ecore_evas_win32_event_window_configure, NULL);
110 ecore_evas_event_handlers[9] = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_win32_event_window_delete_request, NULL);
111
112 ecore_event_evas_init();
113 return _ecore_evas_init_count;
114}
115
116int
117_ecore_evas_win32_shutdown(void)
118{
119 _ecore_evas_init_count--;
120 if (_ecore_evas_init_count == 0)
121 {
122 int i;
123
124 for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
125 ecore_event_handler_del(ecore_evas_event_handlers[i]);
126 ecore_event_evas_shutdown();
127 }
128
129 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
130
131 return _ecore_evas_init_count;
132}
133
134static Eina_Bool
135_ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
136{
137 Ecore_Evas *ee;
138 Ecore_Win32_Event_Mouse_In *e;
139
140 INF("mouse in");
141
142 e = event;
143 ee = ecore_event_window_match((Ecore_Window)e->window);
144 if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
145 if ((Ecore_Window)e->window != ee->prop.window) return 1;
146
147 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
148 /* FIXME to do */
149/* _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
150 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
151 evas_focus_in(ee->evas);
152 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
153
154 return 1;
155}
156
157static Eina_Bool
158_ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
159{
160 Ecore_Evas *ee;
161 Ecore_Win32_Event_Mouse_Out *e;
162
163 INF("mouse out");
164
165 e = event;
166 ee = ecore_event_window_match((Ecore_Window)e->window);
167 if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
168 if ((Ecore_Window)e->window != ee->prop.window) return 1;
169
170 /* FIXME to do */
171/* _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
172 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
173
174 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
175 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
176 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
177
178 return 1;
179}
180
181static Eina_Bool
182_ecore_evas_win32_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
183{
184 Ecore_Evas *ee;
185 Ecore_Win32_Event_Window_Focus_In *e;
186
187 e = event;
188 ee = ecore_event_window_match((Ecore_Window)e->window);
189 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
190 if ((Ecore_Window)e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
191
192 ee->prop.focused = 1;
193 evas_focus_in(ee->evas);
194 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
195 return ECORE_CALLBACK_PASS_ON;
196}
197
198static Eina_Bool
199_ecore_evas_win32_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
200{
201 Ecore_Evas *ee;
202 Ecore_Win32_Event_Window_Focus_Out *e;
203
204 e = event;
205 ee = ecore_event_window_match((Ecore_Window)e->window);
206 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
207 if ((Ecore_Window)e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
208
209 evas_focus_out(ee->evas);
210 ee->prop.focused = 0;
211 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
212 return ECORE_CALLBACK_PASS_ON;
213}
214
215static Eina_Bool
216_ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
217{
218 Ecore_Evas *ee;
219 Ecore_Win32_Event_Window_Damage *e;
220
221 INF("window damage");
222
223 e = event;
224 ee = ecore_event_window_match((Ecore_Window)e->window);
225 if (!ee) return 1; /* pass on event */
226 if ((Ecore_Window)e->window != ee->prop.window) return 1;
227
228 if (ee->prop.avoid_damage)
229 {
230#ifdef _MSC_VER
231# pragma message ("[ECORE] [WIN32] No Region code")
232#else
233# warning [ECORE] [WIN32] No Region code
234#endif /* ! _MSC_VER */
235 }
236 else
237 {
238 if (ee->rotation == 0)
239 evas_damage_rectangle_add(ee->evas,
240 e->x,
241 e->y,
242 e->width,
243 e->height);
244 else if (ee->rotation == 90)
245 evas_damage_rectangle_add(ee->evas,
246 ee->h - e->y - e->height,
247 e->x,
248 e->height,
249 e->width);
250 else if (ee->rotation == 180)
251 evas_damage_rectangle_add(ee->evas,
252 ee->w - e->x - e->width,
253 ee->h - e->y - e->height,
254 e->width,
255 e->height);
256 else if (ee->rotation == 270)
257 evas_damage_rectangle_add(ee->evas,
258 e->y,
259 ee->w - e->x - e->width,
260 e->height,
261 e->width);
262 }
263
264 return 1;
265}
266
267static Eina_Bool
268_ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
269{
270 Ecore_Evas *ee;
271 Ecore_Win32_Event_Window_Destroy *e;
272
273 INF("window destroy");
274
275 e = event;
276 ee = ecore_event_window_match((Ecore_Window)e->window);
277 if (!ee) return 1; /* pass on event */
278 if ((Ecore_Window)e->window != ee->prop.window) return 1;
279 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
280 ecore_evas_free(ee);
281
282 return 1;
283}
284
285static Eina_Bool
286_ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
287{
288 Ecore_Evas *ee;
289 Ecore_Win32_Event_Window_Show *e;
290
291 INF("window show");
292
293 e = event;
294 ee = ecore_event_window_match((Ecore_Window)e->window);
295 if (!ee) return 1; /* pass on event */
296 if ((Ecore_Window)e->window != ee->prop.window) return 1;
297 if (ee->visible) return 0; /* dont pass it on */
298 ee->visible = 1;
299 if (ee->func.fn_show) ee->func.fn_show(ee);
300
301 return 1;
302}
303
304static Eina_Bool
305_ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
306{
307 Ecore_Evas *ee;
308 Ecore_Win32_Event_Window_Hide *e;
309
310 INF("window hide");
311
312 e = event;
313 ee = ecore_event_window_match((Ecore_Window)e->window);
314 if (!ee) return 1; /* pass on event */
315 if ((Ecore_Window)e->window != ee->prop.window) return 1;
316 if (!ee->visible) return 0; /* dont pass it on */
317 ee->visible = 0;
318 if (ee->func.fn_hide) ee->func.fn_hide(ee);
319
320 return 1;
321}
322
323static Eina_Bool
324_ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
325{
326 Ecore_Evas *ee;
327 Ecore_Win32_Event_Window_Configure *e;
328
329 INF("window configure");
330
331 e = event;
332 ee = ecore_event_window_match((Ecore_Window)e->window);
333 if (!ee) return 1; /* pass on event */
334 if ((Ecore_Window)e->window != ee->prop.window) return 1;
335
336 if ((ee->x != e->x) || (ee->y != e->y))
337 {
338 ee->x = e->x;
339 ee->y = e->y;
340 ee->req.x = ee->x;
341 ee->req.y = ee->y;
342
343 if (ee->func.fn_move) ee->func.fn_move(ee);
344 }
345
346 if ((ee->w != e->width) || (ee->h != e->height))
347 {
348 ee->w = e->width;
349 ee->h = e->height;
350 ee->req.w = ee->w;
351 ee->req.h = ee->h;
352
353 if ((ee->rotation == 90) || (ee->rotation == 270))
354 {
355 evas_output_size_set(ee->evas, ee->h, ee->w);
356 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
357 }
358 else
359 {
360 evas_output_size_set(ee->evas, ee->w, ee->h);
361 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
362 }
363 if (ee->prop.avoid_damage)
364 {
365 int pdam;
366
367 pdam = ecore_evas_avoid_damage_get(ee);
368 ecore_evas_avoid_damage_set(ee, 0);
369 ecore_evas_avoid_damage_set(ee, pdam);
370 }
371/* if (ee->shaped) */
372/* _ecore_evas_win32_region_border_resize(ee); */
373 if ((ee->expecting_resize.w > 0) &&
374 (ee->expecting_resize.h > 0))
375 {
376 if ((ee->expecting_resize.w == ee->w) &&
377 (ee->expecting_resize.h == ee->h))
378 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
379 ecore_win32_current_time_get());
380 ee->expecting_resize.w = 0;
381 ee->expecting_resize.h = 0;
382 }
383 if (ee->func.fn_resize) ee->func.fn_resize(ee);
384 }
385
386 return 1;
387}
388
389static Eina_Bool
390_ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
391{
392 Ecore_Evas *ee;
393 Ecore_Win32_Event_Window_Delete_Request *e;
394
395 INF("window delete request");
396
397 e = event;
398 ee = ecore_event_window_match((Ecore_Window)e->window);
399 if (!ee) return 1; /* pass on event */
400 if ((Ecore_Window)e->window != ee->prop.window) return 1;
401 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
402
403 INF(" * ee event delete\n");
404 return 1;
405}
406
407
408/* Ecore_Evas interface */
409
410static void
411_ecore_evas_win32_free(Ecore_Evas *ee)
412{
413 INF("ecore evas free");
414
415 ecore_win32_window_free((struct _Ecore_Win32_Window *)ee->prop.window);
416 ecore_event_window_unregister(ee->prop.window);
417 _ecore_evas_win32_shutdown();
418 ecore_win32_shutdown();
419}
420
421static void
422_ecore_evas_win32_callback_delete_request_set(Ecore_Evas *ee,
423 void (*func) (Ecore_Evas *ee))
424{
425 ee->func.fn_delete_request = func;
426}
427
428static void
429_ecore_evas_win32_move(Ecore_Evas *ee, int x, int y)
430{
431 INF("ecore evas move (%dx%d)", x, y);
432 ee->req.x = x;
433 ee->req.y = y;
434
435 if ((x != ee->x) || (y != ee->y))
436 {
437 ee->x = x;
438 ee->y = y;
439 ecore_win32_window_move((struct _Ecore_Win32_Window *)ee->prop.window,
440 x, y);
441 if (ee->func.fn_move) ee->func.fn_move(ee);
442 }
443}
444
445static void
446_ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
447{
448 INF("ecore evas resize (%dx%d)", width, height);
449 ee->req.w = width;
450 ee->req.h = height;
451
452 if ((ee->w != width) || (ee->h != height))
453 {
454 ee->w = width;
455 ee->h = height;
456 ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
457 width, height);
458 if ((ee->rotation == 90) || (ee->rotation == 270))
459 {
460 evas_output_size_set(ee->evas, ee->h, ee->w);
461 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
462 }
463 else
464 {
465 evas_output_size_set(ee->evas, ee->w, ee->h);
466 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
467 }
468 if (ee->prop.avoid_damage)
469 {
470 int pdam;
471
472 pdam = ecore_evas_avoid_damage_get(ee);
473 ecore_evas_avoid_damage_set(ee, 0);
474 ecore_evas_avoid_damage_set(ee, pdam);
475 }
476/* if ((ee->shaped) || (ee->alpha)) */
477/* _ecore_evas_win32_region_border_resize(ee); */
478 if (ee->func.fn_resize) ee->func.fn_resize(ee);
479 }
480}
481
482static void
483_ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
484{
485 INF("ecore evas resize (%dx%d %dx%d)", x, y, width, height);
486 ee->req.x = x;
487 ee->req.y = y;
488 ee->req.w = width;
489 ee->req.h = height;
490
491 if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
492 {
493 int change_size = 0;
494 int change_pos = 0;
495
496 if ((ee->w != width) || (ee->h != height)) change_size = 1;
497 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
498
499 ee->x = x;
500 ee->y = y;
501 ee->w = width;
502 ee->h = height;
503 ecore_win32_window_move_resize((struct _Ecore_Win32_Window *)ee->prop.window,
504 x, y, width, height);
505 if ((ee->rotation == 90) || (ee->rotation == 270))
506 {
507 evas_output_size_set(ee->evas, ee->h, ee->w);
508 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
509 }
510 else
511 {
512 evas_output_size_set(ee->evas, ee->w, ee->h);
513 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
514 }
515 if (ee->prop.avoid_damage)
516 {
517 int pdam;
518
519 pdam = ecore_evas_avoid_damage_get(ee);
520 ecore_evas_avoid_damage_set(ee, 0);
521 ecore_evas_avoid_damage_set(ee, pdam);
522 }
523/* if ((ee->shaped) || (ee->alpha)) */
524/* _ecore_evas_win32_region_border_resize(ee); */
525 if (change_pos)
526 {
527 if (ee->func.fn_move) ee->func.fn_move(ee);
528 }
529 if (change_size)
530 {
531 if (ee->func.fn_resize) ee->func.fn_resize(ee);
532 }
533 }
534}
535
536static void
537_ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
538{
539 int rot_dif;
540
541 rot_dif = ee->rotation - rotation;
542 if (rot_dif < 0) rot_dif = -rot_dif;
543
544 if (rot_dif != 180)
545 {
546 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
547
548 if (!ee->prop.fullscreen)
549 {
550 ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
551 ee->h, ee->w);
552 ee->expecting_resize.w = ee->h;
553 ee->expecting_resize.h = ee->w;
554 }
555 else
556 {
557 int w, h;
558
559 ecore_win32_window_size_get((struct _Ecore_Win32_Window *)ee->prop.window,
560 &w, &h);
561 ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
562 h, w);
563 if ((rotation == 0) || (rotation == 180))
564 {
565 evas_output_size_set(ee->evas, ee->w, ee->h);
566 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
567 }
568 else
569 {
570 evas_output_size_set(ee->evas, ee->h, ee->w);
571 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
572 }
573 if (ee->func.fn_resize) ee->func.fn_resize(ee);
574 }
575 ecore_evas_size_min_get(ee, &minw, &minh);
576 ecore_evas_size_max_get(ee, &maxw, &maxh);
577 ecore_evas_size_base_get(ee, &basew, &baseh);
578 ecore_evas_size_step_get(ee, &stepw, &steph);
579 ee->rotation = rotation;
580 ecore_evas_size_min_set(ee, minh, minw);
581 ecore_evas_size_max_set(ee, maxh, maxw);
582 ecore_evas_size_base_set(ee, baseh, basew);
583 ecore_evas_size_step_set(ee, steph, stepw);
584 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
585 ecore_win32_current_time_get());
586 }
587 else
588 {
589 ee->rotation = rotation;
590 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
591 ecore_win32_current_time_get());
592 if (ee->func.fn_resize) ee->func.fn_resize(ee);
593 }
594
595 if ((ee->rotation == 90) || (ee->rotation == 270))
596 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
597 else
598 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
599}
600
601static void
602_ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation, int resize)
603{
604 INF("ecore evas rotation: %s", rotation ? "yes" : "no");
605
606 if (ee->rotation == rotation) return;
607
608#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
609 if (!strcmp(ee->driver, "software_gdi"))
610 {
611 Evas_Engine_Info_Software_Gdi *einfo;
612
613 einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
614 if (!einfo) return;
615 einfo->info.rotation = rotation;
616 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
617 {
618 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
619 }
620 _ecore_evas_win32_rotation_set_internal(ee, rotation);
621 }
622#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
623
624#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
625 if (!strcmp(ee->driver, "software_ddraw"))
626 {
627 Evas_Engine_Info_Software_DDraw *einfo;
628
629 einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
630 if (!einfo) return;
631 einfo->info.rotation = rotation;
632 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
633 {
634 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
635 }
636 _ecore_evas_win32_rotation_set_internal(ee, rotation);
637 }
638#endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
639}
640
641static void
642_ecore_evas_win32_shaped_set(Ecore_Evas *ee, int shaped)
643{
644 if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
645 return;
646
647 if (!strcmp(ee->driver, "software_ddraw")) return;
648
649#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
650 if (!strcmp(ee->driver, "software_gdi"))
651 {
652 Evas_Engine_Info_Software_Gdi *einfo;
653
654 einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
655 ee->shaped = shaped;
656 if (einfo)
657 {
658 ee->engine.win32.state.region = ee->shaped;
659 einfo->info.region = ee->engine.win32.state.region;
660 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
661 {
662 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
663 }
664 if (ee->shaped)
665 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
666 }
667#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
668 }
669}
670
671static void
672_ecore_evas_win32_show(Ecore_Evas *ee)
673{
674 INF("ecore evas show");
675
676 ee->should_be_visible = 1;
677 if (ee->prop.avoid_damage)
678 _ecore_evas_win32_render(ee);
679 ecore_win32_window_show((struct _Ecore_Win32_Window *)ee->prop.window);
680/* if (ee->prop.fullscreen) */
681/* ecore_win32_window_focus(ee->prop.window); */
682}
683
684static void
685_ecore_evas_win32_hide(Ecore_Evas *ee)
686{
687 INF("ecore evas hide");
688
689 ecore_win32_window_hide((struct _Ecore_Win32_Window *)ee->prop.window);
690 ee->should_be_visible = 0;
691}
692
693static void
694_ecore_evas_win32_raise(Ecore_Evas *ee)
695{
696 INF("ecore evas raise");
697
698 if (!ee->prop.fullscreen)
699 ecore_win32_window_raise((struct _Ecore_Win32_Window *)ee->prop.window);
700 else
701 ecore_win32_window_raise((struct _Ecore_Win32_Window *)ee->prop.window);
702}
703
704static void
705_ecore_evas_win32_lower(Ecore_Evas *ee)
706{
707 INF("ecore evas lower");
708
709 if (!ee->prop.fullscreen)
710 ecore_win32_window_lower((struct _Ecore_Win32_Window *)ee->prop.window);
711 else
712 ecore_win32_window_lower((struct _Ecore_Win32_Window *)ee->prop.window);
713}
714
715static void
716_ecore_evas_win32_activate(Ecore_Evas *ee)
717{
718 INF("ecore evas activate");
719
720 ecore_win32_window_focus_set((struct _Ecore_Win32_Window *)ee->prop.window);
721}
722
723static void
724_ecore_evas_win32_title_set(Ecore_Evas *ee, const char *title)
725{
726 INF("ecore evas title set");
727
728 if (ee->prop.title) free(ee->prop.title);
729 ee->prop.title = NULL;
730 if (title) ee->prop.title = strdup(title);
731 ecore_win32_window_title_set((struct _Ecore_Win32_Window *)ee->prop.window,
732 ee->prop.title);
733}
734
735static void
736_ecore_evas_win32_size_min_set(Ecore_Evas *ee, int width, int height)
737{
738 if (width < 0) width = 0;
739 if (height < 0) height = 0;
740 if ((ee->prop.min.w == width) && (ee->prop.min.h == height)) return;
741 ee->prop.min.w = width;
742 ee->prop.min.h = height;
743 ecore_win32_window_size_min_set((struct _Ecore_Win32_Window *)ee->prop.window,
744 width, height);
745}
746
747static void
748_ecore_evas_win32_size_max_set(Ecore_Evas *ee, int width, int height)
749{
750 if (width < 0) width = 0;
751 if (height < 0) height = 0;
752 if ((ee->prop.max.w == width) && (ee->prop.max.h == height)) return;
753 ee->prop.max.w = width;
754 ee->prop.max.h = height;
755 ecore_win32_window_size_max_set((struct _Ecore_Win32_Window *)ee->prop.window,
756 width, height);
757}
758
759static void
760_ecore_evas_win32_size_base_set(Ecore_Evas *ee, int width, int height)
761{
762 if (width < 0) width = 0;
763 if (height < 0) height = 0;
764 if ((ee->prop.base.w == width) && (ee->prop.base.h == height)) return;
765 ee->prop.base.w = width;
766 ee->prop.base.h = height;
767 ecore_win32_window_size_base_set((struct _Ecore_Win32_Window *)ee->prop.window,
768 width, height);
769}
770
771static void
772_ecore_evas_win32_size_step_set(Ecore_Evas *ee, int width, int height)
773{
774 if (width < 1) width = 1;
775 if (height < 1) height = 1;
776 if ((ee->prop.step.w == width) && (ee->prop.step.h == height)) return;
777 ee->prop.step.w = width;
778 ee->prop.step.h = height;
779 ecore_win32_window_size_step_set((struct _Ecore_Win32_Window *)ee->prop.window,
780 width, height);
781}
782
783static void
784_ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
785{
786#if 0
787 int x, y;
788
789 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
790
791 if (obj == NULL)
792 {
793 ee->prop.cursor.object = NULL;
794 ee->prop.cursor.layer = 0;
795 ee->prop.cursor.hot.x = 0;
796 ee->prop.cursor.hot.y = 0;
797 ecore_win32_window_cursor_show(ee->prop.window, 1);
798 return;
799 }
800
801 ee->prop.cursor.object = obj;
802 ee->prop.cursor.layer = layer;
803 ee->prop.cursor.hot.x = hot_x;
804 ee->prop.cursor.hot.y = hot_y;
805
806 ecore_win32_window_cursor_show(ee->prop.window, 0);
807
808 evas_pointer_output_xy_get(ee->evas, &x, &y);
809 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
810 evas_object_move(ee->prop.cursor.object,
811 x - ee->prop.cursor.hot.x,
812 y - ee->prop.cursor.hot.y);
813 evas_object_pass_events_set(ee->prop.cursor.object, 1);
814 if (evas_pointer_inside_get(ee->evas))
815 evas_object_show(ee->prop.cursor.object);
816#endif
817}
818
819static void
820_ecore_evas_win32_focus_set(Ecore_Evas *ee, int on __UNUSED__)
821{
822 ecore_win32_window_focus_set((struct _Ecore_Win32_Window *)ee->prop.window);
823}
824
825static void
826_ecore_evas_win32_iconified_set(Ecore_Evas *ee, int on)
827{
828/* if (((ee->prop.borderless) && (on)) || */
829/* ((!ee->prop.borderless) && (!on))) return; */
830 ee->prop.iconified = on;
831 ecore_win32_window_iconified_set((struct _Ecore_Win32_Window *)ee->prop.window,
832 ee->prop.iconified);
833}
834
835static void
836_ecore_evas_win32_borderless_set(Ecore_Evas *ee, int on)
837{
838 if (((ee->prop.borderless) && (on)) ||
839 ((!ee->prop.borderless) && (!on))) return;
840 ee->prop.borderless = on;
841 ecore_win32_window_borderless_set((struct _Ecore_Win32_Window *)ee->prop.window,
842 ee->prop.borderless);
843
844#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
845 if (!strcmp(ee->driver, "software_gdi"))
846 {
847 Evas_Engine_Info_Software_Gdi *einfo;
848
849 einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
850 if (einfo)
851 {
852 einfo->info.borderless = ee->prop.borderless;
853 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
854 {
855 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
856 }
857 if (ee->prop.borderless)
858 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
859 }
860 }
861#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
862}
863
864static void
865_ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
866{
867 struct _Ecore_Win32_Window *window;
868
869 INF("ecore evas fullscreen set");
870
871 if ((ee->engine.win32.state.fullscreen && on) ||
872 (!ee->engine.win32.state.fullscreen && !on))
873 return;
874
875 ee->engine.win32.state.fullscreen = on;
876 ee->prop.fullscreen = on;
877
878 window = (struct _Ecore_Win32_Window *)ee->prop.window;
879
880 if (on != 0)
881 {
882 ecore_win32_window_shape_set((struct _Ecore_Win32_Window *)ee->prop.window,
883 0, 0, NULL);
884 ecore_win32_window_fullscreen_set((struct _Ecore_Win32_Window *)ee->prop.window,
885 on);
886 }
887 else
888 {
889 ecore_win32_window_fullscreen_set(window, on);
890 ecore_win32_window_shape_set(window,
891 window->shape.width,
892 window->shape.height,
893 window->shape.mask);
894 }
895
896 /* Nothing to be done for the GDI backend at the evas level */
897
898#ifdef BUILD_ECORE_EVAS_SOFTWRE_DDRAW
899 if (strcmp(ee->driver, "software_ddraw") == 0)
900 {
901 Evas_Engine_Info_Software_DDraw *einfo;
902
903 einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ecore_evas_get(ee));
904 if (einfo)
905 {
906 einfo->info.fullscreen = !!on;
907/* einfo->info.layered = window->shape.layered; */
908 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
909 {
910 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
911 }
912 }
913 }
914#endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
915
916#ifdef BUILD_ECORE_EVAS_DIRECT3D
917 if (strcmp(ee->driver, "direct3d") == 0)
918 {
919 Evas_Engine_Info_Direct3D *einfo;
920
921 einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ecore_evas_get(ee));
922 if (einfo)
923 {
924 einfo->info.fullscreen = !!on;
925 einfo->info.layered = window->shape.layered;
926 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
927 {
928 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
929 }
930 }
931 }
932#endif /* BUILD_ECORE_EVAS_DIRECT3D */
933}
934
935
936static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
937{
938 _ecore_evas_win32_free,
939 NULL,
940 NULL,
941 NULL,
942 NULL,
943 _ecore_evas_win32_callback_delete_request_set,
944 NULL,
945 NULL,
946 NULL,
947 NULL,
948 NULL,
949 NULL,
950 NULL,
951 NULL,
952 NULL,
953 _ecore_evas_win32_move,
954 NULL,
955 _ecore_evas_win32_resize,
956 _ecore_evas_win32_move_resize,
957 _ecore_evas_win32_rotation_set,
958 _ecore_evas_win32_shaped_set,
959 _ecore_evas_win32_show,
960 _ecore_evas_win32_hide,
961 _ecore_evas_win32_raise,
962 _ecore_evas_win32_lower,
963 _ecore_evas_win32_activate,
964 _ecore_evas_win32_title_set,
965 NULL, /* _ecore_evas_x_name_class_set */
966 _ecore_evas_win32_size_min_set,
967 _ecore_evas_win32_size_max_set,
968 _ecore_evas_win32_size_base_set,
969 _ecore_evas_win32_size_step_set,
970 _ecore_evas_win32_cursor_set,
971 NULL, /* _ecore_evas_x_layer_set */
972 _ecore_evas_win32_focus_set,
973 _ecore_evas_win32_iconified_set,
974 _ecore_evas_win32_borderless_set,
975 NULL, /* _ecore_evas_x_override_set */
976 NULL,
977 _ecore_evas_win32_fullscreen_set,
978 NULL, /* _ecore_evas_x_avoid_damage_set */
979 NULL, /* _ecore_evas_x_withdrawn_set */
980 NULL, /* _ecore_evas_x_sticky_set */
981 NULL, /* _ecore_evas_x_ignore_events_set */
982 NULL, /* _ecore_evas_x_alpha_set */
983 NULL, //transparent
984
985 NULL, // render
986 NULL //screen_geometry_get
987};
988
989#endif /* BUILD_ECORE_EVAS_WIN32 */
990
991/* API */
992
993#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
994static int
995_ecore_evas_engine_software_gdi_init(Ecore_Evas *ee)
996{
997 Evas_Engine_Info_Software_Gdi *einfo;
998 const char *driver;
999 int rmethod;
1000
1001 driver = "software_gdi";
1002
1003 rmethod = evas_render_method_lookup(driver);
1004 if (!rmethod)
1005 return 0;
1006
1007 ee->driver = driver;
1008 evas_output_method_set(ee->evas, rmethod);
1009
1010 einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
1011 if (einfo)
1012 {
1013 /* FIXME: REDRAW_DEBUG missing for now */
1014 einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1015 einfo->info.depth = ecore_win32_screen_depth_get();
1016 einfo->info.rotation = 0;
1017 einfo->info.borderless = 0;
1018 einfo->info.fullscreen = 0;
1019 einfo->info.region = 0;
1020 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1021 {
1022 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1023 return 0;
1024 }
1025 }
1026 else
1027 {
1028 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1029 return 0;
1030 }
1031
1032 return 1;
1033}
1034#endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
1035
1036#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1037static int
1038_ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
1039{
1040 Evas_Engine_Info_Software_DDraw *einfo;
1041 const char *driver;
1042 int rmethod;
1043
1044 driver = "software_ddraw";
1045
1046 rmethod = evas_render_method_lookup(driver);
1047 if (!rmethod)
1048 return 0;
1049
1050 ee->driver = driver;
1051 evas_output_method_set(ee->evas, rmethod);
1052
1053 einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
1054 if (einfo)
1055 {
1056 /* FIXME: REDRAW_DEBUG missing for now */
1057 einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1058 einfo->info.depth = ecore_win32_screen_depth_get();
1059 einfo->info.rotation = 0;
1060 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1061 {
1062 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1063 return 0;
1064 }
1065 }
1066 else
1067 {
1068 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1069 return 0;
1070 }
1071
1072 return 1;
1073}
1074#endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1075
1076#ifdef BUILD_ECORE_EVAS_DIRECT3D
1077static int
1078_ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
1079{
1080 Evas_Engine_Info_Direct3D *einfo;
1081 const char *driver;
1082 int rmethod;
1083
1084 driver = "direct3d";
1085
1086 rmethod = evas_render_method_lookup(driver);
1087 if (!rmethod)
1088 return 0;
1089
1090 ee->driver = driver;
1091 evas_output_method_set(ee->evas, rmethod);
1092
1093 einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ee->evas);
1094 if (einfo)
1095 {
1096 /* FIXME: REDRAW_DEBUG missing for now */
1097 einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1098 einfo->info.depth = ecore_win32_screen_depth_get();
1099 einfo->info.rotation = 0;
1100 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1101 {
1102 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1103 return 0;
1104 }
1105 }
1106 else
1107 {
1108 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1109 return 0;
1110 }
1111
1112 return 1;
1113}
1114#endif /* BUILD_ECORE_EVAS_DIRECT3D */
1115
1116#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1117static int
1118_ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
1119{
1120 Evas_Engine_Info_GL_Glew *einfo;
1121 const char *driver;
1122 int rmethod;
1123
1124 driver = "gl_glew";
1125
1126 rmethod = evas_render_method_lookup(driver);
1127 if (!rmethod)
1128 return 0;
1129
1130 ee->driver = driver;
1131 evas_output_method_set(ee->evas, rmethod);
1132
1133 einfo = (Evas_Engine_Info_GL_Glew *)evas_engine_info_get(ee->evas);
1134 if (einfo)
1135 {
1136 /* FIXME: REDRAW_DEBUG missing for now */
1137 einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1138 einfo->info.depth = ecore_win32_screen_depth_get();
1139 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1140 {
1141 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1142 return 0;
1143 }
1144 }
1145 else
1146 {
1147 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1148 return 0;
1149 }
1150
1151 return 1;
1152}
1153#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1154
1155#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
1156static int
1157_ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
1158{
1159 Evas_Engine_Info_Software_DDraw *einfo;
1160 const char *driver;
1161 int rmethod;
1162
1163 driver = "software_16_ddraw";
1164
1165 rmethod = evas_render_method_lookup(driver);
1166 if (!rmethod)
1167 return 0;
1168
1169 ee->driver = driver;
1170 evas_output_method_set(ee->evas, rmethod);
1171
1172 if (ecore_win32_screen_depth_get() != 16)
1173 return 0;
1174
1175 einfo = (Evas_Engine_Info_Software_16_DDraw *)evas_engine_info_get(ee->evas);
1176 if (einfo)
1177 {
1178 /* FIXME: REDRAW_DEBUG missing for now */
1179 einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1180 einfo->info.depth = ecore_win32_screen_depth_get();
1181 einfo->info.rotation = 0;
1182 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1183 {
1184 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1185 return 0;
1186 }
1187 }
1188 else
1189 {
1190 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1191 return 0;
1192 }
1193
1194 return 1;
1195}
1196#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
1197
1198#ifdef BUILD_ECORE_EVAS_WIN32
1199static Ecore_Evas *
1200_ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
1201 Ecore_Win32_Window *parent,
1202 int x,
1203 int y,
1204 int width,
1205 int height)
1206{
1207 Ecore_Evas *ee;
1208
1209 if (!ecore_win32_init())
1210 return NULL;
1211
1212 ee = calloc(1, sizeof(Ecore_Evas));
1213 if (!ee)
1214 return NULL;
1215
1216 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1217
1218 _ecore_evas_win32_init();
1219
1220 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_win32_engine_func;
1221
1222 if (width < 1) width = 1;
1223 if (height < 1) height = 1;
1224 ee->x = x;
1225 ee->y = y;
1226 ee->w = width;
1227 ee->h = height;
1228 ee->req.x = ee->x;
1229 ee->req.y = ee->y;
1230 ee->req.w = ee->w;
1231 ee->req.h = ee->h;
1232
1233 ee->prop.max.w = 32767;
1234 ee->prop.max.h = 32767;
1235 ee->prop.layer = 4;
1236 ee->prop.request_pos = 0;
1237 ee->prop.sticky = 0;
1238 /* FIXME: sticky to add */
1239 ee->prop.window = 0;
1240
1241 /* init evas here */
1242 ee->evas = evas_new();
1243 evas_data_attach_set(ee->evas, ee);
1244 evas_output_size_set(ee->evas, width, height);
1245 evas_output_viewport_set(ee->evas, 0, 0, width, height);
1246
1247 ee->engine.win32.parent = parent;
1248 ee->prop.window = (Ecore_Window)ecore_win32_window_new(parent, x, y, width, height);
1249 if (!ee->prop.window)
1250 {
1251 _ecore_evas_win32_shutdown();
1252 free(ee);
1253 return NULL;
1254 }
1255
1256 if (!_ecore_evas_engine_init(ee))
1257 {
1258 _ecore_evas_win32_shutdown();
1259 free(ee);
1260 return NULL;
1261 }
1262
1263 ee->engine.func->fn_render = _ecore_evas_win32_render;
1264 _ecore_evas_register(ee);
1265 ecore_event_window_register(ee->prop.window, ee, ee->evas,
1266 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
1267 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
1268 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
1269 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
1270
1271 return ee;
1272}
1273
1274#endif /* BUILD_ECORE_EVAS_WIN32 */
1275
1276#ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
1277
1278EAPI Ecore_Evas *
1279ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
1280 int x,
1281 int y,
1282 int width,
1283 int height)
1284{
1285 return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_gdi_init,
1286 parent,
1287 x,
1288 y,
1289 width,
1290 height);
1291}
1292
1293#else
1294
1295EAPI Ecore_Evas *
1296ecore_evas_software_gdi_new(Ecore_Win32_Window *parent __UNUSED__,
1297 int x __UNUSED__,
1298 int y __UNUSED__,
1299 int width __UNUSED__,
1300 int height __UNUSED__)
1301{
1302 return NULL;
1303}
1304
1305#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_GDI */
1306
1307#ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1308
1309EAPI Ecore_Evas *
1310ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
1311 int x,
1312 int y,
1313 int width,
1314 int height)
1315{
1316 return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_ddraw_init,
1317 parent,
1318 x,
1319 y,
1320 width,
1321 height);
1322}
1323
1324#else
1325
1326EAPI Ecore_Evas *
1327ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
1328 int x __UNUSED__,
1329 int y __UNUSED__,
1330 int width __UNUSED__,
1331 int height __UNUSED__)
1332{
1333 return NULL;
1334}
1335
1336#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1337
1338
1339#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
1340
1341EAPI Ecore_Evas *
1342ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
1343 int x,
1344 int y,
1345 int width,
1346 int height)
1347{
1348 return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_16_ddraw_init,
1349 parent,
1350 x,
1351 y,
1352 width,
1353 height);
1354}
1355
1356#else
1357
1358EAPI Ecore_Evas *
1359ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
1360 int x __UNUSED__,
1361 int y __UNUSED__,
1362 int width __UNUSED__,
1363 int height __UNUSED__)
1364{
1365 return NULL;
1366}
1367
1368#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
1369
1370
1371#ifdef BUILD_ECORE_EVAS_DIRECT3D
1372
1373EAPI Ecore_Evas *
1374ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
1375 int x,
1376 int y,
1377 int width,
1378 int height)
1379{
1380 return _ecore_evas_win32_new_internal(_ecore_evas_engine_direct3d_init,
1381 parent,
1382 x,
1383 y,
1384 width,
1385 height);
1386}
1387
1388#else
1389
1390EAPI Ecore_Evas *
1391ecore_evas_direct3d_new(Ecore_Win32_Window *parent __UNUSED__,
1392 int x __UNUSED__,
1393 int y __UNUSED__,
1394 int width __UNUSED__,
1395 int height __UNUSED__)
1396{
1397 return NULL;
1398}
1399
1400#endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1401
1402
1403#ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1404
1405EAPI Ecore_Evas *
1406ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
1407 int x,
1408 int y,
1409 int width,
1410 int height)
1411{
1412 return _ecore_evas_win32_new_internal(_ecore_evas_engine_opengl_glew_init,
1413 parent,
1414 x,
1415 y,
1416 width,
1417 height);
1418}
1419
1420#else
1421
1422EAPI Ecore_Evas *
1423ecore_evas_gl_glew_new(Ecore_Win32_Window *parent __UNUSED__,
1424 int x __UNUSED__,
1425 int y __UNUSED__,
1426 int width __UNUSED__,
1427 int height __UNUSED__)
1428{
1429 return NULL;
1430}
1431
1432#endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1433
1434
1435#ifdef BUILD_ECORE_EVAS_WIN32
1436
1437EAPI Ecore_Win32_Window *
1438ecore_evas_win32_window_get(const Ecore_Evas *ee)
1439{
1440 return (Ecore_Win32_Window *) ecore_evas_window_get(ee);
1441}
1442
1443#else
1444
1445EAPI Ecore_Win32_Window *
1446ecore_evas_win32_window_get(const Ecore_Evas *ee __UNUSED__)
1447{
1448 return NULL;
1449}
1450
1451#endif /* BUILD_ECORE_EVAS_WIN32 */
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_wince.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_wince.c
new file mode 100644
index 0000000..e102cb7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_wince.c
@@ -0,0 +1,985 @@
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include <stdlib.h> /* for NULL */
6
7#include <Ecore.h>
8#include "ecore_private.h"
9#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
10# define WIN32_LEAN_AND_MEAN
11# include <windows.h>
12# undef WIN32_LEAN_AND_MEAN
13# include <Ecore_WinCE.h>
14# include <ecore_wince_private.h>
15#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
16
17#include "ecore_evas_private.h"
18#include "Ecore_Evas.h"
19
20#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
21
22#define ECORE_EVAS_EVENT_COUNT 9
23
24static int _ecore_evas_init_count = 0;
25
26static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
27
28static Eina_Bool _ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
29
30static Eina_Bool _ecore_evas_wince_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
31
32static Eina_Bool _ecore_evas_wince_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
33
34static Eina_Bool _ecore_evas_wince_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
35
36static Eina_Bool _ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
37
38static Eina_Bool _ecore_evas_wince_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
39
40static Eina_Bool _ecore_evas_wince_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
41
42static Eina_Bool _ecore_evas_wince_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
43
44static Eina_Bool _ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
45
46/* Private functions */
47
48static int
49_ecore_evas_wince_render(Ecore_Evas *ee)
50{
51 int rend = 0;
52 Eina_List *updates = NULL;
53 Eina_List *ll;
54 Ecore_Evas *ee2;
55
56 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
57 {
58 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
59 if (ee2->engine.func->fn_render)
60 rend |= ee2->engine.func->fn_render(ee2);
61 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
62 }
63
64 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
65 if (ee->prop.avoid_damage)
66 {
67 updates = evas_render_updates(ee->evas);
68 if (updates) evas_render_updates_free(updates);
69 }
70 else if ((ee->visible) ||
71 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
72 ((ee->should_be_visible) && (ee->prop.override)))
73 {
74 if (ee->shaped)
75 {
76 updates = evas_render_updates(ee->evas);
77 if (updates) evas_render_updates_free(updates);
78 }
79 else
80 {
81 updates = evas_render_updates(ee->evas);
82 if (updates) evas_render_updates_free(updates);
83 }
84 }
85 else
86 evas_norender(ee->evas);
87 if (updates) rend = 1;
88 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
89 return rend;
90}
91
92static int
93_ecore_evas_wince_init(void)
94{
95 _ecore_evas_init_count++;
96 if (_ecore_evas_init_count > 1)
97 return _ecore_evas_init_count;
98
99 ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_IN, _ecore_evas_wince_event_mouse_in, NULL);
100 ecore_evas_event_handlers[1] = ecore_event_handler_add(ECORE_WINCE_EVENT_MOUSE_OUT, _ecore_evas_wince_event_mouse_out, NULL);
101 ecore_evas_event_handlers[2] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, _ecore_evas_wince_event_window_focus_in, NULL);
102 ecore_evas_event_handlers[3] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_wince_event_window_focus_out, NULL);
103 ecore_evas_event_handlers[4] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, _ecore_evas_wince_event_window_damage, NULL);
104 ecore_evas_event_handlers[5] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, _ecore_evas_wince_event_window_destroy, NULL);
105 ecore_evas_event_handlers[6] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_SHOW, _ecore_evas_wince_event_window_show, NULL);
106 ecore_evas_event_handlers[7] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_HIDE, _ecore_evas_wince_event_window_hide, NULL);
107 ecore_evas_event_handlers[8] = ecore_event_handler_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_wince_event_window_delete_request, NULL);
108
109 ecore_event_evas_init();
110 return _ecore_evas_init_count;
111}
112
113int
114_ecore_evas_wince_shutdown(void)
115{
116 _ecore_evas_init_count--;
117 if (_ecore_evas_init_count == 0)
118 {
119 int i;
120
121 for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
122 ecore_event_handler_del(ecore_evas_event_handlers[i]);
123 ecore_event_evas_shutdown();
124 }
125
126 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
127
128 return _ecore_evas_init_count;
129}
130
131static Eina_Bool
132_ecore_evas_wince_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
133{
134 Ecore_Evas *ee;
135 Ecore_WinCE_Event_Mouse_In *e;
136
137 INF("mouse in");
138
139 e = event;
140 ee = ecore_event_window_match((Ecore_Window)e->window);
141 if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
142 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
143
144 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
145 /* FIXME to do */
146/* _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
147 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
148 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
149
150 return 1;
151}
152
153static Eina_Bool
154_ecore_evas_wince_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
155{
156 Ecore_Evas *ee;
157 Ecore_WinCE_Event_Mouse_Out *e;
158
159 INF("mouse out");
160
161 e = event;
162 ee = ecore_event_window_match((Ecore_Window)e->window);
163 if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
164 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
165
166 /* FIXME to do */
167/* _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
168 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
169
170 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
171 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
172 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
173
174 return 1;
175}
176
177static Eina_Bool
178_ecore_evas_wince_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
179{
180 Ecore_Evas *ee;
181 Ecore_WinCE_Event_Window_Focus_In *e;
182
183 e = event;
184 ee = ecore_event_window_match(e->window);
185 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
186 if (e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
187
188 ee->prop.focused = 1;
189 evas_focus_in(ee->evas);
190 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
191 return ECORE_CALLBACK_PASS_ON;
192}
193
194static Eina_Bool
195_ecore_evas_wince_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
196{
197 Ecore_Evas *ee;
198 Ecore_WinCE_Event_Window_Focus_Out *e;
199
200 e = event;
201 ee = ecore_event_window_match(e->window);
202 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
203 if (e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
204
205 evas_focus_out(ee->evas);
206 ee->prop.focused = 0;
207 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
208 return ECORE_CALLBACK_PASS_ON;
209}
210
211static Eina_Bool
212_ecore_evas_wince_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
213{
214 Ecore_Evas *ee;
215 Ecore_WinCE_Event_Window_Damage *e;
216
217 INF("window damage");
218
219 e = event;
220 ee = ecore_event_window_match((Ecore_Window)e->window);
221 if (!ee) return 1; /* pass on event */
222 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
223
224 if (ee->prop.avoid_damage)
225 {
226#warning [ECORE] [WINCE] No Region code
227 }
228 else
229 {
230 if (ee->rotation == 0)
231 evas_damage_rectangle_add(ee->evas,
232 e->x,
233 e->y,
234 e->width,
235 e->height);
236 else if (ee->rotation == 90)
237 evas_damage_rectangle_add(ee->evas,
238 ee->h - e->y - e->height,
239 e->x,
240 e->height,
241 e->width);
242 else if (ee->rotation == 180)
243 evas_damage_rectangle_add(ee->evas,
244 ee->w - e->x - e->width,
245 ee->h - e->y - e->height,
246 e->width,
247 e->height);
248 else if (ee->rotation == 270)
249 evas_damage_rectangle_add(ee->evas,
250 e->y,
251 ee->w - e->x - e->width,
252 e->height,
253 e->width);
254 }
255
256 return 1;
257}
258
259static Eina_Bool
260_ecore_evas_wince_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
261{
262 Ecore_Evas *ee;
263 Ecore_WinCE_Event_Window_Destroy *e;
264
265 INF("window destroy");
266
267 e = event;
268 ee = ecore_event_window_match((Ecore_Window)e->window);
269 if (!ee) return 1; /* pass on event */
270 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
271 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
272 ecore_evas_free(ee);
273
274 return 1;
275}
276
277static Eina_Bool
278_ecore_evas_wince_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
279{
280 Ecore_Evas *ee;
281 Ecore_WinCE_Event_Window_Show *e;
282
283 INF("window show");
284
285 e = event;
286 ee = ecore_event_window_match((Ecore_Window)e->window);
287 if (!ee) return 1; /* pass on event */
288 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
289 if (ee->visible) return 0; /* dont pass it on */
290 ee->visible = 1;
291 if (ee->func.fn_show) ee->func.fn_show(ee);
292
293 return 1;
294}
295
296static Eina_Bool
297_ecore_evas_wince_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
298{
299 Ecore_Evas *ee;
300 Ecore_WinCE_Event_Window_Hide *e;
301
302 INF("window hide");
303
304 e = event;
305 ee = ecore_event_window_match((Ecore_Window)e->window);
306 if (!ee) return 1; /* pass on event */
307 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
308 if (!ee->visible) return 0; /* dont pass it on */
309 ee->visible = 0;
310 if (ee->func.fn_hide) ee->func.fn_hide(ee);
311
312 return 1;
313}
314
315static Eina_Bool
316_ecore_evas_wince_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
317{
318 Ecore_Evas *ee;
319 Ecore_WinCE_Event_Window_Delete_Request *e;
320
321 INF("window delete request");
322
323 e = event;
324 ee = ecore_event_window_match((Ecore_Window)e->window);
325 if (!ee) return 1; /* pass on event */
326 if (e->window != (Ecore_WinCE_Window *)ee->prop.window) return 1;
327 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
328
329 return 1;
330}
331
332
333/* Ecore_Evas interface */
334
335static void
336_ecore_evas_wince_free(Ecore_Evas *ee)
337{
338 INF("ecore evas free");
339
340 ecore_wince_window_free((Ecore_WinCE_Window *)ee->prop.window);
341 ecore_event_window_unregister(ee->prop.window);
342 _ecore_evas_wince_shutdown();
343 ecore_wince_shutdown();
344}
345
346static void
347_ecore_evas_wince_callback_delete_request_set(Ecore_Evas *ee,
348 void (*func) (Ecore_Evas *ee))
349{
350 ee->func.fn_delete_request = func;
351}
352
353static void
354_ecore_evas_wince_move(Ecore_Evas *ee, int x, int y)
355{
356 INF("ecore evas move (%dx%d)", x, y);
357 ee->req.x = x;
358 ee->req.y = y;
359
360 if ((x != ee->x) || (y != ee->y))
361 {
362 ee->x = x;
363 ee->y = y;
364 ecore_wince_window_move((Ecore_WinCE_Window *)ee->prop.window, x, y);
365 if (ee->func.fn_move) ee->func.fn_move(ee);
366 }
367}
368
369static void
370_ecore_evas_wince_resize(Ecore_Evas *ee, int width, int height)
371{
372 INF("ecore evas resize (%dx%d)", width, height);
373 ee->req.w = width;
374 ee->req.h = height;
375
376 if ((ee->w != width) || (ee->h != height))
377 {
378 ee->w = width;
379 ee->h = height;
380 ecore_wince_window_resize((Ecore_WinCE_Window *)ee->prop.window, width, height);
381 if ((ee->rotation == 90) || (ee->rotation == 270))
382 {
383 evas_output_size_set(ee->evas, ee->h, ee->w);
384 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
385 }
386 else
387 {
388 evas_output_size_set(ee->evas, ee->w, ee->h);
389 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
390 }
391 /* FIXME: damage and shape */
392
393 if (ee->func.fn_resize) ee->func.fn_resize(ee);
394 }
395}
396
397static void
398_ecore_evas_wince_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
399{
400 INF("ecore evas resize (%dx%d %dx%d)", x, y, width, height);
401 ee->req.x = x;
402 ee->req.y = y;
403 ee->req.w = width;
404 ee->req.h = height;
405
406 if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
407 {
408 int change_size = 0;
409 int change_pos = 0;
410
411 if ((ee->w != width) || (ee->h != height)) change_size = 1;
412 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
413
414 ee->x = x;
415 ee->y = y;
416 ee->w = width;
417 ee->h = height;
418 ecore_wince_window_move_resize((Ecore_WinCE_Window *)ee->prop.window, x, y, width, height);
419 if ((ee->rotation == 90) || (ee->rotation == 270))
420 {
421 evas_output_size_set(ee->evas, ee->h, ee->w);
422 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
423 }
424 else
425 {
426 evas_output_size_set(ee->evas, ee->w, ee->h);
427 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
428 }
429 /* FIXME: damage and shape */
430 if (change_pos)
431 {
432 if (ee->func.fn_move) ee->func.fn_move(ee);
433 }
434 if (change_size)
435 {
436 if (ee->func.fn_resize) ee->func.fn_resize(ee);
437 }
438 }
439}
440
441/* static void */
442/* _ecore_evas_wince_rotation_set(Ecore_Evas *ee, int rotation) */
443/* { */
444/* int rot_dif; */
445
446/* if (ee->rotation == rotation) return; */
447/* rot_dif = ee->rotation - rotation; */
448/* if (rot_dif < 0) rot_dif = -rot_dif; */
449/* if (!strcmp(ee->driver, "software_ddraw")) */
450/* { */
451/* Evas_Engine_Info_Software_16_WinCE *einfo; */
452
453/* einfo = (Evas_Engine_Info_Software_16_WinCE *)evas_engine_info_get(ee->evas); */
454/* if (!einfo) return; */
455/* if (rot_dif != 180) */
456/* { */
457/* int minw, minh, maxw, maxh, basew, baseh, stepw, steph; */
458
459/* einfo->info.rotation = rotation; */
460/* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
461/* if (!ee->prop.fullscreen) */
462/* { */
463/* ecore_wince_window_resize(ee->prop.window, ee->h, ee->w); */
464/* ee->expecting_resize.w = ee->h; */
465/* ee->expecting_resize.h = ee->w; */
466/* } */
467/* else */
468/* { */
469/* int w, h; */
470
471/* ecore_wince_window_size_get(ee->prop.window, &w, &h); */
472/* ecore_wince_window_resize(ee->prop.window, h, w); */
473/* if ((rotation == 0) || (rotation == 180)) */
474/* { */
475/* evas_output_size_set(ee->evas, ee->w, ee->h); */
476/* evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); */
477/* } */
478/* else */
479/* { */
480/* evas_output_size_set(ee->evas, ee->h, ee->w); */
481/* evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); */
482/* } */
483/* if (ee->func.fn_resize) ee->func.fn_resize(ee); */
484/* } */
485/* ecore_evas_size_min_get(ee, &minw, &minh); */
486/* ecore_evas_size_max_get(ee, &maxw, &maxh); */
487/* ecore_evas_size_base_get(ee, &basew, &baseh); */
488/* ecore_evas_size_step_get(ee, &stepw, &steph); */
489/* ee->rotation = rotation; */
490/* ecore_evas_size_min_set(ee, minh, minw); */
491/* ecore_evas_size_max_set(ee, maxh, maxw); */
492/* ecore_evas_size_base_set(ee, baseh, basew); */
493/* ecore_evas_size_step_set(ee, steph, stepw); */
494/* _ecore_evas_wince_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, */
495/* ecore_wince_current_time_get()); */
496/* } */
497/* else */
498/* { */
499/* einfo->info.rotation = rotation; */
500/* evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo); */
501/* ee->rotation = rotation; */
502/* _ecore_evas_wince_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, */
503/* ecore_wince_current_time_get()); */
504/* if (ee->func.fn_resize) ee->func.fn_resize(ee); */
505/* } */
506/* if ((ee->rotation == 90) || (ee->rotation == 270)) */
507/* evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); */
508/* else */
509/* evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); */
510/* } */
511/* } */
512
513static void
514_ecore_evas_wince_show(Ecore_Evas *ee)
515{
516 INF("ecore evas show");
517
518 ee->should_be_visible = 1;
519 if (ee->prop.avoid_damage)
520 _ecore_evas_wince_render(ee);
521 ecore_wince_window_show((Ecore_WinCE_Window *)ee->prop.window);
522/* if (ee->prop.fullscreen) */
523/* ecore_wince_window_focus(ee->prop.window); */
524}
525
526static void
527_ecore_evas_wince_hide(Ecore_Evas *ee)
528{
529 INF("ecore evas hide");
530
531 ecore_wince_window_hide((Ecore_WinCE_Window *)ee->prop.window);
532 ee->should_be_visible = 0;
533}
534
535/* static void */
536/* _ecore_evas_wince_raise(Ecore_Evas *ee) */
537/* { */
538/* if (!ee->prop.fullscreen) */
539/* ecore_wince_window_raise(ee->prop.window); */
540/* else */
541/* ecore_wince_window_raise(ee->prop.window); */
542/* } */
543
544/* static void */
545/* _ecore_evas_wince_lower(Ecore_Evas *ee) */
546/* { */
547/* if (!ee->prop.fullscreen) */
548/* ecore_wince_window_lower(ee->prop.window); */
549/* else */
550/* ecore_wince_window_lower(ee->prop.window); */
551/* } */
552
553static void
554_ecore_evas_wince_title_set(Ecore_Evas *ee, const char *title)
555{
556 INF("ecore evas title set");
557
558 if (ee->prop.title) free(ee->prop.title);
559 ee->prop.title = NULL;
560 if (title) ee->prop.title = strdup(title);
561 ecore_wince_window_title_set((Ecore_WinCE_Window *)ee->prop.window, ee->prop.title);
562}
563
564/* static void */
565/* _ecore_evas_wince_size_min_set(Ecore_Evas *ee, int width, int height) */
566/* { */
567/* if (width < 0) width = 0; */
568/* if (height < 0) height = 0; */
569/* if ((ee->prop.min.w == width) && (ee->prop.min.h == height)) return; */
570/* ee->prop.min.w = width; */
571/* ee->prop.min.h = height; */
572/* ecore_wince_window_size_min_set(ee->prop.window, width, height); */
573/* } */
574
575/* static void */
576/* _ecore_evas_wince_size_max_set(Ecore_Evas *ee, int width, int height) */
577/* { */
578/* if (width < 0) width = 0; */
579/* if (height < 0) height = 0; */
580/* if ((ee->prop.max.w == width) && (ee->prop.max.h == height)) return; */
581/* ee->prop.max.w = width; */
582/* ee->prop.max.h = height; */
583/* ecore_wince_window_size_max_set(ee->prop.window, width, height); */
584/* } */
585
586/* static void */
587/* _ecore_evas_wince_size_base_set(Ecore_Evas *ee, int width, int height) */
588/* { */
589/* if (width < 0) width = 0; */
590/* if (height < 0) height = 0; */
591/* if ((ee->prop.base.w == width) && (ee->prop.base.h == height)) return; */
592/* ee->prop.base.w = width; */
593/* ee->prop.base.h = height; */
594/* ecore_wince_window_size_base_set(ee->prop.window, width, height); */
595/* } */
596
597/* static void */
598/* _ecore_evas_wince_size_step_set(Ecore_Evas *ee, int width, int height) */
599/* { */
600/* if (width < 1) width = 1; */
601/* if (height < 1) height = 1; */
602/* if ((ee->prop.step.w == width) && (ee->prop.step.h == height)) return; */
603/* ee->prop.step.w = width; */
604/* ee->prop.step.h = height; */
605/* ecore_wince_window_size_step_set(ee->prop.window, width, height); */
606/* } */
607
608static void
609_ecore_evas_wince_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
610{
611#if 0
612 int x, y;
613
614 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
615
616 if (obj == NULL)
617 {
618 ee->prop.cursor.object = NULL;
619 ee->prop.cursor.layer = 0;
620 ee->prop.cursor.hot.x = 0;
621 ee->prop.cursor.hot.y = 0;
622 ecore_wince_window_cursor_show(ee->prop.window, 1);
623 return;
624 }
625
626 ee->prop.cursor.object = obj;
627 ee->prop.cursor.layer = layer;
628 ee->prop.cursor.hot.x = hot_x;
629 ee->prop.cursor.hot.y = hot_y;
630
631 ecore_wince_window_cursor_show(ee->prop.window, 0);
632
633 evas_pointer_output_xy_get(ee->evas, &x, &y);
634 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
635 evas_object_move(ee->prop.cursor.object,
636 x - ee->prop.cursor.hot.x,
637 y - ee->prop.cursor.hot.y);
638 evas_object_pass_events_set(ee->prop.cursor.object, 1);
639 if (evas_pointer_inside_get(ee->evas))
640 evas_object_show(ee->prop.cursor.object);
641#endif
642}
643
644/* static void */
645/* _ecore_evas_wince_focus_set(Ecore_Evas *ee, int on __UNUSED__) */
646/* { */
647/* ecore_wince_window_focus_set(ee->prop.window); */
648/* } */
649
650/* static void */
651/* _ecore_evas_wince_iconified_set(Ecore_Evas *ee, int on) */
652/* { */
653/* /\* if (((ee->prop.borderless) && (on)) || *\/ */
654/* /\* ((!ee->prop.borderless) && (!on))) return; *\/ */
655/* ee->prop.iconified = on; */
656/* ecore_wince_window_iconified_set(ee->prop.window, ee->prop.iconified); */
657/* } */
658
659/* static void */
660/* _ecore_evas_wince_borderless_set(Ecore_Evas *ee, int on) */
661/* { */
662/* if (((ee->prop.borderless) && (on)) || */
663/* ((!ee->prop.borderless) && (!on))) return; */
664/* ee->prop.borderless = on; */
665/* ecore_wince_window_borderless_set(ee->prop.window, ee->prop.borderless); */
666/* } */
667
668static void
669_ecore_evas_wince_fullscreen_set(Ecore_Evas *ee, int on)
670{
671 Evas_Engine_Info_Software_16_WinCE *einfo;
672 struct _Ecore_WinCE_Window *window;
673
674 INF("ecore evas fullscreen set");
675
676 if ((ee->engine.wince.state.fullscreen && on) ||
677 (!ee->engine.wince.state.fullscreen && !on))
678 return;
679
680 ee->engine.wince.state.fullscreen = on;
681 ee->prop.fullscreen = on;
682
683 window = (struct _Ecore_WinCE_Window *)ee->prop.window;
684
685 if (on != 0)
686 {
687/* ecore_win32_window_shape_set(ee->engine.win32.window, 0, 0, NULL); */
688 ecore_wince_window_fullscreen_set((Ecore_WinCE_Window *)ee->prop.window, on);
689 ee->w = GetSystemMetrics(SM_CXSCREEN);
690 ee->h = GetSystemMetrics(SM_CYSCREEN);
691 ee->req.w = ee->w;
692 ee->req.h = ee->h;
693 evas_output_size_set(ee->evas, ee->w, ee->h);
694 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
695 }
696 else
697 {
698 int w;
699 int h;
700
701 ecore_wince_window_fullscreen_set((Ecore_WinCE_Window *)ee->prop.window, on);
702 ecore_wince_window_size_get((Ecore_WinCE_Window *)ee->prop.window, &w, &h);
703 ee->w = w;
704 ee->h = h;
705 ee->req.w = ee->w;
706 ee->req.h = ee->h;
707 evas_output_size_set(ee->evas, ee->w, ee->h);
708 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
709/* ecore_win32_window_shape_set(window, */
710/* window->shape.width, */
711/* window->shape.height, */
712/* window->shape.mask); */
713 }
714
715 einfo = (Evas_Engine_Info_Software_16_WinCE *)evas_engine_info_get(ecore_evas_get(ee));
716 if (einfo)
717 {
718 einfo->info.fullscreen = !!on;
719/* einfo->info.layered = window->shape.layered; */
720 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
721 {
722 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
723 }
724 }
725}
726
727static Ecore_Evas_Engine_Func _ecore_wince_engine_func =
728{
729 _ecore_evas_wince_free,
730 NULL,
731 NULL,
732 NULL,
733 NULL,
734 _ecore_evas_wince_callback_delete_request_set,
735 NULL,
736 NULL,
737 NULL,
738 NULL,
739 NULL,
740 NULL,
741 NULL,
742 NULL,
743 NULL,
744 _ecore_evas_wince_move,
745 NULL,
746 _ecore_evas_wince_resize,
747 _ecore_evas_wince_move_resize,
748 NULL, //_ecore_evas_wince_rotation_set,
749 NULL, /* _ecore_evas_x_shaped_set */
750 _ecore_evas_wince_show,
751 _ecore_evas_wince_hide,
752 NULL, //_ecore_evas_wince_raise,
753 NULL, //_ecore_evas_wince_lower,
754 NULL, //_ecore_evas_wince_activate,
755 _ecore_evas_wince_title_set,
756 NULL, /* _ecore_evas_x_name_class_set */
757 NULL, //_ecore_evas_wince_size_min_set,
758 NULL, //_ecore_evas_wince_size_max_set,
759 NULL, //_ecore_evas_wince_size_base_set,
760 NULL, //_ecore_evas_wince_size_step_set,
761 _ecore_evas_wince_cursor_set,
762 NULL, /* _ecore_evas_x_layer_set */
763 NULL, //_ecore_evas_wince_focus_set,
764 NULL, //_ecore_evas_wince_iconified_set,
765 NULL, //_ecore_evas_wince_borderless_set,
766 NULL, /* _ecore_evas_x_override_set */
767 NULL,
768 _ecore_evas_wince_fullscreen_set,
769 NULL, /* _ecore_evas_x_avoid_damage_set */
770 NULL, /* _ecore_evas_x_withdrawn_set */
771 NULL, /* _ecore_evas_x_sticky_set */
772 NULL, /* _ecore_evas_x_ignore_events_set */
773 NULL, /* _ecore_evas_x_alpha_set */
774 NULL, //transparent
775
776 NULL, // render
777 NULL // screen_geometry_get
778};
779
780/* API */
781
782static Ecore_Evas *
783ecore_evas_software_wince_new_internal(int backend,
784 Ecore_WinCE_Window *parent,
785 int x,
786 int y,
787 int width,
788 int height,
789 int fullscreen)
790{
791 Evas_Engine_Info_Software_16_WinCE *einfo;
792 Ecore_Evas *ee;
793 int rmethod;
794
795 rmethod = evas_render_method_lookup("software_16_wince");
796 if (!rmethod)
797 return NULL;
798
799 if (!ecore_wince_init())
800 return NULL;
801
802 ee = calloc(1, sizeof(Ecore_Evas));
803 if (!ee)
804 {
805 ecore_wince_shutdown();
806 return NULL;
807 }
808
809 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
810
811 if (!_ecore_evas_wince_init())
812 {
813 free(ee);
814 ecore_wince_shutdown();
815 return NULL;
816 }
817
818 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_wince_engine_func;
819
820 ee->driver = "software_16_wince";
821
822 if (width < 1) width = 1;
823 if (height < 1) height = 1;
824 ee->x = x;
825 ee->y = y;
826 ee->w = width;
827 ee->h = height;
828 ee->req.x = ee->x;
829 ee->req.y = ee->y;
830 ee->req.w = ee->w;
831 ee->req.h = ee->h;
832
833 ee->prop.max.w = 32767;
834 ee->prop.max.h = 32767;
835 ee->prop.layer = 4;
836 ee->prop.request_pos = 0;
837 ee->prop.sticky = 0;
838 /* FIXME: sticky to add */
839
840 ee->prop.window = (Ecore_Window)ecore_wince_window_new((Ecore_WinCE_Window *)parent, x, y, width, height);
841 if (!ee->prop.window)
842 {
843 _ecore_evas_wince_shutdown();
844 free(ee);
845 ecore_wince_shutdown();
846 return NULL;
847 }
848
849 ecore_wince_window_fullscreen_set((Ecore_WinCE_Window *)ee->prop.window, fullscreen);
850
851 /* init evas here */
852 ee->evas = evas_new();
853 evas_data_attach_set(ee->evas, ee);
854 evas_output_method_set(ee->evas, rmethod);
855 evas_output_size_set(ee->evas, width, height);
856 evas_output_viewport_set(ee->evas, 0, 0, width, height);
857
858 einfo = (Evas_Engine_Info_Software_16_WinCE *)evas_engine_info_get(ee->evas);
859 if (einfo)
860 {
861 /* FIXME: REDRAW_DEBUG missing for now */
862 einfo->info.window = ((struct _Ecore_WinCE_Window *)ee->prop.window)->window;
863 einfo->info.width = width;
864 einfo->info.height = height;
865 einfo->info.backend = backend;
866 einfo->info.rotation = 0;
867 einfo->info.fullscreen = fullscreen;
868 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
869 {
870 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
871 _ecore_evas_wince_shutdown();
872 free(ee);
873 ecore_wince_shutdown();
874 return NULL;
875 }
876
877 ecore_wince_window_backend_set((Ecore_WinCE_Window *)ee->prop.window, backend);
878 ecore_wince_window_suspend_cb_set((Ecore_WinCE_Window *)ee->prop.window, einfo->func.suspend);
879 ecore_wince_window_resume_cb_set((Ecore_WinCE_Window *)ee->prop.window, einfo->func.resume);
880 }
881 else
882 {
883 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
884 _ecore_evas_wince_shutdown();
885 free(ee);
886 ecore_wince_shutdown();
887 return NULL;
888 }
889
890 ee->engine.func->fn_render = _ecore_evas_wince_render;
891 _ecore_evas_register(ee);
892 ecore_event_window_register(ee->prop.window, ee, ee->evas,
893 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
894 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
895 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
896 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
897 evas_focus_in(ee->evas);
898
899 return ee;
900}
901
902#else
903
904static Ecore_Evas *
905ecore_evas_software_wince_new_internal(int backend __UNUSED__,
906 Ecore_WinCE_Window *parent __UNUSED__,
907 int x __UNUSED__,
908 int y __UNUSED__,
909 int width __UNUSED__,
910 int height __UNUSED__,
911 int fullscreen __UNUSED__)
912{
913 return NULL;
914}
915
916#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
917
918
919EAPI Ecore_Evas *
920ecore_evas_software_wince_new(Ecore_WinCE_Window *parent,
921 int x,
922 int y,
923 int width,
924 int height)
925{
926 return ecore_evas_software_wince_new_internal(0, parent, x, y, width, height, 1);
927}
928
929EAPI Ecore_Evas *
930ecore_evas_software_wince_fb_new(Ecore_WinCE_Window *parent,
931 int x,
932 int y,
933 int width,
934 int height)
935{
936 return ecore_evas_software_wince_new_internal(1, parent, x, y, width, height, 1);
937}
938
939EAPI Ecore_Evas *
940ecore_evas_software_wince_gapi_new(Ecore_WinCE_Window *parent,
941 int x,
942 int y,
943 int width,
944 int height)
945{
946 return ecore_evas_software_wince_new_internal(2, parent, x, y, width, height, 1);
947}
948
949EAPI Ecore_Evas *
950ecore_evas_software_wince_ddraw_new(Ecore_WinCE_Window *parent,
951 int x,
952 int y,
953 int width,
954 int height)
955{
956 return ecore_evas_software_wince_new_internal(3, parent, x, y, width, height, 1);
957}
958
959EAPI Ecore_Evas *
960ecore_evas_software_wince_gdi_new(Ecore_WinCE_Window *parent,
961 int x,
962 int y,
963 int width,
964 int height)
965{
966 return ecore_evas_software_wince_new_internal(4, parent, x, y, width, height, 0);
967}
968
969#ifdef BUILD_ECORE_EVAS_SOFTWARE_16_WINCE
970
971EAPI Ecore_WinCE_Window *
972ecore_evas_software_wince_window_get(const Ecore_Evas *ee)
973{
974 return (Ecore_WinCE_Window *) ecore_evas_window_get(ee);
975}
976
977#else
978
979EAPI Ecore_WinCE_Window *
980ecore_evas_software_wince_window_get(const Ecore_Evas *ee __UNUSED__)
981{
982 return NULL;
983}
984
985#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_WINCE */
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_x.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_x.c
new file mode 100644
index 0000000..d9ccd6e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_x.c
@@ -0,0 +1,4289 @@
1#include <string.h>
2#include "ecore_evas_private.h"
3#include "Ecore_Evas.h"
4
5#ifdef BUILD_ECORE_EVAS_X11
6static int _ecore_evas_init_count = 0;
7
8static Ecore_Event_Handler *ecore_evas_event_handlers[13];
9
10static int leader_ref = 0;
11static Ecore_X_Window leader_win = 0;
12
13static void
14_ecore_evas_x_group_leader_set(Ecore_Evas *ee)
15{
16 leader_ref++;
17 if (leader_ref == 1)
18 {
19 char *id = NULL;
20
21 leader_win =
22 ecore_x_window_override_new(ee->engine.x.win_root, 1234, 5678, 1, 2);
23 ecore_x_window_defaults_set(leader_win);
24 if ((id = getenv("DESKTOP_STARTUP_ID")))
25 ecore_x_netwm_startup_id_set(leader_win,id);
26 ecore_x_icccm_client_leader_set(leader_win, leader_win);
27 }
28 ee->engine.x.leader = leader_win;
29 ecore_x_icccm_client_leader_set(ee->prop.window, leader_win);
30}
31
32static void
33_ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
34{
35 ecore_x_window_prop_property_del(ee->prop.window,
36 ECORE_X_ATOM_WM_CLIENT_LEADER);
37 if (ee->engine.x.leader == leader_win)
38 {
39 leader_ref--;
40 if (leader_ref <= 0)
41 {
42 ecore_x_window_free(leader_win);
43 leader_win = 0;
44 }
45 ee->engine.x.leader = 0;
46 }
47}
48
49static void
50_ecore_evas_x_group_leader_update(Ecore_Evas *ee)
51{
52 if (ee->engine.x.leader)
53 ecore_x_icccm_client_leader_set(ee->prop.window, ee->engine.x.leader);
54}
55
56static void
57_ecore_evas_x_protocols_set(Ecore_Evas *ee)
58{
59 Ecore_X_Atom protos[3];
60 unsigned int num = 0, tmp = 0;
61
62 if (ee->func.fn_delete_request)
63 protos[num++] = ECORE_X_ATOM_WM_DELETE_WINDOW;
64 protos[num++] = ECORE_X_ATOM_NET_WM_PING;
65 protos[num++] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
66 ecore_x_icccm_protocol_atoms_set(ee->prop.window, protos, num);
67
68 if (!ee->engine.x.netwm_sync_counter)
69 ee->engine.x.netwm_sync_counter = ecore_x_sync_counter_new(0);
70
71 tmp = ee->engine.x.netwm_sync_counter;
72 ecore_x_window_prop_card32_set(ee->prop.window,
73 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
74 &tmp, 1);
75}
76
77static void
78_ecore_evas_x_sync_set(Ecore_Evas *ee)
79{
80 if (((ee->should_be_visible) || (ee->visible)) &&
81 ((ecore_x_e_comp_sync_supported_get(ee->engine.x.win_root)) &&
82 (!ee->no_comp_sync) && (_ecore_evas_app_comp_sync)))
83 {
84 if (!ee->engine.x.sync_counter)
85 ee->engine.x.sync_counter = ecore_x_sync_counter_new(0);
86 }
87 else
88 {
89 if (ee->engine.x.sync_counter)
90 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
91 ee->engine.x.sync_counter = 0;
92 }
93 ecore_x_e_comp_sync_counter_set(ee->prop.window, ee->engine.x.sync_counter);
94}
95
96static void
97_ecore_evas_x_sync_clear(Ecore_Evas *ee)
98{
99 if (!ee->engine.x.sync_counter) return;
100 ecore_x_sync_counter_free(ee->engine.x.sync_counter);
101 ee->engine.x.sync_counter = 0;
102}
103
104# ifdef BUILD_ECORE_EVAS_OPENGL_X11
105static Ecore_X_Window
106_ecore_evas_x_gl_window_new(Ecore_Evas *ee, Ecore_X_Window parent, int x, int y, int w, int h, int override, int argb, const int *opt)
107{
108 Evas_Engine_Info_GL_X11 *einfo;
109 Ecore_X_Window win;
110
111 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
112 if (einfo)
113 {
114 int screen;
115
116 if (opt)
117 {
118 int op;
119
120 for (op = 0; opt[op]; op++)
121 {
122 if (opt[op] == ECORE_EVAS_GL_X11_OPT_INDIRECT)
123 {
124 op++;
125 einfo->indirect = opt[op];
126 }
127 else if (opt[op] == ECORE_EVAS_GL_X11_OPT_VSYNC)
128 {
129 op++;
130 einfo->vsync = opt[op];
131 }
132 }
133 }
134
135 /* FIXME: this is inefficient as its 1 or more round trips */
136 screen = ecore_x_screen_index_get(ecore_x_default_screen_get());
137 if (ecore_x_screen_count_get() > 1)
138 {
139 Ecore_X_Window *roots;
140 int num, i;
141
142 num = 0;
143 roots = ecore_x_window_root_list(&num);
144 if (roots)
145 {
146 Ecore_X_Window root;
147
148 root = ecore_x_window_root_get(parent);
149 for (i = 0; i < num; i++)
150 {
151 if (root == roots[i])
152 {
153 screen = i;
154 break;
155 }
156 }
157 free(roots);
158 }
159 }
160
161 einfo->info.display = ecore_x_display_get();
162 einfo->info.screen = screen;
163
164 einfo->info.destination_alpha = argb;
165
166 einfo->info.visual = einfo->func.best_visual_get(einfo);
167 einfo->info.colormap = einfo->func.best_colormap_get(einfo);
168 einfo->info.depth = einfo->func.best_depth_get(einfo);
169
170 if ((!einfo->info.visual) ||
171 (!einfo->info.colormap) || (!einfo->info.depth))
172 {
173 WRN("OpenGL X11 init engine '%s' failed - no visual, colormap or depth.", ee->driver);
174 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
175 {
176 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
177 return 0;
178 }
179 }
180
181 if (argb)
182 {
183 if (override)
184 win = ecore_x_window_override_argb_new(parent, x, y, w, h);
185 else
186 win = ecore_x_window_argb_new(parent, x, y, w, h);
187 }
188 else
189 {
190 if (override)
191 win = ecore_x_window_override_new(parent, x, y, w, h);
192 else
193 win = ecore_x_window_new(parent, x, y, w, h);
194 }
195
196 ecore_x_window_pixel_gravity_set(win, ECORE_X_GRAVITY_FORGET);
197
198 /* attr.backing_store = NotUseful; */
199 /* attr.override_redirect = override; */
200 /* attr.colormap = einfo->info.colormap; */
201 /* attr.border_pixel = 0; */
202 /* attr.background_pixmap = None; */
203 /* attr.event_mask = */
204 /* KeyPressMask | KeyReleaseMask | */
205 /* ExposureMask | ButtonPressMask | ButtonReleaseMask | */
206 /* EnterWindowMask | LeaveWindowMask | */
207 /* PointerMotionMask | StructureNotifyMask | VisibilityChangeMask | */
208 /* FocusChangeMask | PropertyChangeMask | ColormapChangeMask; */
209 /* attr.bit_gravity = ForgetGravity; */
210
211 /* win = */
212 /* XCreateWindow(einfo->info.display, parent, x, y, w, h, 0, */
213 /* einfo->info.depth, InputOutput, einfo->info.visual, */
214 /* CWBackingStore | CWColormap | CWBackPixmap | */
215 /* CWBorderPixel | CWBitGravity | CWEventMask | */
216 /* CWOverrideRedirect, &attr); */
217
218 einfo->info.drawable = win;
219
220 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
221 {
222 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
223 ecore_x_window_free(win);
224 return 0;
225 }
226 }
227 else
228 win = 0;
229
230 return win;
231}
232#endif
233
234static int
235_ecore_evas_x_render(Ecore_Evas *ee)
236{
237 int rend = 0;
238 Eina_List *updates = NULL;
239 Eina_List *ll;
240 Ecore_Evas *ee2;
241
242 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync) &&
243 (ee->engine.x.sync_counter) && (!ee->engine.x.sync_began) &&
244 (!ee->engine.x.sync_cancel))
245 return 0;
246
247 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
248 {
249 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
250 if (ee2->engine.func->fn_render)
251 rend |= ee2->engine.func->fn_render(ee2);
252 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
253 }
254
255 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
256 updates = evas_render_updates(ee->evas);
257 if (ee->prop.avoid_damage)
258 {
259 if (ee->engine.x.using_bg_pixmap)
260 {
261 if (updates)
262 {
263 Eina_List *l = NULL;
264 Eina_Rectangle *r;
265
266 EINA_LIST_FOREACH(updates, l, r)
267 ecore_x_window_area_clear(ee->prop.window,
268 r->x, r->y, r->w, r->h);
269 if (ee->shaped)
270 {
271#ifdef EVAS_FRAME_QUEUING
272 evas_sync(ee->evas);
273#endif
274 ecore_x_window_shape_mask_set(ee->prop.window,
275 ee->engine.x.mask);
276 }
277 if (ee->alpha)
278 {
279#ifdef EVAS_FRAME_QUEUING
280 /* wait until ee->engine.x.mask being updated */
281// evas_sync(ee->evas);
282#endif
283// ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
284 }
285 evas_render_updates_free(updates);
286 _ecore_evas_idle_timeout_update(ee);
287 rend = 1;
288 }
289 }
290 else
291 {
292 if (updates)
293 {
294 Eina_List *l = NULL;
295 Eina_Rectangle *r;
296
297 EINA_LIST_FOREACH(updates, l, r)
298 {
299 Ecore_X_Rectangle rect;
300 Ecore_X_XRegion *tmpr;
301
302 if (!ee->engine.x.damages)
303 ee->engine.x.damages = ecore_x_xregion_new();
304 tmpr = ecore_x_xregion_new();
305 if (ee->rotation == 0)
306 {
307 rect.x = r->x;
308 rect.y = r->y;
309 rect.width = r->w;
310 rect.height = r->h;
311 }
312 else if (ee->rotation == 90)
313 {
314 rect.x = r->y;
315 rect.y = ee->h - r->x - r->w;
316 rect.width = r->h;
317 rect.height = r->w;
318 }
319 else if (ee->rotation == 180)
320 {
321 rect.x = ee->w - r->x - r->w;
322 rect.y = ee->h - r->y - r->h;
323 rect.width = r->w;
324 rect.height = r->h;
325 }
326 else if (ee->rotation == 270)
327 {
328 rect.x = ee->w - r->y - r->h;
329 rect.y = r->x;
330 rect.width = r->h;
331 rect.height = r->w;
332 }
333 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages,
334 &rect);
335 ecore_x_xregion_free(ee->engine.x.damages);
336 ee->engine.x.damages = tmpr;
337 }
338 if (ee->engine.x.damages)
339 {
340 /* if we have a damage pixmap - we can avoid exposures by
341 * disabling them just for setting the mask */
342 ecore_x_event_mask_set(ee->prop.window,
343 ECORE_X_EVENT_MASK_KEY_DOWN |
344 ECORE_X_EVENT_MASK_KEY_UP |
345 ECORE_X_EVENT_MASK_MOUSE_DOWN |
346 ECORE_X_EVENT_MASK_MOUSE_UP |
347 ECORE_X_EVENT_MASK_MOUSE_IN |
348 ECORE_X_EVENT_MASK_MOUSE_OUT |
349 ECORE_X_EVENT_MASK_MOUSE_MOVE |
350 // ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
351 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
352 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
353 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
354 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
355 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
356 );
357 if (ee->shaped)
358 ecore_x_window_shape_mask_set(ee->prop.window,
359 ee->engine.x.mask);
360 /* and re-enable them again */
361 ecore_x_event_mask_set(ee->prop.window,
362 ECORE_X_EVENT_MASK_KEY_DOWN |
363 ECORE_X_EVENT_MASK_KEY_UP |
364 ECORE_X_EVENT_MASK_MOUSE_DOWN |
365 ECORE_X_EVENT_MASK_MOUSE_UP |
366 ECORE_X_EVENT_MASK_MOUSE_IN |
367 ECORE_X_EVENT_MASK_MOUSE_OUT |
368 ECORE_X_EVENT_MASK_MOUSE_MOVE |
369 ECORE_X_EVENT_MASK_WINDOW_DAMAGE |
370 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY |
371 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE |
372 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE |
373 ECORE_X_EVENT_MASK_WINDOW_PROPERTY |
374 ECORE_X_EVENT_MASK_WINDOW_COLORMAP
375 );
376 ecore_x_xregion_set(ee->engine.x.damages, ee->engine.x.gc);
377 ecore_x_pixmap_paste(ee->engine.x.pmap, ee->prop.window,
378 ee->engine.x.gc, 0, 0, ee->w, ee->h,
379 0, 0);
380 ecore_x_xregion_free(ee->engine.x.damages);
381 ee->engine.x.damages = NULL;
382 }
383 evas_render_updates_free(updates);
384 _ecore_evas_idle_timeout_update(ee);
385 rend = 1;
386 }
387 }
388 }
389 else if (((ee->visible) && (ee->draw_ok)) ||
390 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
391 ((ee->should_be_visible) && (ee->prop.override)))
392 {
393 if (updates)
394 {
395 if (ee->shaped)
396 {
397#ifdef EVAS_FRAME_QUEUING
398 evas_sync(ee->evas);
399#endif
400 ecore_x_window_shape_mask_set(ee->prop.window,
401 ee->engine.x.mask);
402 }
403 if (ee->alpha)
404 {
405#ifdef EVAS_FRAME_QUEUING
406 /* wait until ee->engine.x.mask being updated */
407// evas_sync(ee->evas);
408#endif
409// ecore_x_window_shape_input_mask_set(ee->prop.window, ee->engine.x.mask);
410 }
411 evas_render_updates_free(updates);
412 _ecore_evas_idle_timeout_update(ee);
413 rend = 1;
414 }
415 }
416 else
417 evas_norender(ee->evas);
418 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
419/*
420 if (rend)
421 {
422 static int frames = 0;
423 static double t0 = 0.0;
424 double t, td;
425
426 t = ecore_time_get();
427 frames++;
428 if ((t - t0) > 1.0)
429 {
430 td = t - t0;
431 printf("FPS: %3.3f\n", (double)frames / td);
432 frames = 0;
433 t0 = t;
434 }
435 }
436 */
437
438 return rend;
439}
440
441static void
442_ecore_evas_x_resize_shape(Ecore_Evas *ee)
443{
444 if (!strcmp(ee->driver, "software_x11"))
445 {
446#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
447 Evas_Engine_Info_Software_X11 *einfo;
448
449 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
450 if (einfo)
451 {
452 unsigned int foreground;
453 Ecore_X_GC gc;
454
455 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
456 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
457 foreground = 0;
458 gc = ecore_x_gc_new(ee->engine.x.mask,
459 ECORE_X_GC_VALUE_MASK_FOREGROUND,
460 &foreground);
461 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
462 0, 0, ee->w, ee->h);
463 ecore_x_gc_free(gc);
464 einfo->info.mask = ee->engine.x.mask;
465 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
466 {
467 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
468 }
469 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
470 }
471#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
472 }
473 else if (!strcmp(ee->driver, "software_16_x11"))
474 {
475#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
476# if 0 /* XXX no shaped window support for software_16_x11 */
477 Evas_Engine_Info_Software_16_X11 *einfo;
478
479 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
480 if (einfo)
481 {
482 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
483 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
484 einfo->info.mask = ee->engine.x.mask;
485 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
486 {
487 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
488 }
489 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
490 }
491# endif /* XXX no shaped window support for software_16_x11 */
492#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
493 }
494 if (!strcmp(ee->driver, "software_8_x11"))
495 {
496#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
497 Evas_Engine_Info_Software_8_X11 *einfo;
498
499 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
500 if (einfo)
501 {
502 unsigned int foreground;
503 Ecore_X_GC gc;
504
505 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
506 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
507 foreground = 0;
508 gc = ecore_x_gc_new(ee->engine.x.mask,
509 ECORE_X_GC_VALUE_MASK_FOREGROUND,
510 &foreground);
511 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
512 0, 0, ee->w, ee->h);
513 ecore_x_gc_free(gc);
514 einfo->info.mask = ee->engine.x.mask;
515 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
516 {
517 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
518 }
519 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
520 }
521#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
522 }
523}
524
525/* TODO: we need to make this work for all the states, not just sticky */
526static Eina_Bool
527_ecore_evas_x_event_property_change(void *data __UNUSED__, int type __UNUSED__, void *event)
528{
529 Ecore_Evas *ee;
530 Ecore_X_Event_Window_Property *e;
531
532 e = event;
533 ee = ecore_event_window_match(e->win);
534 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
535 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
536 if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
537 {
538 unsigned int i, num;
539 Ecore_X_Window_State *state;
540 int sticky = 0;
541
542 /* TODO: we need to move those to the end, with if statements */
543 ee->engine.x.state.modal = 0;
544 ee->engine.x.state.maximized_v = 0;
545 ee->engine.x.state.maximized_h = 0;
546 ee->engine.x.state.shaded = 0;
547 ee->engine.x.state.skip_taskbar = 0;
548 ee->engine.x.state.skip_pager = 0;
549 ee->prop.fullscreen = 0;
550 ee->engine.x.state.fullscreen = 0;
551 ee->engine.x.state.above = 0;
552 ee->engine.x.state.below = 0;
553
554 ecore_x_netwm_window_state_get(e->win, &state, &num);
555 if (state)
556 {
557 for (i = 0; i < num; i++)
558 {
559 switch (state[i])
560 {
561 case ECORE_X_WINDOW_STATE_MODAL:
562 ee->engine.x.state.modal = 1;
563 break;
564 case ECORE_X_WINDOW_STATE_STICKY:
565 if (ee->prop.sticky && ee->engine.x.state.sticky)
566 break;
567
568 sticky = 1;
569 ee->prop.sticky = 1;
570 ee->engine.x.state.sticky = 1;
571 if (ee->func.fn_sticky) ee->func.fn_sticky(ee);
572 break;
573 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
574 ee->engine.x.state.maximized_v = 1;
575 break;
576 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
577 ee->engine.x.state.maximized_h = 1;
578 break;
579 case ECORE_X_WINDOW_STATE_SHADED:
580 ee->engine.x.state.shaded = 1;
581 break;
582 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
583 ee->engine.x.state.skip_taskbar = 1;
584 break;
585 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
586 ee->engine.x.state.skip_pager = 1;
587 break;
588 case ECORE_X_WINDOW_STATE_FULLSCREEN:
589 ee->prop.fullscreen = 1;
590 ee->engine.x.state.fullscreen = 1;
591 break;
592 case ECORE_X_WINDOW_STATE_ABOVE:
593 ee->engine.x.state.above = 1;
594 break;
595 case ECORE_X_WINDOW_STATE_BELOW:
596 ee->engine.x.state.below = 1;
597 break;
598 default:
599 break;
600 }
601 }
602 free(state);
603 }
604
605 if ((ee->prop.sticky) && (!sticky))
606 {
607 ee->prop.sticky = 0;
608 ee->engine.x.state.sticky = 0;
609 if (ee->func.fn_unsticky) ee->func.fn_unsticky(ee);
610 }
611 }
612
613 return ECORE_CALLBACK_PASS_ON;
614}
615
616static Eina_Bool
617_ecore_evas_x_event_visibility_change(void *data __UNUSED__, int type __UNUSED__, void *event)
618{
619 Ecore_Evas *ee;
620 Ecore_X_Event_Window_Visibility_Change *e;
621
622 e = event;
623 ee = ecore_event_window_match(e->win);
624 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
625 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
626// printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
627 if (e->fully_obscured)
628 {
629 /* FIXME: round trip */
630 if (!ecore_x_screen_is_composited(ee->engine.x.screen_num))
631 ee->draw_ok = 0;
632 }
633 else
634 ee->draw_ok = 1;
635 return ECORE_CALLBACK_PASS_ON;
636}
637
638static Eina_Bool
639_ecore_evas_x_event_client_message(void *data __UNUSED__, int type __UNUSED__, void *event)
640{
641 Ecore_Evas *ee;
642 Ecore_X_Event_Client_Message *e;
643
644 e = event;
645 if (e->format != 32) return ECORE_CALLBACK_PASS_ON;
646 if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_BEGIN)
647 {
648 ee = ecore_event_window_match(e->data.l[0]);
649 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
650 if (e->data.l[0] != (long)ee->prop.window)
651 return ECORE_CALLBACK_PASS_ON;
652 if (!ee->engine.x.sync_began)
653 {
654 // qeue a damage + draw. work around an event re-ordering thing.
655 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
656 }
657 ee->engine.x.sync_began = 1;
658 ee->engine.x.sync_cancel = 0;
659 }
660 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_END)
661 {
662 ee = ecore_event_window_match(e->data.l[0]);
663 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
664 if (e->data.l[0] != (long)ee->prop.window)
665 return ECORE_CALLBACK_PASS_ON;
666 ee->engine.x.sync_began = 0;
667 ee->engine.x.sync_cancel = 0;
668 }
669 else if (e->message_type == ECORE_X_ATOM_E_COMP_SYNC_CANCEL)
670 {
671 ee = ecore_event_window_match(e->data.l[0]);
672 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
673 if (e->data.l[0] != (long)ee->prop.window)
674 return ECORE_CALLBACK_PASS_ON;
675 ee->engine.x.sync_began = 0;
676 ee->engine.x.sync_cancel = 1;
677 }
678 else if ((e->message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
679 (e->data.l[0] == (int)ECORE_X_ATOM_NET_WM_SYNC_REQUEST))
680 {
681 ee = ecore_event_window_match(e->win);
682 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
683 ee->engine.x.netwm_sync_val_lo = (unsigned int)e->data.l[2];
684 ee->engine.x.netwm_sync_val_hi = (int)e->data.l[3];
685 ee->engine.x.netwm_sync_set = 1;
686 }
687 return ECORE_CALLBACK_PASS_ON;
688}
689
690static Eina_Bool
691_ecore_evas_x_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
692{
693 Ecore_Evas *ee;
694 Ecore_X_Event_Mouse_In *e;
695
696 e = event;
697 ee = ecore_event_window_match(e->win);
698 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
699 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
700/* { */
701/* time_t t; */
702/* char *ct; */
703
704/* const char *modes[] = { */
705/* "MODE_NORMAL", */
706/* "MODE_WHILE_GRABBED", */
707/* "MODE_GRAB", */
708/* "MODE_UNGRAB" */
709/* }; */
710/* const char *details[] = { */
711/* "DETAIL_ANCESTOR", */
712/* "DETAIL_VIRTUAL", */
713/* "DETAIL_INFERIOR", */
714/* "DETAIL_NON_LINEAR", */
715/* "DETAIL_NON_LINEAR_VIRTUAL", */
716/* "DETAIL_POINTER", */
717/* "DETAIL_POINTER_ROOT", */
718/* "DETAIL_DETAIL_NONE" */
719/* }; */
720/* t = time(NULL); */
721/* ct = ctime(&t); */
722/* ct[strlen(ct) - 1] = 0; */
723/* printf("@@ ->IN 0x%x 0x%x %s md=%s dt=%s\n", */
724/* e->win, e->event_win, */
725/* ct, */
726/* modes[e->mode], */
727/* details[e->detail]); */
728/* } */
729 // disable. causes more problems than it fixes
730 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
731 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
732 // return 0;
733 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
734 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
735 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
736 evas_event_feed_mouse_in(ee->evas, e->time, NULL);
737 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
738 return ECORE_CALLBACK_PASS_ON;
739}
740
741static Eina_Bool
742_ecore_evas_x_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
743{
744 Ecore_Evas *ee;
745 Ecore_X_Event_Mouse_Out *e;
746
747 e = event;
748 ee = ecore_event_window_match(e->win);
749 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
750 /* pass on event */
751 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
752/* { */
753/* time_t t; */
754/* char *ct; */
755
756/* const char *modes[] = { */
757/* "MODE_NORMAL", */
758/* "MODE_WHILE_GRABBED", */
759/* "MODE_GRAB", */
760/* "MODE_UNGRAB" */
761/* }; */
762/* const char *details[] = { */
763/* "DETAIL_ANCESTOR", */
764/* "DETAIL_VIRTUAL", */
765/* "DETAIL_INFERIOR", */
766/* "DETAIL_NON_LINEAR", */
767/* "DETAIL_NON_LINEAR_VIRTUAL", */
768/* "DETAIL_POINTER", */
769/* "DETAIL_POINTER_ROOT", */
770/* "DETAIL_DETAIL_NONE" */
771/* }; */
772/* t = time(NULL); */
773/* ct = ctime(&t); */
774/* ct[strlen(ct) - 1] = 0; */
775/* printf("@@ ->OUT 0x%x 0x%x %s md=%s dt=%s\n", */
776/* e->win, e->event_win, */
777/* ct, */
778/* modes[e->mode], */
779/* details[e->detail]); */
780/* } */
781 // disable. causes more problems than it fixes
782 // if ((e->mode == ECORE_X_EVENT_MODE_GRAB) ||
783 // (e->mode == ECORE_X_EVENT_MODE_UNGRAB))
784 // return 0;
785 /* if (e->mode != ECORE_X_EVENT_MODE_NORMAL) return 0; */
786 ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
787 _ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
788 if (e->mode == ECORE_X_EVENT_MODE_GRAB)
789 evas_event_feed_mouse_cancel(ee->evas, e->time, NULL);
790 evas_event_feed_mouse_out(ee->evas, e->time, NULL);
791 if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
792 if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
793 return ECORE_CALLBACK_PASS_ON;
794}
795
796static Eina_Bool
797_ecore_evas_x_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
798{
799 Ecore_Evas *ee;
800 Ecore_X_Event_Window_Focus_In *e;
801
802 e = event;
803 ee = ecore_event_window_match(e->win);
804 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
805 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
806 if (e->mode == ECORE_X_EVENT_MODE_UNGRAB) return ECORE_CALLBACK_PASS_ON;
807 ee->prop.focused = 1;
808 evas_focus_in(ee->evas);
809 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
810 return ECORE_CALLBACK_PASS_ON;
811}
812
813static Eina_Bool
814_ecore_evas_x_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
815{
816 Ecore_Evas *ee;
817 Ecore_X_Event_Window_Focus_Out *e;
818
819 e = event;
820 ee = ecore_event_window_match(e->win);
821 if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
822 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
823 if (e->mode == ECORE_X_EVENT_MODE_GRAB) return ECORE_CALLBACK_PASS_ON;
824// if (ee->prop.fullscreen)
825// ecore_x_window_focus(ee->prop.window);
826 evas_focus_out(ee->evas);
827 ee->prop.focused = 0;
828 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
829 return ECORE_CALLBACK_PASS_ON;
830}
831
832static Eina_Bool
833_ecore_evas_x_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
834{
835 Ecore_Evas *ee;
836 Ecore_X_Event_Window_Damage *e;
837
838 e = event;
839 ee = ecore_event_window_match(e->win);
840 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
841 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
842 if (ee->engine.x.using_bg_pixmap) return ECORE_CALLBACK_PASS_ON;
843// printf("EXPOSE %p [%i] %i %i %ix%i\n", ee, ee->prop.avoid_damage, e->x, e->y, e->w, e->h);
844 if (ee->prop.avoid_damage)
845 {
846 Ecore_X_Rectangle rect;
847 Ecore_X_XRegion *tmpr;
848
849 if (!ee->engine.x.damages)
850 ee->engine.x.damages = ecore_x_xregion_new();
851 tmpr = ecore_x_xregion_new();
852 rect.x = e->x;
853 rect.y = e->y;
854 rect.width = e->w;
855 rect.height = e->h;
856 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
857 ecore_x_xregion_free(ee->engine.x.damages);
858 ee->engine.x.damages = tmpr;
859/* no - this breaks things badly. disable. Ecore_X_Rectangle != XRectangle - see
860 * the typedefs in x's headers and ecore_x's. also same with Region - it's a pointer in x - not an X ID
861 Ecore_X_Rectangle rect;
862 Ecore_X_XRegion *tmpr;
863
864 if (!ee->engine.x.damages) ee->engine.x.damages = ecore_x_xregion_new();
865 tmpr = ecore_x_xregion_new();
866 rect.x = e->x;
867 rect.y = e->y;
868 rect.width = e->w;
869 rect.height = e->h;
870 ecore_x_xregion_union_rect(tmpr, ee->engine.x.damages, &rect);
871 ecore_x_xregion_free(ee->engine.x.damages);
872 ee->engine.x.damages = tmpr;
873 */
874 }
875 else
876 {
877 if (ee->rotation == 0)
878 evas_damage_rectangle_add(ee->evas, e->x, e->y, e->w, e->h);
879 else if (ee->rotation == 90)
880 evas_damage_rectangle_add(ee->evas,
881 ee->h - e->y - e->h, e->x, e->h, e->w);
882 else if (ee->rotation == 180)
883 evas_damage_rectangle_add(ee->evas, ee->w - e->x - e->w,
884 ee->h - e->y - e->h, e->w, e->h);
885 else if (ee->rotation == 270)
886 evas_damage_rectangle_add(ee->evas, e->y, ee->w - e->x - e->w,
887 e->h, e->w);
888 }
889 return ECORE_CALLBACK_PASS_ON;
890}
891
892static Eina_Bool
893_ecore_evas_x_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
894{
895 Ecore_Evas *ee;
896 Ecore_X_Event_Window_Destroy *e;
897
898 e = event;
899 ee = ecore_event_window_match(e->win);
900 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
901 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
902 if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
903 _ecore_evas_x_sync_clear(ee);
904 ecore_evas_free(ee);
905 return ECORE_CALLBACK_PASS_ON;
906}
907
908static Eina_Bool
909_ecore_evas_x_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
910{
911 Ecore_Evas *ee;
912 Ecore_X_Event_Window_Configure *e;
913
914 e = event;
915 ee = ecore_event_window_match(e->win);
916 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
917 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
918 if (ee->engine.x.direct_resize) return ECORE_CALLBACK_PASS_ON;
919
920 ee->engine.x.configure_coming = 0;
921 if ((e->from_wm) || (ee->prop.override))
922 {
923 if ((ee->x != e->x) || (ee->y != e->y))
924 {
925 ee->x = e->x;
926 ee->y = e->y;
927 ee->req.x = ee->x;
928 ee->req.y = ee->y;
929 if (ee->func.fn_move) ee->func.fn_move(ee);
930 }
931 }
932 if ((ee->w != e->w) || (ee->h != e->h))
933 {
934 ee->w = e->w;
935 ee->h = e->h;
936 ee->req.w = ee->w;
937 ee->req.h = ee->h;
938 if ((ee->rotation == 90) || (ee->rotation == 270))
939 {
940 evas_output_size_set(ee->evas, ee->h, ee->w);
941 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
942 }
943 else
944 {
945 evas_output_size_set(ee->evas, ee->w, ee->h);
946 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
947 }
948 if (ee->prop.avoid_damage)
949 {
950 int pdam;
951
952 pdam = ecore_evas_avoid_damage_get(ee);
953 ecore_evas_avoid_damage_set(ee, 0);
954 ecore_evas_avoid_damage_set(ee, pdam);
955 }
956 if ((ee->shaped) || (ee->alpha))
957 _ecore_evas_x_resize_shape(ee);
958 if ((ee->expecting_resize.w > 0) && (ee->expecting_resize.h > 0))
959 {
960 if ((ee->expecting_resize.w == ee->w) &&
961 (ee->expecting_resize.h == ee->h))
962 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
963 ecore_x_current_time_get());
964 ee->expecting_resize.w = 0;
965 ee->expecting_resize.h = 0;
966 }
967 if (ee->func.fn_resize) ee->func.fn_resize(ee);
968 }
969 return ECORE_CALLBACK_PASS_ON;
970}
971
972static Eina_Bool
973_ecore_evas_x_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
974{
975 Ecore_Evas *ee;
976 Ecore_X_Event_Window_Delete_Request *e;
977
978 e = event;
979 ee = ecore_event_window_match(e->win);
980 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
981 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
982 if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
983 return ECORE_CALLBACK_PASS_ON;
984}
985
986static Eina_Bool
987_ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
988{
989 Ecore_Evas *ee;
990 Ecore_X_Event_Window_Show *e;
991 static int first_map_bug = -1;
992
993 e = event;
994 ee = ecore_event_window_match(e->win);
995 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
996 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
997 if (first_map_bug < 0)
998 {
999 char *bug = NULL;
1000
1001 if ((bug = getenv("ECORE_EVAS_GL_FIRST_MAP_BUG")))
1002 first_map_bug = atoi(bug);
1003 else
1004 first_map_bug = 0;
1005 }
1006 if ((first_map_bug) && (!strcmp(ee->driver, "opengl_x11")))
1007 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1008 if (ee->visible) return ECORE_CALLBACK_PASS_ON;
1009// if (ee->visible) return ECORE_CALLBACK_DONE;
1010// printf("SHOW EVENT %p\n", ee);
1011 ee->visible = 1;
1012 if (ee->func.fn_show) ee->func.fn_show(ee);
1013 return ECORE_CALLBACK_PASS_ON;
1014}
1015
1016static Eina_Bool
1017_ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
1018{
1019 Ecore_Evas *ee;
1020 Ecore_X_Event_Window_Hide *e;
1021
1022 e = event;
1023 ee = ecore_event_window_match(e->win);
1024 if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
1025 if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
1026 if (!ee->visible) return ECORE_CALLBACK_PASS_ON;
1027// if (!ee->visible) return ECORE_CALLBACK_DONE;
1028// printf("HIDE EVENT %p\n", ee);
1029 ee->visible = 0;
1030 if (ee->func.fn_hide) ee->func.fn_hide(ee);
1031 return ECORE_CALLBACK_PASS_ON;
1032}
1033
1034/* FIXME, should be in idler */
1035/* FIXME, round trip */
1036static void
1037_ecore_evas_x_size_pos_hints_update(Ecore_Evas *ee)
1038{
1039 ecore_x_icccm_size_pos_hints_set(ee->prop.window,
1040 ee->prop.request_pos /*request_pos */,
1041 ECORE_X_GRAVITY_NW /* gravity */,
1042 ee->prop.min.w /* min_w */,
1043 ee->prop.min.h /* min_h */,
1044 ee->prop.max.w /* max_w */,
1045 ee->prop.max.h /* max_h */,
1046 ee->prop.base.w /* base_w */,
1047 ee->prop.base.h /* base_h */,
1048 ee->prop.step.w /* step_x */,
1049 ee->prop.step.h /* step_y */,
1050 0 /* min_aspect */,
1051 0 /* max_aspect */);
1052}
1053
1054/* FIXME, should be in idler */
1055static void
1056_ecore_evas_x_state_update(Ecore_Evas *ee)
1057{
1058 Ecore_X_Window_State state[10];
1059 int num = 0;
1060
1061 /*
1062 if (bd->client.netwm.state.modal)
1063 state[num++] = ECORE_X_WINDOW_STATE_MODAL;
1064 */
1065 if (ee->engine.x.state.sticky)
1066 state[num++] = ECORE_X_WINDOW_STATE_STICKY;
1067 /*
1068 if (bd->client.netwm.state.maximized_v)
1069 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1070 if (bd->client.netwm.state.maximized_h)
1071 state[num++] = ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1072 if (bd->client.netwm.state.shaded)
1073 state[num++] = ECORE_X_WINDOW_STATE_SHADED;
1074 if (bd->client.netwm.state.skip_taskbar)
1075 state[num++] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1076 if (bd->client.netwm.state.skip_pager)
1077 state[num++] = ECORE_X_WINDOW_STATE_SKIP_PAGER;
1078 if (bd->client.netwm.state.hidden)
1079 state[num++] = ECORE_X_WINDOW_STATE_HIDDEN;
1080 */
1081 if (ee->engine.x.state.fullscreen)
1082 state[num++] = ECORE_X_WINDOW_STATE_FULLSCREEN;
1083 if (ee->engine.x.state.above)
1084 state[num++] = ECORE_X_WINDOW_STATE_ABOVE;
1085 if (ee->engine.x.state.below)
1086 state[num++] = ECORE_X_WINDOW_STATE_BELOW;
1087
1088 ecore_x_netwm_window_state_set(ee->prop.window, state, num);
1089}
1090
1091static void
1092_ecore_evas_x_layer_update(Ecore_Evas *ee)
1093{
1094 if (ee->should_be_visible)
1095 {
1096 /* We need to send a netwm request to the wm */
1097 /* FIXME: Do we have to remove old state before adding new? */
1098 if (ee->prop.layer < 3)
1099 {
1100 if (ee->engine.x.state.above)
1101 {
1102 ee->engine.x.state.above = 0;
1103 ecore_x_netwm_state_request_send(ee->prop.window,
1104 ee->engine.x.win_root,
1105 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1106 }
1107 if (!ee->engine.x.state.below)
1108 {
1109 ee->engine.x.state.below = 1;
1110 ecore_x_netwm_state_request_send(ee->prop.window,
1111 ee->engine.x.win_root,
1112 ECORE_X_WINDOW_STATE_BELOW, -1, 1);
1113 }
1114 }
1115 else if (ee->prop.layer > 5)
1116 {
1117 if (ee->engine.x.state.below)
1118 {
1119 ee->engine.x.state.below = 0;
1120 ecore_x_netwm_state_request_send(ee->prop.window,
1121 ee->engine.x.win_root,
1122 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1123 }
1124 if (!ee->engine.x.state.above)
1125 {
1126 ee->engine.x.state.above = 1;
1127 ecore_x_netwm_state_request_send(ee->prop.window,
1128 ee->engine.x.win_root,
1129 ECORE_X_WINDOW_STATE_ABOVE, -1, 1);
1130 }
1131 }
1132 else
1133 {
1134 if (ee->engine.x.state.below)
1135 {
1136 ee->engine.x.state.below = 0;
1137 ecore_x_netwm_state_request_send(ee->prop.window,
1138 ee->engine.x.win_root,
1139 ECORE_X_WINDOW_STATE_BELOW, -1, 0);
1140 }
1141 if (ee->engine.x.state.above)
1142 {
1143 ee->engine.x.state.above = 0;
1144 ecore_x_netwm_state_request_send(ee->prop.window,
1145 ee->engine.x.win_root,
1146 ECORE_X_WINDOW_STATE_ABOVE, -1, 0);
1147 }
1148 }
1149 }
1150 else
1151 {
1152 /* Just set the state */
1153 if (ee->prop.layer < 3)
1154 {
1155 if ((ee->engine.x.state.above) || (!ee->engine.x.state.below))
1156 {
1157 ee->engine.x.state.above = 0;
1158 ee->engine.x.state.below = 1;
1159 _ecore_evas_x_state_update(ee);
1160 }
1161 }
1162 else if (ee->prop.layer > 5)
1163 {
1164 if ((!ee->engine.x.state.above) || (ee->engine.x.state.below))
1165 {
1166 ee->engine.x.state.above = 1;
1167 ee->engine.x.state.below = 0;
1168 _ecore_evas_x_state_update(ee);
1169 }
1170 }
1171 else
1172 {
1173 if ((ee->engine.x.state.above) || (ee->engine.x.state.below))
1174 {
1175 ee->engine.x.state.above = 0;
1176 ee->engine.x.state.below = 0;
1177 _ecore_evas_x_state_update(ee);
1178 }
1179 }
1180 }
1181 /* FIXME: Set gnome layer */
1182}
1183
1184static int
1185_ecore_evas_x_init(void)
1186{
1187 _ecore_evas_init_count++;
1188 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
1189 ecore_evas_event_handlers[0] =
1190 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
1191 _ecore_evas_x_event_mouse_in, NULL);
1192 ecore_evas_event_handlers[1] =
1193 ecore_event_handler_add(ECORE_X_EVENT_MOUSE_OUT,
1194 _ecore_evas_x_event_mouse_out, NULL);
1195 ecore_evas_event_handlers[2] =
1196 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN,
1197 _ecore_evas_x_event_window_focus_in, NULL);
1198 ecore_evas_event_handlers[3] =
1199 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT,
1200 _ecore_evas_x_event_window_focus_out, NULL);
1201 ecore_evas_event_handlers[4] =
1202 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DAMAGE,
1203 _ecore_evas_x_event_window_damage, NULL);
1204 ecore_evas_event_handlers[5] =
1205 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY,
1206 _ecore_evas_x_event_window_destroy, NULL);
1207 ecore_evas_event_handlers[6] =
1208 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
1209 _ecore_evas_x_event_window_configure, NULL);
1210 ecore_evas_event_handlers[7] =
1211 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST,
1212 _ecore_evas_x_event_window_delete_request, NULL);
1213 ecore_evas_event_handlers[8] =
1214 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHOW,
1215 _ecore_evas_x_event_window_show, NULL);
1216 ecore_evas_event_handlers[9] =
1217 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_HIDE,
1218 _ecore_evas_x_event_window_hide, NULL);
1219 ecore_evas_event_handlers[10] =
1220 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY,
1221 _ecore_evas_x_event_property_change, NULL);
1222 ecore_evas_event_handlers[11] =
1223 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE,
1224 _ecore_evas_x_event_visibility_change, NULL);
1225 ecore_evas_event_handlers[12] =
1226 ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
1227 _ecore_evas_x_event_client_message, NULL);
1228 ecore_event_evas_init();
1229 return _ecore_evas_init_count;
1230}
1231
1232static void
1233_ecore_evas_x_free(Ecore_Evas *ee)
1234{
1235 _ecore_evas_x_group_leader_unset(ee);
1236 _ecore_evas_x_sync_set(ee);
1237 if (ee->engine.x.win_shaped_input)
1238 ecore_x_window_free(ee->engine.x.win_shaped_input);
1239 ecore_x_window_free(ee->prop.window);
1240 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
1241 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1242 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
1243 if (ee->engine.x.damages) ecore_x_xregion_free(ee->engine.x.damages);
1244 ee->engine.x.pmap = 0;
1245 ee->engine.x.mask = 0;
1246 ee->engine.x.gc = 0;
1247 ee->engine.x.damages = NULL;
1248 ecore_event_window_unregister(ee->prop.window);
1249 while (ee->engine.x.win_extra)
1250 {
1251 Ecore_X_Window *winp;
1252
1253 winp = ee->engine.x.win_extra->data;
1254 ee->engine.x.win_extra =
1255 eina_list_remove_list(ee->engine.x.win_extra, ee->engine.x.win_extra);
1256 ecore_event_window_unregister(*winp);
1257 free(winp);
1258 }
1259 _ecore_evas_x_shutdown();
1260 ecore_x_shutdown();
1261}
1262
1263static void
1264_ecore_evas_x_callback_delete_request_set(Ecore_Evas *ee, void (*func) (Ecore_Evas *ee))
1265{
1266 ee->func.fn_delete_request = func;
1267 _ecore_evas_x_protocols_set(ee);
1268 _ecore_evas_x_sync_set(ee);
1269}
1270
1271static void
1272_ecore_evas_x_move(Ecore_Evas *ee, int x, int y)
1273{
1274 ee->req.x = x;
1275 ee->req.y = y;
1276 if (ee->engine.x.direct_resize)
1277 {
1278 if (!ee->engine.x.managed)
1279 {
1280 if ((x != ee->x) || (y != ee->y))
1281 {
1282 ee->x = x;
1283 ee->y = y;
1284 ecore_x_window_move(ee->prop.window, x, y);
1285 if (!ee->should_be_visible)
1286 {
1287 /* We need to request pos */
1288 ee->prop.request_pos = 1;
1289 _ecore_evas_x_size_pos_hints_update(ee);
1290 }
1291 if (ee->func.fn_move) ee->func.fn_move(ee);
1292 }
1293 }
1294 }
1295 else
1296 {
1297 if (((ee->x != x) || (ee->y != y)) ||
1298 (ee->engine.x.configure_coming))
1299 {
1300 ee->engine.x.configure_coming = 1;
1301 if (!ee->engine.x.managed)
1302 {
1303 ee->x = x;
1304 ee->y = y;
1305 }
1306 ecore_x_window_move(ee->prop.window, x, y);
1307 }
1308 if (!ee->should_be_visible)
1309 {
1310 /* We need to request pos */
1311 ee->prop.request_pos = 1;
1312 _ecore_evas_x_size_pos_hints_update(ee);
1313 }
1314 }
1315}
1316
1317static void
1318_ecore_evas_x_managed_move(Ecore_Evas *ee, int x, int y)
1319{
1320 ee->req.x = x;
1321 ee->req.y = y;
1322 if (ee->engine.x.direct_resize)
1323 {
1324 ee->engine.x.managed = 1;
1325 if ((x != ee->x) || (y != ee->y))
1326 {
1327 ee->x = x;
1328 ee->y = y;
1329 if (ee->func.fn_move) ee->func.fn_move(ee);
1330 }
1331 }
1332}
1333
1334static void
1335_ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
1336{
1337 ee->req.w = w;
1338 ee->req.h = h;
1339 if (ee->engine.x.direct_resize)
1340 {
1341 if ((ee->w != w) || (ee->h != h))
1342 {
1343 ee->w = w;
1344 ee->h = h;
1345 ecore_x_window_resize(ee->prop.window, w, h);
1346 if ((ee->rotation == 90) || (ee->rotation == 270))
1347 {
1348 evas_output_size_set(ee->evas, ee->h, ee->w);
1349 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1350 }
1351 else
1352 {
1353 evas_output_size_set(ee->evas, ee->w, ee->h);
1354 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1355 }
1356 if (ee->prop.avoid_damage)
1357 {
1358 int pdam;
1359
1360 pdam = ecore_evas_avoid_damage_get(ee);
1361 ecore_evas_avoid_damage_set(ee, 0);
1362 ecore_evas_avoid_damage_set(ee, pdam);
1363 }
1364 if ((ee->shaped) || (ee->alpha))
1365 _ecore_evas_x_resize_shape(ee);
1366 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1367 }
1368 }
1369 else if (((ee->w != w) || (ee->h != h)) ||
1370 (ee->engine.x.configure_coming))
1371 {
1372 ee->engine.x.configure_coming = 1;
1373 ecore_x_window_resize(ee->prop.window, w, h);
1374 }
1375}
1376
1377static void
1378_ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
1379{
1380 ee->req.x = x;
1381 ee->req.y = y;
1382 ee->req.w = w;
1383 ee->req.h = h;
1384 if (ee->engine.x.direct_resize)
1385 {
1386 if ((ee->w != w) || (ee->h != h) || (x != ee->x) || (y != ee->y))
1387 {
1388 int change_size = 0, change_pos = 0;
1389
1390 if ((ee->w != w) || (ee->h != h)) change_size = 1;
1391 if (!ee->engine.x.managed)
1392 {
1393 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
1394 }
1395 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1396 if (!ee->engine.x.managed)
1397 {
1398 ee->x = x;
1399 ee->y = y;
1400 }
1401 ee->w = w;
1402 ee->h = h;
1403 if ((ee->rotation == 90) || (ee->rotation == 270))
1404 {
1405 evas_output_size_set(ee->evas, ee->h, ee->w);
1406 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1407 }
1408 else
1409 {
1410 evas_output_size_set(ee->evas, ee->w, ee->h);
1411 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1412 }
1413 if (ee->prop.avoid_damage)
1414 {
1415 int pdam;
1416
1417 pdam = ecore_evas_avoid_damage_get(ee);
1418 ecore_evas_avoid_damage_set(ee, 0);
1419 ecore_evas_avoid_damage_set(ee, pdam);
1420 }
1421 if ((ee->shaped) || (ee->alpha))
1422 _ecore_evas_x_resize_shape(ee);
1423 if (change_pos)
1424 {
1425 if (ee->func.fn_move) ee->func.fn_move(ee);
1426 }
1427 if (change_size)
1428 {
1429 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1430 }
1431 }
1432 }
1433 else if (((ee->w != w) || (ee->h != h) || (ee->x != x) || (ee->y != y)) ||
1434 (ee->engine.x.configure_coming))
1435 {
1436 ee->engine.x.configure_coming = 1;
1437 ecore_x_window_move_resize(ee->prop.window, x, y, w, h);
1438 if (!ee->engine.x.managed)
1439 {
1440 ee->x = x;
1441 ee->y = y;
1442 }
1443 }
1444}
1445
1446static void
1447_ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
1448 Evas_Engine_Info *einfo)
1449{
1450 int rot_dif;
1451
1452 rot_dif = ee->rotation - rotation;
1453 if (rot_dif < 0) rot_dif = -rot_dif;
1454
1455 if (rot_dif != 180)
1456 {
1457 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
1458
1459 if (!evas_engine_info_set(ee->evas, einfo))
1460 {
1461 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1462 }
1463
1464 if (!resize)
1465 {
1466 ee->engine.x.configure_coming = 1;
1467 if (!ee->prop.fullscreen)
1468 {
1469 ecore_x_window_resize(ee->prop.window, ee->req.h, ee->req.w);
1470 ee->expecting_resize.w = ee->h;
1471 ee->expecting_resize.h = ee->w;
1472 }
1473 else
1474 {
1475 int w, h;
1476
1477 ecore_x_window_size_get(ee->prop.window, &w, &h);
1478 ecore_x_window_resize(ee->prop.window, h, w);
1479 if ((rotation == 0) || (rotation == 180))
1480 {
1481 evas_output_size_set(ee->evas, ee->req.w, ee->req.h);
1482 evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h);
1483 }
1484 else
1485 {
1486 evas_output_size_set(ee->evas, ee->req.h, ee->req.w);
1487 evas_output_viewport_set(ee->evas, 0, 0, ee->req.h, ee->req.w);
1488 }
1489 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1490 }
1491 if ((ee->rotation == 90) || (ee->rotation == 270))
1492 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w);
1493 else
1494 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1495 }
1496 else
1497 {
1498 /* int w, h; */
1499
1500 /* ecore_x_window_size_get(ee->prop.window, &w, &h); */
1501 if ((rotation == 0) || (rotation == 180))
1502 {
1503 evas_output_size_set(ee->evas, ee->w, ee->h);
1504 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
1505 }
1506 else
1507 {
1508 evas_output_size_set(ee->evas, ee->h, ee->w);
1509 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
1510 }
1511 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1512 if ((ee->rotation == 90) || (ee->rotation == 270))
1513 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1514 else
1515 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1516 }
1517 ecore_evas_size_min_get(ee, &minw, &minh);
1518 ecore_evas_size_max_get(ee, &maxw, &maxh);
1519 ecore_evas_size_base_get(ee, &basew, &baseh);
1520 ecore_evas_size_step_get(ee, &stepw, &steph);
1521 ee->rotation = rotation;
1522 ecore_evas_size_min_set(ee, minh, minw);
1523 ecore_evas_size_max_set(ee, maxh, maxw);
1524 ecore_evas_size_base_set(ee, baseh, basew);
1525 ecore_evas_size_step_set(ee, steph, stepw);
1526 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1527 ecore_x_current_time_get());
1528 }
1529 else
1530 {
1531 if (!evas_engine_info_set(ee->evas, einfo))
1532 {
1533 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1534 }
1535 ee->rotation = rotation;
1536 _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
1537 ecore_x_current_time_get());
1538 if (ee->func.fn_resize) ee->func.fn_resize(ee);
1539
1540 if ((ee->rotation == 90) || (ee->rotation == 270))
1541 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
1542 else
1543 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1544 }
1545}
1546
1547static void
1548_ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize)
1549{
1550 if (ee->rotation == rotation) return;
1551 if (!strcmp(ee->driver, "opengl_x11"))
1552 {
1553#ifdef BUILD_ECORE_EVAS_OPENGL_X11
1554 Evas_Engine_Info_GL_X11 *einfo;
1555
1556 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1557 if (!einfo) return;
1558 einfo->info.rotation = rotation;
1559 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1560 (Evas_Engine_Info *)einfo);
1561#endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1562 }
1563 else if (!strcmp(ee->driver, "software_x11"))
1564 {
1565#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1566 Evas_Engine_Info_Software_X11 *einfo;
1567
1568 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1569 if (!einfo) return;
1570 einfo->info.rotation = rotation;
1571 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1572 (Evas_Engine_Info *)einfo);
1573#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1574 }
1575 else if (!strcmp(ee->driver, "software_16_x11"))
1576 {
1577#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1578 Evas_Engine_Info_Software_16_X11 *einfo;
1579
1580 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1581 if (!einfo) return;
1582 einfo->info.rotation = rotation;
1583 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1584 (Evas_Engine_Info *)einfo);
1585#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1586 }
1587 else if (!strcmp(ee->driver, "software_8_x11"))
1588 {
1589#if BUILD_ECORE_EVAS_SOFTWARE_8_X11
1590 Evas_Engine_Info_Software_8_X11 *einfo;
1591
1592 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1593 if (!einfo) return;
1594 einfo->info.rotation = rotation;
1595 _ecore_evas_x_rotation_set_internal(ee, rotation, resize,
1596 (Evas_Engine_Info *)einfo);
1597#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1598 }
1599}
1600
1601static void
1602_ecore_evas_x_shaped_set(Ecore_Evas *ee, int shaped)
1603{
1604 if ((ee->shaped == shaped)) return;
1605 if (!strcmp(ee->driver, "opengl_x11")) return;
1606 if (!strcmp(ee->driver, "software_x11"))
1607 {
1608#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1609 Evas_Engine_Info_Software_X11 *einfo;
1610
1611 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1612 ee->shaped = shaped;
1613 if (einfo)
1614 {
1615 if (ee->shaped)
1616 {
1617 unsigned int foreground;
1618 Ecore_X_GC gc;
1619
1620 if (!ee->engine.x.mask)
1621 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1622 foreground = 0;
1623 gc = ecore_x_gc_new(ee->engine.x.mask,
1624 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1625 &foreground);
1626 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1627 0, 0, ee->w, ee->h);
1628 ecore_x_gc_free(gc);
1629 einfo->info.mask = ee->engine.x.mask;
1630 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1631 {
1632 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1633 }
1634 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1635 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1636 }
1637 else
1638 {
1639 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1640 ee->engine.x.mask = 0;
1641 einfo->info.mask = 0;
1642 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1643 {
1644 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1645 }
1646 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1647 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1648 }
1649 }
1650#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1651 }
1652 else if (!strcmp(ee->driver, "software_16_x11"))
1653 {
1654#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1655# if 0 /* XXX no shaped window support for software_16_x11 */
1656 Evas_Engine_Info_Software_16_X11 *einfo;
1657
1658 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1659 ee->shaped = shaped;
1660 if (einfo)
1661 {
1662 if (ee->shaped)
1663 {
1664 ee->engine.x.mask =
1665 ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1666 einfo->info.mask = ee->engine.x.mask;
1667 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1668 {
1669 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1670 }
1671 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1672 }
1673 else
1674 {
1675 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1676 ee->engine.x.mask = 0;
1677 einfo->info.mask = 0;
1678 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1679 {
1680 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1681 }
1682 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1683 }
1684 }
1685# endif /* XXX no shaped window support for software_16_x11 */
1686#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
1687 }
1688 if (!strcmp(ee->driver, "software_8_x11"))
1689 {
1690#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
1691 Evas_Engine_Info_Software_8_X11 *einfo;
1692
1693 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
1694 ee->shaped = shaped;
1695 if (einfo)
1696 {
1697 if (ee->shaped)
1698 {
1699 unsigned int foreground;
1700 Ecore_X_GC gc;
1701
1702 if (!ee->engine.x.mask)
1703 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 1);
1704 foreground = 0;
1705 gc = ecore_x_gc_new(ee->engine.x.mask,
1706 ECORE_X_GC_VALUE_MASK_FOREGROUND,
1707 &foreground);
1708 ecore_x_drawable_rectangle_fill(ee->engine.x.mask, gc,
1709 0, 0, ee->w, ee->h);
1710 ecore_x_gc_free(gc);
1711 einfo->info.mask = ee->engine.x.mask;
1712 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1713 {
1714 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1715 }
1716 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
1717 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1718 }
1719 else
1720 {
1721 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1722 ee->engine.x.mask = 0;
1723 einfo->info.mask = 0;
1724 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1725 {
1726 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1727 }
1728 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1729 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1730 }
1731 }
1732#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
1733 }
1734}
1735
1736/* FIXME, round trip */
1737static void
1738_ecore_evas_x_alpha_set(Ecore_Evas *ee, int alpha)
1739{
1740 Ecore_X_Window_Attributes att;
1741 char *id = NULL;
1742
1743 if ((ee->alpha == alpha)) return;
1744
1745 if (!strcmp(ee->driver, "software_x11"))
1746 {
1747#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
1748 Evas_Engine_Info_Software_X11 *einfo;
1749
1750 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
1751 if (!einfo) return;
1752
1753 if (!ecore_x_composite_query()) return;
1754
1755 ee->shaped = 0;
1756 ee->alpha = alpha;
1757 ecore_x_window_free(ee->prop.window);
1758 ecore_event_window_unregister(ee->prop.window);
1759 if (ee->alpha)
1760 {
1761 if (ee->prop.override)
1762 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1763 else
1764 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1765 if (!ee->engine.x.mask)
1766 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1767 }
1768 else
1769 {
1770 if (ee->prop.override)
1771 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1772 else
1773 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1774 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1775 ee->engine.x.mask = 0;
1776 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1777 }
1778
1779 einfo->info.destination_alpha = alpha;
1780
1781 ecore_x_window_attributes_get(ee->prop.window, &att);
1782 einfo->info.visual = att.visual;
1783 einfo->info.colormap = att.colormap;
1784 einfo->info.depth = att.depth;
1785
1786// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1787// ee->engine.x.mask = 0;
1788 einfo->info.mask = ee->engine.x.mask;
1789 einfo->info.drawable = ee->prop.window;
1790 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1791 {
1792 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1793 }
1794 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1795 ecore_x_window_shape_mask_set(ee->prop.window, 0);
1796 ecore_x_input_multi_select(ee->prop.window);
1797 ecore_event_window_register(ee->prop.window, ee, ee->evas,
1798 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
1799 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
1800 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
1801 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
1802 if (ee->prop.borderless)
1803 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
1804 if (ee->visible) ecore_x_window_show(ee->prop.window);
1805 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
1806 if (ee->prop.title)
1807 {
1808 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
1809 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
1810 }
1811 ecore_x_icccm_hints_set(ee->prop.window,
1812 1 /* accepts_focus */,
1813 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
1814 0 /* icon_pixmap */,
1815 0 /* icon_mask */,
1816 0 /* icon_window */,
1817 0 /* window_group */,
1818 0 /* is_urgent */);
1819 _ecore_evas_x_group_leader_update(ee);
1820 ecore_x_window_defaults_set(ee->prop.window);
1821 _ecore_evas_x_protocols_set(ee);
1822 _ecore_evas_x_sync_set(ee);
1823#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
1824 if ((id = getenv("DESKTOP_STARTUP_ID")))
1825 {
1826 ecore_x_netwm_startup_id_set(ee->prop.window, id);
1827 /* NB: on linux this may simply empty the env as opposed to completely
1828 * unset it to being empty - unsure as solartis libc crashes looking
1829 * for the '=' char */
1830 // putenv((char*)"DESKTOP_STARTUP_ID=");
1831 }
1832 }
1833 else if (!strcmp(ee->driver, "opengl_x11"))
1834 {
1835#ifdef BUILD_ECORE_EVAS_OPENGL_X11
1836 Evas_Engine_Info_GL_X11 *einfo;
1837
1838 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
1839 if (!einfo) return;
1840
1841 if (!ecore_x_composite_query()) return;
1842
1843 ee->shaped = 0;
1844 ee->alpha = alpha;
1845 ecore_x_window_free(ee->prop.window);
1846 ecore_event_window_unregister(ee->prop.window);
1847 ee->prop.window = 0;
1848
1849 einfo->info.destination_alpha = alpha;
1850
1851 if (ee->engine.x.win_root != 0)
1852 {
1853 /* FIXME: round trip in ecore_x_window_argb_get */
1854 if (ecore_x_window_argb_get(ee->engine.x.win_root))
1855 {
1856 ee->prop.window =
1857 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
1858 ee->req.x, ee->req.y,
1859 ee->req.w, ee->req.h,
1860 ee->prop.override, 1, NULL);
1861 }
1862 else
1863 {
1864 ee->prop.window =
1865 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
1866 ee->req.x, ee->req.y,
1867 ee->req.w, ee->req.h,
1868 ee->prop.override, ee->alpha,
1869 NULL);
1870 }
1871 }
1872 else
1873 {
1874 ee->prop.window =
1875 _ecore_evas_x_gl_window_new(ee, ee->engine.x.win_root,
1876 ee->req.x, ee->req.y,
1877 ee->req.w, ee->req.h,
1878 ee->prop.override, ee->alpha, NULL);
1879 }
1880
1881 if (!ee->prop.window) return;
1882/*
1883 if (ee->alpha)
1884 {
1885 if (ee->prop.override)
1886 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1887 else
1888 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1889 if (!ee->engine.x.mask)
1890 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1891 }
1892 else
1893 {
1894 if (ee->prop.override)
1895 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1896 else
1897 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1898 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1899 ee->engine.x.mask = 0;
1900 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1901 }
1902 */
1903
1904 ecore_x_window_attributes_get(ee->prop.window, &att);
1905 einfo->info.visual = att.visual;
1906 einfo->info.colormap = att.colormap;
1907 einfo->info.depth = att.depth;
1908
1909// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1910// ee->engine.x.mask = 0;
1911// einfo->info.mask = ee->engine.x.mask;
1912 einfo->info.drawable = ee->prop.window;
1913 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1914 {
1915 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1916 }
1917 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1918// ecore_x_window_shape_mask_set(ee->prop.window, 0);
1919 ecore_x_input_multi_select(ee->prop.window);
1920 ecore_event_window_register(ee->prop.window, ee, ee->evas,
1921 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
1922 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
1923 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
1924 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
1925 if (ee->prop.borderless)
1926 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
1927 if (ee->visible) ecore_x_window_show(ee->prop.window);
1928 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
1929 if (ee->prop.title)
1930 {
1931 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
1932 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
1933 }
1934 ecore_x_icccm_hints_set(ee->prop.window,
1935 1 /* accepts_focus */,
1936 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
1937 0 /* icon_pixmap */,
1938 0 /* icon_mask */,
1939 0 /* icon_window */,
1940 0 /* window_group */,
1941 0 /* is_urgent */);
1942 _ecore_evas_x_group_leader_update(ee);
1943 ecore_x_window_defaults_set(ee->prop.window);
1944 _ecore_evas_x_protocols_set(ee);
1945 _ecore_evas_x_sync_set(ee);
1946#endif /* BUILD_ECORE_EVAS_OPENGL_X11 */
1947 if ((id = getenv("DESKTOP_STARTUP_ID")))
1948 {
1949 ecore_x_netwm_startup_id_set(ee->prop.window, id);
1950 /* NB: on linux this may simply empty the env as opposed to completely
1951 * unset it to being empty - unsure as solartis libc crashes looking
1952 * for the '=' char */
1953 // putenv((char*)"DESKTOP_STARTUP_ID=");
1954 }
1955 }
1956 else if (!strcmp(ee->driver, "software_16_x11"))
1957 {
1958#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
1959 Evas_Engine_Info_Software_16_X11 *einfo;
1960
1961 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
1962 if (!einfo) return;
1963
1964 ee->shaped = 0;
1965 ee->alpha = alpha;
1966 ecore_x_window_free(ee->prop.window);
1967 ecore_event_window_unregister(ee->prop.window);
1968 if (ee->alpha)
1969 {
1970 if (ee->prop.override)
1971 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1972 else
1973 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1974 if (!ee->engine.x.mask)
1975 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
1976 }
1977 else
1978 {
1979 if (ee->prop.override)
1980 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1981 else
1982 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
1983 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1984 ee->engine.x.mask = 0;
1985 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
1986 }
1987
1988# if 0 /* XXX no alpha window support for software_16_x11 */
1989 einfo->info.destination_alpha = alpha;
1990# endif /* XXX no alpha window support for software_16_x11 */
1991
1992# if 0 /* XXX no shaped window support for software_16_x11 */
1993// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
1994// ee->engine.x.mask = 0;
1995 einfo->info.mask = ee->engine.x.mask;
1996# endif /* XXX no shaped window support for software_16_x11 */
1997
1998 einfo->info.drawable = ee->prop.window;
1999 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2000 {
2001 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2002 }
2003 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2004 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2005 ecore_x_input_multi_select(ee->prop.window);
2006 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2007 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2008 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2009 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2010 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2011 if (ee->prop.borderless)
2012 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2013 if (ee->visible) ecore_x_window_show(ee->prop.window);
2014 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2015 if (ee->prop.title)
2016 {
2017 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2018 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2019 }
2020 ecore_x_icccm_hints_set(ee->prop.window,
2021 1 /* accepts_focus */,
2022 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2023 0 /* icon_pixmap */,
2024 0 /* icon_mask */,
2025 0 /* icon_window */,
2026 0 /* window_group */,
2027 0 /* is_urgent */);
2028 _ecore_evas_x_group_leader_update(ee);
2029 ecore_x_window_defaults_set(ee->prop.window);
2030 _ecore_evas_x_protocols_set(ee);
2031 _ecore_evas_x_sync_set(ee);
2032#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2033 if ((id = getenv("DESKTOP_STARTUP_ID")))
2034 {
2035 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2036 /* NB: on linux this may simply empty the env as opposed to completely
2037 * unset it to being empty - unsure as solartis libc crashes looking
2038 * for the '=' char */
2039 // putenv((char*)"DESKTOP_STARTUP_ID=");
2040 }
2041 }
2042 else if (!strcmp(ee->driver, "software_8_x11"))
2043 {
2044#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2045 Evas_Engine_Info_Software_8_X11 *einfo;
2046
2047 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2048 if (!einfo) return;
2049
2050 ee->shaped = 0;
2051 ee->alpha = alpha;
2052 ecore_x_window_free(ee->prop.window);
2053 ecore_event_window_unregister(ee->prop.window);
2054 if (ee->alpha)
2055 {
2056 if (ee->prop.override)
2057 ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2058 else
2059 ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2060 if (!ee->engine.x.mask)
2061 ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1);
2062 }
2063 else
2064 {
2065 if (ee->prop.override)
2066 ee->prop.window = ecore_x_window_override_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2067 else
2068 ee->prop.window = ecore_x_window_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h);
2069 if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2070 ee->engine.x.mask = 0;
2071 ecore_x_window_shape_input_mask_set(ee->prop.window, 0);
2072 }
2073
2074 einfo->info.destination_alpha = alpha;
2075
2076 ecore_x_window_attributes_get(ee->prop.window, &att);
2077 einfo->info.visual = att.visual;
2078 einfo->info.colormap = att.colormap;
2079 einfo->info.depth = att.depth;
2080
2081// if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
2082// ee->engine.x.mask = 0;
2083 einfo->info.mask = ee->engine.x.mask;
2084 einfo->info.drawable = ee->prop.window;
2085 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2086 {
2087 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2088 }
2089 evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
2090 ecore_x_window_shape_mask_set(ee->prop.window, 0);
2091 ecore_x_input_multi_select(ee->prop.window);
2092 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2093 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2094 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2095 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2096 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2097 if (ee->prop.borderless)
2098 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2099 if (ee->visible) ecore_x_window_show(ee->prop.window);
2100 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2101 if (ee->prop.title)
2102 {
2103 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2104 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2105 }
2106 ecore_x_icccm_hints_set(ee->prop.window,
2107 1 /* accepts_focus */,
2108 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2109 0 /* icon_pixmap */,
2110 0 /* icon_mask */,
2111 0 /* icon_window */,
2112 0 /* window_group */,
2113 0 /* is_urgent */);
2114 _ecore_evas_x_group_leader_update(ee);
2115 ecore_x_window_defaults_set(ee->prop.window);
2116 _ecore_evas_x_protocols_set(ee);
2117 _ecore_evas_x_sync_set(ee);
2118
2119 if ((id = getenv("DESKTOP_STARTUP_ID")))
2120 {
2121 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2122 /* NB: on linux this may simply empty the env as opposed to completely
2123 * unset it to being empty - unsure as solartis libc crashes looking
2124 * for the '=' char */
2125 // putenv((char*)"DESKTOP_STARTUP_ID=");
2126 }
2127#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2128 }
2129}
2130
2131static void
2132_ecore_evas_x_transparent_set(Ecore_Evas *ee, int transparent)
2133{
2134 if ((ee->transparent == transparent)) return;
2135
2136 if (!strcmp(ee->driver, "software_x11"))
2137 {
2138#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2139 Evas_Engine_Info_Software_X11 *einfo;
2140
2141 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2142 if (!einfo) return;
2143
2144 ee->transparent = transparent;
2145 einfo->info.destination_alpha = transparent;
2146 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2147 {
2148 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2149 }
2150 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2151#endif
2152 }
2153}
2154#endif /* BUILD_ECORE_EVAS_X11 */
2155
2156#ifdef BUILD_ECORE_EVAS_X11
2157static void
2158_ecore_evas_x_show(Ecore_Evas *ee)
2159{
2160 ee->should_be_visible = 1;
2161 if (ee->prop.avoid_damage)
2162 _ecore_evas_x_render(ee);
2163 _ecore_evas_x_sync_set(ee);
2164 ecore_x_window_show(ee->prop.window);
2165 if (ee->prop.fullscreen)
2166 ecore_x_window_focus(ee->prop.window);
2167}
2168
2169static void
2170_ecore_evas_x_hide(Ecore_Evas *ee)
2171{
2172 ecore_x_window_hide(ee->prop.window);
2173 ee->should_be_visible = 0;
2174 _ecore_evas_x_sync_set(ee);
2175}
2176
2177static void
2178_ecore_evas_x_raise(Ecore_Evas *ee)
2179{
2180 ecore_x_window_raise(ee->prop.window);
2181}
2182
2183static void
2184_ecore_evas_x_lower(Ecore_Evas *ee)
2185{
2186 ecore_x_window_lower(ee->prop.window);
2187}
2188
2189static void
2190_ecore_evas_x_activate(Ecore_Evas *ee)
2191{
2192 ecore_x_netwm_client_active_request(ee->engine.x.win_root,
2193 ee->prop.window, 2, 0);
2194}
2195
2196static void
2197_ecore_evas_x_title_set(Ecore_Evas *ee, const char *t)
2198{
2199 if (ee->prop.title) free(ee->prop.title);
2200 ee->prop.title = NULL;
2201 if (t) ee->prop.title = strdup(t);
2202 ecore_x_icccm_title_set(ee->prop.window, ee->prop.title);
2203 ecore_x_netwm_name_set(ee->prop.window, ee->prop.title);
2204}
2205
2206static void
2207_ecore_evas_x_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
2208{
2209 if (ee->prop.name) free(ee->prop.name);
2210 if (ee->prop.clas) free(ee->prop.clas);
2211 ee->prop.name = NULL;
2212 ee->prop.clas = NULL;
2213 if (n) ee->prop.name = strdup(n);
2214 if (c) ee->prop.clas = strdup(c);
2215 ecore_x_icccm_name_class_set(ee->prop.window, ee->prop.name, ee->prop.clas);
2216}
2217
2218static void
2219_ecore_evas_x_size_min_set(Ecore_Evas *ee, int w, int h)
2220{
2221 if (w < 0) w = 0;
2222 if (h < 0) h = 0;
2223 if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
2224 ee->prop.min.w = w;
2225 ee->prop.min.h = h;
2226 _ecore_evas_x_size_pos_hints_update(ee);
2227}
2228
2229static void
2230_ecore_evas_x_size_max_set(Ecore_Evas *ee, int w, int h)
2231{
2232 if (w < 0) w = 0;
2233 if (h < 0) h = 0;
2234 if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
2235 ee->prop.max.w = w;
2236 ee->prop.max.h = h;
2237 _ecore_evas_x_size_pos_hints_update(ee);
2238}
2239
2240static void
2241_ecore_evas_x_size_base_set(Ecore_Evas *ee, int w, int h)
2242{
2243 if (w < 0) w = 0;
2244 if (h < 0) h = 0;
2245 if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
2246 ee->prop.base.w = w;
2247 ee->prop.base.h = h;
2248 _ecore_evas_x_size_pos_hints_update(ee);
2249}
2250
2251static void
2252_ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
2253{
2254 if (w < 1) w = 1;
2255 if (h < 1) h = 1;
2256 if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
2257 ee->prop.step.w = w;
2258 ee->prop.step.h = h;
2259 _ecore_evas_x_size_pos_hints_update(ee);
2260}
2261
2262static void
2263_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
2264{
2265 Ecore_Evas *ee;
2266
2267 ee = data;
2268 if (ee) ee->prop.cursor.object = NULL;
2269}
2270
2271static void
2272_ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
2273{
2274 int x, y;
2275
2276 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
2277
2278 if (!obj)
2279 {
2280 ee->prop.cursor.object = NULL;
2281 ee->prop.cursor.layer = 0;
2282 ee->prop.cursor.hot.x = 0;
2283 ee->prop.cursor.hot.y = 0;
2284 ecore_x_window_cursor_show(ee->prop.window, 1);
2285 return;
2286 }
2287
2288 ee->prop.cursor.object = obj;
2289 ee->prop.cursor.layer = layer;
2290 ee->prop.cursor.hot.x = hot_x;
2291 ee->prop.cursor.hot.y = hot_y;
2292
2293 ecore_x_window_cursor_show(ee->prop.window, 0);
2294
2295 evas_pointer_output_xy_get(ee->evas, &x, &y);
2296 evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
2297 evas_object_move(ee->prop.cursor.object,
2298 x - ee->prop.cursor.hot.x,
2299 y - ee->prop.cursor.hot.y);
2300 evas_object_pass_events_set(ee->prop.cursor.object, 1);
2301 if (evas_pointer_inside_get(ee->evas))
2302 evas_object_show(ee->prop.cursor.object);
2303
2304 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
2305}
2306
2307/*
2308 * @param ee
2309 * @param layer If < 3, @a ee will be put below all other windows.
2310 * If > 5, @a ee will be "always-on-top"
2311 * If = 4, @a ee will be put in the default layer.
2312 * Acceptable values range from 1 to 255 (0 reserved for
2313 * desktop windows)
2314 */
2315static void
2316_ecore_evas_x_layer_set(Ecore_Evas *ee, int layer)
2317{
2318 if (ee->prop.layer == layer) return;
2319
2320 /* FIXME: Should this logic be here? */
2321 if (layer < 1)
2322 layer = 1;
2323 else if (layer > 255)
2324 layer = 255;
2325
2326 ee->prop.layer = layer;
2327 _ecore_evas_x_layer_update(ee);
2328}
2329
2330static void
2331_ecore_evas_x_focus_set(Ecore_Evas *ee, int on __UNUSED__)
2332{
2333 ecore_x_window_focus(ee->prop.window);
2334}
2335
2336static void
2337_ecore_evas_x_iconified_set(Ecore_Evas *ee, int on)
2338{
2339 if (ee->prop.iconified == on) return;
2340 ee->prop.iconified = on;
2341 if (on)
2342 {
2343 ecore_x_icccm_hints_set(ee->prop.window,
2344 1 /* accepts_focus */,
2345 ECORE_X_WINDOW_STATE_HINT_ICONIC /* initial_state */,
2346 0 /* icon_pixmap */,
2347 0 /* icon_mask */,
2348 0 /* icon_window */,
2349 0 /* window_group */,
2350 0 /* is_urgent */);
2351 ecore_x_icccm_iconic_request_send(ee->prop.window, ee->engine.x.win_root);
2352 }
2353 else
2354 {
2355 ecore_x_icccm_hints_set(ee->prop.window,
2356 1 /* accepts_focus */,
2357 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2358 0 /* icon_pixmap */,
2359 0 /* icon_mask */,
2360 0 /* icon_window */,
2361 0 /* window_group */,
2362 0 /* is_urgent */);
2363 ecore_evas_show(ee);
2364 }
2365}
2366
2367static void
2368_ecore_evas_x_borderless_set(Ecore_Evas *ee, int on)
2369{
2370 if (ee->prop.borderless == on) return;
2371 ee->prop.borderless = on;
2372 ecore_x_mwm_borderless_set(ee->prop.window, ee->prop.borderless);
2373}
2374
2375/* FIXME: This function changes the initial state of the ee
2376 * whilest the iconic function changes the current state! */
2377static void
2378_ecore_evas_x_withdrawn_set(Ecore_Evas *ee, int withdrawn)
2379{
2380 Ecore_X_Window_State_Hint hint;
2381
2382 if (ee->prop.withdrawn == withdrawn) return;
2383
2384 ee->prop.withdrawn = withdrawn;
2385 if (withdrawn)
2386 hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
2387 else
2388 hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
2389
2390 ecore_x_icccm_hints_set(ee->prop.window,
2391 1 /* accepts_focus */,
2392 hint /* initial_state */,
2393 0 /* icon_pixmap */,
2394 0 /* icon_mask */,
2395 0 /* icon_window */,
2396 0 /* window_group */,
2397 0 /* is_urgent */);
2398}
2399
2400static void
2401_ecore_evas_x_sticky_set(Ecore_Evas *ee, int sticky)
2402{
2403 if (ee->prop.sticky == sticky) return;
2404
2405 /* We dont want to set prop.sticky here as it will cause
2406 * the sticky callback not to get called. Its set on the
2407 * property change event.
2408 * ee->prop.sticky = sticky;
2409 */
2410 ee->engine.x.state.sticky = sticky;
2411 if (ee->should_be_visible)
2412 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2413 ECORE_X_WINDOW_STATE_STICKY, -1, sticky);
2414 else
2415 _ecore_evas_x_state_update(ee);
2416}
2417
2418static void
2419_ecore_evas_x_ignore_events_set(Ecore_Evas *ee, int ignore)
2420{
2421 if (ee->ignore_events == ignore) return;
2422
2423 ee->ignore_events = ignore;
2424 if (ee->prop.window)
2425 ecore_x_window_ignore_set(ee->prop.window, ignore);
2426}
2427
2428/*
2429static void
2430_ecore_evas_x_reinit_win(Ecore_Evas *ee)
2431{
2432 if (!strcmp(ee->driver, "software_x11"))
2433 {
2434#ifdef BUILD_ECORE_EVAS_X11
2435 Evas_Engine_Info_Software_X11 *einfo;
2436
2437 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2438 if (einfo)
2439 {
2440 einfo->info.drawable = ee->prop.window;
2441 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2442 }
2443#endif
2444 }
2445 else if (!strcmp(ee->driver, "opengl_x11"))
2446 {
2447#ifdef BUILD_ECORE_EVAS_OPENGL_X11
2448 Evas_Engine_Info_GL_X11 *einfo;
2449
2450 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
2451 if (einfo)
2452 {
2453 einfo->info.drawable = ee->prop.window;
2454 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
2455 }
2456#endif
2457 }
2458}
2459*/
2460
2461static void
2462_ecore_evas_x_override_set(Ecore_Evas *ee, int on)
2463{
2464 if (ee->prop.override == on) return;
2465 if (ee->should_be_visible) ecore_x_window_hide(ee->prop.window);
2466 ecore_x_window_override_set(ee->prop.window, on);
2467 if (ee->should_be_visible) ecore_x_window_show(ee->prop.window);
2468 if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
2469 ee->prop.override = on;
2470}
2471
2472static void
2473_ecore_evas_x_fullscreen_set(Ecore_Evas *ee, int on)
2474{
2475 if (ee->prop.fullscreen == on) return;
2476
2477 /* FIXME: Detect if WM is EWMH compliant and handle properly if not,
2478 * i.e. reposition, resize, and change borderless hint */
2479 ee->engine.x.state.fullscreen = on;
2480 if (ee->should_be_visible)
2481 ecore_x_netwm_state_request_send(ee->prop.window, ee->engine.x.win_root,
2482 ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on);
2483 else
2484 _ecore_evas_x_state_update(ee);
2485}
2486
2487static void
2488_ecore_evas_x_avoid_damage_set(Ecore_Evas *ee, int on)
2489{
2490 if (ee->prop.avoid_damage == on) return;
2491 if (!strcmp(ee->driver, "opengl_x11")) return;
2492
2493 if (!strcmp(ee->driver, "software_x11"))
2494 {
2495#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2496 Evas_Engine_Info_Software_X11 *einfo;
2497
2498 ee->prop.avoid_damage = on;
2499 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2500 if (einfo)
2501 {
2502 if (ee->prop.avoid_damage)
2503 {
2504 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2505 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2506 einfo->info.drawable = ee->engine.x.pmap;
2507 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2508 {
2509 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2510 }
2511 if ((ee->rotation == 90) || (ee->rotation == 270))
2512 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2513 else
2514 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2515 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2516 {
2517 ee->engine.x.using_bg_pixmap = 1;
2518 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2519 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2520 }
2521 if (ee->engine.x.direct_resize)
2522 {
2523 /* Turn this off for now
2524 ee->engine.x.using_bg_pixmap = 1;
2525 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2526 */
2527 }
2528 }
2529 else
2530 {
2531 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2532 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2533 if (ee->engine.x.using_bg_pixmap)
2534 {
2535 ecore_x_window_pixmap_set(ee->prop.window, 0);
2536 ee->engine.x.using_bg_pixmap = 0;
2537 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2538 }
2539 ee->engine.x.pmap = 0;
2540 ee->engine.x.gc = 0;
2541 einfo->info.drawable = ee->prop.window;
2542 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2543 {
2544 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2545 }
2546 }
2547 }
2548#endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */
2549 }
2550 else if (!strcmp(ee->driver, "software_16_x11"))
2551 {
2552#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
2553 Evas_Engine_Info_Software_16_X11 *einfo;
2554
2555 ee->prop.avoid_damage = on;
2556 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
2557 if (einfo)
2558 {
2559 if (ee->prop.avoid_damage)
2560 {
2561 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, 16);
2562 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2563 einfo->info.drawable = ee->engine.x.pmap;
2564 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2565 {
2566 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2567 }
2568 if ((ee->rotation == 90) || (ee->rotation == 270))
2569 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2570 else
2571 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2572 if (ee->engine.x.direct_resize)
2573 {
2574 /* Turn this off for now
2575 ee->engine.x.using_bg_pixmap = 1;
2576 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2577 */
2578 }
2579 }
2580 else
2581 {
2582 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2583 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2584 if (ee->engine.x.using_bg_pixmap)
2585 {
2586 ecore_x_window_pixmap_set(ee->prop.window, 0);
2587 ee->engine.x.using_bg_pixmap = 0;
2588 }
2589 ee->engine.x.pmap = 0;
2590 ee->engine.x.gc = 0;
2591 einfo->info.drawable = ee->prop.window;
2592 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2593 {
2594 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2595 }
2596 }
2597 }
2598#endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
2599 }
2600 else if (!strcmp(ee->driver, "software_8_x11"))
2601 {
2602#if BUILD_ECORE_EVAS_SOFTWARE_8_X11
2603 Evas_Engine_Info_Software_8_X11 *einfo;
2604
2605 ee->prop.avoid_damage = on;
2606 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
2607 if (einfo)
2608 {
2609 if (ee->prop.avoid_damage)
2610 {
2611 ee->engine.x.pmap = ecore_x_pixmap_new(ee->prop.window, ee->w, ee->h, einfo->info.depth);
2612 ee->engine.x.gc = ecore_x_gc_new(ee->engine.x.pmap, 0, NULL);
2613 einfo->info.drawable = ee->engine.x.pmap;
2614 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2615 {
2616 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2617 }
2618 if ((ee->rotation == 90) || (ee->rotation == 270))
2619 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
2620 else
2621 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
2622 if (ee->prop.avoid_damage == ECORE_EVAS_AVOID_DAMAGE_BUILT_IN)
2623 {
2624 ee->engine.x.using_bg_pixmap = 1;
2625 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2626 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2627 }
2628 if (ee->engine.x.direct_resize)
2629 {
2630 /* Turn this off for now
2631 ee->engine.x.using_bg_pixmap = 1;
2632 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
2633 */
2634 }
2635 }
2636 else
2637 {
2638 if (ee->engine.x.pmap) ecore_x_pixmap_free(ee->engine.x.pmap);
2639 if (ee->engine.x.gc) ecore_x_gc_free(ee->engine.x.gc);
2640 if (ee->engine.x.using_bg_pixmap)
2641 {
2642 ecore_x_window_pixmap_set(ee->prop.window, 0);
2643 ee->engine.x.using_bg_pixmap = 0;
2644 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
2645 }
2646 ee->engine.x.pmap = 0;
2647 ee->engine.x.gc = 0;
2648 einfo->info.drawable = ee->prop.window;
2649 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2650 {
2651 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
2652 }
2653 }
2654 }
2655#endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
2656 }
2657}
2658
2659static void
2660_ecore_evas_x_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
2661{
2662 if (x) *x = 0;
2663 if (y) *y = 0;
2664 ecore_x_screen_size_get(ecore_x_default_screen_get(), w, h);
2665}
2666
2667int
2668_ecore_evas_x_shutdown(void)
2669{
2670 _ecore_evas_init_count--;
2671 if (_ecore_evas_init_count == 0)
2672 {
2673 unsigned int i;
2674
2675 for (i = 0; i < sizeof(ecore_evas_event_handlers) / sizeof(Ecore_Event_Handler*); i++)
2676 {
2677 if (ecore_evas_event_handlers[i])
2678 ecore_event_handler_del(ecore_evas_event_handlers[i]);
2679 }
2680 ecore_event_evas_shutdown();
2681 }
2682 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
2683 return _ecore_evas_init_count;
2684}
2685
2686static Ecore_Evas_Engine_Func _ecore_x_engine_func =
2687{
2688 _ecore_evas_x_free,
2689 NULL,
2690 NULL,
2691 NULL,
2692 NULL,
2693 _ecore_evas_x_callback_delete_request_set,
2694 NULL,
2695 NULL,
2696 NULL,
2697 NULL,
2698 NULL,
2699 NULL,
2700 NULL,
2701 NULL,
2702 NULL,
2703 _ecore_evas_x_move,
2704 _ecore_evas_x_managed_move,
2705 _ecore_evas_x_resize,
2706 _ecore_evas_x_move_resize,
2707 _ecore_evas_x_rotation_set,
2708 _ecore_evas_x_shaped_set,
2709 _ecore_evas_x_show,
2710 _ecore_evas_x_hide,
2711 _ecore_evas_x_raise,
2712 _ecore_evas_x_lower,
2713 _ecore_evas_x_activate,
2714 _ecore_evas_x_title_set,
2715 _ecore_evas_x_name_class_set,
2716 _ecore_evas_x_size_min_set,
2717 _ecore_evas_x_size_max_set,
2718 _ecore_evas_x_size_base_set,
2719 _ecore_evas_x_size_step_set,
2720 _ecore_evas_x_object_cursor_set,
2721 _ecore_evas_x_layer_set,
2722 _ecore_evas_x_focus_set,
2723 _ecore_evas_x_iconified_set,
2724 _ecore_evas_x_borderless_set,
2725 _ecore_evas_x_override_set,
2726 NULL,
2727 _ecore_evas_x_fullscreen_set,
2728 _ecore_evas_x_avoid_damage_set,
2729 _ecore_evas_x_withdrawn_set,
2730 _ecore_evas_x_sticky_set,
2731 _ecore_evas_x_ignore_events_set,
2732 _ecore_evas_x_alpha_set,
2733 _ecore_evas_x_transparent_set,
2734
2735 NULL, // render
2736 _ecore_evas_x_screen_geometry_get
2737};
2738#endif /* BUILD_ECORE_EVAS_X11 */
2739
2740/*
2741 * FIXME: there are some round trips. Especially, we can split
2742 * ecore_x_init in 2 functions and suppress some round trips.
2743 */
2744
2745#if defined (BUILD_ECORE_EVAS_SOFTWARE_X11) || defined (BUILD_ECORE_EVAS_OPENGL_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_16_X11) || defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
2746static void
2747_ecore_evas_x_flush_pre(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
2748{
2749 Ecore_Evas *ee = data;
2750
2751 if (ee->no_comp_sync) return;
2752 if (!_ecore_evas_app_comp_sync) return;
2753 if (ee->engine.x.sync_counter)
2754 {
2755 if (ee->engine.x.sync_began)
2756 {
2757 ee->engine.x.sync_val++;
2758 if (!ee->engine.x.sync_cancel)
2759 {
2760 if (!ee->semi_sync)
2761 ecore_x_sync_counter_val_wait(ee->engine.x.sync_counter,
2762 ee->engine.x.sync_val);
2763 }
2764 }
2765 }
2766}
2767
2768static void
2769_ecore_evas_x_flush_post(void *data, Evas *e __UNUSED__, void *event_info __UNUSED__)
2770{
2771 Ecore_Evas *ee = data;
2772
2773 if ((!ee->no_comp_sync) && (_ecore_evas_app_comp_sync))
2774 {
2775 if (ee->engine.x.sync_counter)
2776 {
2777 if (ee->engine.x.sync_began)
2778 {
2779 if (!ee->engine.x.sync_cancel)
2780 {
2781 ecore_x_e_comp_sync_draw_size_done_send
2782 (ee->engine.x.win_root, ee->prop.window, ee->w, ee->h);
2783 }
2784 }
2785 }
2786 }
2787 if (ee->engine.x.netwm_sync_set)
2788 {
2789 ecore_x_sync_counter_2_set(ee->engine.x.netwm_sync_counter,
2790 ee->engine.x.netwm_sync_val_hi,
2791 ee->engine.x.netwm_sync_val_lo);
2792 ee->engine.x.netwm_sync_set = 0;
2793 }
2794}
2795#endif
2796
2797/**
2798 * To be documented.
2799 *
2800 * FIXME: To be fixed.
2801 */
2802#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
2803EAPI Ecore_Evas *
2804ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent,
2805 int x, int y, int w, int h)
2806{
2807 Evas_Engine_Info_Software_X11 *einfo;
2808 Ecore_Evas *ee;
2809 int argb = 0, rmethod;
2810 static int redraw_debug = -1;
2811 char *id = NULL;
2812
2813 rmethod = evas_render_method_lookup("software_x11");
2814 if (!rmethod) return NULL;
2815 if (!ecore_x_init(disp_name)) return NULL;
2816 ee = calloc(1, sizeof(Ecore_Evas));
2817 if (!ee) return NULL;
2818
2819 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
2820
2821 _ecore_evas_x_init();
2822
2823 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
2824
2825 ee->driver = "software_x11";
2826 if (disp_name) ee->name = strdup(disp_name);
2827
2828 if (w < 1) w = 1;
2829 if (h < 1) h = 1;
2830 ee->x = x;
2831 ee->y = y;
2832 ee->w = w;
2833 ee->h = h;
2834 ee->req.x = ee->x;
2835 ee->req.y = ee->y;
2836 ee->req.w = ee->w;
2837 ee->req.h = ee->h;
2838
2839 ee->prop.max.w = 32767;
2840 ee->prop.max.h = 32767;
2841 ee->prop.layer = 4;
2842 ee->prop.request_pos = 0;
2843 ee->prop.sticky = 0;
2844 ee->engine.x.state.sticky = 0;
2845
2846 /* init evas here */
2847 ee->evas = evas_new();
2848 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE,
2849 _ecore_evas_x_flush_pre, ee);
2850 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST,
2851 _ecore_evas_x_flush_post, ee);
2852 evas_data_attach_set(ee->evas, ee);
2853 evas_output_method_set(ee->evas, rmethod);
2854 evas_output_size_set(ee->evas, w, h);
2855 evas_output_viewport_set(ee->evas, 0, 0, w, h);
2856
2857 ee->engine.x.win_root = parent;
2858 ee->engine.x.screen_num = 0;
2859
2860 if (parent != 0)
2861 {
2862 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
2863 /* FIXME: round trip in ecore_x_window_argb_get */
2864 if (ecore_x_window_argb_get(parent))
2865 {
2866 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
2867 argb = 1;
2868 }
2869 else
2870 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
2871 }
2872 else
2873 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
2874 if ((id = getenv("DESKTOP_STARTUP_ID")))
2875 {
2876 ecore_x_netwm_startup_id_set(ee->prop.window, id);
2877 /* NB: on linux this may simply empty the env as opposed to completely
2878 * unset it to being empty - unsure as solartis libc crashes looking
2879 * for the '=' char */
2880// putenv((char*)"DESKTOP_STARTUP_ID=");
2881 }
2882 einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(ee->evas);
2883 if (einfo)
2884 {
2885 Ecore_X_Screen *screen;
2886
2887 /* FIXME: this is inefficient as its 1 or more round trips */
2888 screen = ecore_x_default_screen_get();
2889 if (ecore_x_screen_count_get() > 1)
2890 {
2891 Ecore_X_Window *roots;
2892 int num, i;
2893
2894 num = 0;
2895 roots = ecore_x_window_root_list(&num);
2896 if (roots)
2897 {
2898 Ecore_X_Window root;
2899
2900 root = ecore_x_window_root_get(parent);
2901 for (i = 0; i < num; i++)
2902 {
2903 if (root == roots[i])
2904 {
2905 screen = ecore_x_screen_get(i);
2906 break;
2907 }
2908 }
2909 free(roots);
2910 }
2911 }
2912
2913 einfo->info.destination_alpha = argb;
2914
2915 if (redraw_debug < 0)
2916 {
2917 if (getenv("REDRAW_DEBUG"))
2918 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
2919 else
2920 redraw_debug = 0;
2921 }
2922
2923# ifdef BUILD_ECORE_EVAS_SOFTWARE_XCB
2924 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB;
2925 einfo->info.connection = ecore_x_connection_get();
2926 einfo->info.screen = screen;
2927# else
2928 einfo->info.backend = EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB;
2929 einfo->info.connection = ecore_x_display_get();
2930 einfo->info.screen = NULL;
2931# endif
2932 einfo->info.drawable = ee->prop.window;
2933
2934# ifdef EVAS_FRAME_QUEUING
2935 {
2936 char *render_mode;
2937
2938 render_mode = getenv("EVAS_RENDER_MODE");
2939 if ((render_mode) && (!strcmp(render_mode, "non-blocking")))
2940 einfo->render_mode = EVAS_RENDER_MODE_NONBLOCKING;
2941 }
2942# endif
2943
2944 if (argb)
2945 {
2946 Ecore_X_Window_Attributes at;
2947
2948 ecore_x_window_attributes_get(ee->prop.window, &at);
2949 einfo->info.visual = at.visual;
2950 einfo->info.colormap = at.colormap;
2951 einfo->info.depth = at.depth;
2952 einfo->info.destination_alpha = 1;
2953 }
2954 else
2955 {
2956 einfo->info.visual =
2957 ecore_x_default_visual_get(einfo->info.connection, screen);
2958 einfo->info.colormap =
2959 ecore_x_default_colormap_get(einfo->info.connection, screen);
2960 einfo->info.depth =
2961 ecore_x_default_depth_get(einfo->info.connection, screen);
2962 einfo->info.destination_alpha = 0;
2963 }
2964
2965 einfo->info.rotation = 0;
2966 einfo->info.debug = redraw_debug;
2967 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
2968 {
2969 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
2970 ecore_evas_free(ee);
2971 return NULL;
2972 }
2973 }
2974
2975 ecore_x_icccm_hints_set(ee->prop.window,
2976 1 /* accepts_focus */,
2977 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
2978 0 /* icon_pixmap */,
2979 0 /* icon_mask */,
2980 0 /* icon_window */,
2981 0 /* window_group */,
2982 0 /* is_urgent */);
2983 _ecore_evas_x_group_leader_set(ee);
2984 ecore_x_window_defaults_set(ee->prop.window);
2985 _ecore_evas_x_protocols_set(ee);
2986 _ecore_evas_x_sync_set(ee);
2987
2988 ee->engine.func->fn_render = _ecore_evas_x_render;
2989 _ecore_evas_register(ee);
2990 ecore_x_input_multi_select(ee->prop.window);
2991 ecore_event_window_register(ee->prop.window, ee, ee->evas,
2992 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
2993 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
2994 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
2995 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
2996 return ee;
2997}
2998#else
2999EAPI Ecore_Evas *
3000ecore_evas_software_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3001 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3002{
3003 return NULL;
3004}
3005#endif
3006
3007/**
3008 * To be documented.
3009 *
3010 * FIXME: To be fixed.
3011 */
3012#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3013EAPI Ecore_X_Window
3014ecore_evas_software_x11_window_get(const Ecore_Evas *ee)
3015{
3016 return (Ecore_X_Window) ecore_evas_window_get(ee);
3017}
3018#else
3019EAPI Ecore_X_Window
3020ecore_evas_software_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3021{
3022 return 0;
3023}
3024#endif
3025
3026/**
3027 * To be documented.
3028 *
3029 * FIXME: To be fixed.
3030 */
3031#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3032EAPI void
3033ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3034{
3035 ee->engine.x.direct_resize = on;
3036 if (ee->prop.avoid_damage)
3037 {
3038 if (ee->engine.x.direct_resize)
3039 {
3040/* turn this off for now
3041 ee->engine.x.using_bg_pixmap = 1;
3042 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3043 */
3044 }
3045 else
3046 {
3047/* turn this off too- bg pixmap is controlled by avoid damage directly
3048 ee->engine.x.using_bg_pixmap = 0;
3049 ecore_x_window_pixmap_set(ee->prop.window, 0);
3050 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3051 */
3052 }
3053 }
3054}
3055#else
3056EAPI void
3057ecore_evas_software_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3058{
3059}
3060#endif
3061
3062/**
3063 * To be documented.
3064 *
3065 * FIXME: To be fixed.
3066 */
3067#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3068EAPI Eina_Bool
3069ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee)
3070{
3071 return ee->engine.x.direct_resize;
3072}
3073#else
3074EAPI Eina_Bool
3075ecore_evas_software_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3076{
3077 return 0;
3078}
3079#endif
3080
3081/**
3082 * To be documented.
3083 *
3084 * FIXME: To be fixed.
3085 */
3086#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
3087EAPI void
3088ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3089{
3090 Ecore_X_Window *winp;
3091
3092 winp = malloc(sizeof(Ecore_X_Window));
3093 if (winp)
3094 {
3095 *winp = win;
3096 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3097 ecore_x_input_multi_select(win);
3098 ecore_event_window_register(win, ee, ee->evas,
3099 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3100 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3101 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3102 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3103 }
3104}
3105#else
3106EAPI void
3107ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3108{
3109}
3110#endif
3111
3112/**
3113 * To be documented.
3114 *
3115 * FIXME: To be fixed.
3116 */
3117#ifdef BUILD_ECORE_EVAS_OPENGL_X11
3118EAPI Ecore_Evas *
3119ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent,
3120 int x, int y, int w, int h)
3121{
3122 return ecore_evas_gl_x11_options_new(disp_name, parent, x, y, w, h, NULL);
3123}
3124
3125EAPI Ecore_Evas *
3126ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
3127 int x, int y, int w, int h, const int *opt)
3128{
3129 Ecore_Evas *ee;
3130 int rmethod;
3131 char *id = NULL;
3132
3133 rmethod = evas_render_method_lookup("gl_x11");
3134 if (!rmethod) return NULL;
3135 if (!ecore_x_init(disp_name)) return NULL;
3136 ee = calloc(1, sizeof(Ecore_Evas));
3137 if (!ee) return NULL;
3138
3139 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3140
3141 _ecore_evas_x_init();
3142
3143 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3144
3145 ee->driver = "opengl_x11";
3146 if (!getenv("ECORE_EVAS_COMP_NOSEMISYNC"))
3147 ee->semi_sync = 1; // gl engine doesn't need to sync - its whole swaps
3148// ee->no_comp_sync = 1; // gl engine doesn't need to sync - its whole swaps
3149 if (disp_name) ee->name = strdup(disp_name);
3150
3151 if (w < 1) w = 1;
3152 if (h < 1) h = 1;
3153 ee->x = x;
3154 ee->y = y;
3155 ee->w = w;
3156 ee->h = h;
3157 ee->req.x = ee->x;
3158 ee->req.y = ee->y;
3159 ee->req.w = ee->w;
3160 ee->req.h = ee->h;
3161
3162 ee->prop.max.w = 32767;
3163 ee->prop.max.h = 32767;
3164 ee->prop.layer = 4;
3165 ee->prop.request_pos = 0;
3166 ee->prop.sticky = 0;
3167 ee->engine.x.state.sticky = 0;
3168
3169 /* init evas here */
3170 ee->evas = evas_new();
3171 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3172 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3173 evas_data_attach_set(ee->evas, ee);
3174 evas_output_method_set(ee->evas, rmethod);
3175 evas_output_size_set(ee->evas, w, h);
3176 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3177
3178 if (parent == 0) parent = DefaultRootWindow(ecore_x_display_get());
3179 ee->engine.x.win_root = parent;
3180
3181 if (ee->engine.x.win_root != 0)
3182 {
3183 ee->engine.x.screen_num = 1; /* FIXME: get real scren # */
3184 /* FIXME: round trip in ecore_x_window_argb_get */
3185 if (ecore_x_window_argb_get(ee->engine.x.win_root))
3186 {
3187 ee->prop.window = _ecore_evas_x_gl_window_new
3188 (ee, ee->engine.x.win_root, x, y, w, h, 0, 1, opt);
3189 }
3190 else
3191 ee->prop.window = _ecore_evas_x_gl_window_new
3192 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3193 }
3194 else
3195 ee->prop.window = _ecore_evas_x_gl_window_new
3196 (ee, ee->engine.x.win_root, x, y, w, h, 0, 0, opt);
3197 if (!ee->prop.window)
3198 {
3199 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3200 ecore_evas_free(ee);
3201 return NULL;
3202 }
3203 if ((id = getenv("DESKTOP_STARTUP_ID")))
3204 {
3205 ecore_x_netwm_startup_id_set(ee->prop.window, id);
3206 /* NB: on linux this may simply empty the env as opposed to completely
3207 * unset it to being empty - unsure as solartis libc crashes looking
3208 * for the '=' char */
3209// putenv((char*)"DESKTOP_STARTUP_ID=");
3210 }
3211
3212 ecore_x_icccm_hints_set(ee->prop.window,
3213 1 /* accepts_focus */,
3214 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3215 0 /* icon_pixmap */,
3216 0 /* icon_mask */,
3217 0 /* icon_window */,
3218 0 /* window_group */,
3219 0 /* is_urgent */);
3220 _ecore_evas_x_group_leader_set(ee);
3221 ecore_x_window_defaults_set(ee->prop.window);
3222 _ecore_evas_x_protocols_set(ee);
3223 _ecore_evas_x_sync_set(ee);
3224
3225 ee->engine.func->fn_render = _ecore_evas_x_render;
3226 _ecore_evas_register(ee);
3227 ecore_x_input_multi_select(ee->prop.window);
3228 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3229 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3230 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3231 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3232 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3233
3234 return ee;
3235}
3236#else
3237EAPI Ecore_Evas *
3238ecore_evas_gl_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3239 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3240{
3241 return NULL;
3242}
3243EAPI Ecore_Evas *
3244ecore_evas_gl_x11_options_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3245 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, const int *opt __UNUSED__)
3246{
3247 return NULL;
3248}
3249#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3250
3251/**
3252 * To be documented.
3253 *
3254 * FIXME: To be fixed.
3255 */
3256#ifdef BUILD_ECORE_EVAS_OPENGL_X11
3257EAPI Ecore_X_Window
3258ecore_evas_gl_x11_window_get(const Ecore_Evas *ee)
3259{
3260 return (Ecore_X_Window) ecore_evas_window_get(ee);
3261}
3262#else
3263EAPI Ecore_X_Window
3264ecore_evas_gl_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3265{
3266 return 0;
3267}
3268#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3269
3270/**
3271 * To be documented.
3272 *
3273 * FIXME: To be fixed.
3274 */
3275#ifdef BUILD_ECORE_EVAS_OPENGL_X11
3276EAPI void
3277ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3278{
3279 ee->engine.x.direct_resize = on;
3280}
3281#else
3282EAPI void
3283ecore_evas_gl_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3284{
3285}
3286#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3287
3288/**
3289 * To be documented.
3290 *
3291 * FIXME: To be fixed.
3292 */
3293#ifdef BUILD_ECORE_EVAS_OPENGL_X11
3294EAPI Eina_Bool
3295ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee)
3296{
3297 return ee->engine.x.direct_resize;
3298}
3299#else
3300EAPI Eina_Bool
3301ecore_evas_gl_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3302{
3303 return 0;
3304}
3305#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3306
3307/**
3308 * To be documented.
3309 *
3310 * FIXME: To be fixed.
3311 */
3312#ifdef BUILD_ECORE_EVAS_OPENGL_X11
3313EAPI void
3314ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3315{
3316 ecore_evas_software_x11_extra_event_window_add(ee, win);
3317}
3318#else
3319EAPI void
3320ecore_evas_gl_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3321{
3322}
3323#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3324
3325/**
3326 * To be documented.
3327 *
3328 * FIXME: To be fixed.
3329 */
3330#ifdef BUILD_ECORE_EVAS_OPENGL_X11
3331EAPI void
3332ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee, void *data, void (*pre_cb) (void *data, Evas *e), void (*post_cb) (void *data, Evas *e))
3333{
3334 Evas_Engine_Info_GL_X11 *einfo;
3335
3336 if (!(!strcmp(ee->driver, "opengl_x11"))) return;
3337
3338 einfo = (Evas_Engine_Info_GL_X11 *)evas_engine_info_get(ee->evas);
3339 if (einfo)
3340 {
3341 einfo->callback.pre_swap = pre_cb;
3342 einfo->callback.post_swap = post_cb;
3343 einfo->callback.data = data;
3344 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3345 {
3346 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
3347 }
3348 }
3349}
3350#else
3351EAPI void
3352ecore_evas_gl_x11_pre_post_swap_callback_set(const Ecore_Evas *ee __UNUSED__, void *data __UNUSED__, void (*pre_cb) (void *data, Evas *e) __UNUSED__, void (*post_cb) (void *data, Evas *e) __UNUSED__)
3353{
3354 return;
3355}
3356#endif /* ! BUILD_ECORE_EVAS_OPENGL_X11 */
3357
3358/**
3359 * To be documented.
3360 *
3361 * FIXME: To be fixed or maybe removed rather?
3362 */
3363EAPI Ecore_Evas *
3364ecore_evas_xrender_x11_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3365 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3366{
3367 return NULL;
3368}
3369
3370/**
3371 * To be documented.
3372 *
3373 * FIXME: To be fixed or maybe removed rather?
3374 */
3375EAPI Ecore_X_Window
3376ecore_evas_xrender_x11_window_get(const Ecore_Evas *ee __UNUSED__)
3377{
3378 return 0;
3379}
3380
3381/**
3382 * To be documented.
3383 *
3384 * FIXME: To be fixed.
3385 */
3386EAPI void
3387ecore_evas_xrender_x11_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3388{
3389}
3390
3391/**
3392 * To be documented.
3393 *
3394 * FIXME: To be fixed.
3395 */
3396EAPI Eina_Bool
3397ecore_evas_xrender_x11_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3398{
3399 return 0;
3400}
3401
3402/**
3403 * To be documented.
3404 *
3405 * FIXME: To be fixed.
3406 */
3407EAPI void
3408ecore_evas_xrender_x11_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3409{
3410}
3411
3412/**
3413 * To be documented.
3414 *
3415 * FIXME: To be fixed.
3416 */
3417#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3418EAPI Ecore_Evas *
3419ecore_evas_software_x11_16_new(const char *disp_name, Ecore_X_Window parent,
3420 int x, int y, int w, int h)
3421{
3422 Evas_Engine_Info_Software_16_X11 *einfo;
3423 Ecore_Evas *ee;
3424 int rmethod;
3425 static int redraw_debug = -1;
3426
3427 rmethod = evas_render_method_lookup("software_16_x11");
3428 if (!rmethod) return NULL;
3429 if (!ecore_x_init(disp_name)) return NULL;
3430 ee = calloc(1, sizeof(Ecore_Evas));
3431 if (!ee) return NULL;
3432
3433 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3434
3435 _ecore_evas_x_init();
3436
3437 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3438
3439 ee->driver = "software_16_x11";
3440 if (disp_name) ee->name = strdup(disp_name);
3441
3442 if (w < 1) w = 1;
3443 if (h < 1) h = 1;
3444 ee->x = x;
3445 ee->y = y;
3446 ee->w = w;
3447 ee->h = h;
3448 ee->req.x = ee->x;
3449 ee->req.y = ee->y;
3450 ee->req.w = ee->w;
3451 ee->req.h = ee->h;
3452
3453 ee->prop.max.w = 32767;
3454 ee->prop.max.h = 32767;
3455 ee->prop.layer = 4;
3456 ee->prop.request_pos = 0;
3457 ee->prop.sticky = 0;
3458 ee->engine.x.state.sticky = 0;
3459
3460 /* init evas here */
3461 ee->evas = evas_new();
3462 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3463 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3464 evas_data_attach_set(ee->evas, ee);
3465 evas_output_method_set(ee->evas, rmethod);
3466 evas_output_size_set(ee->evas, w, h);
3467 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3468
3469 ee->engine.x.win_root = parent;
3470 if (parent != 0)
3471 {
3472 /* FIXME: round trip in ecore_x_window_argb_get */
3473 if (ecore_x_window_argb_get(parent))
3474 {
3475 ee->prop.window = ecore_x_window_argb_new(parent, x, y, w, h);
3476 }
3477 else
3478 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3479 }
3480 else
3481 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3482 if (getenv("DESKTOP_STARTUP_ID"))
3483 {
3484 ecore_x_netwm_startup_id_set(ee->prop.window,
3485 getenv("DESKTOP_STARTUP_ID"));
3486 /* NB: on linux this may simply empty the env as opposed to completely
3487 * unset it to being empty - unsure as solartis libc crashes looking
3488 * for the '=' char */
3489// putenv((char*)"DESKTOP_STARTUP_ID=");
3490 }
3491 einfo = (Evas_Engine_Info_Software_16_X11 *)evas_engine_info_get(ee->evas);
3492
3493 if (einfo)
3494 {
3495 if (ScreenCount(ecore_x_display_get()) > 1)
3496 {
3497 Ecore_X_Window *roots;
3498 int num, i;
3499
3500 num = 0;
3501 roots = ecore_x_window_root_list(&num);
3502 if (roots)
3503 {
3504 XWindowAttributes at;
3505
3506 if (XGetWindowAttributes(ecore_x_display_get(),
3507 parent, &at))
3508 {
3509 for (i = 0; i < num; i++)
3510 {
3511 if (at.root == roots[i])
3512 break;
3513 }
3514 }
3515 free(roots);
3516 }
3517 }
3518
3519 if (redraw_debug < 0)
3520 {
3521 if (getenv("REDRAW_DEBUG"))
3522 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3523 else
3524 redraw_debug = 0;
3525 }
3526 einfo->info.display = ecore_x_display_get();
3527 einfo->info.drawable = ee->prop.window;
3528
3529 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3530 {
3531 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3532 ecore_evas_free(ee);
3533 return NULL;
3534 }
3535 }
3536 else
3537 {
3538 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3539 ecore_evas_free(ee);
3540 return NULL;
3541 }
3542
3543 ecore_x_icccm_hints_set(ee->prop.window,
3544 1 /* accepts_focus */,
3545 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3546 0 /* icon_pixmap */,
3547 0 /* icon_mask */,
3548 0 /* icon_window */,
3549 0 /* window_group */,
3550 0 /* is_urgent */);
3551 _ecore_evas_x_group_leader_set(ee);
3552 ecore_x_window_defaults_set(ee->prop.window);
3553 _ecore_evas_x_protocols_set(ee);
3554 _ecore_evas_x_sync_set(ee);
3555
3556 ee->engine.func->fn_render = _ecore_evas_x_render;
3557 _ecore_evas_register(ee);
3558 ecore_x_input_multi_select(ee->prop.window);
3559 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3560 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3561 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3562 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3563 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3564 return ee;
3565}
3566#else
3567EAPI Ecore_Evas *
3568ecore_evas_software_x11_16_new(const char *disp_name __UNUSED__, Ecore_X_Window parent __UNUSED__,
3569 int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
3570{
3571 return NULL;
3572}
3573#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3574
3575/**
3576 * To be documented.
3577 *
3578 * FIXME: To be fixed.
3579 */
3580#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3581EAPI Ecore_X_Window
3582ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee)
3583{
3584 return (Ecore_X_Window) ecore_evas_window_get(ee);
3585}
3586#else
3587EAPI Ecore_X_Window
3588ecore_evas_software_x11_16_window_get(const Ecore_Evas *ee __UNUSED__)
3589{
3590 return 0;
3591}
3592#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3593
3594/**
3595 * To be documented.
3596 *
3597 * FIXME: To be fixed.
3598 */
3599#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3600EAPI void
3601ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3602{
3603 ee->engine.x.direct_resize = on;
3604 if (ee->prop.avoid_damage)
3605 {
3606 if (ee->engine.x.direct_resize)
3607 {
3608/* turn this off for now
3609 ee->engine.x.using_bg_pixmap = 1;
3610 ecore_x_window_pixmap_set(ee->prop.window, ee->engine.x.pmap);
3611 */
3612 }
3613 else
3614 {
3615/* turn this off too- bg pixmap is controlled by avoid damage directly
3616 ee->engine.x.using_bg_pixmap = 0;
3617 ecore_x_window_pixmap_set(ee->prop.window, 0);
3618 ecore_x_window_area_expose(ee->prop.window, 0, 0, ee->w, ee->h);
3619 */
3620 }
3621 }
3622}
3623#else
3624EAPI void
3625ecore_evas_software_x11_16_direct_resize_set(Ecore_Evas *ee __UNUSED__, Eina_Bool on __UNUSED__)
3626{
3627}
3628#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3629
3630/**
3631 * To be documented.
3632 *
3633 * FIXME: To be fixed.
3634 */
3635#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3636EAPI Eina_Bool
3637ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee)
3638{
3639 return ee->engine.x.direct_resize;
3640}
3641#else
3642EAPI Eina_Bool
3643ecore_evas_software_x11_16_direct_resize_get(const Ecore_Evas *ee __UNUSED__)
3644{
3645 return 0;
3646}
3647#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3648
3649/**
3650 * To be documented.
3651 *
3652 * FIXME: To be fixed.
3653 */
3654#if BUILD_ECORE_EVAS_SOFTWARE_16_X11
3655EAPI void
3656ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3657{
3658 Ecore_X_Window *winp;
3659
3660 winp = malloc(sizeof(Ecore_X_Window));
3661 if (winp)
3662 {
3663 *winp = win;
3664 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
3665 ecore_x_input_multi_select(win);
3666 ecore_event_window_register(win, ee, ee->evas,
3667 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3668 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3669 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3670 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3671 }
3672}
3673#else
3674EAPI void
3675ecore_evas_software_x11_16_extra_event_window_add(Ecore_Evas *ee __UNUSED__, Ecore_X_Window win __UNUSED__)
3676{
3677}
3678#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_X11 */
3679
3680
3681/**
3682 * To be documented.
3683 *
3684 * FIXME: To be fixed.
3685 */
3686EAPI Ecore_Evas *
3687ecore_evas_software_x11_8_new(const char *disp_name, Ecore_X_Window parent,
3688 int x, int y, int w, int h)
3689{
3690#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3691 Evas_Engine_Info_Software_8_X11 *einfo;
3692 Ecore_Evas *ee;
3693 int argb = 0;
3694 int rmethod;
3695 static int redraw_debug = -1;
3696
3697 rmethod = evas_render_method_lookup("software_8_x11");
3698 if (!rmethod) return NULL;
3699 if (!ecore_x_init(disp_name)) return NULL;
3700 ee = calloc(1, sizeof(Ecore_Evas));
3701 if (!ee) return NULL;
3702
3703 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
3704
3705 _ecore_evas_x_init();
3706
3707 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
3708
3709 ee->driver = "software_8_x11";
3710 if (disp_name) ee->name = strdup(disp_name);
3711
3712 if (w < 1) w = 1;
3713 if (h < 1) h = 1;
3714 ee->x = x;
3715 ee->y = y;
3716 ee->w = w;
3717 ee->h = h;
3718 ee->req.x = ee->x;
3719 ee->req.y = ee->y;
3720 ee->req.w = ee->w;
3721 ee->req.h = ee->h;
3722
3723 ee->prop.max.w = 32767;
3724 ee->prop.max.h = 32767;
3725 ee->prop.layer = 4;
3726 ee->prop.request_pos = 0;
3727 ee->prop.sticky = 0;
3728 ee->engine.x.state.sticky = 0;
3729
3730 /* init evas here */
3731 ee->evas = evas_new();
3732 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_PRE, _ecore_evas_x_flush_pre, ee);
3733 evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_FLUSH_POST, _ecore_evas_x_flush_post, ee);
3734 evas_data_attach_set(ee->evas, ee);
3735 evas_output_method_set(ee->evas, rmethod);
3736 evas_output_size_set(ee->evas, w, h);
3737 evas_output_viewport_set(ee->evas, 0, 0, w, h);
3738
3739 ee->engine.x.win_root = parent;
3740 // if (parent != 0)
3741 // {
3742 // /* FIXME: round trip in ecore_x_window_argb_get */
3743 // if (ecore_x_window_argb_get(parent))
3744 // {
3745 // ee->engine.x.win = ecore_x_window_argb_new(parent, x, y, w, h);
3746 // argb = 1;
3747 // }
3748 // else
3749 // ee->engine.x.win = ecore_x_window_new(parent, x, y, w, h);
3750 // }
3751 // else
3752 ee->prop.window = ecore_x_window_new(parent, x, y, w, h);
3753 if (getenv("DESKTOP_STARTUP_ID"))
3754 {
3755 ecore_x_netwm_startup_id_set(ee->prop.window,
3756 getenv("DESKTOP_STARTUP_ID"));
3757 /* NB: on linux this may simply empty the env as opposed to completely
3758 * unset it to being empty - unsure as solartis libc crashes looking
3759 * for the '=' char */
3760 // putenv((char*)"DESKTOP_STARTUP_ID=");
3761 }
3762 einfo = (Evas_Engine_Info_Software_8_X11 *)evas_engine_info_get(ee->evas);
3763 if (einfo)
3764 {
3765 xcb_screen_iterator_t iter;
3766 xcb_screen_t *screen;
3767
3768 /* FIXME: this is inefficient as its a round trip */
3769 //einfo->info.backend = 1;
3770 screen = ecore_x_default_screen_get();
3771 iter = xcb_setup_roots_iterator (xcb_get_setup (ecore_x_connection_get()));
3772 if (iter.rem > 1)
3773 {
3774 xcb_get_geometry_cookie_t cookie;
3775 xcb_get_geometry_reply_t *reply;
3776 Ecore_X_Window *roots;
3777 int num;
3778 uint8_t i;
3779
3780 num = 0;
3781 cookie = xcb_get_geometry_unchecked(ecore_x_connection_get(), parent);
3782 roots = ecore_x_window_root_list(&num);
3783 if (roots)
3784 {
3785 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3786
3787 if (reply)
3788 {
3789 for (i = 0; i < num; xcb_screen_next (&iter), i++)
3790 {
3791 if (reply->root == roots[i])
3792 {
3793 screen = iter.data;
3794 break;
3795 }
3796 }
3797 free(reply);
3798 }
3799 free(roots);
3800 }
3801 else
3802 {
3803 reply = xcb_get_geometry_reply(ecore_x_connection_get(), cookie, NULL);
3804 if (reply) free(reply);
3805 }
3806 }
3807
3808 if (redraw_debug < 0)
3809 {
3810 if (getenv("REDRAW_DEBUG"))
3811 redraw_debug = atoi(getenv("REDRAW_DEBUG"));
3812 else
3813 redraw_debug = 0;
3814 }
3815 einfo->info.connection = ecore_x_connection_get();
3816 einfo->info.screen = screen;
3817 einfo->info.drawable = ee->prop.window;
3818 if (argb)
3819 {
3820 /* FIXME: round trip */
3821 xcb_get_geometry_cookie_t cookie_geom;
3822 xcb_get_window_attributes_cookie_t cookie_attr;
3823 xcb_get_geometry_reply_t *reply_geom;
3824 xcb_get_window_attributes_reply_t *reply_attr;
3825
3826 cookie_geom = xcb_get_geometry_unchecked(ecore_x_connection_get(), ee->prop.window);
3827 cookie_attr = xcb_get_window_attributes_unchecked(ecore_x_connection_get(), ee->prop.window);
3828
3829 reply_geom = xcb_get_geometry_reply(ecore_x_connection_get(), cookie_geom, NULL);
3830 reply_attr = xcb_get_window_attributes_reply(ecore_x_connection_get(), cookie_attr, NULL);
3831 if (reply_attr && reply_geom)
3832 {
3833 einfo->info.visual = xcb_visualtype_get(ecore_x_default_screen_get(), reply_attr->visual);
3834 einfo->info.colormap = reply_attr->colormap;
3835 einfo->info.depth = reply_geom->depth;
3836 einfo->info.destination_alpha = 1;
3837 free(reply_geom);
3838 free(reply_attr);
3839 }
3840 }
3841 else
3842 {
3843 xcb_screen_t *screen;
3844
3845 screen = ecore_x_default_screen_get();
3846 einfo->info.visual = xcb_visualtype_get(screen, screen->root_visual);
3847 einfo->info.colormap = screen->default_colormap;
3848 einfo->info.depth = screen->root_depth;
3849 einfo->info.destination_alpha = 0;
3850 }
3851 einfo->info.rotation = 0;
3852 einfo->info.debug = redraw_debug;
3853 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
3854 {
3855 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3856 ecore_evas_free(ee);
3857 return NULL;
3858 }
3859 }
3860 else
3861 {
3862 ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
3863 ecore_evas_free(ee);
3864 return NULL;
3865 }
3866
3867 ecore_x_icccm_hints_set(ee->prop.window,
3868 1 /* accepts_focus */,
3869 ECORE_X_WINDOW_STATE_HINT_NORMAL /* initial_state */,
3870 0 /* icon_pixmap */,
3871 0 /* icon_mask */,
3872 0 /* icon_window */,
3873 0 /* window_group */,
3874 0 /* is_urgent */);
3875 _ecore_evas_x_group_leader_set(ee);
3876 ecore_x_window_defaults_set(ee->prop.window);
3877 _ecore_evas_x_protocols_set(ee);
3878 _ecore_evas_x_sync_set(ee);
3879
3880 ee->engine.func->fn_render = _ecore_evas_x_render;
3881 _ecore_evas_register(ee);
3882 ecore_x_input_multi_select(ee->prop.window);
3883 ecore_event_window_register(ee->prop.window, ee, ee->evas,
3884 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
3885 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
3886 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
3887 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
3888
3889 return ee;
3890#else
3891 return NULL;
3892 (void)(disp_name);
3893 (void)(parent);
3894 (void)(x);
3895 (void)(y);
3896 (void)(w);
3897 (void)(h);
3898#endif /* ! BUILD_ECORE_EVAS_SOFTWARE_8_X11 */
3899}
3900
3901/**
3902 * To be documented.
3903 *
3904 * FIXME: To be fixed.
3905 */
3906EAPI Ecore_X_Window
3907ecore_evas_software_x11_8_window_get(const Ecore_Evas *ee)
3908{
3909#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3910 return (Ecore_X_Window) ecore_evas_window_get(ee);
3911#else
3912 return 0;
3913 (void)(ee);
3914#endif
3915}
3916
3917/**
3918 * To be documented.
3919 *
3920 * FIXME: To be fixed.
3921 */
3922EAPI Ecore_X_Window
3923ecore_evas_software_x11_8_subwindow_get(const Ecore_Evas *ee)
3924{
3925#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3926 return (Ecore_X_Window) ecore_evas_window_get(ee);
3927#else
3928 return 0;
3929 (void)(ee);
3930#endif
3931}
3932
3933/**
3934 * To be documented.
3935 *
3936 * FIXME: To be fixed.
3937 */
3938EAPI void
3939ecore_evas_software_x11_8_direct_resize_set(Ecore_Evas *ee, Eina_Bool on)
3940{
3941#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3942 ee->engine.x.direct_resize = on;
3943 if (ee->prop.avoid_damage)
3944 {
3945 if (ee->engine.x.direct_resize)
3946 {
3947 /* turn this off for now
3948 ee->engine.x.using_bg_pixmap = 1;
3949 ecore_x_window_pixmap_set(ee->engine.x.win, ee->engine.x.pmap);
3950 */
3951 }
3952 else
3953 {
3954 /* turn this off too- bg pixmap is controlled by avoid damage directly
3955 ee->engine.x.using_bg_pixmap = 0;
3956 ecore_x_window_pixmap_set(ee->engine.x.win, 0);
3957 ecore_x_window_area_expose(ee->engine.x.win, 0, 0, ee->w, ee->h);
3958 */
3959 }
3960 }
3961#else
3962 return;
3963 (void)(ee);
3964 (void)(on);
3965#endif
3966}
3967
3968/**
3969 * To be documented.
3970 *
3971 * FIXME: To be fixed.
3972 */
3973EAPI Eina_Bool
3974ecore_evas_software_x11_8_direct_resize_get(const Ecore_Evas *ee)
3975{
3976#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3977 return ee->engine.x.direct_resize;
3978#else
3979 return 0;
3980 (void)(ee);
3981#endif
3982}
3983
3984/**
3985 * To be documented.
3986 *
3987 * FIXME: To be fixed.
3988 */
3989EAPI void
3990ecore_evas_software_x11_8_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window win)
3991{
3992#if defined (BUILD_ECORE_EVAS_SOFTWARE_8_X11)
3993 Ecore_X_Window *winp;
3994
3995 winp = malloc(sizeof(Ecore_X_Window));
3996 if (winp)
3997 {
3998 *winp = win;
3999 ee->engine.x.win_extra = eina_list_append(ee->engine.x.win_extra, winp);
4000 ecore_x_input_multi_select(win);
4001 ecore_event_window_register(win, ee, ee->evas,
4002 (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
4003 (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
4004 (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
4005 (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
4006 }
4007#else
4008 return;
4009 (void)(ee);
4010 (void)(win);
4011#endif
4012}
4013
4014EAPI void
4015ecore_evas_x11_leader_set(Ecore_Evas *ee, Ecore_X_Window win)
4016{
4017#ifdef BUILD_ECORE_EVAS_X11
4018 _ecore_evas_x_group_leader_unset(ee);
4019 ee->engine.x.leader = win;
4020 _ecore_evas_x_group_leader_update(ee);
4021#else
4022 return;
4023 ee = NULL;
4024 win = 0;
4025#endif
4026}
4027
4028EAPI Ecore_X_Window
4029ecore_evas_x11_leader_get(Ecore_Evas *ee)
4030{
4031#ifdef BUILD_ECORE_EVAS_X11
4032 return ee->engine.x.leader;
4033#else
4034 return 0;
4035 ee = NULL;
4036#endif
4037}
4038
4039EAPI void
4040ecore_evas_x11_leader_default_set(Ecore_Evas *ee)
4041{
4042#ifdef BUILD_ECORE_EVAS_X11
4043 _ecore_evas_x_group_leader_unset(ee);
4044 _ecore_evas_x_group_leader_set(ee);
4045#else
4046 return;
4047 ee = NULL;
4048#endif
4049}
4050
4051#ifdef BUILD_ECORE_EVAS_X11
4052static Eina_Bool
4053_ecore_evas_x11_convert_rectangle_with_angle(Ecore_Evas *ee, Ecore_X_Rectangle *dst_rect, Ecore_X_Rectangle *src_rect)
4054{
4055 if ((!src_rect) || (!dst_rect)) return 0;
4056
4057 if (ee->rotation == 0)
4058 {
4059 dst_rect->x = src_rect->x;
4060 dst_rect->y = src_rect->y;
4061 dst_rect->width = src_rect->width;
4062 dst_rect->height = src_rect->height;
4063 }
4064 else if (ee->rotation == 90)
4065 {
4066 dst_rect->x = src_rect->y;
4067 dst_rect->y = ee->req.h - src_rect->x - src_rect->width;
4068 dst_rect->width = src_rect->height;
4069 dst_rect->height = src_rect->width;
4070 }
4071 else if (ee->rotation == 180)
4072 {
4073 dst_rect->x = ee->req.w - src_rect->x - src_rect->width;
4074 dst_rect->y = ee->req.h - src_rect->y - src_rect->height;
4075 dst_rect->width = src_rect->width;
4076 dst_rect->height = src_rect->height;
4077 }
4078 else if (ee->rotation == 270)
4079 {
4080 dst_rect->x = ee->req.w - src_rect->y - src_rect->height;
4081 dst_rect->y = src_rect->x;
4082 dst_rect->width = src_rect->height;
4083 dst_rect->height = src_rect->width;
4084 }
4085 else
4086 {
4087 return 0;
4088 }
4089
4090 return 1;
4091}
4092#endif
4093
4094EAPI void
4095ecore_evas_x11_shape_input_rectangle_set(Ecore_Evas *ee, int x, int y, int w, int h)
4096{
4097#ifdef BUILD_ECORE_EVAS_X11
4098 Eina_Bool ret;
4099 Ecore_X_Rectangle src_rect;
4100 Ecore_X_Rectangle dst_rect;
4101
4102 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4103 {
4104 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4105 "ecore_evas_x11_shape_input_rectangle_set");
4106 return;
4107 }
4108
4109 src_rect.x = x;
4110 src_rect.y = y;
4111 src_rect.width = w;
4112 src_rect.height = h;
4113
4114 dst_rect.x = 0;
4115 dst_rect.y = 0;
4116 dst_rect.width = 0;
4117 dst_rect.height = 0;
4118
4119 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4120
4121 if (!ee->engine.x.win_shaped_input)
4122 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4123 0, 0, 1, 1);
4124
4125 if (ret)
4126 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input,
4127 dst_rect.x, dst_rect.y,
4128 dst_rect.width, dst_rect.height);
4129#else
4130 return;
4131 ee = NULL;
4132 x = 0;
4133 y = 0;
4134 w = 0;
4135 h = 0;
4136#endif
4137}
4138
4139EAPI void
4140ecore_evas_x11_shape_input_rectangle_add(Ecore_Evas *ee, int x, int y, int w, int h)
4141{
4142#ifdef BUILD_ECORE_EVAS_X11
4143 Eina_Bool ret;
4144 Ecore_X_Rectangle src_rect;
4145 Ecore_X_Rectangle dst_rect;
4146
4147 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4148 {
4149 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4150 "ecore_evas_x11_shape_input_rectangle_add");
4151 return;
4152 }
4153
4154 src_rect.x = x;
4155 src_rect.y = y;
4156 src_rect.width = w;
4157 src_rect.height = h;
4158
4159 dst_rect.x = 0;
4160 dst_rect.y = 0;
4161 dst_rect.width = 0;
4162 dst_rect.height = 0;
4163
4164 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4165
4166 if (!ee->engine.x.win_shaped_input)
4167 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4168 0, 0, 1, 1);
4169
4170 if (ret)
4171 ecore_x_window_shape_input_rectangle_add(ee->engine.x.win_shaped_input,
4172 dst_rect.x, dst_rect.y,
4173 dst_rect.width, dst_rect.height);
4174#else
4175 return;
4176 ee = NULL;
4177 x = 0;
4178 y = 0;
4179 w = 0;
4180 h = 0;
4181#endif
4182}
4183
4184EAPI void
4185ecore_evas_x11_shape_input_rectangle_subtract(Ecore_Evas *ee, int x, int y, int w, int h)
4186{
4187#ifdef BUILD_ECORE_EVAS_X11
4188 Eina_Bool ret;
4189 Ecore_X_Rectangle src_rect;
4190 Ecore_X_Rectangle dst_rect;
4191
4192 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4193 {
4194 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4195 "ecore_evas_x11_shape_input_rectangle_subtract");
4196 return;
4197 }
4198
4199 src_rect.x = x;
4200 src_rect.y = y;
4201 src_rect.width = w;
4202 src_rect.height = h;
4203
4204 dst_rect.x = 0;
4205 dst_rect.y = 0;
4206 dst_rect.width = 0;
4207 dst_rect.height = 0;
4208
4209 ret = _ecore_evas_x11_convert_rectangle_with_angle(ee, &dst_rect, &src_rect);
4210
4211 if (!ee->engine.x.win_shaped_input)
4212 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root,
4213 0, 0, 1, 1);
4214
4215 if (ret)
4216 ecore_x_window_shape_input_rectangle_subtract(ee->engine.x.win_shaped_input,
4217 dst_rect.x, dst_rect.y,
4218 dst_rect.width, dst_rect.height);
4219#else
4220 return;
4221 ee = NULL;
4222 x = 0;
4223 y = 0;
4224 w = 0;
4225 h = 0;
4226#endif
4227}
4228
4229EAPI void
4230ecore_evas_x11_shape_input_empty(Ecore_Evas *ee)
4231{
4232#ifdef BUILD_ECORE_EVAS_X11
4233 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4234 {
4235 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4236 "ecore_evas_x11_shape_input_empty");
4237 return;
4238 }
4239
4240 if (!ee->engine.x.win_shaped_input)
4241 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
4242
4243 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 0, 0);
4244#else
4245 return;
4246 ee = NULL;
4247#endif
4248}
4249
4250EAPI void
4251ecore_evas_x11_shape_input_reset(Ecore_Evas *ee)
4252{
4253#ifdef BUILD_ECORE_EVAS_X11
4254 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4255 {
4256 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4257 "ecore_evas_x11_shape_input_reset");
4258 return;
4259 }
4260
4261 if (!ee->engine.x.win_shaped_input)
4262 ee->engine.x.win_shaped_input = ecore_x_window_override_new(ee->engine.x.win_root, 0, 0, 1, 1);
4263
4264 ecore_x_window_shape_input_rectangle_set(ee->engine.x.win_shaped_input, 0, 0, 65535, 65535);
4265#else
4266 return;
4267 ee = NULL;
4268#endif
4269}
4270
4271EAPI void
4272ecore_evas_x11_shape_input_apply(Ecore_Evas *ee)
4273{
4274#ifdef BUILD_ECORE_EVAS_X11
4275 if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
4276 {
4277 ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
4278 "ecore_evas_x11_shape_input_apply");
4279 return;
4280 }
4281
4282 if (!ee->engine.x.win_shaped_input) return;
4283
4284 ecore_x_window_shape_input_window_set(ee->prop.window, ee->engine.x.win_shaped_input);
4285#else
4286 return;
4287 ee = NULL;
4288#endif
4289}
diff --git a/libraries/ecore/src/lib/ecore_fb/Ecore_Fb.h b/libraries/ecore/src/lib/ecore_fb/Ecore_Fb.h
new file mode 100644
index 0000000..069cccd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/Ecore_Fb.h
@@ -0,0 +1,100 @@
1#ifndef _ECORE_FB_H
2#define _ECORE_FB_H
3
4#include <Eina.h>
5
6#ifdef EAPI
7# undef EAPI
8#endif
9
10#ifdef __GNUC__
11# if __GNUC__ >= 4
12# define EAPI __attribute__ ((visibility("default")))
13# else
14# define EAPI
15# endif
16#else
17# define EAPI
18#endif
19
20/* FIXME:
21 * maybe a new module?
22 * - code to get battery info
23 * - code to get thermal info
24 * ecore evas fb isn't good enough for weird things, like multiple fb's, same happens here.
25 * backlight support using new kernel interface
26 * absolute axis
27 * joystick
28 * ecore_fb_li_device_close_all ? or a shutdown of the subsystem?
29 *
30 */
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36/**
37 * @defgroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
38 *
39 * Functions used to set up and shut down the Ecore_Framebuffer functions.
40 *
41 * @{
42 */
43
44/**
45 * @typedef Ecore_Fb_Input_Device
46 * Input device handler.
47 */
48typedef struct _Ecore_Fb_Input_Device Ecore_Fb_Input_Device;
49
50/**
51 * @enum _Ecore_Fb_Input_Device_Cap
52 * Device capabilities.
53 */
54enum _Ecore_Fb_Input_Device_Cap
55{
56 ECORE_FB_INPUT_DEVICE_CAP_NONE = 0x00000000,
57 ECORE_FB_INPUT_DEVICE_CAP_RELATIVE = 0x00000001,
58 ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE = 0x00000002,
59 ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS = 0x00000004
60};
61
62/**
63 * @typedef Ecore_Fb_Input_Device_Cap
64 * Device capabilities.
65 */
66typedef enum _Ecore_Fb_Input_Device_Cap Ecore_Fb_Input_Device_Cap;
67
68/* ecore_fb_vt.c */
69EAPI void ecore_fb_callback_gain_set(void (*func) (void *data), void *data);
70EAPI void ecore_fb_callback_lose_set(void (*func) (void *data), void *data);
71
72/* ecore_fb_li.c */
73EAPI Ecore_Fb_Input_Device *ecore_fb_input_device_open(const char *dev);
74EAPI void ecore_fb_input_device_close(Ecore_Fb_Input_Device *dev);
75EAPI void ecore_fb_input_device_listen(Ecore_Fb_Input_Device *dev, Eina_Bool listen);
76EAPI const char *ecore_fb_input_device_name_get(Ecore_Fb_Input_Device *dev);
77EAPI Ecore_Fb_Input_Device_Cap ecore_fb_input_device_cap_get(Ecore_Fb_Input_Device *dev);
78EAPI void ecore_fb_input_device_axis_size_set(Ecore_Fb_Input_Device *dev, int w, int h);
79EAPI void ecore_fb_input_threshold_click_set(Ecore_Fb_Input_Device *dev, double threshold);
80EAPI double ecore_fb_input_threshold_click_get(Ecore_Fb_Input_Device *dev);
81EAPI void ecore_fb_input_device_window_set(Ecore_Fb_Input_Device *dev, void *window);
82
83/* ecore_fb.c */
84
85EAPI int ecore_fb_init(const char *name);
86EAPI int ecore_fb_shutdown(void);
87EAPI void ecore_fb_size_get(int *w, int *h);
88
89EAPI void ecore_fb_touch_screen_calibrate_set(int xscale, int xtrans, int yscale, int ytrans, int xyswap);
90EAPI void ecore_fb_touch_screen_calibrate_get(int *xscale, int *xtrans, int *yscale, int *ytrans, int *xyswap);
91
92/**
93 * @}
94 */
95
96#ifdef __cplusplus
97}
98#endif
99
100#endif
diff --git a/libraries/ecore/src/lib/ecore_fb/Makefile.am b/libraries/ecore/src/lib/ecore_fb/Makefile.am
new file mode 100644
index 0000000..9129fec
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/Makefile.am
@@ -0,0 +1,34 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_builddir)/src/lib/ecore \
6-I$(top_srcdir)/src/lib/ecore_input \
7@TSLIB_CFLAGS@ \
8@EINA_CFLAGS@
9
10
11lib_LTLIBRARIES = libecore_fb.la
12includes_HEADERS = Ecore_Fb.h
13includesdir = $(includedir)/ecore-@VMAJ@
14
15libecore_fb_la_SOURCES = \
16ecore_fb.c \
17ecore_fb_vt.c \
18ecore_fb_li.c \
19ecore_fb_ts.c
20# deprecated sources (might not compile):
21# ecore_fb_kbd.c
22# ecore_fb_ps2.c
23
24libecore_fb_la_LIBADD = \
25@TSLIB_LIBS@ \
26$(top_builddir)/src/lib/ecore/libecore.la \
27$(top_builddir)/src/lib/ecore_input/libecore_input.la \
28@EINA_LIBS@
29
30libecore_fb_la_LDFLAGS = -version-info @version_info@ @release_info@
31
32EXTRA_DIST = \
33ecore_fb_private.h \
34ecore_fb_keytable.h
diff --git a/libraries/ecore/src/lib/ecore_fb/Makefile.in b/libraries/ecore/src/lib/ecore_fb/Makefile.in
new file mode 100644
index 0000000..b37120f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/Makefile.in
@@ -0,0 +1,831 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_fb
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_fb_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la \
91 $(top_builddir)/src/lib/ecore_input/libecore_input.la
92am_libecore_fb_la_OBJECTS = ecore_fb.lo ecore_fb_vt.lo ecore_fb_li.lo \
93 ecore_fb_ts.lo
94libecore_fb_la_OBJECTS = $(am_libecore_fb_la_OBJECTS)
95AM_V_lt = $(am__v_lt_$(V))
96am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
97am__v_lt_0 = --silent
98libecore_fb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
99 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
100 $(AM_CFLAGS) $(CFLAGS) $(libecore_fb_la_LDFLAGS) $(LDFLAGS) -o \
101 $@
102DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
103depcomp = $(SHELL) $(top_srcdir)/depcomp
104am__depfiles_maybe = depfiles
105am__mv = mv -f
106COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
107 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
108LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
109 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
110 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
111 $(AM_CFLAGS) $(CFLAGS)
112AM_V_CC = $(am__v_CC_$(V))
113am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
114am__v_CC_0 = @echo " CC " $@;
115AM_V_at = $(am__v_at_$(V))
116am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
117am__v_at_0 = @
118CCLD = $(CC)
119LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
120 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
121 $(AM_LDFLAGS) $(LDFLAGS) -o $@
122AM_V_CCLD = $(am__v_CCLD_$(V))
123am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
124am__v_CCLD_0 = @echo " CCLD " $@;
125AM_V_GEN = $(am__v_GEN_$(V))
126am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
127am__v_GEN_0 = @echo " GEN " $@;
128SOURCES = $(libecore_fb_la_SOURCES)
129DIST_SOURCES = $(libecore_fb_la_SOURCES)
130HEADERS = $(includes_HEADERS)
131ETAGS = etags
132CTAGS = ctags
133DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
134ACLOCAL = @ACLOCAL@
135ALLOCA = @ALLOCA@
136AMTAR = @AMTAR@
137AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
138AR = @AR@
139AS = @AS@
140AUTOCONF = @AUTOCONF@
141AUTOHEADER = @AUTOHEADER@
142AUTOMAKE = @AUTOMAKE@
143AWK = @AWK@
144CARES_CFLAGS = @CARES_CFLAGS@
145CARES_LIBS = @CARES_LIBS@
146CC = @CC@
147CCDEPMODE = @CCDEPMODE@
148CFLAGS = @CFLAGS@
149CHECK_CFLAGS = @CHECK_CFLAGS@
150CHECK_LIBS = @CHECK_LIBS@
151CPP = @CPP@
152CPPFLAGS = @CPPFLAGS@
153CURL_CFLAGS = @CURL_CFLAGS@
154CURL_LIBS = @CURL_LIBS@
155CXX = @CXX@
156CXXCPP = @CXXCPP@
157CXXDEPMODE = @CXXDEPMODE@
158CXXFLAGS = @CXXFLAGS@
159CYGPATH_W = @CYGPATH_W@
160DEFS = @DEFS@
161DEPDIR = @DEPDIR@
162DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
163DIRECTFB_LIBS = @DIRECTFB_LIBS@
164DLLTOOL = @DLLTOOL@
165DSYMUTIL = @DSYMUTIL@
166DUMPBIN = @DUMPBIN@
167ECHO_C = @ECHO_C@
168ECHO_N = @ECHO_N@
169ECHO_T = @ECHO_T@
170ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
171ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
172EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
173EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
174EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
175EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
176EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
177EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
178EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
179EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
180EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
181EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
182EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
183EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
184EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
185EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
186EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
187EGREP = @EGREP@
188EINA_CFLAGS = @EINA_CFLAGS@
189EINA_LIBS = @EINA_LIBS@
190ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
191ESCAPE_LIBS = @ESCAPE_LIBS@
192EVAS_CFLAGS = @EVAS_CFLAGS@
193EVAS_LIBS = @EVAS_LIBS@
194EVIL_CFLAGS = @EVIL_CFLAGS@
195EVIL_LIBS = @EVIL_LIBS@
196EXEEXT = @EXEEXT@
197FGREP = @FGREP@
198GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
199GLIB_CFLAGS = @GLIB_CFLAGS@
200GLIB_LIBS = @GLIB_LIBS@
201GMSGFMT = @GMSGFMT@
202GMSGFMT_015 = @GMSGFMT_015@
203GREP = @GREP@
204INSTALL = @INSTALL@
205INSTALL_DATA = @INSTALL_DATA@
206INSTALL_PROGRAM = @INSTALL_PROGRAM@
207INSTALL_SCRIPT = @INSTALL_SCRIPT@
208INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
209INTLLIBS = @INTLLIBS@
210INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
211KEYSYMDEFS = @KEYSYMDEFS@
212LD = @LD@
213LDFLAGS = @LDFLAGS@
214LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
215LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
216LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
217LIBICONV = @LIBICONV@
218LIBINTL = @LIBINTL@
219LIBOBJS = @LIBOBJS@
220LIBS = @LIBS@
221LIBTOOL = @LIBTOOL@
222LIPO = @LIPO@
223LN_S = @LN_S@
224LTLIBICONV = @LTLIBICONV@
225LTLIBINTL = @LTLIBINTL@
226LTLIBOBJS = @LTLIBOBJS@
227MAKEINFO = @MAKEINFO@
228MKDIR_P = @MKDIR_P@
229MSGFMT = @MSGFMT@
230MSGFMT_015 = @MSGFMT_015@
231MSGMERGE = @MSGMERGE@
232NM = @NM@
233NMEDIT = @NMEDIT@
234OBJC = @OBJC@
235OBJCDEPMODE = @OBJCDEPMODE@
236OBJCFLAGS = @OBJCFLAGS@
237OBJDUMP = @OBJDUMP@
238OBJEXT = @OBJEXT@
239OTOOL = @OTOOL@
240OTOOL64 = @OTOOL64@
241PACKAGE = @PACKAGE@
242PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
243PACKAGE_NAME = @PACKAGE_NAME@
244PACKAGE_STRING = @PACKAGE_STRING@
245PACKAGE_TARNAME = @PACKAGE_TARNAME@
246PACKAGE_URL = @PACKAGE_URL@
247PACKAGE_VERSION = @PACKAGE_VERSION@
248PATH_SEPARATOR = @PATH_SEPARATOR@
249PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
250PIXMAN_LIBS = @PIXMAN_LIBS@
251PKG_CONFIG = @PKG_CONFIG@
252PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
253PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
254POSUB = @POSUB@
255RANLIB = @RANLIB@
256SDL_CFLAGS = @SDL_CFLAGS@
257SDL_CONFIG = @SDL_CONFIG@
258SDL_LIBS = @SDL_LIBS@
259SED = @SED@
260SET_MAKE = @SET_MAKE@
261SHELL = @SHELL@
262SSL_CFLAGS = @SSL_CFLAGS@
263SSL_LIBS = @SSL_LIBS@
264STRIP = @STRIP@
265TLS2_CFLAGS = @TLS2_CFLAGS@
266TLS2_LIBS = @TLS2_LIBS@
267TLS_CFLAGS = @TLS_CFLAGS@
268TLS_LIBS = @TLS_LIBS@
269TSLIB_CFLAGS = @TSLIB_CFLAGS@
270TSLIB_LIBS = @TSLIB_LIBS@
271USE_NLS = @USE_NLS@
272VERSION = @VERSION@
273VMAJ = @VMAJ@
274WIN32_CFLAGS = @WIN32_CFLAGS@
275WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
276WIN32_LIBS = @WIN32_LIBS@
277XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
278XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
279XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
280XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
281XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
282XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
283XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
284XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
285XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
286XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
287XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
288XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
289XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
290XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
291XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
292XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
293XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
294XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
295XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
296XCB_X11_LIBS = @XCB_X11_LIBS@
297XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
298XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
299XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
300XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
301XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
302XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
303XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
304XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
305XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
306XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
307XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
308XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
309XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
310XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
311XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
312XDAMAGE_LIBS = @XDAMAGE_LIBS@
313XDPMS_CFLAGS = @XDPMS_CFLAGS@
314XDPMS_LIBS = @XDPMS_LIBS@
315XFIXES_CFLAGS = @XFIXES_CFLAGS@
316XFIXES_LIBS = @XFIXES_LIBS@
317XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
318XGESTURE_LIBS = @XGESTURE_LIBS@
319XGETTEXT = @XGETTEXT@
320XGETTEXT_015 = @XGETTEXT_015@
321XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
322XI2_CFLAGS = @XI2_CFLAGS@
323XI2_LIBS = @XI2_LIBS@
324XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
325XINERAMA_LIBS = @XINERAMA_LIBS@
326XKB_CFLAGS = @XKB_CFLAGS@
327XKB_LIBS = @XKB_LIBS@
328XMKMF = @XMKMF@
329XPRINT_CFLAGS = @XPRINT_CFLAGS@
330XPRINT_LIBS = @XPRINT_LIBS@
331XRANDR_CFLAGS = @XRANDR_CFLAGS@
332XRANDR_LIBS = @XRANDR_LIBS@
333XRENDER_CFLAGS = @XRENDER_CFLAGS@
334XRENDER_LIBS = @XRENDER_LIBS@
335XSS_CFLAGS = @XSS_CFLAGS@
336XSS_LIBS = @XSS_LIBS@
337XTEST_CFLAGS = @XTEST_CFLAGS@
338XTEST_LIBS = @XTEST_LIBS@
339X_CFLAGS = @X_CFLAGS@
340X_EXTRA_LIBS = @X_EXTRA_LIBS@
341X_LIBS = @X_LIBS@
342X_PRE_LIBS = @X_PRE_LIBS@
343Xcursor_cflags = @Xcursor_cflags@
344Xcursor_libs = @Xcursor_libs@
345abs_builddir = @abs_builddir@
346abs_srcdir = @abs_srcdir@
347abs_top_builddir = @abs_top_builddir@
348abs_top_srcdir = @abs_top_srcdir@
349ac_ct_CC = @ac_ct_CC@
350ac_ct_CXX = @ac_ct_CXX@
351ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
352ac_ct_OBJC = @ac_ct_OBJC@
353am__include = @am__include@
354am__leading_dot = @am__leading_dot@
355am__quote = @am__quote@
356am__tar = @am__tar@
357am__untar = @am__untar@
358bindir = @bindir@
359build = @build@
360build_alias = @build_alias@
361build_cpu = @build_cpu@
362build_os = @build_os@
363build_vendor = @build_vendor@
364builddir = @builddir@
365cocoa_ldflags = @cocoa_ldflags@
366datadir = @datadir@
367datarootdir = @datarootdir@
368dlopen_libs = @dlopen_libs@
369docdir = @docdir@
370dvidir = @dvidir@
371ecore_cocoa_cflags = @ecore_cocoa_cflags@
372ecore_cocoa_libs = @ecore_cocoa_libs@
373ecore_con_cflags = @ecore_con_cflags@
374ecore_con_libs = @ecore_con_libs@
375ecore_directfb_cflags = @ecore_directfb_cflags@
376ecore_directfb_libs = @ecore_directfb_libs@
377ecore_evas_cflags = @ecore_evas_cflags@
378ecore_evas_libs = @ecore_evas_libs@
379ecore_fb_cflags = @ecore_fb_cflags@
380ecore_fb_libs = @ecore_fb_libs@
381ecore_file_cflags = @ecore_file_cflags@
382ecore_file_libs = @ecore_file_libs@
383ecore_imf_cflags = @ecore_imf_cflags@
384ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
385ecore_imf_evas_libs = @ecore_imf_evas_libs@
386ecore_imf_libs = @ecore_imf_libs@
387ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
388ecore_imf_xim_libs = @ecore_imf_xim_libs@
389ecore_input_cflags = @ecore_input_cflags@
390ecore_input_evas_cflags = @ecore_input_evas_cflags@
391ecore_input_evas_libs = @ecore_input_evas_libs@
392ecore_input_libs = @ecore_input_libs@
393ecore_ipc_cflags = @ecore_ipc_cflags@
394ecore_ipc_libs = @ecore_ipc_libs@
395ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
396ecore_psl1ght_libs = @ecore_psl1ght_libs@
397ecore_sdl_cflags = @ecore_sdl_cflags@
398ecore_sdl_libs = @ecore_sdl_libs@
399ecore_win32_cflags = @ecore_win32_cflags@
400ecore_win32_libs = @ecore_win32_libs@
401ecore_wince_cflags = @ecore_wince_cflags@
402ecore_wince_libs = @ecore_wince_libs@
403ecore_x_cflags = @ecore_x_cflags@
404ecore_x_libs = @ecore_x_libs@
405ecore_x_libs_private = @ecore_x_libs_private@
406efl_doxygen = @efl_doxygen@
407efl_have_doxygen = @efl_have_doxygen@
408exec_prefix = @exec_prefix@
409have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
410host = @host@
411host_alias = @host_alias@
412host_cpu = @host_cpu@
413host_os = @host_os@
414host_vendor = @host_vendor@
415htmldir = @htmldir@
416includedir = @includedir@
417infodir = @infodir@
418install_sh = @install_sh@
419libdir = @libdir@
420libexecdir = @libexecdir@
421localedir = @localedir@
422localstatedir = @localstatedir@
423lt_ECHO = @lt_ECHO@
424lt_enable_auto_import = @lt_enable_auto_import@
425mandir = @mandir@
426mkdir_p = @mkdir_p@
427oldincludedir = @oldincludedir@
428pdfdir = @pdfdir@
429pkgconfig_requires_private = @pkgconfig_requires_private@
430prefix = @prefix@
431program_transform_name = @program_transform_name@
432psdir = @psdir@
433release_info = @release_info@
434requirements_ecore = @requirements_ecore@
435requirements_ecore_cocoa = @requirements_ecore_cocoa@
436requirements_ecore_con = @requirements_ecore_con@
437requirements_ecore_directfb = @requirements_ecore_directfb@
438requirements_ecore_evas = @requirements_ecore_evas@
439requirements_ecore_fb = @requirements_ecore_fb@
440requirements_ecore_file = @requirements_ecore_file@
441requirements_ecore_imf = @requirements_ecore_imf@
442requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
443requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
444requirements_ecore_input = @requirements_ecore_input@
445requirements_ecore_input_evas = @requirements_ecore_input_evas@
446requirements_ecore_ipc = @requirements_ecore_ipc@
447requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
448requirements_ecore_sdl = @requirements_ecore_sdl@
449requirements_ecore_win32 = @requirements_ecore_win32@
450requirements_ecore_wince = @requirements_ecore_wince@
451requirements_ecore_x = @requirements_ecore_x@
452rt_libs = @rt_libs@
453sbindir = @sbindir@
454sharedstatedir = @sharedstatedir@
455srcdir = @srcdir@
456sysconfdir = @sysconfdir@
457target_alias = @target_alias@
458top_build_prefix = @top_build_prefix@
459top_builddir = @top_builddir@
460top_srcdir = @top_srcdir@
461version_info = @version_info@
462x_cflags = @x_cflags@
463x_includes = @x_includes@
464x_libs = @x_libs@
465MAINTAINERCLEANFILES = Makefile.in
466AM_CPPFLAGS = \
467-I$(top_srcdir)/src/lib/ecore \
468-I$(top_builddir)/src/lib/ecore \
469-I$(top_srcdir)/src/lib/ecore_input \
470@TSLIB_CFLAGS@ \
471@EINA_CFLAGS@
472
473lib_LTLIBRARIES = libecore_fb.la
474includes_HEADERS = Ecore_Fb.h
475includesdir = $(includedir)/ecore-@VMAJ@
476libecore_fb_la_SOURCES = \
477ecore_fb.c \
478ecore_fb_vt.c \
479ecore_fb_li.c \
480ecore_fb_ts.c
481
482# deprecated sources (might not compile):
483# ecore_fb_kbd.c
484# ecore_fb_ps2.c
485libecore_fb_la_LIBADD = \
486@TSLIB_LIBS@ \
487$(top_builddir)/src/lib/ecore/libecore.la \
488$(top_builddir)/src/lib/ecore_input/libecore_input.la \
489@EINA_LIBS@
490
491libecore_fb_la_LDFLAGS = -version-info @version_info@ @release_info@
492EXTRA_DIST = \
493ecore_fb_private.h \
494ecore_fb_keytable.h
495
496all: all-am
497
498.SUFFIXES:
499.SUFFIXES: .c .lo .o .obj
500$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
501 @for dep in $?; do \
502 case '$(am__configure_deps)' in \
503 *$$dep*) \
504 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
505 && { if test -f $@; then exit 0; else break; fi; }; \
506 exit 1;; \
507 esac; \
508 done; \
509 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_fb/Makefile'; \
510 $(am__cd) $(top_srcdir) && \
511 $(AUTOMAKE) --gnu src/lib/ecore_fb/Makefile
512.PRECIOUS: Makefile
513Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
514 @case '$?' in \
515 *config.status*) \
516 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
517 *) \
518 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
519 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
520 esac;
521
522$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
523 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
524
525$(top_srcdir)/configure: $(am__configure_deps)
526 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
527$(ACLOCAL_M4): $(am__aclocal_m4_deps)
528 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
529$(am__aclocal_m4_deps):
530install-libLTLIBRARIES: $(lib_LTLIBRARIES)
531 @$(NORMAL_INSTALL)
532 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
533 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
534 list2=; for p in $$list; do \
535 if test -f $$p; then \
536 list2="$$list2 $$p"; \
537 else :; fi; \
538 done; \
539 test -z "$$list2" || { \
540 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
541 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
542 }
543
544uninstall-libLTLIBRARIES:
545 @$(NORMAL_UNINSTALL)
546 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
547 for p in $$list; do \
548 $(am__strip_dir) \
549 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
550 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
551 done
552
553clean-libLTLIBRARIES:
554 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
555 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
556 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
557 test "$$dir" != "$$p" || dir=.; \
558 echo "rm -f \"$${dir}/so_locations\""; \
559 rm -f "$${dir}/so_locations"; \
560 done
561libecore_fb.la: $(libecore_fb_la_OBJECTS) $(libecore_fb_la_DEPENDENCIES)
562 $(AM_V_CCLD)$(libecore_fb_la_LINK) -rpath $(libdir) $(libecore_fb_la_OBJECTS) $(libecore_fb_la_LIBADD) $(LIBS)
563
564mostlyclean-compile:
565 -rm -f *.$(OBJEXT)
566
567distclean-compile:
568 -rm -f *.tab.c
569
570@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_fb.Plo@am__quote@
571@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_fb_li.Plo@am__quote@
572@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_fb_ts.Plo@am__quote@
573@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_fb_vt.Plo@am__quote@
574
575.c.o:
576@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
577@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
578@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
580@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
581@am__fastdepCC_FALSE@ $(COMPILE) -c $<
582
583.c.obj:
584@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
585@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
586@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
587@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
588@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
589@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
590
591.c.lo:
592@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
593@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
594@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
595@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
596@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
597@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
598
599mostlyclean-libtool:
600 -rm -f *.lo
601
602clean-libtool:
603 -rm -rf .libs _libs
604install-includesHEADERS: $(includes_HEADERS)
605 @$(NORMAL_INSTALL)
606 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
607 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
608 for p in $$list; do \
609 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
610 echo "$$d$$p"; \
611 done | $(am__base_list) | \
612 while read files; do \
613 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
614 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
615 done
616
617uninstall-includesHEADERS:
618 @$(NORMAL_UNINSTALL)
619 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
620 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
621 test -n "$$files" || exit 0; \
622 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
623 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
624
625ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
626 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
627 unique=`for i in $$list; do \
628 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
629 done | \
630 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
631 END { if (nonempty) { for (i in files) print i; }; }'`; \
632 mkid -fID $$unique
633tags: TAGS
634
635TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
636 $(TAGS_FILES) $(LISP)
637 set x; \
638 here=`pwd`; \
639 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
640 unique=`for i in $$list; do \
641 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
642 done | \
643 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
644 END { if (nonempty) { for (i in files) print i; }; }'`; \
645 shift; \
646 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
647 test -n "$$unique" || unique=$$empty_fix; \
648 if test $$# -gt 0; then \
649 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
650 "$$@" $$unique; \
651 else \
652 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
653 $$unique; \
654 fi; \
655 fi
656ctags: CTAGS
657CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
658 $(TAGS_FILES) $(LISP)
659 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
660 unique=`for i in $$list; do \
661 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
662 done | \
663 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
664 END { if (nonempty) { for (i in files) print i; }; }'`; \
665 test -z "$(CTAGS_ARGS)$$unique" \
666 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
667 $$unique
668
669GTAGS:
670 here=`$(am__cd) $(top_builddir) && pwd` \
671 && $(am__cd) $(top_srcdir) \
672 && gtags -i $(GTAGS_ARGS) "$$here"
673
674distclean-tags:
675 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
676
677distdir: $(DISTFILES)
678 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
679 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
680 list='$(DISTFILES)'; \
681 dist_files=`for file in $$list; do echo $$file; done | \
682 sed -e "s|^$$srcdirstrip/||;t" \
683 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
684 case $$dist_files in \
685 */*) $(MKDIR_P) `echo "$$dist_files" | \
686 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
687 sort -u` ;; \
688 esac; \
689 for file in $$dist_files; do \
690 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
691 if test -d $$d/$$file; then \
692 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
693 if test -d "$(distdir)/$$file"; then \
694 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
695 fi; \
696 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
697 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
698 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
699 fi; \
700 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
701 else \
702 test -f "$(distdir)/$$file" \
703 || cp -p $$d/$$file "$(distdir)/$$file" \
704 || exit 1; \
705 fi; \
706 done
707check-am: all-am
708check: check-am
709all-am: Makefile $(LTLIBRARIES) $(HEADERS)
710installdirs:
711 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
712 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
713 done
714install: install-am
715install-exec: install-exec-am
716install-data: install-data-am
717uninstall: uninstall-am
718
719install-am: all-am
720 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
721
722installcheck: installcheck-am
723install-strip:
724 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
725 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
726 `test -z '$(STRIP)' || \
727 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
728mostlyclean-generic:
729
730clean-generic:
731
732distclean-generic:
733 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
734 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
735
736maintainer-clean-generic:
737 @echo "This command is intended for maintainers to use"
738 @echo "it deletes files that may require special tools to rebuild."
739 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
740clean: clean-am
741
742clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
743 mostlyclean-am
744
745distclean: distclean-am
746 -rm -rf ./$(DEPDIR)
747 -rm -f Makefile
748distclean-am: clean-am distclean-compile distclean-generic \
749 distclean-tags
750
751dvi: dvi-am
752
753dvi-am:
754
755html: html-am
756
757html-am:
758
759info: info-am
760
761info-am:
762
763install-data-am: install-includesHEADERS
764
765install-dvi: install-dvi-am
766
767install-dvi-am:
768
769install-exec-am: install-libLTLIBRARIES
770
771install-html: install-html-am
772
773install-html-am:
774
775install-info: install-info-am
776
777install-info-am:
778
779install-man:
780
781install-pdf: install-pdf-am
782
783install-pdf-am:
784
785install-ps: install-ps-am
786
787install-ps-am:
788
789installcheck-am:
790
791maintainer-clean: maintainer-clean-am
792 -rm -rf ./$(DEPDIR)
793 -rm -f Makefile
794maintainer-clean-am: distclean-am maintainer-clean-generic
795
796mostlyclean: mostlyclean-am
797
798mostlyclean-am: mostlyclean-compile mostlyclean-generic \
799 mostlyclean-libtool
800
801pdf: pdf-am
802
803pdf-am:
804
805ps: ps-am
806
807ps-am:
808
809uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
810
811.MAKE: install-am install-strip
812
813.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
814 clean-libLTLIBRARIES clean-libtool ctags distclean \
815 distclean-compile distclean-generic distclean-libtool \
816 distclean-tags distdir dvi dvi-am html html-am info info-am \
817 install install-am install-data install-data-am install-dvi \
818 install-dvi-am install-exec install-exec-am install-html \
819 install-html-am install-includesHEADERS install-info \
820 install-info-am install-libLTLIBRARIES install-man install-pdf \
821 install-pdf-am install-ps install-ps-am install-strip \
822 installcheck installcheck-am installdirs maintainer-clean \
823 maintainer-clean-generic mostlyclean mostlyclean-compile \
824 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
825 tags uninstall uninstall-am uninstall-includesHEADERS \
826 uninstall-libLTLIBRARIES
827
828
829# Tell versions [3.59,3.63) of GNU make to not export all variables.
830# Otherwise a system limit (for SysV at least) may be exceeded.
831.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_fb/ecore_fb.c b/libraries/ecore/src/lib/ecore_fb/ecore_fb.c
new file mode 100644
index 0000000..ca7d73d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/ecore_fb.c
@@ -0,0 +1,114 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "Ecore_Fb.h"
6#include "ecore_fb_private.h"
7
8static void _ecore_fb_size_get(int *w, int *h);
9
10static int _ecore_fb_init_count = 0;
11static int _ecore_fb_console_w = 0;
12static int _ecore_fb_console_h = 0;
13
14/**
15 * @addtogroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
16 *
17 * @{
18 */
19
20/**
21 * @brief Initialize the Ecore_Fb library.
22 *
23 * @param name Device target name.
24 * @return 1 or greater on success, 0 on error.
25 *
26 * This function sets up all the Ecore_Fb library. It returns 0 on
27 * failure, otherwise it returns the number of times it has already
28 * been called.
29 *
30 * When Ecore_Fb is not used anymore, call ecore_fb_shutdown() to shut down
31 * the Ecore_Fb library.
32 */
33EAPI int
34ecore_fb_init(const char *name __UNUSED__)
35{
36 if (++_ecore_fb_init_count != 1)
37 return _ecore_fb_init_count;
38
39 if (!ecore_fb_vt_init())
40 return --_ecore_fb_init_count;
41
42 _ecore_fb_size_get(&_ecore_fb_console_w, &_ecore_fb_console_h);
43
44 return _ecore_fb_init_count;
45}
46
47/**
48 * @brief Shut down the Ecore_Fb library.
49 *
50 * @return 0 when the library is completely shut down, 1 or
51 * greater otherwise.
52 *
53 * This function shuts down the Ecore_Fb library. It returns 0 when it has
54 * been called the same number of times than ecore_fb_init().
55 */
56EAPI int
57ecore_fb_shutdown(void)
58{
59 if (--_ecore_fb_init_count != 0)
60 return _ecore_fb_init_count;
61
62 ecore_fb_vt_shutdown();
63
64 return _ecore_fb_init_count;
65}
66
67
68/**
69 * @brief Retrieve the width and height of the current frame buffer in
70 * pixels.
71 *
72 * @param w Pointer to an integer in which to store the width.
73 * @param h Pointer to an interge in which to store the height.
74 *
75 * This function retrieves the size of the current frame buffer in
76 * pixels. @p w and @p h can be buffers that will be filled with the
77 * corresponding values. If one of them is @c NULL, nothing will be
78 * done for that parameter.
79 */
80EAPI void
81ecore_fb_size_get(int *w, int *h)
82{
83 if (w) *w = _ecore_fb_console_w;
84 if (h) *h = _ecore_fb_console_h;
85}
86
87static void
88_ecore_fb_size_get(int *w, int *h)
89{
90 struct fb_var_screeninfo fb_var;
91 int fb;
92
93 fb = open("/dev/fb0", O_RDWR);
94 if (fb < 0)
95 {
96 if (w) *w = 0;
97 if (h) *h = 0;
98 return;
99 }
100 if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_var) == -1)
101 {
102 if (w) *w = 0;
103 if (h) *h = 0;
104 close(fb);
105 return;
106 }
107 close(fb);
108 if (w) *w = fb_var.xres;
109 if (h) *h = fb_var.yres;
110}
111
112/**
113 * @}
114 */
diff --git a/libraries/ecore/src/lib/ecore_fb/ecore_fb_keytable.h b/libraries/ecore/src/lib/ecore_fb/ecore_fb_keytable.h
new file mode 100644
index 0000000..38de7bf
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/ecore_fb_keytable.h
@@ -0,0 +1,129 @@
1/* this table was taken from ecore_fb, is the default en layout */
2 "0x00", "0x00", "0x00", /**/"", "", "",/***/
3 "Escape", "Escape", "Escape", /**/"", "", "",/***/
4 "1", "exclam", "1", /**/"1", "!", "1",/***/
5 "2", "at", "2", /**/"2", "@", "2",/***/
6 "3", "numbersign", "3", /**/"3", "#", "3",/***/
7 "4", "dollar", "4", /**/"4", "$", "4",/***/
8 "5", "percent", "5", /**/"5", "%", "5",/***/
9 "6", "asciicircumm", "6", /**/"6", "^", "6",/***/
10 "7", "ampersand", "7", /**/"7", "&", "7",/***/
11 "8", "asterisk", "8", /**/"8", "*", "8",/***/
12 "9", "parenleft", "9", /**/"9", "(", "9",/***/
13 "0", "parenright", "0", /**/"0", ")", "0",/***/
14 "minus", "underscore", "minus", /**/"-", "_", "-",/***/
15 "equal", "plus", "equal", /**/"=", "+", "=",/***/
16 "BackSpace", "BackSpace", "BackSpace", /**/"\010","\010","\010",/***/
17 "Tab", "ISO_Left_Tab", "Tab", /**/"\011","", "\011",/***/
18 "q", "Q", "Q", /**/"q", "Q", "Q",/***/
19 "w", "W", "W", /**/"w", "W", "W",/***/
20 "e", "E", "E", /**/"e", "E", "E",/***/
21 "r", "R", "R", /**/"r", "R", "R",/***/
22 "t", "T", "T", /**/"t", "T", "T",/***/
23 "y", "Y", "Y", /**/"y", "Y", "Y",/***/
24 "u", "U", "U", /**/"u", "U", "U",/***/
25 "i", "I", "I", /**/"i", "I", "I",/***/
26 "o", "O", "O", /**/"o", "O", "O",/***/
27 "p", "P", "P", /**/"p", "P", "P",/***/
28 "bracketleft", "braceleft", "bracketleft", /**/"[", "{", "[",/***/
29 "bracketright", "braceright", "bracketright", /**/"]", "}", "]",/***/
30 "Return", "Return", "Return", /**/"\015","\015","\015",/***/
31 "Control_L", "Control_L", "Control_L", /**/"", "", "",/***/
32 "a", "A", "A", /**/"a", "A", "A",/***/
33 "s", "S", "S", /**/"s", "S", "S",/***/
34 "d", "D", "D", /**/"d", "D", "D",/***/
35 "f", "F", "F", /**/"f", "F", "F",/***/
36 "g", "G", "G", /**/"g", "G", "G",/***/
37 "h", "h", "H", /**/"h", "H", "H",/***/
38 "j", "J", "J", /**/"j", "J", "J",/***/
39 "k", "K", "K", /**/"k", "K", "K",/***/
40 "l", "L", "L", /**/"l", "L", "L",/***/
41 "semicolon", "colon", "semicolon", /**/";", ":", ";",/***/
42 "apostrophe", "quotedbl", "apostrophe", /**/"'", "\"", "'",/***/
43 "grave", "asciitilde", "grave", /**/"`", "~", "`",/***/
44 "Shift_L", "Shift_L", "Shift_L", /**/"", "", "",/***/
45 "backslash", "bar", "backslash", /**/"\\", "|", "\\",/***/
46 "z", "Z", "Z", /**/"z", "Z", "Z",/***/
47 "x", "X", "X", /**/"x", "X", "X",/***/
48 "c", "C", "C", /**/"c", "C", "C",/***/
49 "v", "V", "V", /**/"v", "V", "V",/***/
50 "b", "B", "B", /**/"b", "B", "B",/***/
51 "n", "N", "N", /**/"n", "N", "N",/***/
52 "m", "M", "M", /**/"m", "M", "M",/***/
53 "comma", "less", "comma", /**/",", "<", ",",/***/
54 "period", "greater", "period", /**/".", ">", ".",/***/
55 "slash", "question", "slash", /**/"/", "?", "/",/***/
56 "Shift_R", "Shift_R", "Shift_R", /**/"", "", "",/***/
57 "KP_Multiply", "KP_Multiply", "KP_Multiply", /**/"", "*", "",/***/
58 "Alt_L", "Alt_L", "Alt_L", /**/"", "", "",/***/
59 "space", "space", "space", /**/" ", " ", " ",/***/
60 "Caps_Lock", "Caps_Lock", "Caps_Lock", /**/"", "", "",/***/
61 "F1", "F1", "F1", /**/"", "", "",/***/
62 "F2", "F2", "F2", /**/"", "", "",/***/
63 "F3", "F3", "F3", /**/"", "", "",/***/
64 "F4", "F4", "F4", /**/"", "", "",/***/
65 "F5", "F5", "F5", /**/"", "", "",/***/
66 "F6", "F6", "F6", /**/"", "", "",/***/
67 "F7", "F7", "F7", /**/"", "", "",/***/
68 "F8", "F8", "F8", /**/"", "", "",/***/
69 "F9", "F9", "F9", /**/"", "", "",/***/
70 "F10", "F10", "F10", /**/"", "", "",/***/
71 "Num_Lock", "Num_Lock", "Num_Lock", /**/"", "", "",/***/
72 "Scroll_Lock", "Scroll_Lock", "Scroll_Lock", /**/"", "", "",/***/
73 "KP_Home", "KP_7", "KP_Home", /**/"", "7", "",/***/
74 "KP_Up", "KP_8", "KP_Up", /**/"", "8", "",/***/
75 "KP_Prior", "KP_9", "KP_Prior", /**/"", "9", "",/***/
76 "KP_Subtract", "KP_Subtract", "KP_Subtract", /**/"", "", "",/***/
77 "KP_Left", "KP_4", "KP_Left", /**/"", "4", "",/***/
78 "KP_Begin", "KP_5", "KP_Begin", /**/"", "5", "",/***/
79 "KP_Right", "KP_6", "KP_Right", /**/"", "6", "",/***/
80 "KP_Add", "KP_Add", "KP_Add", /**/"", "", "",/***/
81 "KP_End", "KP_1", "KP_End", /**/"", "1", "",/***/
82 "KP_Down", "KP_2", "KP_Down", /**/"", "2", "",/***/
83 "KP_Next", "KP_3", "KP_Next", /**/"", "3", "",/***/
84 "KP_Insert", "KP_0", "KP_Insert", /**/"", "0", "",/***/
85 "KP_Delete", "KP_Decimal", "KP_Delete", /**/"", ".", "",/***/
86 "0x54", "0x54", "0x54", /**/"", "", "",/***/
87 "0x55", "0x55", "0x55", /**/"", "", "",/***/
88 "0x56", "0x56", "0x56", /**/"", "", "",/***/
89 "F11", "F11", "F11", /**/"", "", "",/***/
90 "F12", "F12", "F12", /**/"", "", "",/***/
91 "0x59", "0x59", "0x59", /**/"", "", "",/***/
92 "0x5a", "0x5a", "0x5a", /**/"", "", "",/***/
93 "0x5b", "0x5b", "0x5b", /**/"", "", "",/***/
94 "0x5c", "0x5c", "0x5c", /**/"", "", "",/***/
95 "0x5d", "0x5d", "0x5d", /**/"", "", "",/***/
96 "0x5e", "0x5e", "0x5e", /**/"", "", "",/***/
97 "0x5f", "0x5f", "0x5f", /**/"", "", "",/***/
98 "KP_Enter", "KP_Enter", "KP_Enter", /**/"", "", "",/***/
99 "Control_R", "Control_R", "Control_R", /**/"", "", "",/***/
100 "KP_Divide", "KP_Divide", "KP_Divide", /**/"", "", "",/***/
101 "Print", "Print", "Print", /**/"", "", "",/***/
102 "Alt_R", "Alt_R", "Alt_R", /**/"", "", "",/***/
103 "0x65", "0x65", "0x65", /**/"", "", "",/***/
104 "Home", "Home", "Home", /**/"", "", "",/***/
105 "Up", "Up", "Up", /**/"", "", "",/***/
106 "Prior", "Prior", "Prior", /**/"", "", "",/***/
107 "Left", "Left", "Left", /**/"", "", "",/***/
108 "Right", "Right", "Right", /**/"", "", "",/***/
109 "End", "End", "End", /**/"", "", "",/***/
110 "Down", "Down", "Down", /**/"", "", "",/***/
111 "Next", "Next", "Next", /**/"", "", "",/***/
112 "Insert", "Insert", "Insert", /**/"", "", "",/***/
113 "Delete", "Delete", "Delete", /**/"\177","\177","\177",/***/
114 "0x70", "0x70", "0x70", /**/"", "", "",/***/
115 "0x71", "0x71", "0x71", /**/"", "", "",/***/
116 "0x72", "0x72", "0x72", /**/"", "", "",/***/
117 "0x73", "0x73", "0x73", /**/"", "", "",/***/
118 "0x74", "0x74", "0x74", /**/"", "", "",/***/
119 "0x75", "0x75", "0x75", /**/"", "", "",/***/
120 "0x76", "0x76", "0x76", /**/"", "", "",/***/
121 "Pause", "Pause", "Pause", /**/"", "", "",/***/
122 "0x78", "0x78", "0x78", /**/"", "", "",/***/
123 "0x79", "0x79", "0x79", /**/"", "", "",/***/
124 "0x7a", "0x7a", "0x7a", /**/"", "", "",/***/
125 "0x7b", "0x7b", "0x7b", /**/"", "", "",/***/
126 "0x7c", "0x7c", "0x7c", /**/"", "", "",/***/
127 "Super_L", "Super_L", "Super_L", /**/"", "", "",/***/
128 "Super_R", "Super_R", "Super_R", /**/"", "", "",/***/
129 "0x7f", "0x7f", "0x7f", /**/"", "", "" /***/
diff --git a/libraries/ecore/src/lib/ecore_fb/ecore_fb_li.c b/libraries/ecore/src/lib/ecore_fb/ecore_fb_li.c
new file mode 100644
index 0000000..4a196dd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/ecore_fb_li.c
@@ -0,0 +1,706 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "Ecore_Fb.h"
6#include "ecore_fb_private.h"
7
8#define CLICK_THRESHOLD_DEFAULT 0.25
9
10static Eina_List *_ecore_fb_li_devices = NULL;
11
12static const char *_ecore_fb_li_kbd_syms[128 * 6] =
13{
14#include "ecore_fb_keytable.h"
15};
16
17/* Initial Copyright (C) Brad Hards (1999-2002),
18 * this function is used to tell if "bit" is set in "array"
19 * it selects a byte from the array, and does a boolean AND
20 * operation with a byte that only has the relevant bit set.
21 * eg. to check for the 12th bit, we do (array[1] & 1<<4).
22 * Moved to static inline in order to force compiler to otimized
23 * the unsued part away or force a link error if long has an unexpected
24 * size.
25 * - bigeasy
26 */
27extern int long_has_neither_32_nor_64_bits(void);
28static inline int
29test_bit(int bit, unsigned long *array)
30{
31 if (sizeof(long) == 4)
32 return array[bit / 32] & (1 << (bit % 32));
33 else if (sizeof(long) == 8)
34 return array[bit / 64] & (1 << (bit % 64));
35 else long_has_neither_32_nor_64_bits();
36}
37
38static void
39_ecore_fb_li_device_event_key(Ecore_Fb_Input_Device *dev, struct input_event *iev)
40{
41 if (!dev->listen) return;
42
43 /* check for basic keyboard keys */
44 if ((iev->code >= KEY_ESC) && (iev->code <= KEY_COMPOSE))
45 {
46 int offset = 0;
47 const char *keyname = _ecore_fb_li_kbd_syms[iev->code * 6];
48 /* check the key table */
49 if (iev->value)
50 {
51 /* its a repeated key, dont increment */
52 if (iev->value == 2)
53 return;
54 if (!strcmp(keyname, "Control_L"))
55 dev->keyboard.ctrl++;
56 else if (!strcmp(keyname, "Control_R"))
57 dev->keyboard.ctrl++;
58 else if (!strcmp(keyname, "Alt_L"))
59 dev->keyboard.alt++;
60 else if (!strcmp(keyname, "Alt_R"))
61 dev->keyboard.alt++;
62 else if (!strcmp(keyname, "Shift_L"))
63 dev->keyboard.shift++;
64 else if (!strcmp(keyname, "Shift_R"))
65 dev->keyboard.shift++;
66 else if (!strcmp(keyname, "Caps_Lock"))
67 dev->keyboard.lock = !dev->keyboard.lock;
68 if (dev->keyboard.ctrl > 2) dev->keyboard.ctrl = 2;
69 if (dev->keyboard.alt > 2) dev->keyboard.alt = 2;
70 if (dev->keyboard.shift > 2) dev->keyboard.shift = 2;
71 if (dev->keyboard.lock > 1) dev->keyboard.lock = 1;
72 }
73 else
74 {
75 if (!strcmp(keyname, "Control_L"))
76 dev->keyboard.ctrl--;
77 else if (!strcmp(keyname, "Control_R"))
78 dev->keyboard.ctrl--;
79 else if (!strcmp(keyname, "Alt_L"))
80 dev->keyboard.alt--;
81 else if (!strcmp(keyname, "Alt_R"))
82 dev->keyboard.alt--;
83 else if (!strcmp(keyname, "Shift_L"))
84 dev->keyboard.shift--;
85 else if (!strcmp(keyname, "Shift_R"))
86 dev->keyboard.shift--;
87 if (dev->keyboard.ctrl < 0) dev->keyboard.ctrl = 0;
88 if (dev->keyboard.alt < 0) dev->keyboard.alt = 0;
89 if (dev->keyboard.shift < 0) dev->keyboard.shift = 0;
90 if (dev->keyboard.lock < 0) dev->keyboard.lock = 0;
91 }
92
93 /* sending ecore_input_evas events */
94 Ecore_Event_Key *e;
95
96 if (dev->keyboard.shift) offset = 1;
97 else if (dev->keyboard.lock) offset = 2;
98
99 const char *key = _ecore_fb_li_kbd_syms[(iev->code * 6) + offset];
100 const char *compose = _ecore_fb_li_kbd_syms[(iev->code * 6) + 3 + offset];
101
102 e = calloc(1, sizeof(Ecore_Event_Key) + strlen(key) +
103 strlen(keyname) + (compose ? strlen(compose) : 0) + 3);
104 e->keyname = (char *)(e + 1);
105 e->key = e->keyname + strlen(keyname) + 1;
106 e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
107 e->string = e->compose;
108
109 strcpy((char *)e->keyname, keyname);
110 strcpy((char *)e->key, key);
111 if (compose)
112 strcpy((char *)e->compose, compose);
113
114 e->modifiers = 0;
115 if (dev->keyboard.shift)
116 e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
117 if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
118 if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
119 if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
120
121 e->timestamp = ecore_time_get();
122 e->window = (Ecore_Window)dev->window;
123 e->event_window = (Ecore_Window)dev->window;
124 e->root_window = (Ecore_Window)dev->window;
125 e->same_screen = 1;
126
127 if (iev->value)
128 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
129 else
130 ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
131 }
132 /* check for mouse button events */
133 else if ((iev->code >= BTN_MOUSE) && (iev->code < BTN_JOYSTICK))
134 {
135 int button;
136 Ecore_Event_Mouse_Button *e;
137 double current = ecore_time_get();
138
139 button = ((iev->code & 0x00F) + 1);
140 if (iev->value)
141 {
142 dev->mouse.did_double = EINA_FALSE;
143 dev->mouse.did_triple = EINA_FALSE;
144
145 if (((current - dev->mouse.prev) <= dev->mouse.threshold) &&
146 (button == dev->mouse.prev_button))
147 {
148 dev->mouse.did_double = EINA_TRUE;
149 if (((current - dev->mouse.last) <= (2 * dev->mouse.threshold)) &&
150 (button == dev->mouse.last_button))
151 {
152 dev->mouse.did_triple = EINA_TRUE;
153 /* reset */
154 dev->mouse.prev = 0;
155 dev->mouse.last = 0;
156 current = 0;
157 }
158 }
159 dev->mouse.last = dev->mouse.prev;
160 dev->mouse.prev = current;
161 dev->mouse.last_button = dev->mouse.prev_button;
162 dev->mouse.prev_button = button;
163 }
164
165 e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
166 if (!e)
167 return;
168
169 e->timestamp = current;
170 e->window = (Ecore_Window)dev->window;
171 e->event_window = (Ecore_Window)dev->window;
172 e->root_window = (Ecore_Window)dev->window;
173 e->same_screen = 1;
174
175 e->modifiers = 0;
176 if (dev->keyboard.shift)
177 e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
178 if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
179 if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
180 if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
181
182 e->x = dev->mouse.x;
183 e->y = dev->mouse.y;
184 e->root.x = e->x;
185 e->root.y = e->y;
186 e->buttons = button;
187
188 if (dev->mouse.did_double)
189 e->double_click = 1;
190 if (dev->mouse.did_triple)
191 e->triple_click = 1;
192
193 if (iev->value)
194 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
195 else
196 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
197 }
198}
199
200static void
201_ecore_fb_li_device_event_rel(Ecore_Fb_Input_Device *dev, struct input_event *iev)
202{
203 if (!dev->listen) return;
204 /* dispatch the button events if they are queued */
205 switch (iev->code)
206 {
207 case REL_X:
208 case REL_Y:
209 {
210 Ecore_Event_Mouse_Move *e;
211 if(iev->code == REL_X)
212 {
213 dev->mouse.x += iev->value;
214 if(dev->mouse.x > dev->mouse.w - 1)
215 dev->mouse.x = dev->mouse.w;
216 else if(dev->mouse.x < 0)
217 dev->mouse.x = 0;
218 }
219 else
220 {
221 dev->mouse.y += iev->value;
222 if(dev->mouse.y > dev->mouse.h - 1)
223 dev->mouse.y = dev->mouse.h;
224 else if(dev->mouse.y < 0)
225 dev->mouse.y = 0;
226 }
227
228 e = calloc(1, sizeof(Ecore_Event_Mouse_Move));
229 if (!e)
230 return;
231
232 e->window = (Ecore_Window)dev->window;
233 e->event_window = (Ecore_Window)dev->window;
234 e->root_window = (Ecore_Window)dev->window;
235 e->same_screen = 1;
236
237 e->modifiers = 0;
238 if (dev->keyboard.shift) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
239 if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
240 if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
241 if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
242
243 e->x = dev->mouse.x;
244 e->y = dev->mouse.y;
245 e->root.x = e->x;
246 e->root.y = e->y;
247
248 e->timestamp = ecore_time_get();
249
250 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
251
252 break;
253 }
254 case REL_WHEEL:
255 case REL_HWHEEL:
256 {
257 Ecore_Event_Mouse_Wheel *e;
258
259 e = calloc(1, sizeof(Ecore_Event_Mouse_Wheel));
260 if (!e)
261 return;
262
263 e->x = dev->mouse.x;
264 e->y = dev->mouse.y;
265 if (iev->code == REL_HWHEEL) e->direction = 1;
266 e->z = iev->value;
267 e->root.x = dev->mouse.x;
268 e->root.y = dev->mouse.y;
269
270 e->window = (Ecore_Window)dev->window;
271 e->event_window = (Ecore_Window)dev->window;
272 e->root_window = (Ecore_Window)dev->window;
273 e->same_screen = 1;
274
275 e->modifiers = 0;
276 if (dev->keyboard.shift) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
277 if (dev->keyboard.ctrl) e->modifiers |= ECORE_EVENT_MODIFIER_CTRL;
278 if (dev->keyboard.alt) e->modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
279 if (dev->keyboard.lock) e->modifiers |= ECORE_EVENT_LOCK_CAPS;
280
281 e->timestamp = ecore_time_get();
282
283 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
284
285 break;
286 }
287 default:
288 break;
289 }
290}
291
292static void
293_ecore_fb_li_device_event_abs(Ecore_Fb_Input_Device *dev, struct input_event *iev)
294{
295 static int prev_pressure = 0;
296 int pressure;
297
298 if (!dev->listen) return;
299 switch (iev->code)
300 {
301 case ABS_X:
302 if (dev->mouse.w != 0)
303 {
304 int tmp;
305
306 tmp = (int)((double)(iev->value - dev->mouse.min_w) / dev->mouse.rel_w);
307 if (tmp < 0) dev->mouse.x = 0;
308 else if (tmp > dev->mouse.w) dev->mouse.x = dev->mouse.w;
309 else dev->mouse.x = tmp;
310 dev->mouse.event = ECORE_EVENT_MOUSE_MOVE;
311 }
312 break;
313
314 case ABS_Y:
315 if(dev->mouse.h != 0)
316 {
317 int tmp;
318
319 tmp = (int)((double)(iev->value - dev->mouse.min_h) / dev->mouse.rel_h);
320 if (tmp < 0) dev->mouse.y = 0;
321 else if (tmp > dev->mouse.h) dev->mouse.y = dev->mouse.h;
322 else dev->mouse.y = tmp;
323 dev->mouse.event = ECORE_EVENT_MOUSE_MOVE;
324 }
325 break;
326
327 case ABS_PRESSURE:
328 pressure = iev->value;
329 if ((pressure) && (!prev_pressure))
330 {
331 /* DOWN: mouse is down, but was not before */
332 dev->mouse.event = ECORE_EVENT_MOUSE_BUTTON_DOWN;
333 }
334 else if ((!pressure) && (prev_pressure))
335 {
336 /* UP: mouse was down, but is not now */
337 dev->mouse.event = ECORE_EVENT_MOUSE_BUTTON_UP;
338 }
339 prev_pressure = pressure;
340 break;
341 }
342}
343
344static void
345_ecore_fb_li_device_event_syn(Ecore_Fb_Input_Device *dev, struct input_event *iev __UNUSED__)
346{
347 if (!dev->listen) return;
348
349 if (dev->mouse.event == ECORE_EVENT_MOUSE_MOVE)
350 {
351 Ecore_Event_Mouse_Move *ev;
352 ev = calloc(1,sizeof(Ecore_Event_Mouse_Move));
353 ev->x = dev->mouse.x;
354 ev->y = dev->mouse.y;
355 ev->root.x = ev->x;
356 ev->root.y = ev->y;
357 ev->timestamp = ecore_time_get();
358 }
359 else if (dev->mouse.event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
360 {
361 Ecore_Event_Mouse_Button *ev;
362 ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
363 ev->x = dev->mouse.x;
364 ev->y = dev->mouse.y;
365 ev->root.x = ev->x;
366 ev->root.y = ev->y;
367 ev->buttons = 1;
368 ev->timestamp = ecore_time_get();
369 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
370 }
371 else if (dev->mouse.event == ECORE_EVENT_MOUSE_BUTTON_UP)
372 {
373 Ecore_Event_Mouse_Button *ev;
374 ev = calloc(1, sizeof(Ecore_Event_Mouse_Button));
375 ev->x = dev->mouse.x;
376 ev->y = dev->mouse.y;
377 ev->root.x = ev->x;
378 ev->root.y = ev->y;
379 ev->buttons = 1;
380 ev->timestamp = ecore_time_get();
381 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
382 }
383}
384
385static Eina_Bool
386_ecore_fb_li_device_fd_callback(void *data, Ecore_Fd_Handler *fdh __UNUSED__)
387{
388 Ecore_Fb_Input_Device *dev;
389 struct input_event ev[64];
390 int len;
391 int i;
392
393 dev = (Ecore_Fb_Input_Device*)data;
394 /* read up to 64 events at once */
395 len = read(dev->fd, &ev, sizeof(ev));
396 for(i = 0; i < (int)(len / sizeof(ev[0])); i++)
397 {
398 switch(ev[i].type)
399 {
400 case EV_SYN:
401 _ecore_fb_li_device_event_syn(dev, &ev[i]);
402 break;
403 case EV_ABS:
404 _ecore_fb_li_device_event_abs(dev, &ev[i]);
405 break;
406 case EV_REL:
407 _ecore_fb_li_device_event_rel(dev, &ev[i]);
408 break;
409 case EV_KEY:
410 _ecore_fb_li_device_event_key(dev, &ev[i]);
411 break;
412 default:
413 break;
414 }
415 }
416 return EINA_TRUE;
417}
418
419/**
420 * @addtogroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
421 *
422 * @{
423 */
424
425/**
426 * @brief Set the listen mode for an input device .
427 *
428 * @param dev The device to set the mode of.
429 * @param listen EINA_FALSE to disable listening mode, EINA_TRUE to enable it.
430 *
431 * This function enables or disables listening on the input device @p
432 * dev. If @p listen is #EINA_FALSE, listening mode is disabled, if it
433 * is #EINA_TRUE, it is enabled.
434 */
435EAPI void
436ecore_fb_input_device_listen(Ecore_Fb_Input_Device *dev, Eina_Bool listen)
437{
438 if (!dev) return;
439 if ((listen && dev->listen) || (!listen && !dev->listen)) return;
440 if (listen)
441 {
442 /* if the device already had a handler */
443 if (!dev->handler)
444 dev->handler = ecore_main_fd_handler_add(dev->fd, ECORE_FD_READ, _ecore_fb_li_device_fd_callback, dev, NULL, NULL);
445
446 }
447 dev->listen = listen;
448}
449
450#ifndef EV_CNT
451# define EV_CNT (EV_MAX+1)
452#endif
453
454/**
455 * @brief Associates an input device with the given @ref Ecore_Evas.
456 *
457 * @param dev The input being associated with an @ref Ecore_Evas (not @c NULL).
458 * @param window The window which this input is being associated to.
459 * @c NULL will remove any previous association.
460 *
461 * Events generated by this device will have a pointer to @p window. If this @p
462 * window is registered with ecore_event_window_register() or
463 * ecore_evas_input_event_register(), respective evas events will be delivered
464 * by the ecore_input_evas system. An example can be seen in the following code:
465 *
466 * @code
467 * Ecore_Evas *ee = ecore_evas_new(NULL, 0, 0, 800, 600, NULL);
468 *
469 * ecore_evas_input_event_register(ee);
470 *
471 * device = ecore_fb_input_device_open(device_path);
472 * if (device)
473 * ecore_fb_input_device_window_set(device, ee);
474 *
475 * @endcode
476 *
477 * On the previous code, all input captured on the mentioned device will be
478 * delivered to the @Ecore_Evas @c ee.
479 *
480 * @since 1.1
481 */
482EAPI void
483ecore_fb_input_device_window_set(Ecore_Fb_Input_Device *dev, void *window)
484{
485 if (!dev) return;
486
487 dev->window = window;
488}
489
490/**
491 * @brief Open an input device.
492 *
493 * @param dev The device to open.
494 * @return The @ref Ecore_Fb_Input_Device object that has been opened.
495 *
496 * This function opens the input device named @p dev and returns the
497 * object for it, or returns @c NULL on failure.
498 */
499EAPI Ecore_Fb_Input_Device *
500ecore_fb_input_device_open(const char *dev)
501{
502 Ecore_Fb_Input_Device *device;
503 unsigned long event_type_bitmask[EV_CNT / 32 + 1];
504 int event_type;
505 int fd;
506
507 if (!dev) return NULL;
508 device = calloc(1, sizeof(Ecore_Fb_Input_Device));
509 if (!device) return NULL;
510
511 if ((fd = open(dev, O_RDONLY, O_NONBLOCK)) < 0)
512 {
513 fprintf(stderr, "[ecore_fb_li:device_open] %s %s", dev, strerror(errno));
514 goto error_open;
515 }
516 /* query capabilities */
517 if (ioctl(fd, EVIOCGBIT(0, EV_MAX), event_type_bitmask) < 0)
518 {
519 fprintf(stderr,"[ecore_fb_li:device_open] query capabilities %s %s", dev, strerror(errno));
520 goto error_caps;
521 }
522 /* query name */
523 device->info.name = calloc(256, sizeof(char));
524 if (ioctl(fd, EVIOCGNAME(sizeof(char) * 256), device->info.name) < 0)
525 {
526 fprintf(stderr, "[ecore_fb_li:device_open] get name %s %s", dev, strerror(errno));
527 strcpy(device->info.name, "Unknown");
528 }
529 device->fd = fd;
530 device->info.dev = strdup(dev);
531 /* common */
532 device->mouse.threshold = CLICK_THRESHOLD_DEFAULT;
533
534 /* set info */
535 for (event_type = 0; event_type < EV_MAX; event_type++)
536 {
537 if(!test_bit(event_type, event_type_bitmask))
538 continue;
539 switch (event_type)
540 {
541 case EV_SYN:
542 break;
543 case EV_KEY:
544 device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_KEYS_OR_BUTTONS;
545 break;
546 case EV_REL:
547 device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_RELATIVE;
548 break;
549 case EV_ABS:
550 device->info.cap |= ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE;
551 break;
552 case EV_MSC:
553 case EV_LED:
554 case EV_SND:
555 case EV_REP:
556 case EV_FF :
557 case EV_FF_STATUS:
558 case EV_PWR:
559 default:
560 break;
561 }
562 }
563
564 _ecore_fb_li_devices = eina_list_append(_ecore_fb_li_devices, device);
565 return device;
566
567error_caps:
568 close(fd);
569error_open:
570 free(device);
571 return NULL;
572}
573
574/**
575 * @brief Close the given device.
576 *
577 * @param dev The device to close
578 *
579 * This function closes the device @p dev. If @p dev is @c NULL, this
580 * function does nothing.
581 */
582EAPI void
583ecore_fb_input_device_close(Ecore_Fb_Input_Device *dev)
584{
585 if (!dev || dev->fd < 0) return;
586 /* close the fd */
587 close(dev->fd);
588 /* remove the element from the list */
589 _ecore_fb_li_devices = eina_list_remove(_ecore_fb_li_devices, dev);
590 free(dev);
591}
592
593
594/**
595 * @brief Set the axis size of the given device.
596 *
597 * @param dev The device to set the axis size to.
598 * @param w The width of the axis.
599 * @param h The height of the axis.
600 *
601 * This function sets set the width @p w and height @p h of the axis
602 * of device @p dev. If @p dev is a relative input device, a width and
603 * height must set for it. If its absolute set the ioctl correctly, if
604 * not, unsupported device.
605 */
606EAPI void
607ecore_fb_input_device_axis_size_set(Ecore_Fb_Input_Device *dev, int w, int h)
608{
609 if (!dev) return;
610 if ((w < 0) || (h < 0)) return;
611 /* FIXME
612 * this code is for a touchscreen device,
613 * make it configurable (ABSOLUTE | RELATIVE)
614 */
615 if (dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_ABSOLUTE)
616 {
617 /* FIXME looks like some kernels dont include this struct */
618 struct input_absinfo abs_features;
619
620 ioctl(dev->fd, EVIOCGABS(ABS_X), &abs_features);
621 dev->mouse.min_w = abs_features.minimum;
622 dev->mouse.rel_w = (double)(abs_features.maximum - abs_features.minimum)/(double)(w);
623
624 ioctl(dev->fd, EVIOCGABS(ABS_Y), &abs_features);
625 dev->mouse.min_h = abs_features.minimum;
626 dev->mouse.rel_h = (double)(abs_features.maximum - abs_features.minimum)/(double)(h);
627 }
628 else if (!(dev->info.cap & ECORE_FB_INPUT_DEVICE_CAP_RELATIVE))
629 return;
630
631 /* update the local values */
632 if (dev->mouse.x > w - 1) dev->mouse.x = w -1;
633 if (dev->mouse.y > h - 1) dev->mouse.y = h -1;
634 dev->mouse.w = w;
635 dev->mouse.h = h;
636}
637
638/**
639 * @brief Retrieve the name of the given device.
640 *
641 * @param dev The device to get the name from.
642 * @return The name of the device.
643 *
644 * This function returns the name of the device @p dev. If @p dev is
645 * @c NULL, this function returns @c NULL.
646 */
647EAPI const char *
648ecore_fb_input_device_name_get(Ecore_Fb_Input_Device *dev)
649{
650 if (!dev) return NULL;
651 return dev->info.name;
652}
653
654/**
655 * @brief Retrieve the capability of the given device.
656 *
657 * @param dev The device to get the name from.
658 * @return The capability of the device.
659 *
660 * This function returns the capability of the device @p dev. If @p dev is
661 * @c NULL, this function returns #ECORE_FB_INPUT_DEVICE_CAP_NONE.
662 */
663EAPI Ecore_Fb_Input_Device_Cap
664ecore_fb_input_device_cap_get(Ecore_Fb_Input_Device *dev)
665{
666 if (!dev) return ECORE_FB_INPUT_DEVICE_CAP_NONE;
667 return dev->info.cap;
668}
669
670/**
671 * @brief Set the threshold of mouse clicks of the given device.
672 *
673 * @param dev The device to set the threshodl mouse click to.
674 * @param threshold The threshold value.
675 *
676 * This function sets the threshold of mouse clicks of the device
677 * @p dev to @p threshold. If @p dev is @c NULL, this function does
678 * nothing.
679 */
680EAPI void
681ecore_fb_input_device_threshold_click_set(Ecore_Fb_Input_Device *dev, double threshold)
682{
683 if (!dev) return;
684 if ((threshold == dev->mouse.threshold) || (threshold == 0)) return;
685 dev->mouse.threshold = threshold;
686}
687
688/**
689 * @brief Get the threshold of mouse clicks of the given device.
690 *
691 * @param dev The device to set the threshodl mouse click from.
692 * @return The threshold value.
693 *
694 * This function returns the threshold of mouse clicks of the device
695 * @p dev. If @p dev is @c NULL, this function returns 0.0.
696 */
697EAPI double
698ecore_fb_input_device_threshold_click_get(Ecore_Fb_Input_Device *dev)
699{
700 if (!dev) return 0;
701 return dev->mouse.threshold;
702}
703
704/**
705 * @}
706 */
diff --git a/libraries/ecore/src/lib/ecore_fb/ecore_fb_private.h b/libraries/ecore/src/lib/ecore_fb/ecore_fb_private.h
new file mode 100644
index 0000000..3e908a0
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/ecore_fb_private.h
@@ -0,0 +1,91 @@
1#ifndef _ECORE_FB_PRIVATE_H
2#define _ECORE_FB_PRIVATE_H
3
4#include "Ecore.h"
5#include "ecore_private.h"
6#include "Ecore_Input.h"
7
8#include <stdio.h>
9#include <string.h>
10#include <unistd.h>
11#include <termios.h>
12#include <sys/types.h>
13#include <sys/stat.h>
14#include <sys/ioctl.h>
15#include <linux/version.h>
16#include <linux/kd.h>
17#include <linux/vt.h>
18#include <linux/fb.h>
19#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18))
20 #define kernel_ulong_t unsigned long
21 #define BITS_PER_LONG 32
22 #include <linux/input.h>
23 #undef kernel_ulong_t
24 #undef BITS_PER_LONG
25#else
26 #include <linux/input.h>
27#endif
28
29#include <signal.h>
30#include <fcntl.h>
31#include <errno.h>
32
33/* ecore_fb_li.c */
34struct _Ecore_Fb_Input_Device
35{
36 int fd;
37 Ecore_Fd_Handler *handler;
38 int listen;
39 struct {
40 Ecore_Fb_Input_Device_Cap cap;
41 char *name;
42 char *dev;
43 } info;
44 struct
45 {
46 /* common mouse */
47 int x,y;
48 int w,h;
49
50 double last;
51 double prev;
52 double threshold;
53 Eina_Bool did_double;
54 Eina_Bool did_triple;
55 /* absolute axis */
56 int min_w, min_h;
57 double rel_w, rel_h;
58 int event;
59 int prev_button;
60 int last_button;
61 } mouse;
62 struct
63 {
64 int shift;
65 int ctrl;
66 int alt;
67 int lock;
68 } keyboard;
69 void *window;
70};
71
72/* ecore_fb_ts.c */
73EAPI int ecore_fb_ts_init(void);
74EAPI void ecore_fb_ts_shutdown(void);
75EAPI void ecore_fb_ts_events_window_set(void *window);
76EAPI void *ecore_fb_ts_events_window_get(void);
77EAPI void ecore_fb_ts_event_window_set(void *window);
78
79/* ecore_fb_vt.c */
80int ecore_fb_vt_init(void);
81void ecore_fb_vt_shutdown(void);
82
83/* hacks to stop people NEEDING #include <linux/h3600_ts.h> */
84#ifndef TS_SET_CAL
85#define TS_SET_CAL 0x4014660b
86#endif
87#ifndef TS_GET_CAL
88#define TS_GET_CAL 0x8014660a
89#endif
90
91#endif
diff --git a/libraries/ecore/src/lib/ecore_fb/ecore_fb_ts.c b/libraries/ecore/src/lib/ecore_fb/ecore_fb_ts.c
new file mode 100644
index 0000000..395e768
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/ecore_fb_ts.c
@@ -0,0 +1,355 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#ifdef HAVE_TSLIB
6# include <tslib.h>
7# include <errno.h>
8#endif
9
10#include "Ecore_Fb.h"
11#include "ecore_fb_private.h"
12
13typedef struct _Ecore_Fb_Ts_Event Ecore_Fb_Ts_Event;
14typedef struct _Ecore_Fb_Ts_Calibrate Ecore_Fb_Ts_Calibrate;
15typedef struct _Ecore_Fb_Ts_Backlight Ecore_Fb_Ts_Backlight;
16typedef struct _Ecore_Fb_Ts_Contrast Ecore_Fb_Ts_Contrast;
17typedef struct _Ecore_Fb_Ts_Led Ecore_Fb_Ts_Led;
18typedef struct _Ecore_Fb_Ts_Flite Ecore_Fb_Ts_Flite;
19
20struct _Ecore_Fb_Ts_Event
21{
22 unsigned short pressure;
23 unsigned short x;
24 unsigned short y;
25 unsigned short _unused;
26};
27
28struct _Ecore_Fb_Ts_Calibrate
29{
30 int xscale;
31 int xtrans;
32 int yscale;
33 int ytrans;
34 int xyswap;
35};
36
37struct _Ecore_Fb_Ts_Backlight
38{
39 int on;
40 unsigned char brightness;
41};
42
43struct _Ecore_Fb_Ts_Contrast
44{
45 unsigned char contrast;
46};
47
48struct _Ecore_Fb_Ts_Led
49{
50 unsigned char on;
51 unsigned char blink_time;
52 unsigned char on_time;
53 unsigned char off_time;
54};
55
56struct _Ecore_Fb_Ts_Flite
57{
58 unsigned char mode;
59 unsigned char pwr;
60 unsigned char brightness;
61};
62
63static Eina_Bool _ecore_fb_ts_fd_handler(void *data, Ecore_Fd_Handler *fd_handler);
64static int _ecore_fb_ts_fd = -1;
65static int _ecore_fb_ts_event_byte_count = 0;
66static int _ecore_fb_ts_apply_cal = 0;
67static Ecore_Fb_Ts_Event _ecore_fb_ts_event;
68static Ecore_Fb_Ts_Calibrate _ecore_fb_ts_cal = {1,1,0,0,0};
69static Ecore_Fd_Handler *_ecore_fb_ts_fd_handler_handle = NULL;
70
71#ifdef HAVE_TSLIB
72struct tsdev *_ecore_fb_tslib_tsdev = NULL;
73struct ts_sample _ecore_fb_tslib_event;
74#endif
75
76static double _ecore_fb_double_click_time = 0.25;
77static void *_ecore_fb_ts_event_window = NULL;
78
79EAPI int
80ecore_fb_ts_init(void)
81{
82#ifdef HAVE_TSLIB
83 char *tslib_tsdevice = NULL;
84 if ( (tslib_tsdevice = getenv("TSLIB_TSDEVICE")) )
85 {
86 printf( "ECORE_FB: TSLIB_TSDEVICE = '%s'\n", tslib_tsdevice );
87 _ecore_fb_tslib_tsdev = ts_open( tslib_tsdevice, 1 ); /* 1 = nonblocking, 0 = blocking */
88
89 if ( !_ecore_fb_tslib_tsdev )
90 {
91 printf( "ECORE_FB: Can't ts_open (%s)\n", strerror( errno ) );
92 return 0;
93 }
94
95 if ( ts_config( _ecore_fb_tslib_tsdev ) )
96 {
97 printf( "ECORE_FB: Can't ts_config (%s)\n", strerror( errno ) );
98 return 0;
99 }
100 _ecore_fb_ts_fd = ts_fd( _ecore_fb_tslib_tsdev );
101 if ( _ecore_fb_ts_fd < 0 )
102 {
103 printf( "ECORE_FB: Can't open touchscreen (%s)\n", strerror( errno ) );
104 return 0;
105 }
106 }
107#else
108 _ecore_fb_ts_fd = open("/dev/touchscreen/0", O_RDONLY);
109#endif
110 if (_ecore_fb_ts_fd >= 0)
111 {
112 _ecore_fb_ts_fd_handler_handle = ecore_main_fd_handler_add(_ecore_fb_ts_fd,
113 ECORE_FD_READ,
114 _ecore_fb_ts_fd_handler, NULL,
115 NULL, NULL);
116 if (!_ecore_fb_ts_fd_handler_handle)
117 {
118 close(_ecore_fb_ts_fd);
119 return 0;
120 }
121 // FIXME _ecore_fb_kbd_fd = open("/dev/touchscreen/key", O_RDONLY);
122 return 1;
123 }
124 return 0;
125}
126
127EAPI void
128ecore_fb_ts_shutdown(void)
129{
130 if (_ecore_fb_ts_fd_handler_handle)
131 ecore_main_fd_handler_del(_ecore_fb_ts_fd_handler_handle);
132 if (_ecore_fb_ts_fd >= 0) close(_ecore_fb_ts_fd);
133 _ecore_fb_ts_fd = -1;
134 _ecore_fb_ts_fd_handler_handle = NULL;
135 _ecore_fb_ts_event_window = NULL;
136}
137
138EAPI void
139ecore_fb_ts_event_window_set(void *window)
140{
141 _ecore_fb_ts_event_window = window;
142}
143
144EAPI void *
145ecore_fb_ts_event_window_get(void)
146{
147 return _ecore_fb_ts_event_window;
148}
149
150/**
151 * @defgroup Ecore_FB_Calibrate_Group Framebuffer Calibration Functions
152 *
153 * Functions that calibrate the screen.
154 */
155
156
157/**
158 * Calibrates the touschreen using the given parameters.
159 * @param xscale X scaling, where 256 = 1.0
160 * @param xtrans X translation.
161 * @param yscale Y scaling.
162 * @param ytrans Y translation.
163 * @param xyswap Swap X & Y flag.
164 * @ingroup Ecore_FB_Calibrate_Group
165 */
166EAPI void
167ecore_fb_touch_screen_calibrate_set(int xscale, int xtrans, int yscale, int ytrans, int xyswap)
168{
169 Ecore_Fb_Ts_Calibrate cal;
170
171 if (_ecore_fb_ts_fd < 0) return;
172 cal.xscale = xscale;
173 cal.xtrans = xtrans;
174 cal.yscale = yscale;
175 cal.ytrans = ytrans;
176 cal.xyswap = xyswap;
177 if (ioctl(_ecore_fb_ts_fd, TS_SET_CAL, (void *)&cal))
178 {
179 _ecore_fb_ts_cal = cal;
180 _ecore_fb_ts_apply_cal = 1;
181 }
182}
183
184/**
185 * Retrieves the calibration parameters of the touchscreen.
186 * @param xscale Pointer to an integer in which to store the X scaling.
187 * Note that 256 = 1.0.
188 * @param xtrans Pointer to an integer in which to store the X translation.
189 * @param yscale Pointer to an integer in which to store the Y scaling.
190 * @param ytrans Pointer to an integer in which to store the Y translation.
191 * @param xyswap Pointer to an integer in which to store the Swap X & Y flag.
192 * @ingroup Ecore_FB_Calibrate_Group
193 */
194EAPI void
195ecore_fb_touch_screen_calibrate_get(int *xscale, int *xtrans, int *yscale, int *ytrans, int *xyswap)
196{
197 Ecore_Fb_Ts_Calibrate cal;
198
199 if (_ecore_fb_ts_fd < 0) return;
200 if (!_ecore_fb_ts_apply_cal)
201 {
202 if (ioctl(_ecore_fb_ts_fd, TS_GET_CAL, (void *)&cal))
203 _ecore_fb_ts_cal = cal;
204 }
205 else
206 cal = _ecore_fb_ts_cal;
207 if (xscale) *xscale = cal.xscale;
208 if (xtrans) *xtrans = cal.xtrans;
209 if (yscale) *yscale = cal.yscale;
210 if (ytrans) *ytrans = cal.ytrans;
211 if (xyswap) *xyswap = cal.xyswap;
212}
213
214static Eina_Bool
215_ecore_fb_ts_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__)
216{
217 static int prev_x = 0, prev_y = 0, prev_pressure = 0;
218 static double last_time = 0;
219 static double last_last_time = 0;
220 int v = 0;
221
222 do
223 {
224 int x, y, pressure;
225 int num;
226 char *ptr;
227 double t = 0.0;
228 static int did_double = 0;
229 static int did_triple = 0;
230
231#ifdef HAVE_TSLIB
232 if (_ecore_fb_ts_apply_cal)
233 num = ts_read_raw(_ecore_fb_tslib_tsdev, &_ecore_fb_tslib_event, 1);
234 else
235 num = ts_read(_ecore_fb_tslib_tsdev, &_ecore_fb_tslib_event, 1);
236 if (num != 1) return 1; /* no more samples at this time */
237 x = _ecore_fb_tslib_event.x;
238 y = _ecore_fb_tslib_event.y;
239 pressure = _ecore_fb_tslib_event.pressure;
240 v = 1; /* loop, there might be more samples */
241 t = ecore_time_get();
242#else
243 ptr = (char *)&(_ecore_fb_ts_event);
244 ptr += _ecore_fb_ts_event_byte_count;
245 num = sizeof(Ecore_Fb_Ts_Event) - _ecore_fb_ts_event_byte_count;
246 v = read(_ecore_fb_ts_fd, ptr, num);
247 if (v < 0) return 1;
248 _ecore_fb_ts_event_byte_count += v;
249 if (v < num) return 1;
250 _ecore_fb_ts_event_byte_count = 0;
251 if (_ecore_fb_ts_apply_cal)
252 {
253 x = ((_ecore_fb_ts_cal.xscale * _ecore_fb_ts_event.x) >> 8) + _ecore_fb_ts_cal.xtrans;
254 y = ((_ecore_fb_ts_cal.yscale * _ecore_fb_ts_event.y) >> 8) + _ecore_fb_ts_cal.ytrans;
255 }
256 else
257 {
258 x = _ecore_fb_ts_event.x;
259 y = _ecore_fb_ts_event.y;
260 }
261 pressure = _ecore_fb_ts_event.pressure;
262#endif
263 /* add event to queue */
264 /* always add a move event */
265 if ((pressure) || (prev_pressure))
266 {
267 /* MOVE: mouse is down and was */
268 Ecore_Event_Mouse_Move *e;
269
270 e = calloc(1, sizeof(Ecore_Event_Mouse_Move));
271 if (!e) goto retry;
272 e->x = x;
273 e->y = y;
274 e->root.x = x;
275 e->root.y = y;
276 e->window = (Ecore_Window)_ecore_fb_ts_event_window;
277 e->event_window = e->window;
278 e->root_window = e->window;
279 e->same_screen = 1;
280 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
281 }
282 if ((pressure) && (!prev_pressure))
283 {
284 /* DOWN: mouse is down, but was not now */
285 Ecore_Event_Mouse_Button *e;
286
287 e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
288 if (!e) goto retry;
289 e->x = x;
290 e->y = y;
291 e->buttons = 1;
292 if ((t - last_time) <= _ecore_fb_double_click_time)
293 {
294 e->double_click = 1;
295 did_double = 1;
296 }
297 else
298 {
299 did_double = 0;
300 did_triple = 0;
301 }
302 if ((t - last_last_time) <= (2 * _ecore_fb_double_click_time))
303 {
304 did_triple = 1;
305 e->triple_click = 1;
306 }
307 else
308 {
309 did_triple = 0;
310 }
311 e->window = (Ecore_Window)_ecore_fb_ts_event_window;
312 e->event_window = e->window;
313 e->root_window = e->window;
314 e->same_screen = 1;
315 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
316 }
317 else if ((!pressure) && (prev_pressure))
318 {
319 /* UP: mouse was down, but is not now */
320 Ecore_Event_Mouse_Button *e;
321
322 e = calloc(1, sizeof(Ecore_Event_Mouse_Button));
323 if (!e) goto retry;
324 e->x = prev_x;
325 e->y = prev_y;
326 e->buttons = 1;
327 if (did_double)
328 e->double_click = 1;
329 if (did_triple)
330 e->triple_click = 1;
331 e->window = (Ecore_Window)_ecore_fb_ts_event_window;
332 e->event_window = e->window;
333 e->root_window = e->window;
334 e->same_screen = 1;
335 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
336 }
337 if (did_triple)
338 {
339 last_time = 0;
340 last_last_time = 0;
341 }
342 else
343 {
344 last_last_time = last_time;
345 last_time = t;
346 }
347retry:
348 prev_x = x;
349 prev_y = y;
350 prev_pressure = pressure;
351 }
352 while (v > 0);
353 return 1;
354}
355
diff --git a/libraries/ecore/src/lib/ecore_fb/ecore_fb_vt.c b/libraries/ecore/src/lib/ecore_fb/ecore_fb_vt.c
new file mode 100644
index 0000000..09e3f37
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_fb/ecore_fb_vt.c
@@ -0,0 +1,322 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "Ecore_Fb.h"
6#include "ecore_fb_private.h"
7
8static int _ecore_fb_vt_do_switch = 0;
9
10static int _ecore_fb_vt_tty0_fd = -1;
11static int _ecore_fb_vt_tty_fd = -1;
12static int _ecore_fb_vt_current_vt = 0;
13static int _ecore_fb_vt_prev_vt = 0;
14
15static struct termios _ecore_fb_tty_prev_tio_mode;
16static struct vt_mode _ecore_fb_vt_prev_mode;
17
18static Eina_Bool _ecore_fb_signal_usr_handler(void *data, int type, void *ev);
19static Ecore_Event_Handler *_ecore_fb_user_handler = NULL;
20static int _ecore_fb_tty_prev_mode = 0;
21static int _ecore_fb_tty_prev_kd_mode = 0;
22
23/* callbacks for an attach/release of a vt */
24static void (*_ecore_fb_func_fb_lost) (void *data) = NULL;
25static void *_ecore_fb_func_fb_lost_data = NULL;
26static void (*_ecore_fb_func_fb_gain) (void *data) = NULL;
27static void *_ecore_fb_func_fb_gain_data = NULL;
28
29/* FIXME what is the filter for? */
30static Ecore_Event_Filter *_ecore_fb_filter_handler = NULL;
31
32/* prototypes */
33/* XXX: unused
34static void _ecore_fb_vt_switch(int vt);
35static void *_ecore_fb_event_filter_start(void *data);
36static Eina_Bool _ecore_fb_event_filter_filter(void *data, void *loop_data, int type, void *event);
37static void _ecore_fb_event_filter_end(void *data, void *loop_data);
38*/
39
40static Eina_Bool
41_ecore_fb_signal_usr_handler(void *data __UNUSED__, int type __UNUSED__, void *ev)
42{
43 Ecore_Event_Signal_User *e;
44
45 e = (Ecore_Event_Signal_User *)ev;
46 if (e->number == 1)
47 {
48 /* release vt */
49 if (_ecore_fb_func_fb_lost) _ecore_fb_func_fb_lost(_ecore_fb_func_fb_lost_data);
50 /* TODO stop listening from the devices? let the callback do it? */
51 ioctl(_ecore_fb_vt_tty_fd, VT_RELDISP, 1);
52 }
53 else if (e->number == 2)
54 {
55 /* attach vt */
56 if (_ecore_fb_func_fb_gain) _ecore_fb_func_fb_gain(_ecore_fb_func_fb_gain_data);
57 /* TODO reattach all devices */
58 }
59 return 1;
60}
61
62/* XXX: unused
63static void
64_ecore_fb_vt_switch(int vt)
65{
66 vt++;
67 if (_ecore_fb_vt_tty_fd != 0)
68 {
69 if (vt != _ecore_fb_vt_current_vt)
70 {
71 tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
72 ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
73 ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
74 }
75 }
76 ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, vt);
77}
78*/
79
80static int
81_ecore_fb_vt_setup(void)
82{
83 char buf[64];
84// XXX: unused
85// struct termios tio;
86 struct vt_mode new_vtmode;
87
88 if (_ecore_fb_vt_current_vt != _ecore_fb_vt_prev_vt)
89 {
90 snprintf(buf, sizeof(buf), "/dev/tty%i", _ecore_fb_vt_current_vt);
91 if ((_ecore_fb_vt_tty_fd = open(buf, O_RDWR)) < 0)
92 {
93 printf("[ecore_fb:vt_setup] can't open tty %d\n", _ecore_fb_vt_current_vt);
94 return 0;
95 }
96 close(_ecore_fb_vt_tty0_fd);
97 _ecore_fb_vt_tty0_fd = -1;
98 /* FIXME detach the process from current tty ? */
99 }
100 else
101 _ecore_fb_vt_tty_fd = _ecore_fb_vt_tty0_fd;
102 /* for backup */
103 tcgetattr(_ecore_fb_vt_tty_fd, &_ecore_fb_tty_prev_tio_mode);
104 ioctl(_ecore_fb_vt_tty_fd, KDGETMODE, &_ecore_fb_tty_prev_kd_mode);
105 ioctl(_ecore_fb_vt_tty_fd, VT_GETMODE, &_ecore_fb_vt_prev_mode);
106
107 if (ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, KD_GRAPHICS) < 0)
108 {
109 perror("[ecore_fb:vt_setup] can't set the mode to KD_GRAPHICS");
110 close(_ecore_fb_vt_tty_fd);
111 _ecore_fb_vt_tty_fd = -1;
112 return 0;
113 }
114 ioctl(_ecore_fb_vt_tty_fd, KDGKBMODE, &_ecore_fb_tty_prev_mode);
115
116 /* support of switching */
117 new_vtmode.mode = VT_PROCESS;
118 new_vtmode.waitv = 0;
119 new_vtmode.relsig = SIGUSR1;
120 new_vtmode.acqsig = SIGUSR2;
121 if (ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &new_vtmode) < 0)
122 {
123 perror("[ecore_fb:vt_setup] can't set the tty mode");
124 close(_ecore_fb_vt_tty_fd);
125 _ecore_fb_vt_tty_fd = -1;
126 return 0;
127 }
128 /* register signal handlers when alloc/detach of vt */
129 _ecore_fb_user_handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
130 _ecore_fb_signal_usr_handler,
131 NULL);
132 /* What does this do? */
133 /*
134 _ecore_fb_filter_handler = ecore_event_filter_add(_ecore_fb_event_filter_start, _ecore_fb_event_filter_filter, _ecore_fb_event_filter_end, NULL);
135 */
136
137 usleep(40000);
138 if (ioctl(_ecore_fb_vt_tty_fd, VT_ACTIVATE, _ecore_fb_vt_current_vt) < 0)
139 {
140 perror("[ecore_fb:vt_setup] error on VT_ACTIVATE");
141 close(_ecore_fb_vt_tty_fd);
142 _ecore_fb_vt_tty_fd = -1;
143 return 0;
144 }
145 if(ioctl(_ecore_fb_vt_tty_fd, VT_WAITACTIVE, _ecore_fb_vt_current_vt) < 0)
146 {
147 perror("[ecore_fb:vt_setup] error on VT_WAITACTIVE");
148 close(_ecore_fb_vt_tty_fd);
149 _ecore_fb_vt_tty_fd = -1;
150 return 0;
151 }
152 /* FIXME assign the fb to the tty in case isn't setup */
153 return 1;
154}
155
156int
157ecore_fb_vt_init(void)
158{
159 struct vt_stat vtstat;
160
161 /* as root you can allocate another tty */
162 if (!geteuid())
163 _ecore_fb_vt_do_switch = 1;
164 if ((_ecore_fb_vt_tty0_fd = open("/dev/tty0", O_RDONLY)) < 0)
165 {
166 printf("[ecore_fb:init] can't open /dev/tty0\n");
167 return 0;
168 }
169 /* query current vt state */
170 if ((ioctl(_ecore_fb_vt_tty0_fd, VT_GETSTATE, &vtstat)) < 0)
171 {
172 printf("[ecore_fb:init] can't get current tty state\n");
173 return 0;
174 }
175 _ecore_fb_vt_prev_vt = vtstat.v_active;
176 /* switch to another tty */
177 if (_ecore_fb_vt_do_switch)
178 {
179 int vtno;
180
181 if ((ioctl(_ecore_fb_vt_tty0_fd, VT_OPENQRY, &vtno) < 0))
182 {
183 printf("[ecore_fb:init] can't query for a vt\n");
184 return 0;
185 }
186 _ecore_fb_vt_current_vt = vtno;
187 }
188 /* use current tty */
189 else
190 _ecore_fb_vt_current_vt = _ecore_fb_vt_prev_vt;
191 if (!_ecore_fb_vt_setup())
192 {
193 printf("[ecore_fb:init] can't setup the vt, restoring previous mode...\n");
194 /* TODO finish this */
195 if (_ecore_fb_vt_do_switch)
196 {
197 printf("[ecore_fb:init] switching back to vt %d\n", _ecore_fb_vt_prev_vt);
198 }
199 return 0;
200 }
201 return 1;
202}
203
204void
205ecore_fb_vt_shutdown(void)
206{
207 /* restore the previous mode */
208 if (_ecore_fb_vt_tty_fd != -1)
209 {
210 tcsetattr(_ecore_fb_vt_tty_fd, TCSAFLUSH, &_ecore_fb_tty_prev_tio_mode);
211 ioctl(_ecore_fb_vt_tty_fd, KDSETMODE, _ecore_fb_tty_prev_kd_mode);
212 ioctl(_ecore_fb_vt_tty_fd, KDSKBMODE, _ecore_fb_tty_prev_mode);
213 ioctl(_ecore_fb_vt_tty_fd, VT_SETMODE, &_ecore_fb_vt_prev_mode);
214 /* go back to previous vt */
215 close(_ecore_fb_vt_tty_fd);
216 _ecore_fb_vt_tty_fd = -1;
217 }
218
219 if (_ecore_fb_user_handler) ecore_event_handler_del(_ecore_fb_user_handler);
220 _ecore_fb_user_handler = NULL;
221
222 if (_ecore_fb_filter_handler) ecore_event_filter_del(_ecore_fb_filter_handler);
223 _ecore_fb_filter_handler = NULL;
224}
225
226/**
227 * @addtogroup Ecore_FB_Group Ecore_FB - Frame buffer convenience functions.
228 *
229 * @{
230 */
231
232/**
233 * @brief Set a callback called when a virtual terminal is gained.
234 *
235 * @param func The callback called when vt is gained.
236 * @param data The data to pass to the callback.
237 *
238 * This function sets the callback @p func which will be called when a
239 * virtual terminal is gained (for example you press Ctrl-Alt-F1 to go
240 * to vt1 and your app was using vt1). @p data will be pass to @p func if
241 * the callback is called.
242 */
243EAPI void
244ecore_fb_callback_gain_set(void (*func) (void *data), void *data)
245{
246 _ecore_fb_func_fb_gain = func;
247 _ecore_fb_func_fb_gain_data = data;
248}
249
250/**
251 * @brief Set a callback called when a virtual terminal is lost.
252 *
253 * @param func The callback called when vt is lost.
254 * @param data The data to pass to the callback.
255 *
256 * This function sets the callback @p func which will be called when a
257 * virtual terminal is lost (someone wants the tv from you and you
258 * want to give up that vt). @p data will be pass to @p func if the
259 * callback is called.
260 */
261EAPI void
262ecore_fb_callback_lose_set(void (*func) (void *data), void *data)
263{
264 _ecore_fb_func_fb_lost = func;
265 _ecore_fb_func_fb_lost_data = data;
266
267}
268
269/**
270 * @}
271 */
272
273/*
274 * This filter should take into account that the MOUSE_MOVE event can be
275 * triggered by a mouse, not just a touchscreen device, so you can't discard
276 * them (only those generated by a device that sends events with absolute
277 * coordinates).
278
279typedef struct _Ecore_Fb_Filter_Data Ecore_Fb_Filter_Data;
280
281struct _Ecore_Fb_Filter_Data
282{
283 int last_event_type;
284};
285
286static void *
287_ecore_fb_event_filter_start(void *data __UNUSED__)
288{
289 Ecore_Fb_Filter_Data *filter_data;
290
291 filter_data = calloc(1, sizeof(Ecore_Fb_Filter_Data));
292 return filter_data;
293}
294
295static Eina_Bool
296_ecore_fb_event_filter_filter(void *data __UNUSED__, void *loop_data,int type, void *event __UNUSED__)
297{
298 Ecore_Fb_Filter_Data *filter_data;
299
300 filter_data = loop_data;
301 if (!filter_data) return EINA_TRUE;
302 if (type == ECORE_EVENT_MOUSE_MOVE)
303 {
304 if ((filter_data->last_event_type) == ECORE_EVENT_MOUSE_MOVE)
305 {
306 filter_data->last_event_type = type;
307 return EINA_FALSE;
308 }
309 }
310 filter_data->last_event_type = type;
311 return EINA_TRUE;
312}
313
314static void
315_ecore_fb_event_filter_end(void *data __UNUSED__, void *loop_data)
316{
317 Ecore_Fb_Filter_Data *filter_data;
318
319 filter_data = loop_data;
320 if (filter_data) free(filter_data);
321}
322*/
diff --git a/libraries/ecore/src/lib/ecore_file/Ecore_File.h b/libraries/ecore/src/lib/ecore_file/Ecore_File.h
new file mode 100644
index 0000000..e4b8851
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/Ecore_File.h
@@ -0,0 +1,190 @@
1#ifndef ECORE_FILE_H
2#define ECORE_FILE_H
3
4/*
5 * TODO:
6 * - More events, move/rename of directory file
7 */
8
9#include <Eina.h>
10
11#ifdef EAPI
12# undef EAPI
13#endif
14
15#ifdef _WIN32
16# ifdef EFL_ECORE_FILE_BUILD
17# ifdef DLL_EXPORT
18# define EAPI __declspec(dllexport)
19# else
20# define EAPI
21# endif /* ! DLL_EXPORT */
22# else
23# define EAPI __declspec(dllimport)
24# endif /* ! EFL_ECORE_FILE_BUILD */
25#else
26# ifdef __GNUC__
27# if __GNUC__ >= 4
28# define EAPI __attribute__ ((visibility("default")))
29# else
30# define EAPI
31# endif
32# else
33# define EAPI
34# endif
35#endif /* ! _WIN32 */
36
37/**
38 * @file Ecore_File.h
39 * @brief Files utility functions
40 */
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46/**
47 * @defgroup Ecore_File_Group Ecore_File - Files and directories convenience functions
48 *
49 * @{
50 */
51
52/**
53 * @typedef Ecore_File_Monitor
54 * Abstract type used when monitoring a directory.
55 */
56typedef struct _Ecore_File_Monitor Ecore_File_Monitor;
57
58/**
59 * @typedef Ecore_File_Download_Job
60 * Abstract type used when aborting a download.
61 */
62typedef struct _Ecore_File_Download_Job Ecore_File_Download_Job;
63
64/**
65 * @typedef Ecore_File_Event
66 * The event type returned when a file or directory is monitored.
67 */
68typedef enum _Ecore_File_Event
69{
70 ECORE_FILE_EVENT_NONE, /**< No event. */
71 ECORE_FILE_EVENT_CREATED_FILE, /**< Created file event. */
72 ECORE_FILE_EVENT_CREATED_DIRECTORY, /**< Created directory event. */
73 ECORE_FILE_EVENT_DELETED_FILE, /**< Deleted file event. */
74 ECORE_FILE_EVENT_DELETED_DIRECTORY, /**< Deleted directory event. */
75 ECORE_FILE_EVENT_DELETED_SELF, /**< Deleted monitored directory event. */
76 ECORE_FILE_EVENT_MODIFIED, /**< Modified file or directory event. */
77 ECORE_FILE_EVENT_CLOSED /**< Closed file event */
78} Ecore_File_Event;
79
80/**
81 * @typedef Ecore_File_Monitor_Cb
82 * Callback type used when a monitored directory has changes.
83 */
84typedef void (*Ecore_File_Monitor_Cb)(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path);
85
86/**
87 * @typedef Ecore_File_Download_Completion_Cb
88 * Callback type used when a download is finished.
89 */
90typedef void (*Ecore_File_Download_Completion_Cb)(void *data, const char *file, int status);
91
92/**
93 * @typedef Ecore_File_Progress_Return
94 * What to do with the download as a return from the
95 * Ecore_File_Download_Progress_Cb function, if provided.
96 */
97typedef enum _Ecore_File_Progress_Return
98{
99 ECORE_FILE_PROGRESS_CONTINUE = 0, /**< Continue the download. */
100 ECORE_FILE_PROGRESS_ABORT = 1 /**< Abort the download. */
101} Ecore_File_Progress_Return;
102
103/**
104 * @typedef Ecore_File_Download_Progress_Cb
105 * Callback type used while a download is in progress.
106 */
107typedef int (*Ecore_File_Download_Progress_Cb)(void *data,
108 const char *file,
109 long int dltotal,
110 long int dlnow,
111 long int ultotal,
112 long int ulnow);
113
114/* File operations */
115
116EAPI int ecore_file_init (void);
117EAPI int ecore_file_shutdown (void);
118EAPI long long ecore_file_mod_time (const char *file);
119EAPI long long ecore_file_size (const char *file);
120EAPI Eina_Bool ecore_file_exists (const char *file);
121EAPI Eina_Bool ecore_file_is_dir (const char *file);
122EAPI Eina_Bool ecore_file_mkdir (const char *dir);
123EAPI int ecore_file_mkdirs (const char **dirs);
124EAPI int ecore_file_mksubdirs (const char *base, const char **subdirs);
125EAPI Eina_Bool ecore_file_rmdir (const char *dir);
126EAPI Eina_Bool ecore_file_recursive_rm (const char *dir);
127EAPI Eina_Bool ecore_file_mkpath (const char *path);
128EAPI int ecore_file_mkpaths (const char **paths);
129EAPI Eina_Bool ecore_file_cp (const char *src, const char *dst);
130EAPI Eina_Bool ecore_file_mv (const char *src, const char *dst);
131EAPI Eina_Bool ecore_file_symlink (const char *src, const char *dest);
132EAPI char *ecore_file_realpath (const char *file);
133EAPI Eina_Bool ecore_file_unlink (const char *file);
134EAPI Eina_Bool ecore_file_remove (const char *file);
135EAPI const char *ecore_file_file_get (const char *path);
136EAPI char *ecore_file_dir_get (const char *path);
137EAPI Eina_Bool ecore_file_can_read (const char *file);
138EAPI Eina_Bool ecore_file_can_write (const char *file);
139EAPI Eina_Bool ecore_file_can_exec (const char *file);
140EAPI char *ecore_file_readlink (const char *link);
141EAPI Eina_List *ecore_file_ls (const char *dir);
142EAPI Eina_Iterator *ecore_file_ls_iterator (const char *dir);
143EAPI char *ecore_file_app_exe_get (const char *app);
144EAPI char *ecore_file_escape_name (const char *filename);
145EAPI char *ecore_file_strip_ext (const char *file);
146EAPI int ecore_file_dir_is_empty (const char *dir);
147
148/* Monitoring */
149
150EAPI Ecore_File_Monitor *ecore_file_monitor_add(const char *path,
151 Ecore_File_Monitor_Cb func,
152 void *data);
153EAPI void ecore_file_monitor_del(Ecore_File_Monitor *ecore_file_monitor);
154EAPI const char *ecore_file_monitor_path_get(Ecore_File_Monitor *ecore_file_monitor);
155
156/* Path */
157
158EAPI Eina_Bool ecore_file_path_dir_exists(const char *in_dir);
159EAPI Eina_Bool ecore_file_app_installed(const char *exe);
160EAPI Eina_List *ecore_file_app_list(void);
161
162/* Download */
163
164EAPI Eina_Bool ecore_file_download(const char *url,
165 const char *dst,
166 Ecore_File_Download_Completion_Cb completion_cb,
167 Ecore_File_Download_Progress_Cb progress_cb,
168 void *data,
169 Ecore_File_Download_Job **job_ret);
170EAPI Eina_Bool ecore_file_download_full(const char *url,
171 const char *dst,
172 Ecore_File_Download_Completion_Cb completion_cb,
173 Ecore_File_Download_Progress_Cb progress_cb,
174 void *data,
175 Ecore_File_Download_Job **job_ret,
176 Eina_Hash *headers);
177
178EAPI void ecore_file_download_abort_all(void);
179EAPI void ecore_file_download_abort(Ecore_File_Download_Job *job);
180EAPI Eina_Bool ecore_file_download_protocol_available(const char *protocol);
181
182/**
183 * @}
184 */
185
186#ifdef __cplusplus
187}
188#endif
189
190#endif
diff --git a/libraries/ecore/src/lib/ecore_file/Makefile.am b/libraries/ecore/src/lib/ecore_file/Makefile.am
new file mode 100644
index 0000000..ab23ace
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/Makefile.am
@@ -0,0 +1,41 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_con \
6-I$(top_builddir)/src/lib/ecore \
7@EFL_ECORE_FILE_BUILD@ \
8@CURL_CFLAGS@ \
9@EVIL_CFLAGS@ \
10@EINA_CFLAGS@ \
11@WIN32_CPPFLAGS@
12
13AM_CFLAGS = @WIN32_CFLAGS@
14
15if BUILD_ECORE_CON
16lib_ecore_con_la = $(top_builddir)/src/lib/ecore_con/libecore_con.la
17endif
18
19lib_LTLIBRARIES = libecore_file.la
20includes_HEADERS = Ecore_File.h
21includesdir = $(includedir)/ecore-@VMAJ@
22
23libecore_file_la_SOURCES = \
24ecore_file.c \
25ecore_file_monitor.c \
26ecore_file_monitor_inotify.c \
27ecore_file_monitor_win32.c \
28ecore_file_monitor_poll.c \
29ecore_file_path.c \
30ecore_file_download.c
31
32libecore_file_la_LIBADD = \
33$(top_builddir)/src/lib/ecore/libecore.la \
34$(lib_ecore_con_la) \
35@EVIL_LIBS@ \
36@EINA_LIBS@
37
38libecore_file_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
39
40EXTRA_DIST = ecore_file_private.h
41
diff --git a/libraries/ecore/src/lib/ecore_file/Makefile.in b/libraries/ecore/src/lib/ecore_file/Makefile.in
new file mode 100644
index 0000000..34945b3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/Makefile.in
@@ -0,0 +1,837 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_file
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_file_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la $(lib_ecore_con_la)
91am_libecore_file_la_OBJECTS = ecore_file.lo ecore_file_monitor.lo \
92 ecore_file_monitor_inotify.lo ecore_file_monitor_win32.lo \
93 ecore_file_monitor_poll.lo ecore_file_path.lo \
94 ecore_file_download.lo
95libecore_file_la_OBJECTS = $(am_libecore_file_la_OBJECTS)
96AM_V_lt = $(am__v_lt_$(V))
97am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
98am__v_lt_0 = --silent
99libecore_file_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
100 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
101 $(AM_CFLAGS) $(CFLAGS) $(libecore_file_la_LDFLAGS) $(LDFLAGS) \
102 -o $@
103DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
104depcomp = $(SHELL) $(top_srcdir)/depcomp
105am__depfiles_maybe = depfiles
106am__mv = mv -f
107COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
108 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
109LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
110 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
111 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
112 $(AM_CFLAGS) $(CFLAGS)
113AM_V_CC = $(am__v_CC_$(V))
114am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
115am__v_CC_0 = @echo " CC " $@;
116AM_V_at = $(am__v_at_$(V))
117am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
118am__v_at_0 = @
119CCLD = $(CC)
120LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
121 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
122 $(AM_LDFLAGS) $(LDFLAGS) -o $@
123AM_V_CCLD = $(am__v_CCLD_$(V))
124am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
125am__v_CCLD_0 = @echo " CCLD " $@;
126AM_V_GEN = $(am__v_GEN_$(V))
127am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
128am__v_GEN_0 = @echo " GEN " $@;
129SOURCES = $(libecore_file_la_SOURCES)
130DIST_SOURCES = $(libecore_file_la_SOURCES)
131HEADERS = $(includes_HEADERS)
132ETAGS = etags
133CTAGS = ctags
134DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
135ACLOCAL = @ACLOCAL@
136ALLOCA = @ALLOCA@
137AMTAR = @AMTAR@
138AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
139AR = @AR@
140AS = @AS@
141AUTOCONF = @AUTOCONF@
142AUTOHEADER = @AUTOHEADER@
143AUTOMAKE = @AUTOMAKE@
144AWK = @AWK@
145CARES_CFLAGS = @CARES_CFLAGS@
146CARES_LIBS = @CARES_LIBS@
147CC = @CC@
148CCDEPMODE = @CCDEPMODE@
149CFLAGS = @CFLAGS@
150CHECK_CFLAGS = @CHECK_CFLAGS@
151CHECK_LIBS = @CHECK_LIBS@
152CPP = @CPP@
153CPPFLAGS = @CPPFLAGS@
154CURL_CFLAGS = @CURL_CFLAGS@
155CURL_LIBS = @CURL_LIBS@
156CXX = @CXX@
157CXXCPP = @CXXCPP@
158CXXDEPMODE = @CXXDEPMODE@
159CXXFLAGS = @CXXFLAGS@
160CYGPATH_W = @CYGPATH_W@
161DEFS = @DEFS@
162DEPDIR = @DEPDIR@
163DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
164DIRECTFB_LIBS = @DIRECTFB_LIBS@
165DLLTOOL = @DLLTOOL@
166DSYMUTIL = @DSYMUTIL@
167DUMPBIN = @DUMPBIN@
168ECHO_C = @ECHO_C@
169ECHO_N = @ECHO_N@
170ECHO_T = @ECHO_T@
171ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
172ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
173EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
174EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
175EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
176EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
177EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
178EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
179EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
180EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
181EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
182EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
183EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
184EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
185EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
186EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
187EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
188EGREP = @EGREP@
189EINA_CFLAGS = @EINA_CFLAGS@
190EINA_LIBS = @EINA_LIBS@
191ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
192ESCAPE_LIBS = @ESCAPE_LIBS@
193EVAS_CFLAGS = @EVAS_CFLAGS@
194EVAS_LIBS = @EVAS_LIBS@
195EVIL_CFLAGS = @EVIL_CFLAGS@
196EVIL_LIBS = @EVIL_LIBS@
197EXEEXT = @EXEEXT@
198FGREP = @FGREP@
199GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
200GLIB_CFLAGS = @GLIB_CFLAGS@
201GLIB_LIBS = @GLIB_LIBS@
202GMSGFMT = @GMSGFMT@
203GMSGFMT_015 = @GMSGFMT_015@
204GREP = @GREP@
205INSTALL = @INSTALL@
206INSTALL_DATA = @INSTALL_DATA@
207INSTALL_PROGRAM = @INSTALL_PROGRAM@
208INSTALL_SCRIPT = @INSTALL_SCRIPT@
209INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
210INTLLIBS = @INTLLIBS@
211INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
212KEYSYMDEFS = @KEYSYMDEFS@
213LD = @LD@
214LDFLAGS = @LDFLAGS@
215LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
216LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
217LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
218LIBICONV = @LIBICONV@
219LIBINTL = @LIBINTL@
220LIBOBJS = @LIBOBJS@
221LIBS = @LIBS@
222LIBTOOL = @LIBTOOL@
223LIPO = @LIPO@
224LN_S = @LN_S@
225LTLIBICONV = @LTLIBICONV@
226LTLIBINTL = @LTLIBINTL@
227LTLIBOBJS = @LTLIBOBJS@
228MAKEINFO = @MAKEINFO@
229MKDIR_P = @MKDIR_P@
230MSGFMT = @MSGFMT@
231MSGFMT_015 = @MSGFMT_015@
232MSGMERGE = @MSGMERGE@
233NM = @NM@
234NMEDIT = @NMEDIT@
235OBJC = @OBJC@
236OBJCDEPMODE = @OBJCDEPMODE@
237OBJCFLAGS = @OBJCFLAGS@
238OBJDUMP = @OBJDUMP@
239OBJEXT = @OBJEXT@
240OTOOL = @OTOOL@
241OTOOL64 = @OTOOL64@
242PACKAGE = @PACKAGE@
243PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
244PACKAGE_NAME = @PACKAGE_NAME@
245PACKAGE_STRING = @PACKAGE_STRING@
246PACKAGE_TARNAME = @PACKAGE_TARNAME@
247PACKAGE_URL = @PACKAGE_URL@
248PACKAGE_VERSION = @PACKAGE_VERSION@
249PATH_SEPARATOR = @PATH_SEPARATOR@
250PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
251PIXMAN_LIBS = @PIXMAN_LIBS@
252PKG_CONFIG = @PKG_CONFIG@
253PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
254PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
255POSUB = @POSUB@
256RANLIB = @RANLIB@
257SDL_CFLAGS = @SDL_CFLAGS@
258SDL_CONFIG = @SDL_CONFIG@
259SDL_LIBS = @SDL_LIBS@
260SED = @SED@
261SET_MAKE = @SET_MAKE@
262SHELL = @SHELL@
263SSL_CFLAGS = @SSL_CFLAGS@
264SSL_LIBS = @SSL_LIBS@
265STRIP = @STRIP@
266TLS2_CFLAGS = @TLS2_CFLAGS@
267TLS2_LIBS = @TLS2_LIBS@
268TLS_CFLAGS = @TLS_CFLAGS@
269TLS_LIBS = @TLS_LIBS@
270TSLIB_CFLAGS = @TSLIB_CFLAGS@
271TSLIB_LIBS = @TSLIB_LIBS@
272USE_NLS = @USE_NLS@
273VERSION = @VERSION@
274VMAJ = @VMAJ@
275WIN32_CFLAGS = @WIN32_CFLAGS@
276WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
277WIN32_LIBS = @WIN32_LIBS@
278XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
279XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
280XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
281XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
282XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
283XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
284XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
285XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
286XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
287XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
288XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
289XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
290XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
291XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
292XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
293XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
294XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
295XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
296XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
297XCB_X11_LIBS = @XCB_X11_LIBS@
298XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
299XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
300XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
301XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
302XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
303XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
304XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
305XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
306XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
307XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
308XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
309XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
310XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
311XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
312XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
313XDAMAGE_LIBS = @XDAMAGE_LIBS@
314XDPMS_CFLAGS = @XDPMS_CFLAGS@
315XDPMS_LIBS = @XDPMS_LIBS@
316XFIXES_CFLAGS = @XFIXES_CFLAGS@
317XFIXES_LIBS = @XFIXES_LIBS@
318XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
319XGESTURE_LIBS = @XGESTURE_LIBS@
320XGETTEXT = @XGETTEXT@
321XGETTEXT_015 = @XGETTEXT_015@
322XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
323XI2_CFLAGS = @XI2_CFLAGS@
324XI2_LIBS = @XI2_LIBS@
325XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
326XINERAMA_LIBS = @XINERAMA_LIBS@
327XKB_CFLAGS = @XKB_CFLAGS@
328XKB_LIBS = @XKB_LIBS@
329XMKMF = @XMKMF@
330XPRINT_CFLAGS = @XPRINT_CFLAGS@
331XPRINT_LIBS = @XPRINT_LIBS@
332XRANDR_CFLAGS = @XRANDR_CFLAGS@
333XRANDR_LIBS = @XRANDR_LIBS@
334XRENDER_CFLAGS = @XRENDER_CFLAGS@
335XRENDER_LIBS = @XRENDER_LIBS@
336XSS_CFLAGS = @XSS_CFLAGS@
337XSS_LIBS = @XSS_LIBS@
338XTEST_CFLAGS = @XTEST_CFLAGS@
339XTEST_LIBS = @XTEST_LIBS@
340X_CFLAGS = @X_CFLAGS@
341X_EXTRA_LIBS = @X_EXTRA_LIBS@
342X_LIBS = @X_LIBS@
343X_PRE_LIBS = @X_PRE_LIBS@
344Xcursor_cflags = @Xcursor_cflags@
345Xcursor_libs = @Xcursor_libs@
346abs_builddir = @abs_builddir@
347abs_srcdir = @abs_srcdir@
348abs_top_builddir = @abs_top_builddir@
349abs_top_srcdir = @abs_top_srcdir@
350ac_ct_CC = @ac_ct_CC@
351ac_ct_CXX = @ac_ct_CXX@
352ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
353ac_ct_OBJC = @ac_ct_OBJC@
354am__include = @am__include@
355am__leading_dot = @am__leading_dot@
356am__quote = @am__quote@
357am__tar = @am__tar@
358am__untar = @am__untar@
359bindir = @bindir@
360build = @build@
361build_alias = @build_alias@
362build_cpu = @build_cpu@
363build_os = @build_os@
364build_vendor = @build_vendor@
365builddir = @builddir@
366cocoa_ldflags = @cocoa_ldflags@
367datadir = @datadir@
368datarootdir = @datarootdir@
369dlopen_libs = @dlopen_libs@
370docdir = @docdir@
371dvidir = @dvidir@
372ecore_cocoa_cflags = @ecore_cocoa_cflags@
373ecore_cocoa_libs = @ecore_cocoa_libs@
374ecore_con_cflags = @ecore_con_cflags@
375ecore_con_libs = @ecore_con_libs@
376ecore_directfb_cflags = @ecore_directfb_cflags@
377ecore_directfb_libs = @ecore_directfb_libs@
378ecore_evas_cflags = @ecore_evas_cflags@
379ecore_evas_libs = @ecore_evas_libs@
380ecore_fb_cflags = @ecore_fb_cflags@
381ecore_fb_libs = @ecore_fb_libs@
382ecore_file_cflags = @ecore_file_cflags@
383ecore_file_libs = @ecore_file_libs@
384ecore_imf_cflags = @ecore_imf_cflags@
385ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
386ecore_imf_evas_libs = @ecore_imf_evas_libs@
387ecore_imf_libs = @ecore_imf_libs@
388ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
389ecore_imf_xim_libs = @ecore_imf_xim_libs@
390ecore_input_cflags = @ecore_input_cflags@
391ecore_input_evas_cflags = @ecore_input_evas_cflags@
392ecore_input_evas_libs = @ecore_input_evas_libs@
393ecore_input_libs = @ecore_input_libs@
394ecore_ipc_cflags = @ecore_ipc_cflags@
395ecore_ipc_libs = @ecore_ipc_libs@
396ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
397ecore_psl1ght_libs = @ecore_psl1ght_libs@
398ecore_sdl_cflags = @ecore_sdl_cflags@
399ecore_sdl_libs = @ecore_sdl_libs@
400ecore_win32_cflags = @ecore_win32_cflags@
401ecore_win32_libs = @ecore_win32_libs@
402ecore_wince_cflags = @ecore_wince_cflags@
403ecore_wince_libs = @ecore_wince_libs@
404ecore_x_cflags = @ecore_x_cflags@
405ecore_x_libs = @ecore_x_libs@
406ecore_x_libs_private = @ecore_x_libs_private@
407efl_doxygen = @efl_doxygen@
408efl_have_doxygen = @efl_have_doxygen@
409exec_prefix = @exec_prefix@
410have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
411host = @host@
412host_alias = @host_alias@
413host_cpu = @host_cpu@
414host_os = @host_os@
415host_vendor = @host_vendor@
416htmldir = @htmldir@
417includedir = @includedir@
418infodir = @infodir@
419install_sh = @install_sh@
420libdir = @libdir@
421libexecdir = @libexecdir@
422localedir = @localedir@
423localstatedir = @localstatedir@
424lt_ECHO = @lt_ECHO@
425lt_enable_auto_import = @lt_enable_auto_import@
426mandir = @mandir@
427mkdir_p = @mkdir_p@
428oldincludedir = @oldincludedir@
429pdfdir = @pdfdir@
430pkgconfig_requires_private = @pkgconfig_requires_private@
431prefix = @prefix@
432program_transform_name = @program_transform_name@
433psdir = @psdir@
434release_info = @release_info@
435requirements_ecore = @requirements_ecore@
436requirements_ecore_cocoa = @requirements_ecore_cocoa@
437requirements_ecore_con = @requirements_ecore_con@
438requirements_ecore_directfb = @requirements_ecore_directfb@
439requirements_ecore_evas = @requirements_ecore_evas@
440requirements_ecore_fb = @requirements_ecore_fb@
441requirements_ecore_file = @requirements_ecore_file@
442requirements_ecore_imf = @requirements_ecore_imf@
443requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
444requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
445requirements_ecore_input = @requirements_ecore_input@
446requirements_ecore_input_evas = @requirements_ecore_input_evas@
447requirements_ecore_ipc = @requirements_ecore_ipc@
448requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
449requirements_ecore_sdl = @requirements_ecore_sdl@
450requirements_ecore_win32 = @requirements_ecore_win32@
451requirements_ecore_wince = @requirements_ecore_wince@
452requirements_ecore_x = @requirements_ecore_x@
453rt_libs = @rt_libs@
454sbindir = @sbindir@
455sharedstatedir = @sharedstatedir@
456srcdir = @srcdir@
457sysconfdir = @sysconfdir@
458target_alias = @target_alias@
459top_build_prefix = @top_build_prefix@
460top_builddir = @top_builddir@
461top_srcdir = @top_srcdir@
462version_info = @version_info@
463x_cflags = @x_cflags@
464x_includes = @x_includes@
465x_libs = @x_libs@
466MAINTAINERCLEANFILES = Makefile.in
467AM_CPPFLAGS = \
468-I$(top_srcdir)/src/lib/ecore \
469-I$(top_srcdir)/src/lib/ecore_con \
470-I$(top_builddir)/src/lib/ecore \
471@EFL_ECORE_FILE_BUILD@ \
472@CURL_CFLAGS@ \
473@EVIL_CFLAGS@ \
474@EINA_CFLAGS@ \
475@WIN32_CPPFLAGS@
476
477AM_CFLAGS = @WIN32_CFLAGS@
478@BUILD_ECORE_CON_TRUE@lib_ecore_con_la = $(top_builddir)/src/lib/ecore_con/libecore_con.la
479lib_LTLIBRARIES = libecore_file.la
480includes_HEADERS = Ecore_File.h
481includesdir = $(includedir)/ecore-@VMAJ@
482libecore_file_la_SOURCES = \
483ecore_file.c \
484ecore_file_monitor.c \
485ecore_file_monitor_inotify.c \
486ecore_file_monitor_win32.c \
487ecore_file_monitor_poll.c \
488ecore_file_path.c \
489ecore_file_download.c
490
491libecore_file_la_LIBADD = \
492$(top_builddir)/src/lib/ecore/libecore.la \
493$(lib_ecore_con_la) \
494@EVIL_LIBS@ \
495@EINA_LIBS@
496
497libecore_file_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
498EXTRA_DIST = ecore_file_private.h
499all: all-am
500
501.SUFFIXES:
502.SUFFIXES: .c .lo .o .obj
503$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
504 @for dep in $?; do \
505 case '$(am__configure_deps)' in \
506 *$$dep*) \
507 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
508 && { if test -f $@; then exit 0; else break; fi; }; \
509 exit 1;; \
510 esac; \
511 done; \
512 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_file/Makefile'; \
513 $(am__cd) $(top_srcdir) && \
514 $(AUTOMAKE) --gnu src/lib/ecore_file/Makefile
515.PRECIOUS: Makefile
516Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
517 @case '$?' in \
518 *config.status*) \
519 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
520 *) \
521 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
522 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
523 esac;
524
525$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
526 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
527
528$(top_srcdir)/configure: $(am__configure_deps)
529 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
530$(ACLOCAL_M4): $(am__aclocal_m4_deps)
531 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
532$(am__aclocal_m4_deps):
533install-libLTLIBRARIES: $(lib_LTLIBRARIES)
534 @$(NORMAL_INSTALL)
535 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
536 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
537 list2=; for p in $$list; do \
538 if test -f $$p; then \
539 list2="$$list2 $$p"; \
540 else :; fi; \
541 done; \
542 test -z "$$list2" || { \
543 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
544 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
545 }
546
547uninstall-libLTLIBRARIES:
548 @$(NORMAL_UNINSTALL)
549 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
550 for p in $$list; do \
551 $(am__strip_dir) \
552 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
553 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
554 done
555
556clean-libLTLIBRARIES:
557 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
558 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
559 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
560 test "$$dir" != "$$p" || dir=.; \
561 echo "rm -f \"$${dir}/so_locations\""; \
562 rm -f "$${dir}/so_locations"; \
563 done
564libecore_file.la: $(libecore_file_la_OBJECTS) $(libecore_file_la_DEPENDENCIES)
565 $(AM_V_CCLD)$(libecore_file_la_LINK) -rpath $(libdir) $(libecore_file_la_OBJECTS) $(libecore_file_la_LIBADD) $(LIBS)
566
567mostlyclean-compile:
568 -rm -f *.$(OBJEXT)
569
570distclean-compile:
571 -rm -f *.tab.c
572
573@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file.Plo@am__quote@
574@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file_download.Plo@am__quote@
575@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file_monitor.Plo@am__quote@
576@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file_monitor_inotify.Plo@am__quote@
577@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file_monitor_poll.Plo@am__quote@
578@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file_monitor_win32.Plo@am__quote@
579@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_file_path.Plo@am__quote@
580
581.c.o:
582@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
583@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
584@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
585@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
587@am__fastdepCC_FALSE@ $(COMPILE) -c $<
588
589.c.obj:
590@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
591@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
592@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
593@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
594@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
595@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
596
597.c.lo:
598@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
599@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
600@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
601@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
602@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
603@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
604
605mostlyclean-libtool:
606 -rm -f *.lo
607
608clean-libtool:
609 -rm -rf .libs _libs
610install-includesHEADERS: $(includes_HEADERS)
611 @$(NORMAL_INSTALL)
612 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
613 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
614 for p in $$list; do \
615 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
616 echo "$$d$$p"; \
617 done | $(am__base_list) | \
618 while read files; do \
619 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
620 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
621 done
622
623uninstall-includesHEADERS:
624 @$(NORMAL_UNINSTALL)
625 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
626 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
627 test -n "$$files" || exit 0; \
628 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
629 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
630
631ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
632 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
633 unique=`for i in $$list; do \
634 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
635 done | \
636 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
637 END { if (nonempty) { for (i in files) print i; }; }'`; \
638 mkid -fID $$unique
639tags: TAGS
640
641TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
642 $(TAGS_FILES) $(LISP)
643 set x; \
644 here=`pwd`; \
645 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
646 unique=`for i in $$list; do \
647 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
648 done | \
649 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
650 END { if (nonempty) { for (i in files) print i; }; }'`; \
651 shift; \
652 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
653 test -n "$$unique" || unique=$$empty_fix; \
654 if test $$# -gt 0; then \
655 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
656 "$$@" $$unique; \
657 else \
658 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
659 $$unique; \
660 fi; \
661 fi
662ctags: CTAGS
663CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
664 $(TAGS_FILES) $(LISP)
665 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
666 unique=`for i in $$list; do \
667 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
668 done | \
669 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
670 END { if (nonempty) { for (i in files) print i; }; }'`; \
671 test -z "$(CTAGS_ARGS)$$unique" \
672 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
673 $$unique
674
675GTAGS:
676 here=`$(am__cd) $(top_builddir) && pwd` \
677 && $(am__cd) $(top_srcdir) \
678 && gtags -i $(GTAGS_ARGS) "$$here"
679
680distclean-tags:
681 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
682
683distdir: $(DISTFILES)
684 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
685 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
686 list='$(DISTFILES)'; \
687 dist_files=`for file in $$list; do echo $$file; done | \
688 sed -e "s|^$$srcdirstrip/||;t" \
689 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
690 case $$dist_files in \
691 */*) $(MKDIR_P) `echo "$$dist_files" | \
692 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
693 sort -u` ;; \
694 esac; \
695 for file in $$dist_files; do \
696 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
697 if test -d $$d/$$file; then \
698 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
699 if test -d "$(distdir)/$$file"; then \
700 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
701 fi; \
702 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
703 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
704 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
705 fi; \
706 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
707 else \
708 test -f "$(distdir)/$$file" \
709 || cp -p $$d/$$file "$(distdir)/$$file" \
710 || exit 1; \
711 fi; \
712 done
713check-am: all-am
714check: check-am
715all-am: Makefile $(LTLIBRARIES) $(HEADERS)
716installdirs:
717 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
718 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
719 done
720install: install-am
721install-exec: install-exec-am
722install-data: install-data-am
723uninstall: uninstall-am
724
725install-am: all-am
726 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
727
728installcheck: installcheck-am
729install-strip:
730 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
731 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
732 `test -z '$(STRIP)' || \
733 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
734mostlyclean-generic:
735
736clean-generic:
737
738distclean-generic:
739 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
740 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
741
742maintainer-clean-generic:
743 @echo "This command is intended for maintainers to use"
744 @echo "it deletes files that may require special tools to rebuild."
745 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
746clean: clean-am
747
748clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
749 mostlyclean-am
750
751distclean: distclean-am
752 -rm -rf ./$(DEPDIR)
753 -rm -f Makefile
754distclean-am: clean-am distclean-compile distclean-generic \
755 distclean-tags
756
757dvi: dvi-am
758
759dvi-am:
760
761html: html-am
762
763html-am:
764
765info: info-am
766
767info-am:
768
769install-data-am: install-includesHEADERS
770
771install-dvi: install-dvi-am
772
773install-dvi-am:
774
775install-exec-am: install-libLTLIBRARIES
776
777install-html: install-html-am
778
779install-html-am:
780
781install-info: install-info-am
782
783install-info-am:
784
785install-man:
786
787install-pdf: install-pdf-am
788
789install-pdf-am:
790
791install-ps: install-ps-am
792
793install-ps-am:
794
795installcheck-am:
796
797maintainer-clean: maintainer-clean-am
798 -rm -rf ./$(DEPDIR)
799 -rm -f Makefile
800maintainer-clean-am: distclean-am maintainer-clean-generic
801
802mostlyclean: mostlyclean-am
803
804mostlyclean-am: mostlyclean-compile mostlyclean-generic \
805 mostlyclean-libtool
806
807pdf: pdf-am
808
809pdf-am:
810
811ps: ps-am
812
813ps-am:
814
815uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
816
817.MAKE: install-am install-strip
818
819.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
820 clean-libLTLIBRARIES clean-libtool ctags distclean \
821 distclean-compile distclean-generic distclean-libtool \
822 distclean-tags distdir dvi dvi-am html html-am info info-am \
823 install install-am install-data install-data-am install-dvi \
824 install-dvi-am install-exec install-exec-am install-html \
825 install-html-am install-includesHEADERS install-info \
826 install-info-am install-libLTLIBRARIES install-man install-pdf \
827 install-pdf-am install-ps install-ps-am install-strip \
828 installcheck installcheck-am installdirs maintainer-clean \
829 maintainer-clean-generic mostlyclean mostlyclean-compile \
830 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
831 tags uninstall uninstall-am uninstall-includesHEADERS \
832 uninstall-libLTLIBRARIES
833
834
835# Tell versions [3.59,3.63) of GNU make to not export all variables.
836# Otherwise a system limit (for SysV at least) may be exceeded.
837.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file.c b/libraries/ecore/src/lib/ecore_file/ecore_file.c
new file mode 100644
index 0000000..2546f2f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file.c
@@ -0,0 +1,1110 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7
8#ifndef _MSC_VER
9# include <unistd.h>
10# include <libgen.h>
11#endif
12
13#ifdef _WIN32
14# include <direct.h>
15#endif
16
17#ifdef HAVE_FEATURES_H
18# include <features.h>
19#endif
20#include <ctype.h>
21#include <errno.h>
22
23#ifdef HAVE_ATFILE_SOURCE
24# include <dirent.h>
25#endif
26
27#include "ecore_file_private.h"
28
29int _ecore_file_log_dom = -1;
30static int _ecore_file_init_count = 0;
31
32/* externally accessible functions */
33
34/**
35 * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
36 *
37 * @{
38 */
39
40/**
41 * @brief Initialize the Ecore_File library.
42 *
43 * @return 1 or greater on success, 0 on error.
44 *
45 * This function sets up Ecore_File and the services it will use
46 * (monitoring, downloading, PATH related feature). It returns 0 on
47 * failure, otherwise it returns the number of times it has already
48 * been called.
49 *
50 * When Ecore_File is not used anymore, call ecore_file_shutdown()
51 * to shut down the Ecore_File library.
52 */
53EAPI int
54ecore_file_init()
55{
56 if (++_ecore_file_init_count != 1)
57 return _ecore_file_init_count;
58
59 if (!ecore_init())
60 return --_ecore_file_init_count;
61
62 _ecore_file_log_dom = eina_log_domain_register
63 ("ecore_file", ECORE_FILE_DEFAULT_LOG_COLOR);
64 if(_ecore_file_log_dom < 0)
65 {
66 EINA_LOG_ERR("Impossible to create a log domain for the ecore file module.");
67 return --_ecore_file_init_count;
68 }
69 ecore_file_path_init();
70 ecore_file_monitor_init();
71 ecore_file_download_init();
72
73 /* FIXME: were the tests disabled for a good reason ? */
74
75 /*
76 if (!ecore_file_monitor_init())
77 goto shutdown_ecore_file_path;
78
79 if (!ecore_file_download_init())
80 goto shutdown_ecore_file_monitor;
81 */
82
83 return _ecore_file_init_count;
84
85 /*
86 shutdown_ecore_file_monitor:
87 ecore_file_monitor_shutdown();
88 shutdown_ecore_file_path:
89 ecore_file_path_shutdown();
90
91 return --_ecore_file_init_count;
92 */
93}
94
95/**
96 * @brief Shut down the Ecore_File library.
97 *
98 * @return 0 when the library is completely shut down, 1 or
99 * greater otherwise.
100 *
101 * This function shuts down the Ecore_File library. It returns 0 when it has
102 * been called the same number of times than ecore_file_init(). In that case
103 * it shuts down all the services it uses.
104 */
105EAPI int
106ecore_file_shutdown()
107{
108 if (--_ecore_file_init_count != 0)
109 return _ecore_file_init_count;
110
111 ecore_file_download_shutdown();
112 ecore_file_monitor_shutdown();
113 ecore_file_path_shutdown();
114
115 eina_log_domain_unregister(_ecore_file_log_dom);
116 _ecore_file_log_dom = -1;
117
118 ecore_shutdown();
119
120 return _ecore_file_init_count;
121}
122
123/**
124 * @brief Get the time of the last modification to the given file.
125 *
126 * @param file The name of the file.
127 * @return Return the time of the last data modification, or 0 on
128 * failure.
129 *
130 * This function returns the time of the last modification of
131 * @p file. On failure, it returns 0.
132 */
133EAPI long long
134ecore_file_mod_time(const char *file)
135{
136 struct stat st;
137
138 if (stat(file, &st) < 0) return 0;
139 return st.st_mtime;
140}
141
142/**
143 * @brief Get the size of the given file.
144 *
145 * @param file The name of the file.
146 * @return Return the size of the file in bytes, or 0 on failure.
147 *
148 * This function returns the size of @p file in bytes. On failure, it
149 * returns 0.
150 */
151EAPI long long
152ecore_file_size(const char *file)
153{
154 struct stat st;
155
156 if (stat(file, &st) < 0) return 0;
157 return st.st_size;
158}
159
160/**
161 * @brief Check if the given file exists.
162 *
163 * @param file The name of the file.
164 * @return Return EINA_TRUE if the file exists, EINA_FALSE otherwise.
165 *
166 * This function returns EINA_TRUE if @p file exists on local filesystem,
167 * EINA_FALSE otherwise.
168 */
169EAPI Eina_Bool
170ecore_file_exists(const char *file)
171{
172 struct stat st;
173 if (!file) return EINA_FALSE;
174
175 /*Workaround so that "/" returns a true, otherwise we can't monitor "/" in ecore_file_monitor*/
176 if (stat(file, &st) < 0 && strcmp(file, "/")) return EINA_FALSE;
177 return EINA_TRUE;
178}
179
180/**
181 * @brief Check if the given file is a directory.
182 *
183 * @param file The name of the file.
184 * @return Return EINA_TRUE if the file exists and is a directory,
185 * EINA_FALSE otherwise.
186 *
187 * This function returns EINA_TRUE if @p file exists exists and is a
188 * directory on local filesystem, EINA_FALSE otherwise.
189 */
190EAPI Eina_Bool
191ecore_file_is_dir(const char *file)
192{
193 struct stat st;
194
195 if (stat(file, &st) < 0) return EINA_FALSE;
196 if (S_ISDIR(st.st_mode)) return EINA_TRUE;
197 return EINA_FALSE;
198}
199
200static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
201
202/**
203 * @brief Create a new directory.
204 *
205 * @param dir The name of the directory to create
206 * @return EINA_TRUE on successful creation, EINA_FALSE otherwise.
207 *
208 * This function creates the directory @p dir with the mode S_IRUSR |
209 * S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH. On
210 * success, it returns EINA_TRUE, EINA_FALSE otherwise.
211 */
212EAPI Eina_Bool
213ecore_file_mkdir(const char *dir)
214{
215 if (mkdir(dir, default_mode) < 0) return EINA_FALSE;
216 return EINA_TRUE;
217}
218
219/**
220 * @brief Create complete directory in a batch.
221 *
222 * @param dirs The list of directories, null terminated.
223 * @return The number of successful directories created, -1 if dirs is
224 * @c NULL.
225 *
226 * This function creates all the directories that are in the null
227 * terminated array @p dirs. The function loops over the directories
228 * and call ecore_file_mkdir(). This function returns -1 if @p dirs is
229 * @c NULL, otherwise if returns the number of suceesfully created
230 * directories.
231 */
232EAPI int
233ecore_file_mkdirs(const char **dirs)
234{
235 int i = 0;
236
237 if (!dirs) return -1;
238
239 for (; *dirs; dirs++)
240 if (ecore_file_mkdir(*dirs))
241 i++;
242 return i;
243}
244
245/**
246 * @brief Create complete list of sub-directories in a batch (optimized).
247 *
248 * @param base The base directory to act on.
249 * @param subdirs The list of directories, null terminated.
250 * @return number of successful directories created, -1 on failure.
251 *
252 * This function creates all the directories that are in the null
253 * terminated array @p dirs in the @p base directory. If @p base does
254 * not exist, it will be created. The function loops over the directories
255 * and call ecore_file_mkdir(). The whole path of the directories must
256 * exist. So if base/a/b/c wants to be created, @p subdirs must
257 * contain "a", "a/b" and "a/b/c", in that order. This function
258 * returns -1 if @p dirs or @p base are @c NULL, or if @p base is
259 * empty ("\0"). It returns 0 is @p base is not a directory or
260 * invalid, or if it can't be created. Otherwise if returns the number
261 * of suceesfully created directories.
262 */
263EAPI int
264ecore_file_mksubdirs(const char *base, const char **subdirs)
265{
266#ifndef HAVE_ATFILE_SOURCE
267 char buf[PATH_MAX];
268 int baselen;
269#else
270 int fd;
271 DIR *dir;
272#endif
273 int i;
274
275 if (!subdirs) return -1;
276 if ((!base) || (base[0] == '\0')) return -1;
277
278 if ((!ecore_file_is_dir(base)) && (!ecore_file_mkpath(base)))
279 return 0;
280
281#ifndef HAVE_ATFILE_SOURCE
282 baselen = eina_strlcpy(buf, base, sizeof(buf));
283 if ((baselen < 1) || (baselen + 1 >= (int)sizeof(buf)))
284 return 0;
285
286 if (buf[baselen - 1] != '/')
287 {
288 buf[baselen] = '/';
289 baselen++;
290 }
291#else
292 dir = opendir(base);
293 if (!dir)
294 return 0;
295 fd = dirfd(dir);
296#endif
297
298 i = 0;
299 for (; *subdirs; subdirs++)
300 {
301 struct stat st;
302
303#ifndef HAVE_ATFILE_SOURCE
304 eina_strlcpy(buf + baselen, *subdirs, sizeof(buf) - baselen);
305 if (stat(buf, &st) == 0)
306#else
307 if (fstatat(fd, *subdirs, &st, 0) == 0)
308#endif
309 {
310 if (S_ISDIR(st.st_mode))
311 {
312 i++;
313 continue;
314 }
315 }
316 else
317 {
318 if (errno == ENOENT)
319 {
320#ifndef HAVE_ATFILE_SOURCE
321 if (mkdir(buf, default_mode) == 0)
322#else
323 if (mkdirat(fd, *subdirs, default_mode) == 0)
324#endif
325 {
326 i++;
327 continue;
328 }
329 }
330 }
331 }
332
333#ifdef HAVE_ATFILE_SOURCE
334 closedir(dir);
335#endif
336
337 return i;
338}
339
340/**
341 * @brief Delete the given directory.
342 *
343 * @param dir The name of the directory to delete.
344 * @return EINA_TRUE on success, EINA_FALSE otherwise.
345 *
346 * This function deletes @p dir. It returns EINA_TRUE on success,
347 * EINA_FALSE otherwise.
348 */
349EAPI Eina_Bool
350ecore_file_rmdir(const char *dir)
351{
352 if (rmdir(dir) < 0) return EINA_FALSE;
353 return EINA_TRUE;
354}
355
356/**
357 * @brief Delete the given file.
358 *
359 * @param file The name of the file to delete.
360 * @return EINA_TRUE on success, EINA_FALSE otherwise.
361 *
362 * This function deletes @p file. It returns EINA_TRUE on success,
363 * EINA_FALSE otherwise.
364 */
365EAPI Eina_Bool
366ecore_file_unlink(const char *file)
367{
368 if (unlink(file) < 0) return EINA_FALSE;
369 return EINA_TRUE;
370}
371
372/**
373 * @brief Remove the given file or directory.
374 *
375 * @param file The name of the file or directory to delete.
376 * @return EINA_TRUE on success, EINA_FALSE otherwise.
377 *
378 * This function removes @p file. It returns EINA_TRUE on success,
379 * EINA_FALSE otherwise.
380 */
381EAPI Eina_Bool
382ecore_file_remove(const char *file)
383{
384 if (remove(file) < 0) return EINA_FALSE;
385 return EINA_TRUE;
386}
387
388/**
389 * @brief Delete the given directory and all its contents.
390 *
391 * @param dir The name of the directory to delete.
392 * @return EINA_TRUE on success, EINA_FALSE otherwise.
393 *
394 * This function delete @p dir and all its contents. If @p dir is a
395 * link only the link is removed. It returns EINA_TRUE on success,
396 * EINA_FALSE otherwise.
397 */
398EAPI Eina_Bool
399ecore_file_recursive_rm(const char *dir)
400{
401 Eina_Iterator *it;
402 char buf[PATH_MAX];
403 struct stat st;
404 int ret;
405
406 if (readlink(dir, buf, sizeof(buf)) > 0)
407 return ecore_file_unlink(dir);
408
409 ret = stat(dir, &st);
410 if ((ret == 0) && (S_ISDIR(st.st_mode)))
411 {
412 Eina_File_Direct_Info *info;
413
414 ret = 1;
415 if (stat(dir, &st) == -1) return EINA_FALSE; /* WOOT: WHY ARE WE CALLING STAT TWO TIMES ??? */
416
417 it = eina_file_direct_ls(dir);
418 EINA_ITERATOR_FOREACH(it, info)
419 {
420 if (!ecore_file_recursive_rm(info->path))
421 ret = 0;
422 }
423 eina_iterator_free(it);
424
425 if (!ecore_file_rmdir(dir)) ret = 0;
426 if (ret)
427 return EINA_TRUE;
428 else
429 return EINA_FALSE;
430 }
431 else
432 {
433 if (ret == -1) return EINA_FALSE;
434 return ecore_file_unlink(dir);
435 }
436}
437
438static inline Eina_Bool
439_ecore_file_mkpath_if_not_exists(const char *path)
440{
441 struct stat st;
442
443 /* Windows: path like C: or D: etc are valid, but stat() returns an error */
444#ifdef _WIN32
445 if ((strlen(path) == 2) &&
446 ((path[0] >= 'a' && path[0] <= 'z') ||
447 (path[0] >= 'A' && path[0] <= 'Z')) &&
448 (path[1] == ':'))
449 return EINA_TRUE;
450#endif
451
452 if (stat(path, &st) < 0)
453 return ecore_file_mkdir(path);
454 else if (!S_ISDIR(st.st_mode))
455 return EINA_FALSE;
456 else
457 return EINA_TRUE;
458}
459
460/**
461 * @brief Create a complete path.
462 *
463 * @param path The path to create
464 * @return EINA_TRUE on success, EINA_FALSE otherwise.
465 *
466 * This function creates @p path and all the subdirectories it
467 * contains. The separator is '/' or '\'. If @p path exists, this
468 * function returns EINA_TRUE immediately. It returns EINA_TRUE on
469 * success, EINA_FALSE otherwise.
470 */
471EAPI Eina_Bool
472ecore_file_mkpath(const char *path)
473{
474 char ss[PATH_MAX];
475 unsigned int i;
476
477 if (ecore_file_is_dir(path))
478 return EINA_TRUE;
479
480 for (i = 0; path[i] != '\0'; ss[i] = path[i], i++)
481 {
482 if (i == sizeof(ss) - 1) return EINA_FALSE;
483 if (((path[i] == '/') || (path[i] == '\\')) && (i > 0))
484 {
485 ss[i] = '\0';
486 if (!_ecore_file_mkpath_if_not_exists(ss))
487 return EINA_FALSE;
488 }
489 }
490 ss[i] = '\0';
491 return _ecore_file_mkpath_if_not_exists(ss);
492}
493
494/**
495 * @brief Create complete paths in a batch.
496 *
497 * @param paths list of paths, null terminated.
498 * @return number of successful paths created, -1 if paths is NULL.
499 *
500 * This function creates all the directories that are in the null
501 * terminated array @p paths. The function loops over the directories
502 * and call ecore_file_mkpath(), hence on Windows, '\' must be
503 * replaced by '/' before calling that function. This function
504 * returns -1 if @p paths is @c NULL. Otherwise if returns the number
505 * of suceesfully created directories.
506 */
507EAPI int
508ecore_file_mkpaths(const char **paths)
509{
510 int i = 0;
511
512 if (!paths) return -1;
513
514 for (; *paths; paths++)
515 if (ecore_file_mkpath(*paths))
516 i++;
517 return i;
518}
519
520/**
521 * @brief Copy the given file to the given destination.
522 *
523 * @param src The name of the source file.
524 * @param dst The name of the destination file.
525 * @return EINA_TRUE on success, EINA_FALSE otherwise.
526 *
527 * This function copies @p src to @p dst. If the absolute path name of
528 * @p src and @p dst can not be computed, or if they are equal, or if
529 * the copy fails, the function returns EINA_FALSE, otherwise it
530 * returns EINA_TRUE.
531 */
532EAPI Eina_Bool
533ecore_file_cp(const char *src, const char *dst)
534{
535 FILE *f1, *f2;
536 char buf[16384];
537 char realpath1[PATH_MAX], realpath2[PATH_MAX];
538 size_t num;
539 Eina_Bool ret = EINA_TRUE;
540
541 if (!realpath(src, realpath1)) return EINA_FALSE;
542 if (realpath(dst, realpath2) && !strcmp(realpath1, realpath2)) return EINA_FALSE;
543
544 f1 = fopen(src, "rb");
545 if (!f1) return EINA_FALSE;
546 f2 = fopen(dst, "wb");
547 if (!f2)
548 {
549 fclose(f1);
550 return EINA_FALSE;
551 }
552 while ((num = fread(buf, 1, sizeof(buf), f1)) > 0)
553 {
554 if (fwrite(buf, 1, num, f2) != num) ret = EINA_FALSE;
555 }
556 fclose(f1);
557 fclose(f2);
558 return ret;
559}
560
561/**
562 * @brief Move the given file to the given destination.
563 *
564 * @param src The name of the source file.
565 * @param dst The name of the destination file.
566 * @return EINA_TRUE on success, EINA_FALSE otherwise.
567 *
568 * This function moves @p src to @p dst. It returns EINA_TRUE on
569 * success, EINA_FALSE otherwise.
570 */
571EAPI Eina_Bool
572ecore_file_mv(const char *src, const char *dst)
573{
574 char buf[PATH_MAX];
575 int fd;
576
577 if (rename(src, dst))
578 {
579 // File cannot be moved directly because
580 // it resides on a different mount point.
581 if (errno == EXDEV)
582 {
583 struct stat st;
584
585 // Make sure this is a regular file before
586 // we do anything fancy.
587 stat(src, &st);
588 if (S_ISREG(st.st_mode))
589 {
590 char *dir;
591
592 dir = ecore_file_dir_get(dst);
593 // Since we can't directly rename, try to
594 // copy to temp file in the dst directory
595 // and then rename.
596 snprintf(buf, sizeof(buf), "%s/.%s.tmp.XXXXXX",
597 dir, ecore_file_file_get(dst));
598 free(dir);
599 fd = mkstemp(buf);
600 if (fd < 0)
601 {
602 perror("mkstemp");
603 goto FAIL;
604 }
605 close(fd);
606
607 // Copy to temp file
608 if (!ecore_file_cp(src, buf))
609 goto FAIL;
610
611 // Set file permissions of temp file to match src
612 chmod(buf, st.st_mode);
613
614 // Try to atomically move temp file to dst
615 if (rename(buf, dst))
616 {
617 // If we still cannot atomically move
618 // do a normal copy and hope for the best.
619 if (!ecore_file_cp(buf, dst))
620 goto FAIL;
621 }
622
623 // Delete temporary file and src
624 ecore_file_unlink(buf);
625 ecore_file_unlink(src);
626 goto PASS;
627 }
628 }
629 goto FAIL;
630 }
631
632PASS:
633 return EINA_TRUE;
634
635FAIL:
636 return EINA_FALSE;
637}
638
639/**
640 * @brief Create a symbolic link.
641 *
642 * @param src The name of the file to link.
643 * @param dest The name of link.
644 * @return EINA_TRUE on success, EINA_FALSE otherwise.
645 *
646 * This function create the symbolic link @p dest of @p src. This
647 * function does not work on Windows. It returns EINA_TRUE on success,
648 * EINA_FALSE otherwise.
649 */
650EAPI Eina_Bool
651ecore_file_symlink(const char *src, const char *dest)
652{
653 if (!symlink(src, dest)) return EINA_TRUE;
654
655 return EINA_FALSE;
656}
657
658/**
659 * @brief Get the canonicalized absolute path name.
660 *
661 * @param file The file path.
662 * @return The canonicalized absolute pathname or an empty string on
663 * failure.
664 *
665 * This function returns the absolute path name of @p file as a newly
666 * allocated string. If @p file is @c NULL, or on error, this function
667 * returns an empty string. Otherwise, it returns the absolute path
668 * name. When not needed anymore, the returned value must be freed.
669 */
670EAPI char *
671ecore_file_realpath(const char *file)
672{
673 char buf[PATH_MAX];
674
675 /*
676 * Some implementations of realpath do not conform to the SUS.
677 * And as a result we must prevent a null arg from being passed.
678 */
679 if (!file) return strdup("");
680 if (!realpath(file, buf)) return strdup("");
681
682 return strdup(buf);
683}
684
685/**
686 * Get the filename from a given path.
687 *
688 * @param path The complete path.
689 * @return The file name.
690 *
691 * This function returns the file name of @p path. If @p path is
692 * @c NULL, the functions returns @c NULL.
693 */
694EAPI const char *
695ecore_file_file_get(const char *path)
696{
697 char *result = NULL;
698
699 if (!path) return NULL;
700 if ((result = strrchr(path, '/'))) result++;
701 else result = (char *)path;
702 return result;
703}
704
705/**
706 * @brief Get the directory where the given file resides.
707 *
708 * @param file The name of the file.
709 * @return The directory name.
710 *
711 * This function returns the directory where @p file resides as anewly
712 * allocated string. If @p file is @c NULL or on error, this function
713 * returns @c NULL. When not needed anymore, the returned value must
714 * be freed.
715 */
716EAPI char *
717ecore_file_dir_get(const char *file)
718{
719 char *p;
720 char buf[PATH_MAX];
721
722 if (!file) return NULL;
723 strncpy(buf, file, PATH_MAX);
724 buf[PATH_MAX - 1] = 0;
725 p = dirname(buf);
726 return strdup(p);
727}
728
729/**
730 * @brief Check if the given file can be read.
731 *
732 * @param file The name of the file.
733 * @return EINA_TRUE if the file is readable, EINA_FALSE otherwise.
734 *
735 * This function returns EINA_TRUE if @p file can be read, EINA_FALSE
736 * otherwise.
737 */
738EAPI Eina_Bool
739ecore_file_can_read(const char *file)
740{
741 if (!file) return EINA_FALSE;
742 if (!access(file, R_OK)) return EINA_TRUE;
743 return EINA_FALSE;
744}
745
746/**
747 * @brief Check if the given file can be written.
748 *
749 * @param file The name of the file.
750 * @return EINA_TRUE if the file is writable, EINA_FALSE otherwise.
751 *
752 * This function returns EINA_TRUE if @p file can be written, EINA_FALSE
753 * otherwise.
754 */
755EAPI Eina_Bool
756ecore_file_can_write(const char *file)
757{
758 if (!file) return EINA_FALSE;
759 if (!access(file, W_OK)) return EINA_TRUE;
760 return EINA_FALSE;
761}
762
763/**
764 * @bbrief Check if the given file can be executed.
765 *
766 * @param file The name of the file.
767 * @return EINA_TRUE if the file can be executed, EINA_FALSE otherwise.
768 *
769 * This function returns EINA_TRUE if @p file can be executed, EINA_FALSE
770 * otherwise.
771 */
772EAPI Eina_Bool
773ecore_file_can_exec(const char *file)
774{
775 if (!file) return EINA_FALSE;
776 if (!access(file, X_OK)) return EINA_TRUE;
777 return EINA_FALSE;
778}
779
780/**
781 * @brief Get the path pointed by the given link.
782 *
783 * @param lnk The name of the link.
784 * @return The path pointed by link or NULL.
785 *
786 * This function returns the path pointed by @p link as a newly
787 * allocated string. This function does not work on Windows. On
788 * failure, the function returns @c NULL. When not needed anymore, the
789 * returned value must be freed.
790 */
791EAPI char *
792ecore_file_readlink(const char *lnk)
793{
794 char buf[PATH_MAX];
795 int count;
796
797 if ((count = readlink(lnk, buf, sizeof(buf) - 1)) < 0) return NULL;
798 buf[count] = 0;
799 return strdup(buf);
800}
801
802/**
803 * @brief Get the list of the files and directories in the given
804 * directory.
805 *
806 * @param dir The name of the directory to list
807 * @return Return an Eina_List containing all the files in the directory;
808 * on failure it returns NULL.
809 *
810 * This function returns a list of allocated strings of all the files
811 * and directories contained in @p dir. The list will be sorted with
812 * strcoll as compare function. That means that you may want to set
813 * the current locale for the category LC_COLLATE with
814 * setlocale(). For more information see the manual pages of strcoll
815 * and setlocale. The list will not contain the directory entries for
816 * '.' and '..'. On failure, @c NULL is returned. When not needed
817 * anymore, the list elements must be freed.
818 */
819EAPI Eina_List *
820ecore_file_ls(const char *dir)
821{
822 Eina_File_Direct_Info *info;
823 Eina_Iterator *ls;
824 Eina_List *list = NULL;
825
826 ls = eina_file_direct_ls(dir);
827 EINA_ITERATOR_FOREACH(ls, info)
828 {
829 char *f;
830
831 f = strdup(info->path + info->name_start);
832 list = eina_list_append(list, f);
833 }
834 eina_iterator_free(ls);
835
836 list = eina_list_sort(list, eina_list_count(list), EINA_COMPARE_CB(strcoll));
837
838 return list;
839}
840
841/**
842 * @brief Return the executable from the given command.
843 *
844 * @param app The application command, with parameters.
845 *
846 * This function returns the executable from @p app as a newly
847 * allocated string. Arguments are removed and escae characters are
848 * handled. If @p app is @c NULL, or on failure, the function returns
849 * @c NULL. When not needed anymore, the returned value must be freed.
850 */
851EAPI char *
852ecore_file_app_exe_get(const char *app)
853{
854 char *p, *pp, *exe1 = NULL, *exe2 = NULL;
855 char *exe = NULL;
856 int in_quot_dbl = 0, in_quot_sing = 0, restart = 0;
857
858 if (!app) return NULL;
859
860 p = (char *)app;
861restart:
862 while ((*p) && (isspace(*p))) p++;
863 exe1 = p;
864 while (*p)
865 {
866 if (in_quot_sing)
867 {
868 if (*p == '\'')
869 in_quot_sing = 0;
870 }
871 else if (in_quot_dbl)
872 {
873 if (*p == '\"')
874 in_quot_dbl = 0;
875 }
876 else
877 {
878 if (*p == '\'')
879 in_quot_sing = 1;
880 else if (*p == '\"')
881 in_quot_dbl = 1;
882 if ((isspace(*p)) && (!((p > app) && (p[-1] != '\\'))))
883 break;
884 }
885 p++;
886 }
887 exe2 = p;
888 if (exe2 == exe1) return NULL;
889 if (*exe1 == '~')
890 {
891 char *homedir;
892 int len;
893
894 /* Skip ~ */
895 exe1++;
896
897 homedir = getenv("HOME");
898 if (!homedir) return NULL;
899 len = strlen(homedir);
900 if (exe) free(exe);
901 exe = malloc(len + exe2 - exe1 + 2);
902 if (!exe) return NULL;
903 pp = exe;
904 if (len)
905 {
906 strcpy(exe, homedir);
907 pp += len;
908 if (*(pp - 1) != '/')
909 {
910 *pp = '/';
911 pp++;
912 }
913 }
914 }
915 else
916 {
917 if (exe) free(exe);
918 exe = malloc(exe2 - exe1 + 1);
919 if (!exe) return NULL;
920 pp = exe;
921 }
922 p = exe1;
923 restart = 0;
924 in_quot_dbl = 0;
925 in_quot_sing = 0;
926 while (*p)
927 {
928 if (in_quot_sing)
929 {
930 if (*p == '\'')
931 in_quot_sing = 0;
932 else
933 {
934 *pp = *p;
935 pp++;
936 }
937 }
938 else if (in_quot_dbl)
939 {
940 if (*p == '\"')
941 in_quot_dbl = 0;
942 else
943 {
944 /* technically this is wrong. double quotes also accept
945 * special chars:
946 *
947 * $, `, \
948 */
949 *pp = *p;
950 pp++;
951 }
952 }
953 else
954 {
955 /* technically we should handle special chars:
956 *
957 * $, `, \, etc.
958 */
959 if ((p > exe1) && (p[-1] == '\\'))
960 {
961 if (*p != '\n')
962 {
963 *pp = *p;
964 pp++;
965 }
966 }
967 else if ((p > exe1) && (*p == '='))
968 {
969 restart = 1;
970 *pp = *p;
971 pp++;
972 }
973 else if (*p == '\'')
974 in_quot_sing = 1;
975 else if (*p == '\"')
976 in_quot_dbl = 1;
977 else if (isspace(*p))
978 {
979 if (restart)
980 goto restart;
981 else
982 break;
983 }
984 else
985 {
986 *pp = *p;
987 pp++;
988 }
989 }
990 p++;
991 }
992 *pp = 0;
993 return exe;
994}
995
996/**
997 * @brief Add the escape sequence ('\\') to the given file name.
998 *
999 * @param filename The file name.
1000 * @return The file name with special characters escaped.
1001 *
1002 * This function adds the escape sequence ('\\') to the given file
1003 * name and returns the result as a newly allocated string. If the
1004 * length of the returned string is longer than PATH_MAX, or on
1005 * failure, @c NULL is returned. When not needed anymore, the returned
1006 * value must be freed.
1007 */
1008EAPI char *
1009ecore_file_escape_name(const char *filename)
1010{
1011 const char *p;
1012 char *q;
1013 char buf[PATH_MAX];
1014
1015 p = filename;
1016 q = buf;
1017 while (*p)
1018 {
1019 if ((q - buf) > (PATH_MAX - 6)) return NULL;
1020 if (
1021 (*p == ' ') || (*p == '\t') || (*p == '\n') ||
1022 (*p == '\\') || (*p == '\'') || (*p == '\"') ||
1023 (*p == ';') || (*p == '!') || (*p == '#') ||
1024 (*p == '$') || (*p == '%') || (*p == '&') ||
1025 (*p == '*') || (*p == '(') || (*p == ')') ||
1026 (*p == '[') || (*p == ']') || (*p == '{') ||
1027 (*p == '}') || (*p == '|') || (*p == '<') ||
1028 (*p == '>') || (*p == '?')
1029 )
1030 {
1031 *q = '\\';
1032 q++;
1033 }
1034 *q = *p;
1035 q++;
1036 p++;
1037 }
1038 *q = 0;
1039 return strdup(buf);
1040}
1041
1042/**
1043 * @bried Remove the extension from the given file name.
1044 *
1045 * @param path The name of the file.
1046 * @return A newly allocated string with the extension stripped out or
1047 * NULL on errors.
1048 *
1049 * This function removes the extension from @p path and returns the
1050 * result as a newly allocated string. If @p path is @c NULL, or on
1051 * failure, the function returns @c NULL. When not needed anymore, the
1052 * returned value must be freed.
1053 */
1054EAPI char *
1055ecore_file_strip_ext(const char *path)
1056{
1057 char *p, *file = NULL;
1058
1059 if (!path)
1060 return NULL;
1061
1062 p = strrchr(path, '.');
1063 if (!p)
1064 file = strdup(path);
1065 else if (p != path)
1066 {
1067 file = malloc(((p - path) + 1) * sizeof(char));
1068 if (file)
1069 {
1070 memcpy(file, path, (p - path));
1071 file[p - path] = 0;
1072 }
1073 }
1074
1075 return file;
1076}
1077
1078/**
1079 * @brief Check if the given directory is empty.
1080 *
1081 * @param dir The name of the directory to check.
1082 * @return 1 if directory is empty, 0 if it has at least one file or
1083 * -1 in case of errors.
1084 *
1085 * This functions checks if @p dir is empty. The '.' and '..' files
1086 * will be ignored. If @p dir is empty, 1 is returned, if it contains
1087 * at least 1 file, 0 is returned. On failure, -1 is returned.
1088 */
1089EAPI int
1090ecore_file_dir_is_empty(const char *dir)
1091{
1092 Eina_File_Direct_Info *info;
1093 Eina_Iterator *it;
1094
1095 it = eina_file_direct_ls(dir);
1096 if (!it) return -1;
1097
1098 EINA_ITERATOR_FOREACH(it, info)
1099 {
1100 eina_iterator_free(it);
1101 return 0;
1102 }
1103
1104 eina_iterator_free(it);
1105 return 1;
1106}
1107
1108/**
1109 * @}
1110 */
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_download.c b/libraries/ecore/src/lib/ecore_file/ecore_file_download.c
new file mode 100644
index 0000000..c7efc4d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_download.c
@@ -0,0 +1,440 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7
8#ifdef BUILD_ECORE_CON
9# include "Ecore_Con.h"
10#endif
11
12#include "ecore_file_private.h"
13
14#ifdef BUILD_ECORE_CON
15
16#define ECORE_MAGIC_FILE_DOWNLOAD_JOB 0xf7427cb8
17
18struct _Ecore_File_Download_Job
19{
20 ECORE_MAGIC;
21
22 Ecore_Con_Url *url_con;
23 FILE *file;
24
25 char *dst;
26
27 Ecore_File_Download_Completion_Cb completion_cb;
28 Ecore_File_Download_Progress_Cb progress_cb;
29};
30
31#ifdef HAVE_CURL
32Ecore_File_Download_Job *_ecore_file_download_curl(const char *url, const char *dst,
33 Ecore_File_Download_Completion_Cb completion_cb,
34 Ecore_File_Download_Progress_Cb progress_cb,
35 void *data,
36 Eina_Hash *headers);
37
38static Eina_Bool _ecore_file_download_url_complete_cb(void *data, int type, void *event);
39static Eina_Bool _ecore_file_download_url_progress_cb(void *data, int type, void *event);
40#endif
41
42static Ecore_Event_Handler *_url_complete_handler = NULL;
43static Ecore_Event_Handler *_url_progress_download = NULL;
44static Eina_List *_job_list;
45
46#endif /* BUILD_ECORE_CON */
47
48int
49ecore_file_download_init(void)
50{
51#ifdef BUILD_ECORE_CON
52 if (!ecore_con_url_init())
53 return 0;
54
55# ifdef HAVE_CURL
56 _url_complete_handler = ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, _ecore_file_download_url_complete_cb, NULL);
57 _url_progress_download = ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, _ecore_file_download_url_progress_cb, NULL);
58# endif
59
60#endif /* BUILD_ECORE_CON */
61
62 return 1;
63}
64
65void
66ecore_file_download_shutdown(void)
67{
68#ifdef BUILD_ECORE_CON
69 if (_url_complete_handler)
70 ecore_event_handler_del(_url_complete_handler);
71 if (_url_progress_download)
72 ecore_event_handler_del(_url_progress_download);
73 _url_complete_handler = NULL;
74 _url_progress_download = NULL;
75 ecore_file_download_abort_all();
76
77 ecore_con_url_shutdown();
78#endif /* BUILD_ECORE_CON */
79}
80
81#ifdef BUILD_ECORE_CON
82# ifdef HAVE_CURL
83static Eina_Bool
84_ecore_file_download_headers_foreach_cb(const Eina_Hash *hash __UNUSED__, const void *key, void *data, void *fdata)
85{
86 Ecore_File_Download_Job *job = fdata;
87 ecore_con_url_additional_header_add(job->url_con, key, data);
88
89 return EINA_TRUE;
90}
91# endif
92#endif
93
94static Eina_Bool
95_ecore_file_download(const char *url,
96 const char *dst,
97 Ecore_File_Download_Completion_Cb completion_cb,
98 Ecore_File_Download_Progress_Cb progress_cb,
99 void *data,
100 Ecore_File_Download_Job **job_ret,
101 Eina_Hash *headers)
102{
103#ifdef BUILD_ECORE_CON
104 char *dir = ecore_file_dir_get(dst);
105
106 if (!ecore_file_is_dir(dir))
107 {
108 ERR("%s is not a directory", dir);
109 free(dir);
110 return EINA_FALSE;
111 }
112 free(dir);
113 if (ecore_file_exists(dst))
114 {
115 WRN("%s already exists", dst);
116 return EINA_FALSE;
117 }
118
119 if (!strncmp(url, "file://", 7))
120 {
121 /* FIXME: Maybe fork? Might take a while to copy.
122 * Check filesize? */
123 /* Just copy it */
124
125 url += 7;
126 /* skip hostname */
127 url = strchr(url, '/');
128 return ecore_file_cp(url, dst);
129 }
130# ifdef HAVE_CURL
131 else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
132 (!strncmp(url, "ftp://", 6)))
133 {
134 /* download */
135 Ecore_File_Download_Job *job;
136
137 job = _ecore_file_download_curl(url, dst, completion_cb, progress_cb, data, headers);
138 if(job_ret) *job_ret = job;
139 if(job)
140 return EINA_TRUE;
141 else
142 {
143 ERR("no job returned\n");
144 return EINA_FALSE;
145 }
146 return job ? EINA_TRUE : EINA_FALSE;
147 }
148# else
149 else if ((!strncmp(url, "http://", 7)) || (!strncmp(url, "https://", 8)) ||
150 (!strncmp(url, "ftp://", 6)))
151 {
152 (void)completion_cb;
153 (void)progress_cb;
154 (void)data;
155 (void)job_ret;
156 (void)headers;
157 return EINA_FALSE;
158 }
159# endif
160 else
161 {
162 return EINA_FALSE;
163 }
164#else
165 (void)url;
166 (void)dst;
167 (void)completion_cb;
168 (void)progress_cb;
169 (void)data;
170 (void)job_ret;
171 (void)headers;
172 return EINA_FALSE;
173#endif /* BUILD_ECORE_CON */
174}
175
176/**
177 * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
178 *
179 * @{
180 */
181
182/**
183 * @brief Download the given url to the given destination.
184 *
185 * @param url The complete url to download.
186 * @param dst The local file to save the downloaded to.
187 * @param completion_cb A callback called on download complete.
188 * @param progress_cb A callback called during the download operation.
189 * @param data User data passed to both callbacks.
190 * @param job_ret Job used to abort the download.
191 * @return EINA_TRUE if the download start or EINA_FALSE on failure
192 *
193 * This function starts the download of the URL @p url and saves it to
194 * @p dst. @p url must provide the protocol, including 'http://',
195 * 'ftp://' or 'file://'. Ecore_File must be compiled with CURL to
196 * download using http and ftp protocols. If @p dst is ill-formed, or
197 * if it already exists, the function returns EINA_FALSE. When the
198 * download is complete, the callback @p completion_cb is called and
199 * @p data is passed to it. The @p status parameter of @p completion_cb
200 * will be filled with the status of the download (200, 404,...). The
201 * @p progress_cb is called during the download operation, each time a
202 * packet is received or when CURL wants. It can be used to display the
203 * percentage of the downloaded file. Return 0 from this callback, if provided,
204 * to continue the operation or anything else to abort the download. The only
205 * operations that can be aborted are those with protocol 'http' or 'ftp'. In
206 * that case @p job_ret can be filled. It can be used with
207 * ecore_file_download_abort() or ecore_file_download_abort_all() to
208 * respectively abort one or all download operations. This function returns
209 * EINA_TRUE if the download starts, EINA_FALSE otherwise.
210 */
211EAPI Eina_Bool
212ecore_file_download(const char *url,
213 const char *dst,
214 Ecore_File_Download_Completion_Cb completion_cb,
215 Ecore_File_Download_Progress_Cb progress_cb,
216 void *data,
217 Ecore_File_Download_Job **job_ret)
218{
219 return _ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, NULL);
220}
221
222/**
223 * @brief Download the given url to the given destination with additional headers.
224 *
225 * @param url The complete url to download.
226 * @param dst The local file to save the downloaded to.
227 * @param completion_cb A callback called on download complete.
228 * @param progress_cb A callback called during the download operation.
229 * @param data User data passed to both callbacks.
230 * @param job_ret Job used to abort the download.
231 * @param headers pointer of header lists.
232 * @return EINA_TRUE if the download start or EINA_FALSE on failure
233 */
234EAPI Eina_Bool
235ecore_file_download_full(const char *url,
236 const char *dst,
237 Ecore_File_Download_Completion_Cb completion_cb,
238 Ecore_File_Download_Progress_Cb progress_cb,
239 void *data,
240 Ecore_File_Download_Job **job_ret,
241 Eina_Hash *headers)
242{
243 return _ecore_file_download(url, dst, completion_cb, progress_cb, data, job_ret, headers);
244}
245
246/**
247 * @brief Check if the given protocol is available.
248 *
249 * @param protocol The protocol to check.
250 * @return EINA_TRUE if protocol is handled, EINA_FALSE otherwise.
251 *
252 * This function returns EINA_TRUE if @p protocol is supported,
253 * EINA_FALSE otherwise. @p protocol can be 'http://', 'ftp://' or
254 * 'file://'. Ecore_FILE must be compiled with CURL to handle http and
255 * ftp protocols.
256 */
257EAPI Eina_Bool
258ecore_file_download_protocol_available(const char *protocol)
259{
260#ifdef BUILD_ECORE_CON
261 if (!strncmp(protocol, "file://", 7)) return EINA_TRUE;
262# ifdef HAVE_CURL
263 else if (!strncmp(protocol, "http://", 7)) return EINA_TRUE;
264 else if (!strncmp(protocol, "ftp://", 6)) return EINA_TRUE;
265# endif
266#else
267 (void)protocol;
268#endif /* BUILD_ECORE_CON */
269
270 return EINA_FALSE;
271}
272
273#ifdef BUILD_ECORE_CON
274
275# ifdef HAVE_CURL
276static int
277_ecore_file_download_url_compare_job(const void *data1, const void *data2)
278{
279 const Ecore_File_Download_Job *job = data1;
280 const Ecore_Con_Url *url = data2;
281
282 if (job->url_con == url) return 0;
283 return -1;
284}
285
286static Eina_Bool
287_ecore_file_download_url_complete_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
288{
289 Ecore_Con_Event_Url_Complete *ev = event;
290 Ecore_File_Download_Job *job;
291
292 job = eina_list_search_unsorted(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
293 if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return ECORE_CALLBACK_PASS_ON;
294
295 fclose(job->file);
296 if (job->completion_cb)
297 job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, ev->status);
298
299 _job_list = eina_list_remove(_job_list, job);
300 free(job->dst);
301 ecore_con_url_free(job->url_con);
302 free(job);
303
304 return ECORE_CALLBACK_DONE;
305}
306
307static Eina_Bool
308_ecore_file_download_url_progress_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
309{
310/* this reports the downloads progress. if we return 0, then download
311 * continues, if we return anything else, then the download stops */
312 Ecore_Con_Event_Url_Progress *ev = event;
313 Ecore_File_Download_Job *job;
314
315 job = eina_list_search_unsorted(_job_list, _ecore_file_download_url_compare_job, ev->url_con);
316 if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return ECORE_CALLBACK_PASS_ON;
317
318 if (job->progress_cb)
319 if (job->progress_cb(ecore_con_url_data_get(job->url_con), job->dst,
320 (long int) ev->down.total, (long int) ev->down.now,
321 (long int) ev->up.total, (long int) ev->up.now) != 0)
322 {
323 _job_list = eina_list_remove(_job_list, job);
324 fclose(job->file);
325 free(job->dst);
326 free(job);
327
328 return ECORE_CALLBACK_PASS_ON;
329 }
330
331 return ECORE_CALLBACK_DONE;
332}
333
334Ecore_File_Download_Job *
335_ecore_file_download_curl(const char *url, const char *dst,
336 Ecore_File_Download_Completion_Cb completion_cb,
337 Ecore_File_Download_Progress_Cb progress_cb,
338 void *data,
339 Eina_Hash *headers)
340{
341 Ecore_File_Download_Job *job;
342
343 job = calloc(1, sizeof(Ecore_File_Download_Job));
344 if (!job) return NULL;
345
346 ECORE_MAGIC_SET(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB);
347
348 job->file = fopen(dst, "wb");
349 if (!job->file)
350 {
351 free(job);
352 return NULL;
353 }
354 job->url_con = ecore_con_url_new(url);
355 if (!job->url_con)
356 {
357 fclose(job->file);
358 free(job);
359 return NULL;
360 }
361
362 if (headers) eina_hash_foreach(headers, _ecore_file_download_headers_foreach_cb, job);
363 ecore_con_url_fd_set(job->url_con, fileno(job->file));
364 ecore_con_url_data_set(job->url_con, data);
365
366 job->dst = strdup(dst);
367
368 job->completion_cb = completion_cb;
369 job->progress_cb = progress_cb;
370 _job_list = eina_list_append(_job_list, job);
371
372 if (!ecore_con_url_get(job->url_con))
373 {
374 ecore_con_url_free(job->url_con);
375 _job_list = eina_list_remove(_job_list, job);
376 fclose(job->file);
377 ecore_file_remove(job->dst);
378 free(job->dst);
379 free(job);
380 return NULL;
381 }
382
383 return job;
384}
385# endif
386#endif
387
388/**
389 * @brief Abort the given download job and call the completion_cb
390 * callbck with a status of 1 (error).
391 *
392 * @param job The download job to abort.
393 *
394 * This function aborts a download operation started by
395 * ecore_file_download(). @p job is the #Ecore_File_Download_Job
396 * structure filled by ecore_file_download(). If it is @c NULL, this
397 * function does nothing. To abort all the currently downloading
398 * operations, call ecore_file_download_abort_all().
399 */
400EAPI void
401ecore_file_download_abort(Ecore_File_Download_Job *job)
402{
403 if (!job)
404 return;
405
406#ifdef BUILD_ECORE_CON
407 if (job->completion_cb)
408 job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, 1);
409# ifdef HAVE_CURL
410 ecore_con_url_free(job->url_con);
411# endif
412 _job_list = eina_list_remove(_job_list, job);
413 fclose(job->file);
414 free(job->dst);
415 free(job);
416#endif /* BUILD_ECORE_CON */
417}
418
419/**
420 * @brief Abort all downloads.
421 *
422 * This function aborts all the downloads that have been started by
423 * ecore_file_download(). It loops over the started downloads and call
424 * ecore_file_download_abort() for each of them. To abort only one
425 * specific download operation, call ecore_file_download_abort().
426 */
427EAPI void
428ecore_file_download_abort_all(void)
429{
430#ifdef BUILD_ECORE_CON
431 Ecore_File_Download_Job *job;
432
433 EINA_LIST_FREE(_job_list, job)
434 ecore_file_download_abort(job);
435#endif /* BUILD_ECORE_CON */
436}
437
438/**
439 * @}
440 */
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_monitor.c b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor.c
new file mode 100644
index 0000000..7c334c0
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor.c
@@ -0,0 +1,180 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "ecore_file_private.h"
6
7typedef enum {
8 ECORE_FILE_MONITOR_TYPE_NONE,
9#ifdef HAVE_INOTIFY
10 ECORE_FILE_MONITOR_TYPE_INOTIFY,
11#endif
12#ifdef HAVE_NOTIFY_WIN32
13 ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32,
14#endif
15#ifdef HAVE_POLL
16 ECORE_FILE_MONITOR_TYPE_POLL
17#endif
18} Ecore_File_Monitor_Type;
19
20static Ecore_File_Monitor_Type monitor_type = ECORE_FILE_MONITOR_TYPE_NONE;
21
22int
23ecore_file_monitor_init(void)
24{
25#ifdef HAVE_INOTIFY
26 monitor_type = ECORE_FILE_MONITOR_TYPE_INOTIFY;
27 if (ecore_file_monitor_inotify_init())
28 return 1;
29#endif
30#ifdef HAVE_NOTIFY_WIN32
31 monitor_type = ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32;
32 if (ecore_file_monitor_win32_init())
33 return 1;
34#endif
35#ifdef HAVE_POLL
36 monitor_type = ECORE_FILE_MONITOR_TYPE_POLL;
37 if (ecore_file_monitor_poll_init())
38 return 1;
39#endif
40 monitor_type = ECORE_FILE_MONITOR_TYPE_NONE;
41 return 0;
42}
43
44void
45ecore_file_monitor_shutdown(void)
46{
47 switch (monitor_type)
48 {
49 case ECORE_FILE_MONITOR_TYPE_NONE:
50 break;
51#ifdef HAVE_INOTIFY
52 case ECORE_FILE_MONITOR_TYPE_INOTIFY:
53 ecore_file_monitor_inotify_shutdown();
54 break;
55#endif
56#ifdef HAVE_NOTIFY_WIN32
57 case ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32:
58 ecore_file_monitor_win32_shutdown();
59 break;
60#endif
61#ifdef HAVE_POLL
62 case ECORE_FILE_MONITOR_TYPE_POLL:
63 ecore_file_monitor_poll_shutdown();
64 break;
65#endif
66 }
67}
68
69/**
70 * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
71 *
72 * @{
73 */
74
75/**
76 * @brief Monitor the given path using inotify, Windows notification, or polling.
77 *
78 * @param path The path to monitor.
79 * @param func The function to call on changes.
80 * @param data The data passed to func.
81 * @return An Ecore_File_Monitor pointer or NULL on failure.
82 *
83 * This function monitors @p path. If @p path is @c NULL, or is an
84 * empty string, or none of the notify methods (Inotify, Windows
85 * notification or polling) is available, or if @p path is not a file,
86 * the function returns @c NULL. Otherwise, it returns a newly
87 * allocated Ecore_File_Monitor object and the monitoring begins. When
88 * one of the #Ecore_File_Event event is notified, @p func is called
89 * and @p data is passed to @p func. Call ecore_file_monitor_del() to
90 * stop the monitoring.
91 */
92EAPI Ecore_File_Monitor *
93ecore_file_monitor_add(const char *path,
94 Ecore_File_Monitor_Cb func,
95 void *data)
96{
97 if (!path || !*path)
98 return NULL;
99
100 switch (monitor_type)
101 {
102 case ECORE_FILE_MONITOR_TYPE_NONE:
103 return NULL;
104#ifdef HAVE_INOTIFY
105 case ECORE_FILE_MONITOR_TYPE_INOTIFY:
106 return ecore_file_monitor_inotify_add(path, func, data);
107#endif
108#ifdef HAVE_NOTIFY_WIN32
109 case ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32:
110 return ecore_file_monitor_win32_add(path, func, data);
111#endif
112#ifdef HAVE_POLL
113 case ECORE_FILE_MONITOR_TYPE_POLL:
114 return ecore_file_monitor_poll_add(path, func, data);
115#endif
116 }
117 return NULL;
118}
119
120/**
121 * @brief Stop the monitoring of the given path.
122 *
123 * @param em The Ecore_File_Monitor to stop.
124 *
125 * This function stops the the monitoring of the path that has been
126 * monitored by ecore_file_monitor_add(). @p em must be the value
127 * returned by ecore_file_monitor_add(). If @p em is @c NULL, or none
128 * of the notify methods (Inotify, Windows notification or polling) is
129 * availablethis function does nothing.
130 */
131EAPI void
132ecore_file_monitor_del(Ecore_File_Monitor *em)
133{
134 if (!em)
135 return;
136
137 switch (monitor_type)
138 {
139 case ECORE_FILE_MONITOR_TYPE_NONE:
140 break;
141#ifdef HAVE_INOTIFY
142 case ECORE_FILE_MONITOR_TYPE_INOTIFY:
143 ecore_file_monitor_inotify_del(em);
144 break;
145#endif
146#ifdef HAVE_NOTIFY_WIN32
147 case ECORE_FILE_MONITOR_TYPE_NOTIFY_WIN32:
148 ecore_file_monitor_win32_del(em);
149 break;
150#endif
151#ifdef HAVE_POLL
152 case ECORE_FILE_MONITOR_TYPE_POLL:
153 ecore_file_monitor_poll_del(em);
154 break;
155#endif
156 }
157}
158
159/**
160 * @brief Get the monitored path.
161 *
162 * @param em The Ecore_File_Monitor to query.
163 * @return The path that is monitored by @p em.
164 *
165 * This function returns the monitored path that has been
166 * monitored by ecore_file_monitor_add(). @p em must be the value
167 * returned by ecore_file_monitor_add(). If @p em is @c NULL, the
168 * function returns @c NULL.
169 */
170EAPI const char *
171ecore_file_monitor_path_get(Ecore_File_Monitor *em)
172{
173 if (!em)
174 return NULL;
175 return em->path;
176}
177
178/**
179 * @}
180 */
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_inotify.c b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_inotify.c
new file mode 100644
index 0000000..c3533ad
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_inotify.c
@@ -0,0 +1,369 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7#include <sys/types.h>
8#include <unistd.h>
9
10#include "ecore_file_private.h"
11
12/*
13 * TODO:
14 *
15 * - Listen to these events:
16 * IN_ACCESS, IN_ATTRIB, IN_CLOSE_WRITE, IN_CLOSE_NOWRITE, IN_OPEN
17 * - Read all events first, then call the callbacks. This will prevent several
18 * callbacks with the typic save cycle (delete file, new file)
19 * - Listen to IN_IGNORED, emitted when the watch is removed
20 */
21
22#ifdef HAVE_INOTIFY
23
24#ifdef HAVE_SYS_INOTIFY
25# include <sys/inotify.h>
26#else
27# include <asm/unistd.h>
28# include <linux/inotify.h>
29#endif
30
31#ifndef HAVE_SYS_INOTIFY
32static inline int inotify_init(void);
33static inline int inotify_add_watch(int fd, const char *name, __u32 mask);
34static inline int inotify_rm_watch(int fd, __u32 wd);
35#endif
36
37
38typedef struct _Ecore_File_Monitor_Inotify Ecore_File_Monitor_Inotify;
39
40#define ECORE_FILE_MONITOR_INOTIFY(x) ((Ecore_File_Monitor_Inotify *)(x))
41
42struct _Ecore_File_Monitor_Inotify
43{
44 Ecore_File_Monitor monitor;
45 int wd;
46};
47
48static Ecore_Fd_Handler *_fdh = NULL;
49static Ecore_File_Monitor *_monitors = NULL;
50static pid_t _inotify_fd_pid = -1;
51
52static Eina_Bool _ecore_file_monitor_inotify_handler(void *data, Ecore_Fd_Handler *fdh);
53static Ecore_File_Monitor *_ecore_file_monitor_inotify_monitor_find(int wd);
54static void _ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask);
55static int _ecore_file_monitor_inotify_monitor(Ecore_File_Monitor *em, const char *path);
56#if 0
57static void _ecore_file_monitor_inotify_print(char *file, int mask);
58#endif
59
60int
61ecore_file_monitor_inotify_init(void)
62{
63 int fd;
64
65 fd = inotify_init();
66 if (fd < 0)
67 return 0;
68
69 _fdh = ecore_main_fd_handler_add(fd, ECORE_FD_READ, _ecore_file_monitor_inotify_handler,
70 NULL, NULL, NULL);
71 if (!_fdh)
72 {
73 close(fd);
74 return 0;
75 }
76
77 _inotify_fd_pid = getpid();
78 return 1;
79}
80
81int
82ecore_file_monitor_inotify_shutdown(void)
83{
84 int fd;
85
86 while(_monitors)
87 ecore_file_monitor_inotify_del(_monitors);
88
89 if (_fdh)
90 {
91 fd = ecore_main_fd_handler_fd_get(_fdh);
92 ecore_main_fd_handler_del(_fdh);
93 close(fd);
94 }
95 _inotify_fd_pid = -1;
96 return 1;
97}
98
99Ecore_File_Monitor *
100ecore_file_monitor_inotify_add(const char *path,
101 void (*func) (void *data, Ecore_File_Monitor *em,
102 Ecore_File_Event event,
103 const char *path),
104 void *data)
105{
106 Ecore_File_Monitor *em;
107 int len;
108
109 if (_inotify_fd_pid == -1) return NULL;
110
111 if (_inotify_fd_pid != getpid())
112 {
113 ecore_file_monitor_inotify_shutdown();
114 ecore_file_monitor_inotify_init();
115 }
116
117 em = calloc(1, sizeof(Ecore_File_Monitor_Inotify));
118 if (!em) return NULL;
119
120 em->func = func;
121 em->data = data;
122
123 em->path = strdup(path);
124 len = strlen(em->path);
125 if (em->path[len - 1] == '/' && strcmp(em->path, "/"))
126 em->path[len - 1] = 0;
127
128 _monitors = ECORE_FILE_MONITOR(eina_inlist_append(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
129
130 if (ecore_file_exists(em->path))
131 {
132 if (!_ecore_file_monitor_inotify_monitor(em, em->path))
133 return NULL;
134 }
135 else
136 {
137 ecore_file_monitor_inotify_del(em);
138 return NULL;
139 }
140
141 return em;
142}
143
144void
145ecore_file_monitor_inotify_del(Ecore_File_Monitor *em)
146{
147 int fd;
148
149 if (_monitors)
150 _monitors = ECORE_FILE_MONITOR(eina_inlist_remove(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
151
152 fd = ecore_main_fd_handler_fd_get(_fdh);
153 if (ECORE_FILE_MONITOR_INOTIFY(em)->wd)
154 inotify_rm_watch(fd, ECORE_FILE_MONITOR_INOTIFY(em)->wd);
155 free(em->path);
156 free(em);
157}
158
159static Eina_Bool
160_ecore_file_monitor_inotify_handler(void *data __UNUSED__, Ecore_Fd_Handler *fdh)
161{
162 Ecore_File_Monitor *em;
163 char buffer[16384];
164 struct inotify_event *event;
165 int i = 0;
166 int event_size;
167 ssize_t size;
168
169 size = read(ecore_main_fd_handler_fd_get(fdh), buffer, sizeof(buffer));
170 while (i < size)
171 {
172 event = (struct inotify_event *)&buffer[i];
173 event_size = sizeof(struct inotify_event) + event->len;
174 i += event_size;
175
176 em = _ecore_file_monitor_inotify_monitor_find(event->wd);
177 if (!em) continue;
178
179 _ecore_file_monitor_inotify_events(em, (event->len ? event->name : NULL), event->mask);
180 }
181
182 return ECORE_CALLBACK_RENEW;
183}
184
185static Ecore_File_Monitor *
186_ecore_file_monitor_inotify_monitor_find(int wd)
187{
188 Ecore_File_Monitor *l;
189
190 EINA_INLIST_FOREACH(_monitors, l)
191 {
192 if (ECORE_FILE_MONITOR_INOTIFY(l)->wd == wd)
193 return l;
194 }
195 return NULL;
196}
197
198static void
199_ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask)
200{
201 char buf[PATH_MAX];
202 int isdir;
203
204 if ((file) && (file[0]))
205 snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
206 else
207 strcpy(buf, em->path);
208 isdir = mask & IN_ISDIR;
209
210#if 0
211 _ecore_file_monitor_inotify_print(buf, mask);
212#endif
213
214 if (mask & IN_ATTRIB)
215 {
216 em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
217 }
218 if (mask & IN_CLOSE_WRITE)
219 {
220 if (!isdir)
221 em->func(em->data, em, ECORE_FILE_EVENT_CLOSED, buf);
222 }
223 if (mask & IN_MODIFY)
224 {
225 if (!isdir)
226 em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
227 }
228 if (mask & IN_MOVED_FROM)
229 {
230 if (isdir)
231 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_DIRECTORY, buf);
232 else
233 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_FILE, buf);
234 }
235 if (mask & IN_MOVED_TO)
236 {
237 if (isdir)
238 em->func(em->data, em, ECORE_FILE_EVENT_CREATED_DIRECTORY, buf);
239 else
240 em->func(em->data, em, ECORE_FILE_EVENT_CREATED_FILE, buf);
241 }
242 if (mask & IN_DELETE)
243 {
244 if (isdir)
245 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_DIRECTORY, buf);
246 else
247 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_FILE, buf);
248 }
249 if (mask & IN_CREATE)
250 {
251 if (isdir)
252 em->func(em->data, em, ECORE_FILE_EVENT_CREATED_DIRECTORY, buf);
253 else
254 em->func(em->data, em, ECORE_FILE_EVENT_CREATED_FILE, buf);
255 }
256 if (mask & IN_DELETE_SELF)
257 {
258 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
259 }
260 if (mask & IN_MOVE_SELF)
261 {
262 /* We just call delete. The dir is gone... */
263 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
264 }
265 if (mask & IN_UNMOUNT)
266 {
267 /* We just call delete. The dir is gone... */
268 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
269 }
270 if (mask & IN_IGNORED)
271 {
272 /* The watch is removed. If the file name still exists monitor the new one,
273 * else delete it */
274 if (ecore_file_exists(em->path))
275 {
276 if (!_ecore_file_monitor_inotify_monitor(em, em->path))
277 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
278 }
279 else
280 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
281 }
282}
283
284static int
285_ecore_file_monitor_inotify_monitor(Ecore_File_Monitor *em, const char *path)
286{
287 int mask =
288 IN_ATTRIB |
289 IN_CLOSE_WRITE |
290 IN_MOVED_FROM |
291 IN_MOVED_TO |
292 IN_DELETE |
293 IN_CREATE |
294 IN_MODIFY |
295 IN_DELETE_SELF |
296 IN_MOVE_SELF |
297 IN_UNMOUNT;
298
299 ECORE_FILE_MONITOR_INOTIFY(em)->wd =
300 inotify_add_watch(ecore_main_fd_handler_fd_get(_fdh), path, mask);
301 if (ECORE_FILE_MONITOR_INOTIFY(em)->wd < 0)
302 {
303 ERR("inotify_add_watch error");
304 ecore_file_monitor_inotify_del(em);
305 return 0;
306 }
307 return 1;
308}
309
310#ifndef HAVE_SYS_INOTIFY
311static inline int
312inotify_init(void)
313{
314 return syscall(__NR_inotify_init);
315}
316
317static inline int
318inotify_add_watch(int fd, const char *name, __u32 mask)
319{
320 return syscall(__NR_inotify_add_watch, fd, name, mask);
321}
322
323static inline int
324inotify_rm_watch(int fd, __u32 wd)
325{
326 return syscall(__NR_inotify_rm_watch, fd, wd);
327}
328#endif
329
330#if 0
331static void
332_ecore_file_monitor_inotify_print(char *file, int mask)
333{
334 const char *type;
335
336 if (mask & IN_ISDIR)
337 type = "dir";
338 else
339 type = "file";
340
341 if (mask & IN_ACCESS)
342 INF("Inotify accessed %s: %s", type, file);
343 if (mask & IN_MODIFY)
344 INF("Inotify modified %s: %s", type, file);
345 if (mask & IN_ATTRIB)
346 INF("Inotify attributes %s: %s", type, file);
347 if (mask & IN_CLOSE_WRITE)
348 INF("Inotify close write %s: %s", type, file);
349 if (mask & IN_CLOSE_NOWRITE)
350 INF("Inotify close write %s: %s", type, file);
351 if (mask & IN_OPEN)
352 INF("Inotify open %s: %s", type, file);
353 if (mask & IN_MOVED_FROM)
354 INF("Inotify moved from %s: %s", type, file);
355 if (mask & IN_MOVED_TO)
356 INF("Inotify moved to %s: %s", type, file);
357 if (mask & IN_DELETE)
358 INF("Inotify delete %s: %s", type, file);
359 if (mask & IN_CREATE)
360 INF("Inotify create %s: %s", type, file);
361 if (mask & IN_DELETE_SELF)
362 INF("Inotify delete self %s: %s", type, file);
363 if (mask & IN_MOVE_SELF)
364 INF("Inotify move self %s: %s", type, file);
365 if (mask & IN_UNMOUNT)
366 INF("Inotify unmount %s: %s", type, file);
367}
368#endif
369#endif /* HAVE_INOTIFY */
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_poll.c b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_poll.c
new file mode 100644
index 0000000..1f71b55
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_poll.c
@@ -0,0 +1,339 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7
8#include "ecore_file_private.h"
9
10#ifdef HAVE_POLL
11
12/*
13 * TODO:
14 * - Implement recursive as an option!
15 * - Keep whole path or just name of file? (Memory or CPU...)
16 * - Remove requests without files?
17 * - Change poll time
18 */
19
20typedef struct _Ecore_File_Monitor_Poll Ecore_File_Monitor_Poll;
21
22#define ECORE_FILE_MONITOR_POLL(x) ((Ecore_File_Monitor_Poll *)(x))
23
24struct _Ecore_File_Monitor_Poll
25{
26 Ecore_File_Monitor monitor;
27 int mtime;
28 unsigned char deleted;
29};
30
31#define ECORE_FILE_INTERVAL_MIN 1.0
32#define ECORE_FILE_INTERVAL_STEP 0.5
33#define ECORE_FILE_INTERVAL_MAX 5.0
34
35static double _interval = ECORE_FILE_INTERVAL_MIN;
36static Ecore_Timer *_timer = NULL;
37static Ecore_File_Monitor *_monitors = NULL;
38static int _lock = 0;
39
40static Eina_Bool _ecore_file_monitor_poll_handler(void *data);
41static void _ecore_file_monitor_poll_check(Ecore_File_Monitor *em);
42static int _ecore_file_monitor_poll_checking(Ecore_File_Monitor *em, char *name);
43
44int
45ecore_file_monitor_poll_init(void)
46{
47 return 1;
48}
49
50int
51ecore_file_monitor_poll_shutdown(void)
52{
53 while(_monitors)
54 ecore_file_monitor_poll_del(_monitors);
55
56 if (_timer)
57 {
58 ecore_timer_del(_timer);
59 _timer = NULL;
60 }
61 return 1;
62}
63
64Ecore_File_Monitor *
65ecore_file_monitor_poll_add(const char *path,
66 void (*func) (void *data, Ecore_File_Monitor *em,
67 Ecore_File_Event event,
68 const char *path),
69 void *data)
70{
71 Ecore_File_Monitor *em;
72 size_t len;
73
74 if (!path) return NULL;
75 if (!func) return NULL;
76
77 em = calloc(1, sizeof(Ecore_File_Monitor_Poll));
78 if (!em) return NULL;
79
80 if (!_timer)
81 _timer = ecore_timer_add(_interval, _ecore_file_monitor_poll_handler, NULL);
82 else
83 ecore_timer_interval_set(_timer, ECORE_FILE_INTERVAL_MIN);
84
85 em->path = strdup(path);
86 len = strlen(em->path);
87 if (em->path[len - 1] == '/' && strcmp(em->path, "/"))
88 em->path[len - 1] = 0;
89
90 em->func = func;
91 em->data = data;
92
93 ECORE_FILE_MONITOR_POLL(em)->mtime = ecore_file_mod_time(em->path);
94 _monitors = ECORE_FILE_MONITOR(eina_inlist_append(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
95
96 if (ecore_file_exists(em->path))
97 {
98 if (ecore_file_is_dir(em->path))
99 {
100 /* Check for subdirs */
101 Eina_List *files;
102 char *file;
103
104 files = ecore_file_ls(em->path);
105 EINA_LIST_FREE(files, file)
106 {
107 Ecore_File *f;
108 char buf[PATH_MAX];
109
110 f = calloc(1, sizeof(Ecore_File));
111 if (!f)
112 {
113 free(file);
114 continue;
115 }
116
117 snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
118 f->name = file;
119 f->mtime = ecore_file_mod_time(buf);
120 f->is_dir = ecore_file_is_dir(buf);
121 em->files = (Ecore_File *) eina_inlist_append(EINA_INLIST_GET(em->files), EINA_INLIST_GET(f));
122 }
123 }
124 }
125 else
126 {
127 ecore_file_monitor_poll_del(em);
128 return NULL;
129 }
130
131 return em;
132}
133
134void
135ecore_file_monitor_poll_del(Ecore_File_Monitor *em)
136{
137 Ecore_File *l;
138
139 if (_lock)
140 {
141 ECORE_FILE_MONITOR_POLL(em)->deleted = 1;
142 return;
143 }
144
145 /* Remove files */
146 /*It's possible there weren't any files to monitor, so check if the list is init*/
147 if (em->files)
148 {
149 for (l = em->files; l;)
150 {
151 Ecore_File *file = l;
152
153 l = (Ecore_File *) EINA_INLIST_GET(l)->next;
154 free(file->name);
155 free(file);
156 }
157 }
158
159 if (_monitors)
160 _monitors = ECORE_FILE_MONITOR(eina_inlist_remove(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
161
162 free(em->path);
163 free(em);
164
165 if (_timer)
166 {
167 if (!_monitors)
168 {
169 ecore_timer_del(_timer);
170 _timer = NULL;
171 }
172 else
173 ecore_timer_interval_set(_timer, ECORE_FILE_INTERVAL_MIN);
174 }
175}
176
177static Eina_Bool
178_ecore_file_monitor_poll_handler(void *data __UNUSED__)
179{
180 Ecore_File_Monitor *l;
181
182 _interval += ECORE_FILE_INTERVAL_STEP;
183
184 _lock = 1;
185 EINA_INLIST_FOREACH(_monitors, l)
186 _ecore_file_monitor_poll_check(l);
187 _lock = 0;
188
189 if (_interval > ECORE_FILE_INTERVAL_MAX)
190 _interval = ECORE_FILE_INTERVAL_MAX;
191 ecore_timer_interval_set(_timer, _interval);
192
193 for (l = _monitors; l;)
194 {
195 Ecore_File_Monitor *em = l;
196
197 l = ECORE_FILE_MONITOR(EINA_INLIST_GET(l)->next);
198 if (ECORE_FILE_MONITOR_POLL(em)->deleted)
199 ecore_file_monitor_del(em);
200 }
201 return ECORE_CALLBACK_RENEW;
202}
203
204static void
205_ecore_file_monitor_poll_check(Ecore_File_Monitor *em)
206{
207 int mtime;
208
209 mtime = ecore_file_mod_time(em->path);
210 if (mtime < ECORE_FILE_MONITOR_POLL(em)->mtime)
211 {
212 Ecore_File *l;
213 Ecore_File_Event event;
214
215 /* Notify all files deleted */
216 for (l = em->files; l;)
217 {
218 Ecore_File *f = l;
219 char buf[PATH_MAX];
220
221 l = (Ecore_File *) EINA_INLIST_GET(l)->next;
222
223 snprintf(buf, sizeof(buf), "%s/%s", em->path, f->name);
224 if (f->is_dir)
225 event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
226 else
227 event = ECORE_FILE_EVENT_DELETED_FILE;
228 em->func(em->data, em, event, buf);
229 free(f->name);
230 free(f);
231 }
232 em->files = NULL;
233 em->func(em->data, em, ECORE_FILE_EVENT_DELETED_SELF, em->path);
234 _interval = ECORE_FILE_INTERVAL_MIN;
235 }
236 else
237 {
238 Ecore_File *l;
239
240 /* Check for changed files */
241 for (l = em->files; l;)
242 {
243 Ecore_File *f = l;
244 char buf[PATH_MAX];
245 int mt;
246 Ecore_File_Event event;
247
248 l = (Ecore_File *) EINA_INLIST_GET(l)->next;
249
250 snprintf(buf, sizeof(buf), "%s/%s", em->path, f->name);
251 mt = ecore_file_mod_time(buf);
252 if (mt < f->mtime)
253 {
254 if (f->is_dir)
255 event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
256 else
257 event = ECORE_FILE_EVENT_DELETED_FILE;
258
259 em->func(em->data, em, event, buf);
260 em->files = (Ecore_File *) eina_inlist_remove(EINA_INLIST_GET(em->files), EINA_INLIST_GET(f));
261 free(f->name);
262 free(f);
263 _interval = ECORE_FILE_INTERVAL_MIN;
264 }
265 else if ((mt > f->mtime) && !(f->is_dir))
266 {
267 em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
268 _interval = ECORE_FILE_INTERVAL_MIN;
269 f->mtime = mt;
270 }
271 else
272 f->mtime = mt;
273 }
274
275 /* Check for new files */
276 if (ECORE_FILE_MONITOR_POLL(em)->mtime < mtime)
277 {
278 Eina_List *files;
279 Eina_List *fl;
280 char *file;
281
282 /* Files have been added or removed */
283 files = ecore_file_ls(em->path);
284 if (files)
285 {
286 /* Are we a directory? We should check first, rather than rely on null here*/
287 EINA_LIST_FOREACH(files, fl, file)
288 {
289 Ecore_File *f;
290 char buf[PATH_MAX];
291 Ecore_File_Event event;
292
293 if (_ecore_file_monitor_poll_checking(em, file))
294 continue;
295
296 snprintf(buf, sizeof(buf), "%s/%s", em->path, file);
297 f = calloc(1, sizeof(Ecore_File));
298 if (!f)
299 continue;
300
301 f->name = strdup(file);
302 f->mtime = ecore_file_mod_time(buf);
303 f->is_dir = ecore_file_is_dir(buf);
304 if (f->is_dir)
305 event = ECORE_FILE_EVENT_CREATED_DIRECTORY;
306 else
307 event = ECORE_FILE_EVENT_CREATED_FILE;
308 em->func(em->data, em, event, buf);
309 em->files = (Ecore_File *) eina_inlist_append(EINA_INLIST_GET(em->files), EINA_INLIST_GET(f));
310 }
311 while (files)
312 {
313 file = eina_list_data_get(files);
314 free(file);
315 files = eina_list_remove_list(files, files);
316 }
317 }
318
319 if (!ecore_file_is_dir(em->path))
320 em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, em->path);
321 _interval = ECORE_FILE_INTERVAL_MIN;
322 }
323 }
324 ECORE_FILE_MONITOR_POLL(em)->mtime = mtime;
325}
326
327static int
328_ecore_file_monitor_poll_checking(Ecore_File_Monitor *em, char *name)
329{
330 Ecore_File *l;
331
332 EINA_INLIST_FOREACH(em->files, l)
333 {
334 if (!strcmp(l->name, name))
335 return 1;
336 }
337 return 0;
338}
339#endif
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_win32.c b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_win32.c
new file mode 100644
index 0000000..7f3af09
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_monitor_win32.c
@@ -0,0 +1,310 @@
1/*
2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8
9#ifdef HAVE_NOTIFY_WIN32
10
11# define WIN32_LEAN_AND_MEAN
12# include <windows.h>
13# undef WIN32_LEAN_AND_MEAN
14# include <process.h>
15
16# include "ecore_file_private.h"
17
18
19typedef struct _Ecore_File_Monitor_Win32 Ecore_File_Monitor_Win32;
20typedef struct _Ecore_File_Monitor_Win32_Data Ecore_File_Monitor_Win32_Data;
21
22/* 4096 = 256 * sizeof(FILE_NOTIFY_INFORMATION) */
23# define ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE 4096
24# define ECORE_FILE_MONITOR_WIN32(x) ((Ecore_File_Monitor_Win32 *)(x))
25
26struct _Ecore_File_Monitor_Win32_Data
27{
28 char buffer[ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE];
29 OVERLAPPED overlapped;
30 HANDLE handle;
31 HANDLE event;
32 Ecore_File_Monitor *monitor;
33 Ecore_Win32_Handler *h;
34 DWORD buf_length;
35 int is_dir;
36};
37
38struct _Ecore_File_Monitor_Win32
39{
40 Ecore_File_Monitor monitor;
41 Ecore_File_Monitor_Win32_Data *file;
42 Ecore_File_Monitor_Win32_Data *dir;
43};
44
45static Ecore_File_Monitor *_monitors = NULL;
46
47static Eina_Bool _ecore_file_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh);
48
49
50static Ecore_File_Monitor_Win32_Data *
51_ecore_file_monitor_win32_data_new(Ecore_File_Monitor *monitor, int type)
52{
53 Ecore_File_Monitor_Win32_Data *md;
54 DWORD filter;
55
56 md = (Ecore_File_Monitor_Win32_Data *)calloc(1, sizeof(Ecore_File_Monitor_Win32_Data));
57 if (!md) return NULL;
58
59 md->handle = CreateFile(monitor->path,
60 FILE_LIST_DIRECTORY,
61 FILE_SHARE_READ |
62 FILE_SHARE_WRITE,
63 NULL,
64 OPEN_EXISTING,
65 FILE_FLAG_BACKUP_SEMANTICS |
66 FILE_FLAG_OVERLAPPED,
67 NULL);
68 if (md->handle == INVALID_HANDLE_VALUE)
69 goto free_md;
70
71 md->event = CreateEvent(NULL, FALSE, FALSE, NULL);
72 if (!md->event)
73 goto close_handle;
74
75 ZeroMemory (&md->overlapped, sizeof(md->overlapped));
76 md->overlapped.hEvent = md->event;
77
78 filter = (type == 0) ? FILE_NOTIFY_CHANGE_FILE_NAME : FILE_NOTIFY_CHANGE_DIR_NAME;
79 filter |=
80 FILE_NOTIFY_CHANGE_ATTRIBUTES |
81 FILE_NOTIFY_CHANGE_SIZE |
82 FILE_NOTIFY_CHANGE_LAST_WRITE |
83 FILE_NOTIFY_CHANGE_LAST_ACCESS |
84 FILE_NOTIFY_CHANGE_CREATION |
85 FILE_NOTIFY_CHANGE_SECURITY;
86
87 if (!ReadDirectoryChangesW(md->handle,
88 md->buffer,
89 ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE,
90 FALSE,
91 filter,
92 &md->buf_length,
93 &md->overlapped,
94 NULL))
95 goto close_event;
96
97 md->h = ecore_main_win32_handler_add(md->event,
98 _ecore_file_monitor_win32_cb,
99 md);
100 if (!md->h)
101 goto close_event;
102
103 md->monitor = monitor;
104 md->is_dir = type;
105
106 return md;
107
108 close_event:
109 CloseHandle(md->event);
110 close_handle:
111 CloseHandle(md->handle);
112 free_md:
113 free(md);
114
115 return NULL;
116}
117
118static void
119_ecore_file_monitor_win32_data_free(Ecore_File_Monitor_Win32_Data *md)
120{
121 if (!md) return;
122
123 CloseHandle(md->event);
124 CloseHandle (md->handle);
125 free (md);
126}
127
128static Eina_Bool
129_ecore_file_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh)
130{
131 char filename[PATH_MAX];
132 PFILE_NOTIFY_INFORMATION fni;
133 Ecore_File_Monitor_Win32_Data *md;
134 wchar_t *wname;
135 char *name;
136 DWORD filter;
137 DWORD offset;
138 DWORD buf_length;
139 Ecore_File_Event event = ECORE_FILE_EVENT_NONE;
140
141 md = (Ecore_File_Monitor_Win32_Data *)data;
142
143 if (!GetOverlappedResult (md->handle, &md->overlapped, &buf_length, TRUE))
144 return 1;
145
146 fni = (PFILE_NOTIFY_INFORMATION)md->buffer;
147 do {
148 if (!fni)
149 break;
150 offset = fni->NextEntryOffset;
151
152 wname = (wchar_t *)malloc(sizeof(wchar_t) * (fni->FileNameLength + 1));
153 if (!wname)
154 return 0;
155
156 memcpy(wname, fni->FileName, fni->FileNameLength);
157 wname[fni->FileNameLength]='\0';
158 name = evil_wchar_to_char(wname);
159 free(wname);
160 if (!name)
161 return 0;
162
163 _snprintf(filename, PATH_MAX, "%s\\%s", md->monitor->path, name);
164 free(name);
165
166 switch (fni->Action)
167 {
168 case FILE_ACTION_ADDED:
169 if (md->is_dir)
170 event = ECORE_FILE_EVENT_CREATED_DIRECTORY;
171 else
172 event = ECORE_FILE_EVENT_CREATED_FILE;
173 break;
174 case FILE_ACTION_REMOVED:
175 if (md->is_dir)
176 event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
177 else
178 event = ECORE_FILE_EVENT_DELETED_FILE;
179 break;
180 case FILE_ACTION_MODIFIED:
181 if (!md->is_dir)
182 event = ECORE_FILE_EVENT_MODIFIED;
183 break;
184 case FILE_ACTION_RENAMED_OLD_NAME:
185 if (md->is_dir)
186 event = ECORE_FILE_EVENT_DELETED_DIRECTORY;
187 else
188 event = ECORE_FILE_EVENT_DELETED_FILE;
189 break;
190 case FILE_ACTION_RENAMED_NEW_NAME:
191 if (md->is_dir)
192 event = ECORE_FILE_EVENT_CREATED_DIRECTORY;
193 else
194 event = ECORE_FILE_EVENT_CREATED_FILE;
195 break;
196 default:
197 fprintf(stderr, "unknown event\n");
198 event = ECORE_FILE_EVENT_NONE;
199 break;
200 }
201 if (event != ECORE_FILE_EVENT_NONE)
202 md->monitor->func(md->monitor->data, md->monitor, event, filename);
203
204 fni = (PFILE_NOTIFY_INFORMATION)((LPBYTE)fni + offset);
205 } while (offset);
206
207 filter = (md->is_dir == 0) ? FILE_NOTIFY_CHANGE_FILE_NAME : FILE_NOTIFY_CHANGE_DIR_NAME;
208 filter |=
209 FILE_NOTIFY_CHANGE_ATTRIBUTES |
210 FILE_NOTIFY_CHANGE_SIZE |
211 FILE_NOTIFY_CHANGE_LAST_WRITE |
212 FILE_NOTIFY_CHANGE_LAST_ACCESS |
213 FILE_NOTIFY_CHANGE_CREATION |
214 FILE_NOTIFY_CHANGE_SECURITY;
215
216 ReadDirectoryChangesW(md->handle,
217 md->buffer,
218 ECORE_FILE_MONITOR_WIN32_BUFFER_SIZE,
219 FALSE,
220 filter,
221 &md->buf_length,
222 &md->overlapped,
223 NULL);
224 return 1;
225}
226
227int
228ecore_file_monitor_win32_init(void)
229{
230 return 1;
231}
232
233int
234ecore_file_monitor_win32_shutdown(void)
235{
236 return 1;
237}
238
239Ecore_File_Monitor *
240ecore_file_monitor_win32_add(const char *path,
241 void (*func) (void *data, Ecore_File_Monitor *em,
242 Ecore_File_Event event,
243 const char *path),
244 void *data)
245{
246 Ecore_File_Monitor_Win32 *m;
247 Ecore_File_Monitor *em;
248 size_t len;
249
250 if (!path || (*path == '\0')) return NULL;
251 if (!ecore_file_exists(path) || !ecore_file_is_dir(path))
252 return NULL;
253 if (!func) return NULL;
254
255 em = (Ecore_File_Monitor *)calloc(1, sizeof(Ecore_File_Monitor_Win32));
256 if (!em) return NULL;
257
258 em->func = func;
259 em->data = data;
260
261 em->path = strdup(path);
262 if (!em->path)
263 {
264 free(em);
265 return NULL;
266 }
267 len = strlen(em->path);
268 if (em->path[len - 1] == '/' || em->path[len - 1] == '\\')
269 em->path[len - 1] = '\0';
270
271 m = ECORE_FILE_MONITOR_WIN32(em);
272
273 m->file = _ecore_file_monitor_win32_data_new(em, 0);
274 if (!m->file)
275 {
276 free(em->path);
277 free(em);
278 return NULL;
279 }
280
281 m->dir = _ecore_file_monitor_win32_data_new(em, 1);
282 if (!m->dir)
283 {
284 _ecore_file_monitor_win32_data_free(m->file);
285 free(em->path);
286 free(em);
287 return NULL;
288 }
289
290 _monitors = ECORE_FILE_MONITOR(eina_inlist_append(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em)));
291
292 return em;
293}
294
295void
296ecore_file_monitor_win32_del(Ecore_File_Monitor *em)
297{
298 Ecore_File_Monitor_Win32 *m;
299
300 if (!em)
301 return;
302
303 m = ECORE_FILE_MONITOR_WIN32(em);
304 _ecore_file_monitor_win32_data_free(m->dir);
305 _ecore_file_monitor_win32_data_free(m->file);
306 free(em->path);
307 free(em);
308}
309
310#endif
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_path.c b/libraries/ecore/src/lib/ecore_file/ecore_file_path.c
new file mode 100644
index 0000000..ade3bc6
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_path.c
@@ -0,0 +1,184 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#undef alloca
6#ifdef HAVE_ALLOCA_H
7# include <alloca.h>
8#elif defined __GNUC__
9# define alloca __builtin_alloca
10#elif defined _AIX
11# define alloca __alloca
12#elif defined _MSC_VER
13# include <malloc.h>
14# define alloca _alloca
15#else
16# include <stddef.h>
17# ifdef __cplusplus
18extern "C"
19# endif
20void *alloca (size_t);
21#endif
22
23#include <stdio.h>
24#include <string.h>
25
26#include "ecore_file_private.h"
27
28static Eina_List *__ecore_file_path_bin = NULL;
29
30static Eina_List *_ecore_file_path_from_env(const char *env);
31
32void
33ecore_file_path_init(void)
34{
35 __ecore_file_path_bin = _ecore_file_path_from_env("PATH");
36}
37
38void
39ecore_file_path_shutdown(void)
40{
41 char *dir;
42
43 EINA_LIST_FREE(__ecore_file_path_bin, dir)
44 eina_stringshare_del(dir);
45}
46
47Eina_List *
48_ecore_file_path_from_env(const char *env)
49{
50 Eina_List *path = NULL;
51 char *env_tmp, *env_path, *p, *last;
52
53 env_tmp = getenv(env);
54 if (!env_tmp)
55 return path;
56
57 env_path = alloca(sizeof(char) * strlen(env_tmp) + 1);
58 memset(env_path, 0, strlen(env_tmp));
59 strcpy(env_path, env_tmp);
60 last = env_path;
61 for (p = env_path; *p; p++)
62 {
63 if (*p == ':')
64 *p = '\0';
65
66 if (!*p)
67 {
68 if (!ecore_file_path_dir_exists(last))
69 path = eina_list_append(path, eina_stringshare_add(last));
70 last = p + 1;
71 }
72 }
73 if (p > last)
74 path = eina_list_append(path, eina_stringshare_add(last));
75
76 return path;
77}
78
79/**
80 * @addtogroup Ecore_File_Group Ecore_File - Files and directories convenience functions
81 *
82 * @{
83 */
84
85/**
86 * @brief Check if the given directory is in PATH.
87 *
88 * @param The name of the directory to search in PATH.
89 * @return EINA_TRUE if the directory exist in PATH, EINA_FALSE otherwise.
90 *
91 * This function checks if @p in_dir is in the environment variable
92 * PATH. If @p in_dir is @c NULL, or if PATH is empty, or @p in_dir is
93 * not in PATH, the function returns EINA_FALSE, otherwise it returns
94 * EINA_TRUE.
95 */
96EAPI Eina_Bool
97ecore_file_path_dir_exists(const char *in_dir)
98{
99 Eina_List *l;
100 char *dir;
101
102 if (!in_dir)
103 return EINA_FALSE;
104
105 if (!__ecore_file_path_bin) return EINA_FALSE;
106 EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
107 {
108 if (strcmp(dir, in_dir))
109 return EINA_TRUE;
110 }
111
112 return EINA_FALSE;
113}
114
115/**
116 * @brief Check if the given application is installed.
117 *
118 * @param exe The name of the application
119 * @return EINA_TRUE if the exe is in PATH and is executable,
120 * EINA_FALSE otherwise.
121 *
122 *
123 * This function checks if @p exe exists in PATH and is executable. If
124 * @p exe is @c NULL or is not executable, the function returns
125 * EINA_FALSE, otherwise it returns EINA_TRUE.
126 */
127EAPI Eina_Bool
128ecore_file_app_installed(const char *exe)
129{
130 Eina_List *l;
131 char *dir;
132 char buf[PATH_MAX];
133
134 if (!exe) return EINA_FALSE;
135 if (ecore_file_can_exec(exe)) return EINA_TRUE;
136
137 EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
138 {
139 snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
140 if (ecore_file_can_exec(buf))
141 return EINA_TRUE;
142 }
143
144 return EINA_FALSE;
145}
146
147/**
148 * @brief Get a list of all the applications installed on the system.
149 *
150 * @return An Eina_List containing all the executable files in the
151 * system.
152 *
153 * This function returns a list of allocated strings of all the
154 * executable files. If no files are found, the function returns
155 * @c NULL. When not needed anymore, the element of the list must be
156 * freed.
157 */
158EAPI Eina_List *
159ecore_file_app_list(void)
160{
161 Eina_List *list = NULL;
162 Eina_List *files;
163 Eina_List *l;
164 char buf[PATH_MAX], *dir, *exe;
165
166 EINA_LIST_FOREACH(__ecore_file_path_bin, l, dir)
167 {
168 files = ecore_file_ls(dir);
169 EINA_LIST_FREE(files, exe)
170 {
171 snprintf(buf, sizeof(buf), "%s/%s", dir, exe);
172 if ((ecore_file_can_exec(buf)) &&
173 (!ecore_file_is_dir(buf)))
174 list = eina_list_append(list, strdup(buf));
175 free(exe);
176 }
177 }
178
179 return list;
180}
181
182/**
183 * @}
184 */
diff --git a/libraries/ecore/src/lib/ecore_file/ecore_file_private.h b/libraries/ecore/src/lib/ecore_file/ecore_file_private.h
new file mode 100644
index 0000000..45d2cbd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_file/ecore_file_private.h
@@ -0,0 +1,129 @@
1#ifndef ECORE_FILE_PRIVATE_H_
2#define ECORE_FILE_PRIVATE_H_
3
4#ifdef __linux__
5# include <features.h>
6#endif
7
8#ifdef HAVE_EVIL
9# include <Evil.h>
10#endif
11
12#ifdef HAVE_ESCAPE
13# include <Escape.h>
14#endif
15
16#include <sys/types.h>
17#include <sys/stat.h>
18
19#include "Ecore.h"
20#include "ecore_private.h"
21
22#include "Ecore_File.h"
23
24extern int _ecore_file_log_dom;
25
26#ifdef ECORE_FILE_DEFAULT_LOG_COLOR
27#undef ECORE_FILE_DEFAULT_LOG_COLOR
28#endif
29#define ECORE_FILE_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
30
31#ifdef ERR
32# undef ERR
33#endif
34#define ERR(...) EINA_LOG_DOM_ERR(_ecore_file_log_dom, __VA_ARGS__)
35
36#ifdef DBG
37# undef DBG
38#endif
39#define DBG(...) EINA_LOG_DOM_DBG(_ecore_file_log_dom, __VA_ARGS__)
40
41#ifdef INF
42# undef INF
43#endif
44#define INF(...) EINA_LOG_DOM_INFO(_ecore_file_log_dom, __VA_ARGS__)
45
46#ifdef WRN
47# undef WRN
48#endif
49#define WRN(...) EINA_LOG_DOM_WARN(_ecore_file_log_dom, __VA_ARGS__)
50
51#ifdef CRIT
52# undef CRIT
53#endif
54#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_file_log_dom, __VA_ARGS__)
55
56/* ecore_file_monitor */
57int ecore_file_monitor_init(void);
58void ecore_file_monitor_shutdown(void);
59
60#define ECORE_FILE_MONITOR(x) ((Ecore_File_Monitor *)(x))
61
62typedef struct _Ecore_File Ecore_File;
63struct _Ecore_File
64{
65 EINA_INLIST;
66 char *name;
67 int mtime;
68 unsigned char is_dir;
69};
70
71struct _Ecore_File_Monitor
72{
73 EINA_INLIST;
74 void (*func) (void *data,
75 Ecore_File_Monitor *ecore_file_monitor,
76 Ecore_File_Event event,
77 const char *path);
78
79 char *path;
80 void *data;
81 Ecore_File *files;
82};
83
84#ifdef HAVE_INOTIFY
85int ecore_file_monitor_inotify_init(void);
86int ecore_file_monitor_inotify_shutdown(void);
87Ecore_File_Monitor *ecore_file_monitor_inotify_add(const char *path,
88 void (*func) (void *data,
89 Ecore_File_Monitor *ecore_file_monitor,
90 Ecore_File_Event event,
91 const char *path),
92 void *data);
93void ecore_file_monitor_inotify_del(Ecore_File_Monitor *ecore_file_monitor);
94#endif
95
96#ifdef HAVE_NOTIFY_WIN32
97int ecore_file_monitor_win32_init(void);
98int ecore_file_monitor_win32_shutdown(void);
99Ecore_File_Monitor *ecore_file_monitor_win32_add(const char *path,
100 void (*func) (void *data,
101 Ecore_File_Monitor *ecore_file_monitor,
102 Ecore_File_Event event,
103 const char *path),
104 void *data);
105void ecore_file_monitor_win32_del(Ecore_File_Monitor *ecore_file_monitor);
106#endif
107
108#ifdef HAVE_POLL
109int ecore_file_monitor_poll_init(void);
110int ecore_file_monitor_poll_shutdown(void);
111Ecore_File_Monitor *ecore_file_monitor_poll_add(const char *path,
112 void (*func) (void *data,
113 Ecore_File_Monitor *ecore_file_monitor,
114 Ecore_File_Event event,
115 const char *path),
116 void *data);
117void ecore_file_monitor_poll_del(Ecore_File_Monitor *ecore_file_monitor);
118
119#endif
120
121/* ecore_file_path */
122void ecore_file_path_init(void);
123void ecore_file_path_shutdown(void);
124
125/* ecore_file_download */
126int ecore_file_download_init(void);
127void ecore_file_download_shutdown(void);
128
129#endif
diff --git a/libraries/ecore/src/lib/ecore_imf/Ecore_IMF.h b/libraries/ecore/src/lib/ecore_imf/Ecore_IMF.h
new file mode 100644
index 0000000..21df2a0
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/Ecore_IMF.h
@@ -0,0 +1,418 @@
1#ifndef _ECORE_IMF_H
2#define _ECORE_IMF_H
3
4#include <Eina.h>
5
6#ifdef EAPI
7# undef EAPI
8#endif
9
10#ifdef _WIN32
11# ifdef EFL_ECORE_IMF_BUILD
12# ifdef DLL_EXPORT
13# define EAPI __declspec(dllexport)
14# else
15# define EAPI
16# endif /* ! DLL_EXPORT */
17# else
18# define EAPI __declspec(dllimport)
19# endif /* ! EFL_ECORE_IMF_BUILD */
20#else
21# ifdef __GNUC__
22# if __GNUC__ >= 4
23# define EAPI __attribute__ ((visibility("default")))
24# else
25# define EAPI
26# endif
27# else
28# define EAPI
29# endif
30#endif /* ! _WIN32 */
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36/* Events sent by the Input Method */
37typedef struct _Ecore_IMF_Event_Preedit_Start Ecore_IMF_Event_Preedit_Start;
38typedef struct _Ecore_IMF_Event_Preedit_End Ecore_IMF_Event_Preedit_End;
39typedef struct _Ecore_IMF_Event_Preedit_Changed Ecore_IMF_Event_Preedit_Changed;
40typedef struct _Ecore_IMF_Event_Commit Ecore_IMF_Event_Commit;
41typedef struct _Ecore_IMF_Event_Delete_Surrounding Ecore_IMF_Event_Delete_Surrounding;
42
43/* Events to filter */
44typedef struct _Ecore_IMF_Event_Mouse_Down Ecore_IMF_Event_Mouse_Down;
45typedef struct _Ecore_IMF_Event_Mouse_Up Ecore_IMF_Event_Mouse_Up;
46typedef struct _Ecore_IMF_Event_Mouse_In Ecore_IMF_Event_Mouse_In;
47typedef struct _Ecore_IMF_Event_Mouse_Out Ecore_IMF_Event_Mouse_Out;
48typedef struct _Ecore_IMF_Event_Mouse_Move Ecore_IMF_Event_Mouse_Move;
49typedef struct _Ecore_IMF_Event_Mouse_Wheel Ecore_IMF_Event_Mouse_Wheel;
50typedef struct _Ecore_IMF_Event_Key_Down Ecore_IMF_Event_Key_Down;
51typedef struct _Ecore_IMF_Event_Key_Up Ecore_IMF_Event_Key_Up;
52typedef union _Ecore_IMF_Event Ecore_IMF_Event;
53
54typedef struct _Ecore_IMF_Context Ecore_IMF_Context; /**< An Input Method Context */
55typedef struct _Ecore_IMF_Context_Class Ecore_IMF_Context_Class; /**< An Input Method Context class */
56typedef struct _Ecore_IMF_Context_Info Ecore_IMF_Context_Info; /**< An Input Method Context info */
57
58/* Preedit attribute info */
59typedef struct _Ecore_IMF_Preedit_Attr Ecore_IMF_Preedit_Attr;
60
61EAPI extern int ECORE_IMF_EVENT_PREEDIT_START;
62EAPI extern int ECORE_IMF_EVENT_PREEDIT_END;
63EAPI extern int ECORE_IMF_EVENT_PREEDIT_CHANGED;
64EAPI extern int ECORE_IMF_EVENT_COMMIT;
65EAPI extern int ECORE_IMF_EVENT_DELETE_SURROUNDING;
66
67typedef enum
68{
69 ECORE_IMF_EVENT_MOUSE_DOWN,
70 ECORE_IMF_EVENT_MOUSE_UP,
71 ECORE_IMF_EVENT_MOUSE_IN,
72 ECORE_IMF_EVENT_MOUSE_OUT,
73 ECORE_IMF_EVENT_MOUSE_MOVE,
74 ECORE_IMF_EVENT_MOUSE_WHEEL,
75 ECORE_IMF_EVENT_KEY_DOWN,
76 ECORE_IMF_EVENT_KEY_UP
77} Ecore_IMF_Event_Type;
78
79typedef enum
80{
81 ECORE_IMF_KEYBOARD_MODIFIER_NONE = 0, /**< No active modifiers */
82 ECORE_IMF_KEYBOARD_MODIFIER_CTRL = 1 << 0, /**< "Control" is pressed */
83 ECORE_IMF_KEYBOARD_MODIFIER_ALT = 1 << 1, /**< "Alt" is pressed */
84 ECORE_IMF_KEYBOARD_MODIFIER_SHIFT = 1 << 2, /**< "Shift" is pressed */
85 ECORE_IMF_KEYBOARD_MODIFIER_WIN = 1 << 3 /**< "Win" (between "Ctrl" and "Alt") is pressed */
86} Ecore_IMF_Keyboard_Modifiers;
87
88typedef enum
89{
90 ECORE_IMF_KEYBOARD_LOCK_NONE = 0, /**< No locks are active */
91 ECORE_IMF_KEYBOARD_LOCK_NUM = 1 << 0, /**< "Num" lock is active */
92 ECORE_IMF_KEYBOARD_LOCK_CAPS = 1 << 1, /**< "Caps" lock is active */
93 ECORE_IMF_KEYBOARD_LOCK_SCROLL = 1 << 2 /**< "Scroll" lock is active */
94} Ecore_IMF_Keyboard_Locks;
95
96typedef enum
97{
98 ECORE_IMF_MOUSE_NONE = 0, /**< A single click */
99 ECORE_IMF_MOUSE_DOUBLE_CLICK = 1 << 0, /**< A double click */
100 ECORE_IMF_MOUSE_TRIPLE_CLICK = 1 << 1 /**< A triple click */
101} Ecore_IMF_Mouse_Flags;
102
103typedef enum
104{
105 ECORE_IMF_INPUT_MODE_ALPHA = 1 << 0,
106 ECORE_IMF_INPUT_MODE_NUMERIC = 1 << 1,
107 ECORE_IMF_INPUT_MODE_SPECIAL = 1 << 2,
108 ECORE_IMF_INPUT_MODE_HEXA = 1 << 3,
109 ECORE_IMF_INPUT_MODE_TELE = 1 << 4,
110 ECORE_IMF_INPUT_MODE_FULL = (ECORE_IMF_INPUT_MODE_ALPHA | ECORE_IMF_INPUT_MODE_NUMERIC | ECORE_IMF_INPUT_MODE_SPECIAL),
111 ECORE_IMF_INPUT_MODE_INVISIBLE = 1 << 29,
112 ECORE_IMF_INPUT_MODE_AUTOCAP = 1 << 30
113} Ecore_IMF_Input_Mode;
114
115typedef enum
116{
117 ECORE_IMF_PREEDIT_TYPE_NONE,
118 ECORE_IMF_PREEDIT_TYPE_SUB1,
119 ECORE_IMF_PREEDIT_TYPE_SUB2,
120 ECORE_IMF_PREEDIT_TYPE_SUB3
121} Ecore_IMF_Preedit_Type;
122
123typedef enum
124{
125 ECORE_IMF_AUTOCAPITAL_TYPE_NONE,
126 ECORE_IMF_AUTOCAPITAL_TYPE_WORD,
127 ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE,
128 ECORE_IMF_AUTOCAPITAL_TYPE_ALLCHARACTER
129} Ecore_IMF_Autocapital_Type;
130
131typedef enum
132{
133 ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL, /**< Default layout */
134 ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER, /**< Number layout */
135 ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL, /**< Email layout */
136 ECORE_IMF_INPUT_PANEL_LAYOUT_URL, /**< URL layout */
137 ECORE_IMF_INPUT_PANEL_LAYOUT_PHONENUMBER, /**< Phone Number layout */
138 ECORE_IMF_INPUT_PANEL_LAYOUT_IP, /**< IP layout */
139 ECORE_IMF_INPUT_PANEL_LAYOUT_MONTH, /**< Month layout */
140 ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBERONLY, /**< Number Only layout */
141 ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID
142} Ecore_IMF_Input_Panel_Layout;
143
144typedef enum
145{
146 ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC, /**< Automatic */
147 ECORE_IMF_INPUT_PANEL_LANG_ALPHABET /**< Alphabet */
148} Ecore_IMF_Input_Panel_Lang;
149
150struct _Ecore_IMF_Event_Preedit_Start
151{
152 Ecore_IMF_Context *ctx;
153};
154
155struct _Ecore_IMF_Event_Preedit_End
156{
157 Ecore_IMF_Context *ctx;
158};
159
160struct _Ecore_IMF_Event_Preedit_Changed
161{
162 Ecore_IMF_Context *ctx;
163};
164
165struct _Ecore_IMF_Event_Commit
166{
167 Ecore_IMF_Context *ctx;
168 char *str;
169};
170
171struct _Ecore_IMF_Event_Delete_Surrounding
172{
173 Ecore_IMF_Context *ctx;
174 int offset;
175 int n_chars;
176};
177
178struct _Ecore_IMF_Event_Mouse_Down
179{
180 int button; /**< The button which has been pressed */
181 struct {
182 int x, y;
183 } output;
184 struct {
185 int x, y;
186 } canvas;
187 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
188 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
189 Ecore_IMF_Mouse_Flags flags; /**< The flags corresponding the mouse click (single, double or triple click) */
190 unsigned int timestamp; /**< The timestamp when the event occurred */
191};
192
193struct _Ecore_IMF_Event_Mouse_Up
194{
195 int button; /**< The button which has been pressed */
196 struct {
197 int x, y;
198 } output;
199 struct {
200 int x, y;
201 } canvas;
202 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
203 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
204 Ecore_IMF_Mouse_Flags flags; /**< The flags corresponding the mouse click (single, double or triple click) */
205 unsigned int timestamp; /**< The timestamp when the event occurred */
206};
207
208struct _Ecore_IMF_Event_Mouse_In
209{
210 int buttons;
211 struct {
212 int x, y;
213 } output;
214 struct {
215 int x, y;
216 } canvas;
217 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
218 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
219 unsigned int timestamp; /**< The timestamp when the event occurred */
220};
221
222struct _Ecore_IMF_Event_Mouse_Out
223{
224 int buttons;
225 struct {
226 int x, y;
227 } output;
228 struct {
229 int x, y;
230 } canvas;
231 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
232 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
233 unsigned int timestamp; /**< The timestamp when the event occurred */
234};
235
236struct _Ecore_IMF_Event_Mouse_Move
237{
238 int buttons;
239 struct {
240 struct {
241 int x, y;
242 } output;
243 struct {
244 int x, y;
245 } canvas;
246 } cur, prev;
247 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
248 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
249 unsigned int timestamp; /**< The timestamp when the event occurred */
250};
251
252struct _Ecore_IMF_Event_Mouse_Wheel
253{
254 int direction; /* 0 = default up/down wheel */
255 int z; /* ...,-2,-1 = down, 1,2,... = up */
256 struct {
257 int x, y;
258 } output;
259 struct {
260 int x, y;
261 } canvas;
262 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
263 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
264 unsigned int timestamp; /**< The timestamp when the event occurred */
265};
266
267struct _Ecore_IMF_Event_Key_Down
268{
269 const char *keyname; /**< The string name of the key pressed */
270 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
271 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
272 const char *key; /**< The logical key : (eg shift+1 == exclamation) */
273 const char *string; /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
274 const char *compose; /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
275 unsigned int timestamp; /**< The timestamp when the event occurred */
276};
277
278struct _Ecore_IMF_Event_Key_Up
279{
280 const char *keyname; /**< The string name of the key pressed */
281 Ecore_IMF_Keyboard_Modifiers modifiers; /**< The keyboard modifiers active when the event has been emitted */
282 Ecore_IMF_Keyboard_Locks locks; /**< The keyboard locks active when the event has been emitted */
283 const char *key; /**< The logical key : (eg shift+1 == exclamation) */
284 const char *string; /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */
285 const char *compose; /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */
286 unsigned int timestamp; /**< The timestamp when the event occurred */
287};
288
289union _Ecore_IMF_Event
290{
291 Ecore_IMF_Event_Mouse_Down mouse_down;
292 Ecore_IMF_Event_Mouse_Up mouse_up;
293 Ecore_IMF_Event_Mouse_In mouse_in;
294 Ecore_IMF_Event_Mouse_Out mouse_out;
295 Ecore_IMF_Event_Mouse_Move mouse_move;
296 Ecore_IMF_Event_Mouse_Wheel mouse_wheel;
297 Ecore_IMF_Event_Key_Down key_down;
298 Ecore_IMF_Event_Key_Up key_up;
299};
300
301struct _Ecore_IMF_Preedit_Attr
302{
303 Ecore_IMF_Preedit_Type preedit_type;
304 unsigned int start_index;
305 unsigned int end_index;
306};
307
308struct _Ecore_IMF_Context_Class
309{
310 void (*add) (Ecore_IMF_Context *ctx);
311 void (*del) (Ecore_IMF_Context *ctx);
312 void (*client_window_set) (Ecore_IMF_Context *ctx, void *window);
313 void (*client_canvas_set) (Ecore_IMF_Context *ctx, void *canvas);
314 void (*show) (Ecore_IMF_Context *ctx);
315 void (*hide) (Ecore_IMF_Context *ctx);
316 void (*preedit_string_get) (Ecore_IMF_Context *ctx, char **str, int *cursor_pos);
317 void (*focus_in) (Ecore_IMF_Context *ctx);
318 void (*focus_out) (Ecore_IMF_Context *ctx);
319 void (*reset) (Ecore_IMF_Context *ctx);
320 void (*cursor_position_set) (Ecore_IMF_Context *ctx, int cursor_pos);
321 void (*use_preedit_set) (Ecore_IMF_Context *ctx, Eina_Bool use_preedit);
322 void (*input_mode_set) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
323 Eina_Bool (*filter_event) (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
324 void (*preedit_string_with_attributes_get) (Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos);
325 void (*prediction_allow_set)(Ecore_IMF_Context *ctx, Eina_Bool prediction);
326 void (*autocapital_type_set)(Ecore_IMF_Context *ctx, Ecore_IMF_Autocapital_Type autocapital_type);
327 void (*control_panel_show) (Ecore_IMF_Context *ctx);
328 void (*control_panel_hide) (Ecore_IMF_Context *ctx);
329 void (*input_panel_layout_set) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout);
330 Ecore_IMF_Input_Panel_Layout (*input_panel_layout_get) (Ecore_IMF_Context *ctx);
331 void (*input_panel_language_set) (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang);
332 Ecore_IMF_Input_Panel_Lang (*input_panel_language_get) (Ecore_IMF_Context *ctx);
333 void (*cursor_location_set) (Ecore_IMF_Context *ctx, int x, int y, int w, int h);
334};
335
336struct _Ecore_IMF_Context_Info
337{
338 const char *id; /* ID */
339 const char *description; /* Human readable description */
340 const char *default_locales; /* Languages for which this context is the default, separated by : */
341 const char *canvas_type; /* The canvas type used by the input method. Eg.: evas */
342 int canvas_required; /* Whether the canvas usage is required for this input method */
343};
344
345EAPI int ecore_imf_init(void);
346EAPI int ecore_imf_shutdown(void);
347
348EAPI void ecore_imf_module_register(const Ecore_IMF_Context_Info *info, Ecore_IMF_Context *(*imf_module_create)(void), Ecore_IMF_Context *(*imf_module_exit)(void));
349
350EAPI Eina_List *ecore_imf_context_available_ids_get(void);
351EAPI Eina_List *ecore_imf_context_available_ids_by_canvas_type_get(const char *canvas_type);
352EAPI const char *ecore_imf_context_default_id_get(void);
353EAPI const char *ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type);
354EAPI const Ecore_IMF_Context_Info *ecore_imf_context_info_by_id_get(const char *id);
355
356EAPI Ecore_IMF_Context *ecore_imf_context_add(const char *id);
357EAPI const Ecore_IMF_Context_Info *ecore_imf_context_info_get(Ecore_IMF_Context *ctx);
358EAPI void ecore_imf_context_del(Ecore_IMF_Context *ctx);
359EAPI void ecore_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window);
360EAPI void *ecore_imf_context_client_window_get(Ecore_IMF_Context *ctx);
361EAPI void ecore_imf_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas);
362EAPI void *ecore_imf_context_client_canvas_get(Ecore_IMF_Context *ctx);
363EAPI void ecore_imf_context_show(Ecore_IMF_Context *ctx);
364EAPI void ecore_imf_context_hide(Ecore_IMF_Context *ctx);
365EAPI void ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cursor_pos);
366EAPI void ecore_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos);
367EAPI void ecore_imf_context_focus_in(Ecore_IMF_Context *ctx);
368EAPI void ecore_imf_context_focus_out(Ecore_IMF_Context *ctx);
369EAPI void ecore_imf_context_reset(Ecore_IMF_Context *ctx);
370EAPI void ecore_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos);
371EAPI void ecore_imf_context_cursor_location_set(Ecore_IMF_Context *ctx, int x, int y, int w, int h);
372EAPI void ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, Eina_Bool use_preedit);
373EAPI void ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, Eina_Bool (*func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos), const void *data);
374EAPI void ecore_imf_context_input_mode_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode);
375EAPI Ecore_IMF_Input_Mode ecore_imf_context_input_mode_get(Ecore_IMF_Context *ctx);
376EAPI Eina_Bool ecore_imf_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event);
377
378/* plugin specific functions */
379EAPI Ecore_IMF_Context *ecore_imf_context_new(const Ecore_IMF_Context_Class *ctxc);
380EAPI void ecore_imf_context_data_set(Ecore_IMF_Context *ctx, void *data);
381EAPI void *ecore_imf_context_data_get(Ecore_IMF_Context *ctx);
382EAPI Eina_Bool ecore_imf_context_surrounding_get(Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
383EAPI void ecore_imf_context_preedit_start_event_add(Ecore_IMF_Context *ctx);
384EAPI void ecore_imf_context_preedit_end_event_add(Ecore_IMF_Context *ctx);
385EAPI void ecore_imf_context_preedit_changed_event_add(Ecore_IMF_Context *ctx);
386EAPI void ecore_imf_context_commit_event_add(Ecore_IMF_Context *ctx, const char *str);
387EAPI void ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offset, int n_chars);
388EAPI void ecore_imf_context_prediction_allow_set(Ecore_IMF_Context *ctx, Eina_Bool prediction);
389EAPI Eina_Bool ecore_imf_context_prediction_allow_get(Ecore_IMF_Context *ctx);
390EAPI void ecore_imf_context_autocapital_type_set(Ecore_IMF_Context *ctx, Ecore_IMF_Autocapital_Type autocapital_type);
391EAPI Ecore_IMF_Autocapital_Type ecore_imf_context_autocapital_type_get(Ecore_IMF_Context *ctx);
392
393EAPI void ecore_imf_context_control_panel_show(Ecore_IMF_Context *ctx);
394EAPI void ecore_imf_context_control_panel_hide(Ecore_IMF_Context *ctx);
395
396EAPI void ecore_imf_context_input_panel_show(Ecore_IMF_Context *ctx);
397EAPI void ecore_imf_context_input_panel_hide(Ecore_IMF_Context *ctx);
398EAPI void ecore_imf_context_input_panel_layout_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout);
399EAPI Ecore_IMF_Input_Panel_Layout ecore_imf_context_input_panel_layout_get(Ecore_IMF_Context *ctx);
400EAPI void ecore_imf_context_input_panel_language_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang);
401EAPI Ecore_IMF_Input_Panel_Lang ecore_imf_context_input_panel_language_get(Ecore_IMF_Context *ctx);
402EAPI void ecore_imf_context_input_panel_enabled_set(Ecore_IMF_Context *ctx, Eina_Bool enable);
403EAPI Eina_Bool ecore_imf_context_input_panel_enabled_get(Ecore_IMF_Context *ctx);
404
405/* The following entry points must be exported by each input method module
406 */
407
408/*
409 * int imf_module_init (const Ecore_IMF_Context_Info **info);
410 * void imf_module_exit (void);
411 * Ecore_IMF_Context *imf_module_create (void);
412 */
413
414#ifdef __cplusplus
415}
416#endif
417
418#endif
diff --git a/libraries/ecore/src/lib/ecore_imf/Makefile.am b/libraries/ecore/src/lib/ecore_imf/Makefile.am
new file mode 100644
index 0000000..10f6c2f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/Makefile.am
@@ -0,0 +1,28 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-DPACKAGE_LIB_DIR=\"$(libdir)\" \
6@EFL_ECORE_IMF_BUILD@ \
7@EVIL_CFLAGS@ \
8@EINA_CFLAGS@
9
10AM_CFLAGS = @WIN32_CFLAGS@
11
12lib_LTLIBRARIES = libecore_imf.la
13includes_HEADERS = Ecore_IMF.h
14includesdir = $(includedir)/ecore-@VMAJ@
15
16libecore_imf_la_SOURCES = \
17ecore_imf.c \
18ecore_imf_context.c \
19ecore_imf_module.c
20
21libecore_imf_la_LIBADD = \
22$(top_builddir)/src/lib/ecore/libecore.la \
23@EINA_LIBS@ \
24@EVIL_LIBS@
25
26libecore_imf_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
27
28EXTRA_DIST = ecore_imf_private.h
diff --git a/libraries/ecore/src/lib/ecore_imf/Makefile.in b/libraries/ecore/src/lib/ecore_imf/Makefile.in
new file mode 100644
index 0000000..adf8dea
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/Makefile.in
@@ -0,0 +1,822 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_imf
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_imf_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la
91am_libecore_imf_la_OBJECTS = ecore_imf.lo ecore_imf_context.lo \
92 ecore_imf_module.lo
93libecore_imf_la_OBJECTS = $(am_libecore_imf_la_OBJECTS)
94AM_V_lt = $(am__v_lt_$(V))
95am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
96am__v_lt_0 = --silent
97libecore_imf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
98 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
99 $(AM_CFLAGS) $(CFLAGS) $(libecore_imf_la_LDFLAGS) $(LDFLAGS) \
100 -o $@
101DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
102depcomp = $(SHELL) $(top_srcdir)/depcomp
103am__depfiles_maybe = depfiles
104am__mv = mv -f
105COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
106 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
107LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
108 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
109 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
110 $(AM_CFLAGS) $(CFLAGS)
111AM_V_CC = $(am__v_CC_$(V))
112am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
113am__v_CC_0 = @echo " CC " $@;
114AM_V_at = $(am__v_at_$(V))
115am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
116am__v_at_0 = @
117CCLD = $(CC)
118LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
119 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
120 $(AM_LDFLAGS) $(LDFLAGS) -o $@
121AM_V_CCLD = $(am__v_CCLD_$(V))
122am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
123am__v_CCLD_0 = @echo " CCLD " $@;
124AM_V_GEN = $(am__v_GEN_$(V))
125am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
126am__v_GEN_0 = @echo " GEN " $@;
127SOURCES = $(libecore_imf_la_SOURCES)
128DIST_SOURCES = $(libecore_imf_la_SOURCES)
129HEADERS = $(includes_HEADERS)
130ETAGS = etags
131CTAGS = ctags
132DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
133ACLOCAL = @ACLOCAL@
134ALLOCA = @ALLOCA@
135AMTAR = @AMTAR@
136AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
137AR = @AR@
138AS = @AS@
139AUTOCONF = @AUTOCONF@
140AUTOHEADER = @AUTOHEADER@
141AUTOMAKE = @AUTOMAKE@
142AWK = @AWK@
143CARES_CFLAGS = @CARES_CFLAGS@
144CARES_LIBS = @CARES_LIBS@
145CC = @CC@
146CCDEPMODE = @CCDEPMODE@
147CFLAGS = @CFLAGS@
148CHECK_CFLAGS = @CHECK_CFLAGS@
149CHECK_LIBS = @CHECK_LIBS@
150CPP = @CPP@
151CPPFLAGS = @CPPFLAGS@
152CURL_CFLAGS = @CURL_CFLAGS@
153CURL_LIBS = @CURL_LIBS@
154CXX = @CXX@
155CXXCPP = @CXXCPP@
156CXXDEPMODE = @CXXDEPMODE@
157CXXFLAGS = @CXXFLAGS@
158CYGPATH_W = @CYGPATH_W@
159DEFS = @DEFS@
160DEPDIR = @DEPDIR@
161DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
162DIRECTFB_LIBS = @DIRECTFB_LIBS@
163DLLTOOL = @DLLTOOL@
164DSYMUTIL = @DSYMUTIL@
165DUMPBIN = @DUMPBIN@
166ECHO_C = @ECHO_C@
167ECHO_N = @ECHO_N@
168ECHO_T = @ECHO_T@
169ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
170ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
171EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
172EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
173EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
174EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
175EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
176EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
177EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
178EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
179EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
180EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
181EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
182EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
183EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
184EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
185EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
186EGREP = @EGREP@
187EINA_CFLAGS = @EINA_CFLAGS@
188EINA_LIBS = @EINA_LIBS@
189ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
190ESCAPE_LIBS = @ESCAPE_LIBS@
191EVAS_CFLAGS = @EVAS_CFLAGS@
192EVAS_LIBS = @EVAS_LIBS@
193EVIL_CFLAGS = @EVIL_CFLAGS@
194EVIL_LIBS = @EVIL_LIBS@
195EXEEXT = @EXEEXT@
196FGREP = @FGREP@
197GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
198GLIB_CFLAGS = @GLIB_CFLAGS@
199GLIB_LIBS = @GLIB_LIBS@
200GMSGFMT = @GMSGFMT@
201GMSGFMT_015 = @GMSGFMT_015@
202GREP = @GREP@
203INSTALL = @INSTALL@
204INSTALL_DATA = @INSTALL_DATA@
205INSTALL_PROGRAM = @INSTALL_PROGRAM@
206INSTALL_SCRIPT = @INSTALL_SCRIPT@
207INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
208INTLLIBS = @INTLLIBS@
209INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
210KEYSYMDEFS = @KEYSYMDEFS@
211LD = @LD@
212LDFLAGS = @LDFLAGS@
213LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
214LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
215LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
216LIBICONV = @LIBICONV@
217LIBINTL = @LIBINTL@
218LIBOBJS = @LIBOBJS@
219LIBS = @LIBS@
220LIBTOOL = @LIBTOOL@
221LIPO = @LIPO@
222LN_S = @LN_S@
223LTLIBICONV = @LTLIBICONV@
224LTLIBINTL = @LTLIBINTL@
225LTLIBOBJS = @LTLIBOBJS@
226MAKEINFO = @MAKEINFO@
227MKDIR_P = @MKDIR_P@
228MSGFMT = @MSGFMT@
229MSGFMT_015 = @MSGFMT_015@
230MSGMERGE = @MSGMERGE@
231NM = @NM@
232NMEDIT = @NMEDIT@
233OBJC = @OBJC@
234OBJCDEPMODE = @OBJCDEPMODE@
235OBJCFLAGS = @OBJCFLAGS@
236OBJDUMP = @OBJDUMP@
237OBJEXT = @OBJEXT@
238OTOOL = @OTOOL@
239OTOOL64 = @OTOOL64@
240PACKAGE = @PACKAGE@
241PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
242PACKAGE_NAME = @PACKAGE_NAME@
243PACKAGE_STRING = @PACKAGE_STRING@
244PACKAGE_TARNAME = @PACKAGE_TARNAME@
245PACKAGE_URL = @PACKAGE_URL@
246PACKAGE_VERSION = @PACKAGE_VERSION@
247PATH_SEPARATOR = @PATH_SEPARATOR@
248PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
249PIXMAN_LIBS = @PIXMAN_LIBS@
250PKG_CONFIG = @PKG_CONFIG@
251PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
252PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
253POSUB = @POSUB@
254RANLIB = @RANLIB@
255SDL_CFLAGS = @SDL_CFLAGS@
256SDL_CONFIG = @SDL_CONFIG@
257SDL_LIBS = @SDL_LIBS@
258SED = @SED@
259SET_MAKE = @SET_MAKE@
260SHELL = @SHELL@
261SSL_CFLAGS = @SSL_CFLAGS@
262SSL_LIBS = @SSL_LIBS@
263STRIP = @STRIP@
264TLS2_CFLAGS = @TLS2_CFLAGS@
265TLS2_LIBS = @TLS2_LIBS@
266TLS_CFLAGS = @TLS_CFLAGS@
267TLS_LIBS = @TLS_LIBS@
268TSLIB_CFLAGS = @TSLIB_CFLAGS@
269TSLIB_LIBS = @TSLIB_LIBS@
270USE_NLS = @USE_NLS@
271VERSION = @VERSION@
272VMAJ = @VMAJ@
273WIN32_CFLAGS = @WIN32_CFLAGS@
274WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
275WIN32_LIBS = @WIN32_LIBS@
276XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
277XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
278XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
279XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
280XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
281XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
282XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
283XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
284XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
285XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
286XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
287XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
288XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
289XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
290XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
291XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
292XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
293XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
294XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
295XCB_X11_LIBS = @XCB_X11_LIBS@
296XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
297XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
298XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
299XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
300XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
301XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
302XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
303XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
304XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
305XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
306XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
307XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
308XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
309XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
310XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
311XDAMAGE_LIBS = @XDAMAGE_LIBS@
312XDPMS_CFLAGS = @XDPMS_CFLAGS@
313XDPMS_LIBS = @XDPMS_LIBS@
314XFIXES_CFLAGS = @XFIXES_CFLAGS@
315XFIXES_LIBS = @XFIXES_LIBS@
316XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
317XGESTURE_LIBS = @XGESTURE_LIBS@
318XGETTEXT = @XGETTEXT@
319XGETTEXT_015 = @XGETTEXT_015@
320XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
321XI2_CFLAGS = @XI2_CFLAGS@
322XI2_LIBS = @XI2_LIBS@
323XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
324XINERAMA_LIBS = @XINERAMA_LIBS@
325XKB_CFLAGS = @XKB_CFLAGS@
326XKB_LIBS = @XKB_LIBS@
327XMKMF = @XMKMF@
328XPRINT_CFLAGS = @XPRINT_CFLAGS@
329XPRINT_LIBS = @XPRINT_LIBS@
330XRANDR_CFLAGS = @XRANDR_CFLAGS@
331XRANDR_LIBS = @XRANDR_LIBS@
332XRENDER_CFLAGS = @XRENDER_CFLAGS@
333XRENDER_LIBS = @XRENDER_LIBS@
334XSS_CFLAGS = @XSS_CFLAGS@
335XSS_LIBS = @XSS_LIBS@
336XTEST_CFLAGS = @XTEST_CFLAGS@
337XTEST_LIBS = @XTEST_LIBS@
338X_CFLAGS = @X_CFLAGS@
339X_EXTRA_LIBS = @X_EXTRA_LIBS@
340X_LIBS = @X_LIBS@
341X_PRE_LIBS = @X_PRE_LIBS@
342Xcursor_cflags = @Xcursor_cflags@
343Xcursor_libs = @Xcursor_libs@
344abs_builddir = @abs_builddir@
345abs_srcdir = @abs_srcdir@
346abs_top_builddir = @abs_top_builddir@
347abs_top_srcdir = @abs_top_srcdir@
348ac_ct_CC = @ac_ct_CC@
349ac_ct_CXX = @ac_ct_CXX@
350ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
351ac_ct_OBJC = @ac_ct_OBJC@
352am__include = @am__include@
353am__leading_dot = @am__leading_dot@
354am__quote = @am__quote@
355am__tar = @am__tar@
356am__untar = @am__untar@
357bindir = @bindir@
358build = @build@
359build_alias = @build_alias@
360build_cpu = @build_cpu@
361build_os = @build_os@
362build_vendor = @build_vendor@
363builddir = @builddir@
364cocoa_ldflags = @cocoa_ldflags@
365datadir = @datadir@
366datarootdir = @datarootdir@
367dlopen_libs = @dlopen_libs@
368docdir = @docdir@
369dvidir = @dvidir@
370ecore_cocoa_cflags = @ecore_cocoa_cflags@
371ecore_cocoa_libs = @ecore_cocoa_libs@
372ecore_con_cflags = @ecore_con_cflags@
373ecore_con_libs = @ecore_con_libs@
374ecore_directfb_cflags = @ecore_directfb_cflags@
375ecore_directfb_libs = @ecore_directfb_libs@
376ecore_evas_cflags = @ecore_evas_cflags@
377ecore_evas_libs = @ecore_evas_libs@
378ecore_fb_cflags = @ecore_fb_cflags@
379ecore_fb_libs = @ecore_fb_libs@
380ecore_file_cflags = @ecore_file_cflags@
381ecore_file_libs = @ecore_file_libs@
382ecore_imf_cflags = @ecore_imf_cflags@
383ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
384ecore_imf_evas_libs = @ecore_imf_evas_libs@
385ecore_imf_libs = @ecore_imf_libs@
386ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
387ecore_imf_xim_libs = @ecore_imf_xim_libs@
388ecore_input_cflags = @ecore_input_cflags@
389ecore_input_evas_cflags = @ecore_input_evas_cflags@
390ecore_input_evas_libs = @ecore_input_evas_libs@
391ecore_input_libs = @ecore_input_libs@
392ecore_ipc_cflags = @ecore_ipc_cflags@
393ecore_ipc_libs = @ecore_ipc_libs@
394ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
395ecore_psl1ght_libs = @ecore_psl1ght_libs@
396ecore_sdl_cflags = @ecore_sdl_cflags@
397ecore_sdl_libs = @ecore_sdl_libs@
398ecore_win32_cflags = @ecore_win32_cflags@
399ecore_win32_libs = @ecore_win32_libs@
400ecore_wince_cflags = @ecore_wince_cflags@
401ecore_wince_libs = @ecore_wince_libs@
402ecore_x_cflags = @ecore_x_cflags@
403ecore_x_libs = @ecore_x_libs@
404ecore_x_libs_private = @ecore_x_libs_private@
405efl_doxygen = @efl_doxygen@
406efl_have_doxygen = @efl_have_doxygen@
407exec_prefix = @exec_prefix@
408have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
409host = @host@
410host_alias = @host_alias@
411host_cpu = @host_cpu@
412host_os = @host_os@
413host_vendor = @host_vendor@
414htmldir = @htmldir@
415includedir = @includedir@
416infodir = @infodir@
417install_sh = @install_sh@
418libdir = @libdir@
419libexecdir = @libexecdir@
420localedir = @localedir@
421localstatedir = @localstatedir@
422lt_ECHO = @lt_ECHO@
423lt_enable_auto_import = @lt_enable_auto_import@
424mandir = @mandir@
425mkdir_p = @mkdir_p@
426oldincludedir = @oldincludedir@
427pdfdir = @pdfdir@
428pkgconfig_requires_private = @pkgconfig_requires_private@
429prefix = @prefix@
430program_transform_name = @program_transform_name@
431psdir = @psdir@
432release_info = @release_info@
433requirements_ecore = @requirements_ecore@
434requirements_ecore_cocoa = @requirements_ecore_cocoa@
435requirements_ecore_con = @requirements_ecore_con@
436requirements_ecore_directfb = @requirements_ecore_directfb@
437requirements_ecore_evas = @requirements_ecore_evas@
438requirements_ecore_fb = @requirements_ecore_fb@
439requirements_ecore_file = @requirements_ecore_file@
440requirements_ecore_imf = @requirements_ecore_imf@
441requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
442requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
443requirements_ecore_input = @requirements_ecore_input@
444requirements_ecore_input_evas = @requirements_ecore_input_evas@
445requirements_ecore_ipc = @requirements_ecore_ipc@
446requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
447requirements_ecore_sdl = @requirements_ecore_sdl@
448requirements_ecore_win32 = @requirements_ecore_win32@
449requirements_ecore_wince = @requirements_ecore_wince@
450requirements_ecore_x = @requirements_ecore_x@
451rt_libs = @rt_libs@
452sbindir = @sbindir@
453sharedstatedir = @sharedstatedir@
454srcdir = @srcdir@
455sysconfdir = @sysconfdir@
456target_alias = @target_alias@
457top_build_prefix = @top_build_prefix@
458top_builddir = @top_builddir@
459top_srcdir = @top_srcdir@
460version_info = @version_info@
461x_cflags = @x_cflags@
462x_includes = @x_includes@
463x_libs = @x_libs@
464MAINTAINERCLEANFILES = Makefile.in
465AM_CPPFLAGS = \
466-I$(top_srcdir)/src/lib/ecore \
467-DPACKAGE_LIB_DIR=\"$(libdir)\" \
468@EFL_ECORE_IMF_BUILD@ \
469@EVIL_CFLAGS@ \
470@EINA_CFLAGS@
471
472AM_CFLAGS = @WIN32_CFLAGS@
473lib_LTLIBRARIES = libecore_imf.la
474includes_HEADERS = Ecore_IMF.h
475includesdir = $(includedir)/ecore-@VMAJ@
476libecore_imf_la_SOURCES = \
477ecore_imf.c \
478ecore_imf_context.c \
479ecore_imf_module.c
480
481libecore_imf_la_LIBADD = \
482$(top_builddir)/src/lib/ecore/libecore.la \
483@EINA_LIBS@ \
484@EVIL_LIBS@
485
486libecore_imf_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
487EXTRA_DIST = ecore_imf_private.h
488all: all-am
489
490.SUFFIXES:
491.SUFFIXES: .c .lo .o .obj
492$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
493 @for dep in $?; do \
494 case '$(am__configure_deps)' in \
495 *$$dep*) \
496 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
497 && { if test -f $@; then exit 0; else break; fi; }; \
498 exit 1;; \
499 esac; \
500 done; \
501 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_imf/Makefile'; \
502 $(am__cd) $(top_srcdir) && \
503 $(AUTOMAKE) --gnu src/lib/ecore_imf/Makefile
504.PRECIOUS: Makefile
505Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
506 @case '$?' in \
507 *config.status*) \
508 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
509 *) \
510 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
511 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
512 esac;
513
514$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
515 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
516
517$(top_srcdir)/configure: $(am__configure_deps)
518 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
519$(ACLOCAL_M4): $(am__aclocal_m4_deps)
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
521$(am__aclocal_m4_deps):
522install-libLTLIBRARIES: $(lib_LTLIBRARIES)
523 @$(NORMAL_INSTALL)
524 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
525 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
526 list2=; for p in $$list; do \
527 if test -f $$p; then \
528 list2="$$list2 $$p"; \
529 else :; fi; \
530 done; \
531 test -z "$$list2" || { \
532 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
533 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
534 }
535
536uninstall-libLTLIBRARIES:
537 @$(NORMAL_UNINSTALL)
538 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
539 for p in $$list; do \
540 $(am__strip_dir) \
541 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
542 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
543 done
544
545clean-libLTLIBRARIES:
546 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
547 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
548 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
549 test "$$dir" != "$$p" || dir=.; \
550 echo "rm -f \"$${dir}/so_locations\""; \
551 rm -f "$${dir}/so_locations"; \
552 done
553libecore_imf.la: $(libecore_imf_la_OBJECTS) $(libecore_imf_la_DEPENDENCIES)
554 $(AM_V_CCLD)$(libecore_imf_la_LINK) -rpath $(libdir) $(libecore_imf_la_OBJECTS) $(libecore_imf_la_LIBADD) $(LIBS)
555
556mostlyclean-compile:
557 -rm -f *.$(OBJEXT)
558
559distclean-compile:
560 -rm -f *.tab.c
561
562@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_imf.Plo@am__quote@
563@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_imf_context.Plo@am__quote@
564@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_imf_module.Plo@am__quote@
565
566.c.o:
567@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
568@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
569@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
570@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
572@am__fastdepCC_FALSE@ $(COMPILE) -c $<
573
574.c.obj:
575@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
576@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
577@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
578@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
580@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
581
582.c.lo:
583@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
584@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
585@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
587@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
588@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
589
590mostlyclean-libtool:
591 -rm -f *.lo
592
593clean-libtool:
594 -rm -rf .libs _libs
595install-includesHEADERS: $(includes_HEADERS)
596 @$(NORMAL_INSTALL)
597 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
598 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
599 for p in $$list; do \
600 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
601 echo "$$d$$p"; \
602 done | $(am__base_list) | \
603 while read files; do \
604 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
605 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
606 done
607
608uninstall-includesHEADERS:
609 @$(NORMAL_UNINSTALL)
610 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
611 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
612 test -n "$$files" || exit 0; \
613 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
614 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
615
616ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
617 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
618 unique=`for i in $$list; do \
619 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
620 done | \
621 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
622 END { if (nonempty) { for (i in files) print i; }; }'`; \
623 mkid -fID $$unique
624tags: TAGS
625
626TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
627 $(TAGS_FILES) $(LISP)
628 set x; \
629 here=`pwd`; \
630 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
631 unique=`for i in $$list; do \
632 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
633 done | \
634 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
635 END { if (nonempty) { for (i in files) print i; }; }'`; \
636 shift; \
637 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
638 test -n "$$unique" || unique=$$empty_fix; \
639 if test $$# -gt 0; then \
640 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
641 "$$@" $$unique; \
642 else \
643 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
644 $$unique; \
645 fi; \
646 fi
647ctags: CTAGS
648CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
649 $(TAGS_FILES) $(LISP)
650 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
651 unique=`for i in $$list; do \
652 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
653 done | \
654 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
655 END { if (nonempty) { for (i in files) print i; }; }'`; \
656 test -z "$(CTAGS_ARGS)$$unique" \
657 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
658 $$unique
659
660GTAGS:
661 here=`$(am__cd) $(top_builddir) && pwd` \
662 && $(am__cd) $(top_srcdir) \
663 && gtags -i $(GTAGS_ARGS) "$$here"
664
665distclean-tags:
666 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
667
668distdir: $(DISTFILES)
669 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
670 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
671 list='$(DISTFILES)'; \
672 dist_files=`for file in $$list; do echo $$file; done | \
673 sed -e "s|^$$srcdirstrip/||;t" \
674 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
675 case $$dist_files in \
676 */*) $(MKDIR_P) `echo "$$dist_files" | \
677 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
678 sort -u` ;; \
679 esac; \
680 for file in $$dist_files; do \
681 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
682 if test -d $$d/$$file; then \
683 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
684 if test -d "$(distdir)/$$file"; then \
685 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
686 fi; \
687 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
688 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
689 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
690 fi; \
691 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
692 else \
693 test -f "$(distdir)/$$file" \
694 || cp -p $$d/$$file "$(distdir)/$$file" \
695 || exit 1; \
696 fi; \
697 done
698check-am: all-am
699check: check-am
700all-am: Makefile $(LTLIBRARIES) $(HEADERS)
701installdirs:
702 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
703 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
704 done
705install: install-am
706install-exec: install-exec-am
707install-data: install-data-am
708uninstall: uninstall-am
709
710install-am: all-am
711 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
712
713installcheck: installcheck-am
714install-strip:
715 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
716 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
717 `test -z '$(STRIP)' || \
718 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
719mostlyclean-generic:
720
721clean-generic:
722
723distclean-generic:
724 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
725 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
726
727maintainer-clean-generic:
728 @echo "This command is intended for maintainers to use"
729 @echo "it deletes files that may require special tools to rebuild."
730 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
731clean: clean-am
732
733clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
734 mostlyclean-am
735
736distclean: distclean-am
737 -rm -rf ./$(DEPDIR)
738 -rm -f Makefile
739distclean-am: clean-am distclean-compile distclean-generic \
740 distclean-tags
741
742dvi: dvi-am
743
744dvi-am:
745
746html: html-am
747
748html-am:
749
750info: info-am
751
752info-am:
753
754install-data-am: install-includesHEADERS
755
756install-dvi: install-dvi-am
757
758install-dvi-am:
759
760install-exec-am: install-libLTLIBRARIES
761
762install-html: install-html-am
763
764install-html-am:
765
766install-info: install-info-am
767
768install-info-am:
769
770install-man:
771
772install-pdf: install-pdf-am
773
774install-pdf-am:
775
776install-ps: install-ps-am
777
778install-ps-am:
779
780installcheck-am:
781
782maintainer-clean: maintainer-clean-am
783 -rm -rf ./$(DEPDIR)
784 -rm -f Makefile
785maintainer-clean-am: distclean-am maintainer-clean-generic
786
787mostlyclean: mostlyclean-am
788
789mostlyclean-am: mostlyclean-compile mostlyclean-generic \
790 mostlyclean-libtool
791
792pdf: pdf-am
793
794pdf-am:
795
796ps: ps-am
797
798ps-am:
799
800uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
801
802.MAKE: install-am install-strip
803
804.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
805 clean-libLTLIBRARIES clean-libtool ctags distclean \
806 distclean-compile distclean-generic distclean-libtool \
807 distclean-tags distdir dvi dvi-am html html-am info info-am \
808 install install-am install-data install-data-am install-dvi \
809 install-dvi-am install-exec install-exec-am install-html \
810 install-html-am install-includesHEADERS install-info \
811 install-info-am install-libLTLIBRARIES install-man install-pdf \
812 install-pdf-am install-ps install-ps-am install-strip \
813 installcheck installcheck-am installdirs maintainer-clean \
814 maintainer-clean-generic mostlyclean mostlyclean-compile \
815 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
816 tags uninstall uninstall-am uninstall-includesHEADERS \
817 uninstall-libLTLIBRARIES
818
819
820# Tell versions [3.59,3.63) of GNU make to not export all variables.
821# Otherwise a system limit (for SysV at least) may be exceeded.
822.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_imf/ecore_imf.c b/libraries/ecore/src/lib/ecore_imf/ecore_imf.c
new file mode 100644
index 0000000..7cf8a4a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/ecore_imf.c
@@ -0,0 +1,73 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <Ecore.h>
6#include <ecore_private.h>
7
8#include "Ecore_IMF.h"
9#include "ecore_imf_private.h"
10
11EAPI int ECORE_IMF_EVENT_PREEDIT_START = 0;
12EAPI int ECORE_IMF_EVENT_PREEDIT_END = 0;
13EAPI int ECORE_IMF_EVENT_PREEDIT_CHANGED = 0;
14EAPI int ECORE_IMF_EVENT_COMMIT = 0;
15EAPI int ECORE_IMF_EVENT_DELETE_SURROUNDING = 0;
16
17int _ecore_imf_log_dom = -1;
18static int _ecore_imf_init_count = 0;
19
20/**
21 * @defgroup Ecore_IMF_Lib_Group Ecore Input Method Library Functions
22 *
23 * Utility functions that set up and shut down the Ecore Input Method
24 * library.
25 */
26
27/**
28 * Initialises the Ecore_IMF library.
29 * @return Number of times the library has been initialised without being
30 * shut down.
31 * @ingroup Ecore_IMF_Lib_Group
32 */
33EAPI int
34ecore_imf_init(void)
35{
36 if (++_ecore_imf_init_count != 1) return _ecore_imf_init_count;
37
38 if (!ecore_init()) return --_ecore_imf_init_count;
39 _ecore_imf_log_dom = eina_log_domain_register
40 ("ecore_imf", ECORE_IMF_DEFAULT_LOG_COLOR);
41 if (_ecore_imf_log_dom < 0)
42 {
43 EINA_LOG_ERR("Impossible to create a log domain for the Ecore IMF module.");
44 ecore_shutdown();
45 return --_ecore_imf_init_count;
46 }
47 ecore_imf_module_init();
48
49 ECORE_IMF_EVENT_PREEDIT_START = ecore_event_type_new();
50 ECORE_IMF_EVENT_PREEDIT_END = ecore_event_type_new();
51 ECORE_IMF_EVENT_PREEDIT_CHANGED = ecore_event_type_new();
52 ECORE_IMF_EVENT_COMMIT = ecore_event_type_new();
53 ECORE_IMF_EVENT_DELETE_SURROUNDING = ecore_event_type_new();
54
55 return _ecore_imf_init_count;
56}
57
58/**
59 * Shuts down the Ecore_IMF library.
60 * @return Number of times the library has been initialised without being
61 * shut down.
62 * @ingroup Ecore_IMF_Lib_Group
63 */
64EAPI int
65ecore_imf_shutdown(void)
66{
67 if (--_ecore_imf_init_count != 0) return _ecore_imf_init_count;
68 ecore_imf_module_shutdown();
69 eina_log_domain_unregister(_ecore_imf_log_dom);
70 _ecore_imf_log_dom = -1;
71 ecore_shutdown();
72 return _ecore_imf_init_count;
73}
diff --git a/libraries/ecore/src/lib/ecore_imf/ecore_imf_context.c b/libraries/ecore/src/lib/ecore_imf/ecore_imf_context.c
new file mode 100644
index 0000000..417fad3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/ecore_imf_context.c
@@ -0,0 +1,1237 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <string.h>
7#include <locale.h>
8
9#include <Ecore.h>
10#include <ecore_private.h>
11
12#include "Ecore_IMF.h"
13#include "ecore_imf_private.h"
14
15/**
16 * @defgroup Ecore_IMF_Context_Group Ecore Input Method Context Functions
17 *
18 * Functions that operate on Ecore Input Method Context objects.
19 */
20
21/**
22 * Get the list of the available Input Method Context ids.
23 *
24 * Note that the caller is responsible for freeing the Eina_List
25 * when finished with it. There is no need to finish the list strings.
26 *
27 * @return Return an Eina_List of strings;
28 * on failure it returns NULL.
29 * @ingroup Ecore_IMF_Context_Group
30 */
31EAPI Eina_List *
32ecore_imf_context_available_ids_get(void)
33{
34 return ecore_imf_module_context_ids_get();
35}
36
37EAPI Eina_List *
38ecore_imf_context_available_ids_by_canvas_type_get(const char *canvas_type)
39{
40 return ecore_imf_module_context_ids_by_canvas_type_get(canvas_type);
41}
42
43/*
44 * Match @locale against @against.
45 *
46 * 'en_US' against 'en_US' => 4
47 * 'en_US' against 'en' => 3
48 * 'en', 'en_UK' against 'en_US' => 2
49 * all locales, against '*' => 1
50 */
51static int
52_ecore_imf_context_match_locale(const char *locale, const char *against, int against_len)
53{
54 if (strcmp(against, "*") == 0)
55 return 1;
56
57 if (strcasecmp(locale, against) == 0)
58 return 4;
59
60 if (strncasecmp(locale, against, 2) == 0)
61 return (against_len == 2) ? 3 : 2;
62
63 return 0;
64}
65
66/**
67 * Get the id of the default Input Method Context.
68 * The id may to used to create a new instance of an Input Method
69 * Context object.
70 *
71 * @return Return a string containing the id of the default Input
72 * Method Context; on failure it returns NULL.
73 * @ingroup Ecore_IMF_Context_Group
74 */
75EAPI const char *
76ecore_imf_context_default_id_get(void)
77{
78 return ecore_imf_context_default_id_by_canvas_type_get(NULL);
79}
80
81EAPI const char *
82ecore_imf_context_default_id_by_canvas_type_get(const char *canvas_type)
83{
84 const char *id;
85 Eina_List *modules;
86 Ecore_IMF_Module *module;
87 char *locale;
88 char *tmp;
89 int best_goodness = 0;
90
91 id = getenv("ECORE_IMF_MODULE");
92 if (id)
93 {
94 if (strcmp(id, "none") == 0) return NULL;
95 if (ecore_imf_module_get(id)) return id;
96 }
97
98 modules = ecore_imf_module_available_get();
99 if (!modules) return NULL;
100
101 locale = setlocale(LC_CTYPE, NULL);
102 if (!locale) return NULL;
103
104 locale = strdup(locale);
105
106 tmp = strchr(locale, '.');
107 if (tmp) *tmp = '\0';
108 tmp = strchr(locale, '@');
109 if (tmp) *tmp = '\0';
110
111 id = NULL;
112
113 EINA_LIST_FREE(modules, module)
114 {
115 if (canvas_type &&
116 strcmp(module->info->canvas_type, canvas_type) == 0)
117 continue;
118
119 const char *p = module->info->default_locales;
120 while (p)
121 {
122 const char *q = strchr(p, ':');
123 int goodness = _ecore_imf_context_match_locale(locale, p, q ? (size_t)(q - p) : strlen (p));
124
125 if (goodness > best_goodness)
126 {
127 id = module->info->id;
128 best_goodness = goodness;
129 }
130
131 p = q ? q + 1 : NULL;
132 }
133 }
134
135 free(locale);
136 return id;
137}
138
139/**
140 * Retrieve the info for the Input Method Context with @p id.
141 *
142 * @param id The Input Method Context id to query for.
143 * @return Return a #Ecore_IMF_Context_Info for the Input Method Context with @p id;
144 * on failure it returns NULL.
145 * @ingroup Ecore_IMF_Context_Group
146 */
147EAPI const Ecore_IMF_Context_Info *
148ecore_imf_context_info_by_id_get(const char *id)
149{
150 Ecore_IMF_Module *module;
151
152 if (!id) return NULL;
153 module = ecore_imf_module_get(id);
154 if (!module) return NULL;
155 return module->info;
156}
157
158/**
159 * Create a new Input Method Context defined by the given id.
160 *
161 * @param id The Input Method Context id.
162 * @return A newly allocated Input Method Context;
163 * on failure it returns NULL.
164 * @ingroup Ecore_IMF_Context_Group
165 */
166EAPI Ecore_IMF_Context *
167ecore_imf_context_add(const char *id)
168{
169 Ecore_IMF_Context *ctx;
170
171 if (!id) return NULL;
172 ctx = ecore_imf_module_context_create(id);
173 if (!ctx || !ctx->klass) return NULL;
174 if (ctx->klass->add) ctx->klass->add(ctx);
175 /* default use_preedit is EINA_TRUE, so let's make sure it's
176 * set on the immodule */
177 ecore_imf_context_use_preedit_set(ctx, EINA_TRUE);
178
179 /* default prediction is EINA_TRUE, so let's make sure it's
180 * set on the immodule */
181 ecore_imf_context_prediction_allow_set(ctx, EINA_TRUE);
182
183 /* default autocapital type is SENTENCE type, so let's make sure it's
184 * set on the immodule */
185 ecore_imf_context_autocapital_type_set(ctx, ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE);
186
187 /* default input panel enabled status is EINA_TRUE, so let's make sure it's
188 * set on the immodule */
189 ecore_imf_context_input_panel_enabled_set(ctx, EINA_TRUE);
190
191 /* default input_mode is ECORE_IMF_INPUT_MODE_FULL, so let's make sure it's
192 * set on the immodule */
193 ecore_imf_context_input_mode_set(ctx, ECORE_IMF_INPUT_MODE_FULL);
194 return ctx;
195}
196
197/**
198 * Retrieve the info for the given Input Method Context.
199 *
200 * @param ctx An #Ecore_IMF_Context.
201 * @return Return a #Ecore_IMF_Context_Info for the given Input Method Context;
202 * on failure it returns NULL.
203 * @ingroup Ecore_IMF_Context_Group
204 */
205EAPI const Ecore_IMF_Context_Info *
206ecore_imf_context_info_get(Ecore_IMF_Context *ctx)
207{
208 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
209 {
210 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
211 "ecore_imf_context_info_get");
212 return NULL;
213 }
214 return ctx->module->info;
215}
216
217/**
218 * Delete the given Input Method Context and free its memory.
219 *
220 * @param ctx An #Ecore_IMF_Context.
221 * @ingroup Ecore_IMF_Context_Group
222 */
223EAPI void
224ecore_imf_context_del(Ecore_IMF_Context *ctx)
225{
226 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
227 {
228 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
229 "ecore_imf_context_del");
230 return;
231 }
232 if (ctx->klass->del) ctx->klass->del(ctx);
233 ECORE_MAGIC_SET(ctx, ECORE_MAGIC_NONE);
234 free(ctx);
235}
236
237/**
238 * Set the client window for the Input Method Context; this is the
239 * Ecore_X_Window when using X11, Ecore_Win32_Window when using Win32, etc.
240 * This window is used in order to correctly position status windows, and may
241 * also be used for purposes internal to the Input Method Context.
242 *
243 * @param ctx An #Ecore_IMF_Context.
244 * @param window The client window. This may be NULL to indicate
245 * that the previous client window no longer exists.
246 * @ingroup Ecore_IMF_Context_Group
247 */
248EAPI void
249ecore_imf_context_client_window_set(Ecore_IMF_Context *ctx, void *window)
250{
251 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
252 {
253 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
254 "ecore_imf_context_client_window_set");
255 return;
256 }
257 if (ctx->klass->client_window_set) ctx->klass->client_window_set(ctx, window);
258 ctx->window = window;
259}
260
261/**
262 * Get the client window of the Input Method Context
263 *
264 * See @ref ecore_imf_context_client_window_set for more details.
265 *
266 * @param ctx An #Ecore_IMF_Context.
267 * @return Return the client window.
268 * @ingroup Ecore_IMF_Context_Group
269 * @since 1.1.0
270 */
271EAPI void *
272ecore_imf_context_client_window_get(Ecore_IMF_Context *ctx)
273{
274 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
275 {
276 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
277 "ecore_imf_context_client_window_get");
278 return NULL;
279 }
280 return ctx->window;
281}
282
283/**
284 * Set the client canvas for the Input Method Context; this is the
285 * canvas in which the input appears.
286 * The canvas type can be determined by using the context canvas type.
287 * Actually only canvas with type "evas" (Evas *) is supported.
288 * This canvas may be used in order to correctly position status windows, and may
289 * also be used for purposes internal to the Input Method Context.
290 *
291 * @param ctx An #Ecore_IMF_Context.
292 * @param canvas The client canvas. This may be NULL to indicate
293 * that the previous client canvas no longer exists.
294 * @ingroup Ecore_IMF_Context_Group
295 */
296EAPI void
297ecore_imf_context_client_canvas_set(Ecore_IMF_Context *ctx, void *canvas)
298{
299 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
300 {
301 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
302 "ecore_imf_context_client_canvas_set");
303 return;
304 }
305 if (ctx->klass->client_canvas_set) ctx->klass->client_canvas_set(ctx, canvas);
306 ctx->client_canvas = canvas;
307}
308
309/**
310 * Get the client canvas of the Input Method Context.
311 *
312 * See @ref ecore_imf_context_client_canvas_set for more details.
313 *
314 * @param ctx An #Ecore_IMF_Context.
315 * @return Return the client canvas.
316 * @ingroup Ecore_IMF_Context_Group
317 * @since 1.1.0
318 */
319EAPI void *
320ecore_imf_context_client_canvas_get(Ecore_IMF_Context *ctx)
321{
322 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
323 {
324 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
325 "ecore_imf_context_client_canvas_get");
326 return NULL;
327 }
328 return ctx->client_canvas;
329}
330
331/**
332 * Ask the Input Method Context to show itself.
333 *
334 * @param ctx An #Ecore_IMF_Context.
335 * @ingroup Ecore_IMF_Context_Group
336 */
337EAPI void
338ecore_imf_context_show(Ecore_IMF_Context *ctx)
339{
340 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
341 {
342 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
343 "ecore_imf_context_show");
344 return;
345 }
346 if (ctx->klass->show) ctx->klass->show(ctx);
347}
348
349/**
350 * Ask the Input Method Context to hide itself.
351 *
352 * @param ctx An #Ecore_IMF_Context.
353 * @ingroup Ecore_IMF_Context_Group
354 */
355EAPI void
356ecore_imf_context_hide(Ecore_IMF_Context *ctx)
357{
358 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
359 {
360 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
361 "ecore_imf_context_hide");
362 return;
363 }
364 if (ctx->klass->hide) ctx->klass->hide(ctx);
365}
366
367/**
368 * Retrieve the current preedit string and cursor position
369 * for the Input Method Context.
370 *
371 * @param ctx An #Ecore_IMF_Context.
372 * @param str Location to store the retrieved string. The
373 * string retrieved must be freed with free().
374 * @param cursor_pos Location to store position of cursor (in characters)
375 * within the preedit string.
376 * @ingroup Ecore_IMF_Context_Group
377 */
378EAPI void
379ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cursor_pos)
380{
381 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
382 {
383 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
384 "ecore_imf_context_preedit_string_get");
385 return;
386 }
387 if (ctx->klass->preedit_string_get)
388 ctx->klass->preedit_string_get(ctx, str, cursor_pos);
389 else
390 {
391 if (str) *str = strdup("");
392 if (cursor_pos) *cursor_pos = 0;
393 }
394}
395
396/**
397 * Retrieve the current preedit string, atrributes and
398 * cursor position for the Input Method Context.
399 *
400 * @param ctx An #Ecore_IMF_Context.
401 * @param str Location to store the retrieved string. The
402 * string retrieved must be freed with free().
403 * @param attrs an Eina_List of attributes
404 * @param cursor_pos Location to store position of cursor (in characters)
405 * within the preedit string.
406 * @ingroup Ecore_IMF_Context_Group
407 * @since 1.1.0
408 */
409EAPI void
410ecore_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos)
411{
412 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
413 {
414 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
415 "ecore_imf_context_preedit_string_with_attributes_get");
416 return;
417 }
418 if (ctx->klass->preedit_string_with_attributes_get)
419 ctx->klass->preedit_string_with_attributes_get(ctx, str, attrs, cursor_pos);
420 else
421 {
422 if (str) *str = strdup("");
423 if (attrs) *attrs = NULL;
424 if (cursor_pos) *cursor_pos = 0;
425 }
426}
427
428/**
429 * Notify the Input Method Context that the widget to which its
430 * correspond has gained focus.
431 *
432 * @param ctx An #Ecore_IMF_Context.
433 * @ingroup Ecore_IMF_Context_Group
434 */
435EAPI void
436ecore_imf_context_focus_in(Ecore_IMF_Context *ctx)
437{
438 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
439 {
440 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
441 "ecore_imf_context_focus_in");
442 return;
443 }
444 if (ctx->klass->focus_in) ctx->klass->focus_in(ctx);
445}
446
447/**
448 * Notify the Input Method Context that the widget to which its
449 * correspond has lost focus.
450 *
451 * @param ctx An #Ecore_IMF_Context.
452 * @ingroup Ecore_IMF_Context_Group
453 */
454EAPI void
455ecore_imf_context_focus_out(Ecore_IMF_Context *ctx)
456{
457 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
458 {
459 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
460 "ecore_imf_context_focus_out");
461 return;
462 }
463 if (ctx->klass->focus_out) ctx->klass->focus_out(ctx);
464}
465
466/**
467 * Notify the Input Method Context that a change such as a
468 * change in cursor position has been made. This will typically
469 * cause the Input Method Context to clear the preedit state.
470 *
471 * @param ctx An #Ecore_IMF_Context.
472 * @ingroup Ecore_IMF_Context_Group
473 */
474EAPI void
475ecore_imf_context_reset(Ecore_IMF_Context *ctx)
476{
477 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
478 {
479 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
480 "ecore_imf_context_reset");
481 return;
482 }
483 if (ctx->klass->reset) ctx->klass->reset(ctx);
484}
485
486/**
487 * Notify the Input Method Context that a change in the cursor
488 * position has been made.
489 *
490 * @param ctx An #Ecore_IMF_Context.
491 * @param cursor_pos New cursor position in characters.
492 * @ingroup Ecore_IMF_Context_Group
493 */
494EAPI void
495ecore_imf_context_cursor_position_set(Ecore_IMF_Context *ctx, int cursor_pos)
496{
497 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
498 {
499 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
500 "ecore_imf_context_cursor_position_set");
501 return;
502 }
503 if (ctx->klass->cursor_position_set) ctx->klass->cursor_position_set(ctx, cursor_pos);
504}
505
506/**
507 * Notify the Input Method Context that a change in the cursor
508 * location has been made. The location is relative to the canvas.
509 *
510 * @param ctx An #Ecore_IMF_Context.
511 * @param x cursor x position.
512 * @param x cursor y position.
513 * @param w cursor width.
514 * @param h cursor height.
515 * @ingroup Ecore_IMF_Context_Group
516 * @since 1.1.0
517 */
518EAPI void
519ecore_imf_context_cursor_location_set(Ecore_IMF_Context *ctx, int x, int y, int w, int h)
520{
521 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
522 {
523 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
524 "ecore_imf_context_cursor_location_set");
525 return;
526 }
527 if (ctx->klass->cursor_location_set) ctx->klass->cursor_location_set(ctx, x, y, w, h);
528}
529
530/**
531 * Set whether the IM context should use the preedit string
532 * to display feedback. If @use_preedit is EINA_FALSE (default
533 * is EINA_TRUE), then the IM context may use some other method to display
534 * feedback, such as displaying it in a child of the root window.
535 *
536 * @param ctx An #Ecore_IMF_Context.
537 * @param use_preedit Whether the IM context should use the preedit string.
538 * @ingroup Ecore_IMF_Context_Group
539 */
540EAPI void
541ecore_imf_context_use_preedit_set(Ecore_IMF_Context *ctx, Eina_Bool use_preedit)
542{
543 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
544 {
545 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
546 "ecore_imf_context_use_preedit_set");
547 return;
548 }
549 if (ctx->klass->use_preedit_set) ctx->klass->use_preedit_set(ctx, use_preedit);
550}
551
552/**
553 * Set whether the IM context should allow to use the text prediction.
554 * If @prediction is EINA_FALSE (default is EINA_TRUE), then the IM context will not display the text prediction window.
555 *
556 * @param ctx An #Ecore_IMF_Context.
557 * @param prediction Whether the IM context should allow to use the text prediction.
558 * @ingroup Ecore_IMF_Context_Group
559 * @since 1.1.0
560 */
561EAPI void
562ecore_imf_context_prediction_allow_set(Ecore_IMF_Context *ctx, Eina_Bool prediction)
563{
564 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
565 {
566 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
567 "ecore_imf_context_prediction_allow_set");
568 return;
569 }
570
571 ctx->allow_prediction = prediction;
572
573 if (ctx->klass->prediction_allow_set)
574 ctx->klass->prediction_allow_set(ctx, prediction);
575}
576
577/**
578 * Get whether the IM context should allow to use the text prediction.
579 *
580 * @param ctx An #Ecore_IMF_Context.
581 * @return EINA_TRUE if it allows to use the text prediction, otherwise EINA_FALSE.
582 * @ingroup Ecore_IMF_Context_Group
583 * @since 1.1.0
584 */
585EAPI Eina_Bool
586ecore_imf_context_prediction_allow_get(Ecore_IMF_Context *ctx)
587{
588 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
589 {
590 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
591 "ecore_imf_context_prediction_allow_get");
592 return EINA_FALSE;
593 }
594
595 return ctx->allow_prediction;
596}
597
598/**
599 * Set the autocapitalization type on the immodule.
600 *
601 * @param ctx An #Ecore_IMF_Context.
602 * @param autocapital_type the autocapitalization type.
603 * @ingroup Ecore_IMF_Context_Group
604 * @since 1.1.0
605 */
606EAPI void
607ecore_imf_context_autocapital_type_set(Ecore_IMF_Context *ctx, Ecore_IMF_Autocapital_Type autocapital_type)
608{
609 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
610 {
611 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
612 "ecore_imf_context_autocapital_type_set");
613 return;
614 }
615
616 ctx->autocapital_type = autocapital_type;
617
618 if (ctx->klass->autocapital_type_set) ctx->klass->autocapital_type_set(ctx, autocapital_type);
619}
620
621/**
622 * Get the autocapitalization type.
623 *
624 * @param ctx An #Ecore_IMF_Context.
625 * @return The autocapital type being used by @p ctx.
626 * @ingroup Ecore_IMF_Context_Group
627 * @since 1.1.0
628 */
629EAPI Ecore_IMF_Autocapital_Type
630ecore_imf_context_autocapital_type_get(Ecore_IMF_Context *ctx)
631{
632 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
633 {
634 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
635 "ecore_imf_context_autocapital_allow_get");
636 return ECORE_IMF_AUTOCAPITAL_TYPE_NONE;
637 }
638
639 return ctx->autocapital_type;
640}
641
642/**
643 * Set the callback to be used on get_surrounding request.
644 *
645 * This callback will be called when the Input Method Context
646 * module requests the surrounding context.
647 *
648 * @param ctx An #Ecore_IMF_Context.
649 * @param func The callback to be called.
650 * @param data The data pointer to be passed to @p func
651 * @ingroup Ecore_IMF_Context_Group
652 */
653EAPI void
654ecore_imf_context_retrieve_surrounding_callback_set(Ecore_IMF_Context *ctx, Eina_Bool (*func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos), const void *data)
655{
656 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
657 {
658 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
659 "ecore_imf_context_retrieve_surrounding_callback_set");
660 return;
661 }
662
663 ctx->retrieve_surrounding_func = func;
664 ctx->retrieve_surrounding_data = (void *) data;
665}
666
667/**
668 * Set the input mode used by the Ecore Input Context.
669 *
670 * The input mode can be one of the input modes defined in
671 * #Ecore_IMF_Input_Mode. The default input mode is
672 * ECORE_IMF_INPUT_MODE_FULL.
673 *
674 * @param ctx An #Ecore_IMF_Context.
675 * @param input_mode The input mode to be used by @p ctx.
676 * @ingroup Ecore_IMF_Context_Group
677 */
678EAPI void
679ecore_imf_context_input_mode_set(Ecore_IMF_Context *ctx, Ecore_IMF_Input_Mode input_mode)
680{
681 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
682 {
683 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
684 "ecore_imf_context_input_mode_set");
685 return;
686 }
687 if (ctx->klass->input_mode_set) ctx->klass->input_mode_set(ctx, input_mode);
688 ctx->input_mode = input_mode;
689}
690
691/**
692 * Get the input mode being used by the Ecore Input Context.
693 *
694 * See @ref ecore_imf_context_input_mode_set for more details.
695 *
696 * @param ctx An #Ecore_IMF_Context.
697 * @return The input mode being used by @p ctx.
698 * @ingroup Ecore_IMF_Context_Group
699 */
700EAPI Ecore_IMF_Input_Mode
701ecore_imf_context_input_mode_get(Ecore_IMF_Context *ctx)
702{
703 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
704 {
705 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
706 "ecore_imf_context_input_mode_set");
707 return 0;
708 }
709 return ctx->input_mode;
710}
711
712/**
713 * Allow an Ecore Input Context to internally handle an event.
714 * If this function returns EINA_TRUE, then no further processing
715 * should be done for this event.
716 *
717 * Input methods must be able to accept all types of events (simply
718 * returning EINA_FALSE if the event was not handled), but there is no
719 * obligation of any events to be submitted to this function.
720 *
721 * @param ctx An #Ecore_IMF_Context.
722 * @param type The type of event defined by #Ecore_IMF_Event_Type.
723 * @param event The event itself.
724 * @return EINA_TRUE if the event was handled; otherwise EINA_FALSE.
725 * @ingroup Ecore_IMF_Context_Group
726 */
727EAPI Eina_Bool
728ecore_imf_context_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type, Ecore_IMF_Event *event)
729{
730 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
731 {
732 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
733 "ecore_imf_context_filter_event");
734 return EINA_FALSE;
735 }
736 if (ctx->klass->filter_event) return ctx->klass->filter_event(ctx, type, event);
737 return EINA_FALSE;
738}
739
740/**
741 * @defgroup Ecore_IMF_Context_Module_Group Ecore Input Method Context Module Functions
742 *
743 * Functions that should be used by Ecore Input Method Context modules.
744 */
745
746/**
747 * Creates a new Input Method Context with klass specified by @p ctxc.
748 *
749 * This method should be used by modules implementing the Input
750 * Method Context interface.
751 *
752 * @param ctxc An #Ecore_IMF_Context_Class.
753 * @return A new #Ecore_IMF_Context; on failure it returns NULL.
754 * @ingroup Ecore_IMF_Context_Module_Group
755 */
756EAPI Ecore_IMF_Context *
757ecore_imf_context_new(const Ecore_IMF_Context_Class *ctxc)
758{
759 Ecore_IMF_Context *ctx;
760
761 if (!ctxc) return NULL;
762 ctx = calloc(1, sizeof(Ecore_IMF_Context));
763 if (!ctx) return NULL;
764 ECORE_MAGIC_SET(ctx, ECORE_MAGIC_CONTEXT);
765 ctx->klass = ctxc;
766 ctx->data = NULL;
767 ctx->retrieve_surrounding_func = NULL;
768 ctx->retrieve_surrounding_data = NULL;
769 return ctx;
770}
771
772/**
773 * Set the Input Method Context specific data.
774 *
775 * Note that this method should be used by modules to set
776 * the Input Method Context specific data and it's not meant to
777 * be used by applications to store application specific data.
778 *
779 * @param ctx An #Ecore_IMF_Context.
780 * @param data The Input Method Context specific data.
781 * @return A new #Ecore_IMF_Context; on failure it returns NULL.
782 * @ingroup Ecore_IMF_Context_Module_Group
783 */
784EAPI void
785ecore_imf_context_data_set(Ecore_IMF_Context *ctx, void *data)
786{
787 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
788 {
789 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
790 "ecore_imf_context_data_set");
791 return;
792 }
793 ctx->data = data;
794}
795
796/**
797 * Get the Input Method Context specific data.
798 *
799 * See @ref ecore_imf_context_data_set for more details.
800 *
801 * @param ctx An #Ecore_IMF_Context.
802 * @return The Input Method Context specific data.
803 * @ingroup Ecore_IMF_Context_Module_Group
804 */
805EAPI void *ecore_imf_context_data_get(Ecore_IMF_Context *ctx)
806{
807 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
808 {
809 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
810 "ecore_imf_context_data_get");
811 return NULL;
812 }
813 return ctx->data;
814}
815
816/**
817 * Retrieve context around insertion point.
818 *
819 * This function is implemented by calling the
820 * Ecore_IMF_Context::retrieve_surrounding_func (
821 * set using #ecore_imf_context_retrieve_surrounding_callback_set).
822 *
823 * There is no obligation for a widget to respond to the
824 * ::retrieve_surrounding_func, so input methods must be prepared
825 * to function without context.
826 *
827 * @param ctx An #Ecore_IMF_Context.
828 * @param text Location to store a UTF-8 encoded string of text
829 * holding context around the insertion point.
830 * If the function returns EINA_TRUE, then you must free
831 * the result stored in this location with free().
832 * @param cursor_pos Location to store the position in characters of
833 * the insertion cursor within @text.
834 * @return EINA_TRUE if surrounding text was provided; otherwise EINA_FALSE.
835 * @ingroup Ecore_IMF_Context_Module_Group
836 */
837EAPI Eina_Bool
838ecore_imf_context_surrounding_get(Ecore_IMF_Context *ctx, char **text, int *cursor_pos)
839{
840 int result = EINA_FALSE;
841
842 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
843 {
844 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
845 "ecore_imf_context_surrounding_get");
846 return EINA_FALSE;
847 }
848
849 if (ctx->retrieve_surrounding_func)
850 {
851 result = ctx->retrieve_surrounding_func(ctx->retrieve_surrounding_data, ctx, text, cursor_pos);
852 if (!result)
853 {
854 if (text) *text = NULL;
855 if (cursor_pos) *cursor_pos = 0;
856 }
857 }
858 return result;
859}
860
861static void
862_ecore_imf_event_free_preedit(void *data __UNUSED__, void *event)
863{
864 free(event);
865}
866
867/**
868 * Adds ECORE_IMF_EVENT_PREEDIT_START to the event queue.
869 *
870 * ECORE_IMF_EVENT_PREEDIT_START should be added when a new preedit sequence starts.
871 *
872 * @param ctx An #Ecore_IMF_Context.
873 * @ingroup Ecore_IMF_Context_Module_Group
874 */
875EAPI void
876ecore_imf_context_preedit_start_event_add(Ecore_IMF_Context *ctx)
877{
878 Ecore_IMF_Event_Commit *ev;
879
880 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
881 {
882 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
883 "ecore_imf_context_preedit_start_event_add");
884 return;
885 }
886
887 ev = malloc(sizeof(Ecore_IMF_Event_Preedit_Start));
888 ev->ctx = ctx;
889 ecore_event_add(ECORE_IMF_EVENT_PREEDIT_START,
890 ev, _ecore_imf_event_free_preedit, NULL);
891}
892
893/**
894 * Adds ECORE_IMF_EVENT_PREEDIT_END to the event queue.
895 *
896 * ECORE_IMF_EVENT_PREEDIT_END should be added when a new preedit sequence has been completed or canceled.
897 *
898 * @param ctx An #Ecore_IMF_Context.
899 * @ingroup Ecore_IMF_Context_Module_Group
900 */
901EAPI void
902ecore_imf_context_preedit_end_event_add(Ecore_IMF_Context *ctx)
903{
904 Ecore_IMF_Event_Commit *ev;
905
906 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
907 {
908 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
909 "ecore_imf_context_preedit_end_event_add");
910 return;
911 }
912
913 ev = malloc(sizeof(Ecore_IMF_Event_Preedit_End));
914 ev->ctx = ctx;
915 ecore_event_add(ECORE_IMF_EVENT_PREEDIT_END,
916 ev, _ecore_imf_event_free_preedit, NULL);
917}
918
919/**
920 * Adds ECORE_IMF_EVENT_PREEDIT_CHANGED to the event queue.
921 *
922 * @param ctx An #Ecore_IMF_Context.
923 * @ingroup Ecore_IMF_Context_Module_Group
924 */
925EAPI void
926ecore_imf_context_preedit_changed_event_add(Ecore_IMF_Context *ctx)
927{
928 Ecore_IMF_Event_Commit *ev;
929
930 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
931 {
932 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
933 "ecore_imf_context_preedit_changed_event_add");
934 return;
935 }
936
937 ev = malloc(sizeof(Ecore_IMF_Event_Preedit_Changed));
938 ev->ctx = ctx;
939 ecore_event_add(ECORE_IMF_EVENT_PREEDIT_CHANGED,
940 ev, _ecore_imf_event_free_preedit, NULL);
941}
942
943static void
944_ecore_imf_event_free_commit(void *data __UNUSED__, void *event)
945{
946 Ecore_IMF_Event_Commit *ev;
947
948 ev = event;
949 if (ev->str) free(ev->str);
950 free(ev);
951}
952
953/**
954 * Adds ECORE_IMF_EVENT_COMMIT to the event queue.
955 *
956 * @param ctx An #Ecore_IMF_Context.
957 * @param str The committed string.
958 * @ingroup Ecore_IMF_Context_Module_Group
959 */
960EAPI void
961ecore_imf_context_commit_event_add(Ecore_IMF_Context *ctx, const char *str)
962{
963 Ecore_IMF_Event_Commit *ev;
964
965 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
966 {
967 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
968 "ecore_imf_context_commit_event_add");
969 return;
970 }
971
972 ev = malloc(sizeof(Ecore_IMF_Event_Commit));
973 ev->ctx = ctx;
974 ev->str = str ? strdup(str) : NULL;
975 ecore_event_add(ECORE_IMF_EVENT_COMMIT,
976 ev, _ecore_imf_event_free_commit, NULL);
977
978}
979
980static void
981_ecore_imf_event_free_delete_surrounding(void *data __UNUSED__, void *event)
982{
983 free(event);
984}
985
986/**
987 * Adds ECORE_IMF_EVENT_DELETE_SURROUNDING to the event queue.
988 *
989 * Asks the widget that the input context is attached to to delete characters around the cursor position
990 * by adding the ECORE_IMF_EVENT_DELETE_SURROUNDING to the event queue.
991 * Note that offset and n_chars are in characters not in bytes.
992 *
993 * @param ctx An #Ecore_IMF_Context.
994 * @param offset The start offset of surrounding to be deleted.
995 * @param n_chars The number of characters to be deleted.
996 * @ingroup Ecore_IMF_Context_Module_Group
997 */
998EAPI void
999ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offset, int n_chars)
1000{
1001 Ecore_IMF_Event_Delete_Surrounding *ev;
1002
1003 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1004 {
1005 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1006 "ecore_imf_context_delete_surrounding_event_add");
1007 return;
1008 }
1009
1010 ev = malloc(sizeof(Ecore_IMF_Event_Delete_Surrounding));
1011 ev->ctx = ctx;
1012 ev->offset = offset;
1013 ev->n_chars = n_chars;
1014 ecore_event_add(ECORE_IMF_EVENT_DELETE_SURROUNDING,
1015 ev, _ecore_imf_event_free_delete_surrounding, NULL);
1016}
1017
1018/**
1019 * Ask the Input Method Context to show the control panel of using Input Method.
1020 *
1021 * @param ctx An #Ecore_IMF_Context.
1022 * @ingroup Ecore_IMF_Context_IMControl_Group
1023 * @since 1.1.0
1024 */
1025EAPI void
1026ecore_imf_context_control_panel_show (Ecore_IMF_Context *ctx)
1027{
1028 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1029 {
1030 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1031 "ecore_imf_context_control_panel_show");
1032 return;
1033 }
1034
1035 if (ctx->klass->control_panel_show) ctx->klass->control_panel_show(ctx);
1036}
1037
1038/**
1039 * Ask the Input Method Context to hide the control panel of using Input Method.
1040 *
1041 * @param ctx An #Ecore_IMF_Context.
1042 * @ingroup Ecore_IMF_Context_IMControl_Group
1043 * @since 1.1.0
1044 */
1045EAPI void
1046ecore_imf_context_control_panel_hide (Ecore_IMF_Context *ctx)
1047{
1048 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1049 {
1050 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1051 "ecore_imf_context_control_panel_hide");
1052 return;
1053 }
1054
1055 if (ctx->klass->control_panel_hide) ctx->klass->control_panel_hide(ctx);
1056}
1057
1058/**
1059 * Ask the Input Method Context to show the input panel (virtual keyboard).
1060 *
1061 * @param ctx An #Ecore_IMF_Context.
1062 * @ingroup Ecore_IMF_Context_IMControl_Group
1063 * @since 1.1.0
1064 */
1065EAPI void
1066ecore_imf_context_input_panel_show(Ecore_IMF_Context *ctx)
1067{
1068 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1069 {
1070 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1071 "ecore_imf_context_input_panel_show");
1072 return;
1073 }
1074
1075 if (ctx->klass->show) ctx->klass->show(ctx);
1076}
1077
1078/**
1079 * Ask the Input Method Context to hide the input panel.
1080 *
1081 * @param ctx An #Ecore_IMF_Context.
1082 * @ingroup Ecore_IMF_Context_IMControl_Group
1083 * @since 1.1.0
1084 */
1085EAPI void
1086ecore_imf_context_input_panel_hide(Ecore_IMF_Context *ctx)
1087{
1088 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1089 {
1090 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1091 "ecore_imf_context_input_panel_hide");
1092 return;
1093 }
1094
1095 if (ctx->klass->hide) ctx->klass->hide(ctx);
1096}
1097
1098/**
1099 * Set the layout of the input panel.
1100 *
1101 * @param ctx An #Ecore_IMF_Context.
1102 * @param layout see #ECORE_IMF_INPUT_PANEL_LAYOUT
1103 * @ingroup Ecore_IMF_Context_IMControl_Group
1104 * @since 1.1.0
1105 */
1106EAPI void
1107ecore_imf_context_input_panel_layout_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout)
1108{
1109 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1110 {
1111 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1112 "ecore_imf_context_input_panel_layout_set");
1113 return;
1114 }
1115
1116 if (ctx->klass->input_panel_layout_set)
1117 ctx->klass->input_panel_layout_set(ctx, layout);
1118
1119 ctx->input_panel_layout = layout;
1120}
1121
1122/**
1123 * Get the layout of the current active input panel.
1124 *
1125 * @param ctx An #Ecore_IMF_Context.
1126 * @return layout see #Ecore_IMF_Input_Panel_Layout
1127 * @ingroup Ecore_IMF_Context_IMControl_Group
1128 * @since 1.1.0
1129 */
1130EAPI Ecore_IMF_Input_Panel_Layout
1131ecore_imf_context_input_panel_layout_get (Ecore_IMF_Context *ctx)
1132{
1133 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1134 {
1135 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1136 "ecore_imf_context_input_panel_layout_get");
1137 return ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID;
1138 }
1139
1140 if (ctx->klass->input_panel_layout_get)
1141 {
1142 return ctx->input_panel_layout;
1143 }
1144 else
1145 return ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID;
1146}
1147
1148/**
1149 * Set the language of the input panel.
1150 * This API can be used when you want to show the English keyboard.
1151 *
1152 * @param ctx An #Ecore_IMF_Context.
1153 * @param lang the language to be set to the input panel.
1154 * @ingroup Ecore_IMF_Context_IMControl_Group
1155 * @since 1.1.0
1156 */
1157EAPI void
1158ecore_imf_context_input_panel_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang)
1159{
1160 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1161 {
1162 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1163 "ecore_imf_context_input_panel_language_set");
1164 return;
1165 }
1166
1167 if (ctx->klass->input_panel_language_set) ctx->klass->input_panel_language_set(ctx, lang);
1168 ctx->input_panel_lang = lang;
1169}
1170
1171/**
1172 * Get the language of the input panel.
1173 *
1174 * See @ref ecore_imf_context_input_panel_language_set for more details.
1175 *
1176 * @param ctx An #Ecore_IMF_Context.
1177 * @return Ecore_IMF_Input_Panel_Lang
1178 * @ingroup Ecore_IMF_Context_IMControl_Group
1179 * @since 1.1.0
1180 */
1181EAPI Ecore_IMF_Input_Panel_Lang
1182ecore_imf_context_input_panel_language_get (Ecore_IMF_Context *ctx)
1183{
1184 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1185 {
1186 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1187 "ecore_imf_context_input_panel_language_get");
1188 return ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC;
1189 }
1190
1191 return ctx->input_panel_lang;
1192}
1193
1194/**
1195 * Set whether the Input Method Context should request to show the input panel automatically
1196 * when the widget has focus.
1197 *
1198 * @param ctx An #Ecore_IMF_Context.
1199 * @param enabled If true, the input panel will be shown when the widget is clicked or has focus.
1200 * @ingroup Ecore_IMF_Context_Group
1201 * @since 1.1.0
1202 */
1203EAPI void
1204ecore_imf_context_input_panel_enabled_set (Ecore_IMF_Context *ctx,
1205 Eina_Bool enabled)
1206{
1207 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1208 {
1209 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1210 "ecore_imf_context_input_panel_enabled_set");
1211 return;
1212 }
1213
1214 ctx->input_panel_enabled = enabled;
1215}
1216
1217/**
1218 * Get whether the Input Method Context requests to show the input panel automatically.
1219 *
1220 * @param ctx An #Ecore_IMF_Context.
1221 * @return Return the attribute to show the input panel automatically
1222 * @ingroup Ecore_IMF_Context_Group
1223 * @since 1.1.0
1224 */
1225EAPI Eina_Bool
1226ecore_imf_context_input_panel_enabled_get (Ecore_IMF_Context *ctx)
1227{
1228 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
1229 {
1230 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
1231 "ecore_imf_context_input_panel_enabled_get");
1232 return EINA_FALSE;
1233 }
1234
1235 return ctx->input_panel_enabled;
1236}
1237
diff --git a/libraries/ecore/src/lib/ecore_imf/ecore_imf_module.c b/libraries/ecore/src/lib/ecore_imf/ecore_imf_module.c
new file mode 100644
index 0000000..946f5bc
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/ecore_imf_module.c
@@ -0,0 +1,212 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8#include <limits.h>
9
10#include <Ecore.h>
11#include <ecore_private.h>
12
13#include "Ecore_IMF.h"
14#include "ecore_imf_private.h"
15
16static void _ecore_imf_module_free(Ecore_IMF_Module *module);
17static int _ecore_imf_modules_exists(const char *ctx_id);
18
19typedef struct _Ecore_IMF_Selector
20{
21 const char *toselect;
22 void *selected;
23} Ecore_IMF_Selector;
24
25static Eina_Hash *modules = NULL;
26static Eina_Array *module_list = NULL;
27
28void
29ecore_imf_module_init(void)
30{
31 char *homedir;
32
33 module_list = eina_module_list_get(NULL, PACKAGE_LIB_DIR "/ecore/immodules", 0, NULL, NULL);
34 homedir = eina_module_environment_path_get("HOME", "/.ecore/immodules");
35 if (homedir)
36 {
37 module_list = eina_module_list_get(module_list, homedir, 0, NULL, NULL);
38 free(homedir);
39 }
40 eina_module_list_load(module_list);
41}
42
43void
44ecore_imf_module_shutdown(void)
45{
46 if (modules)
47 {
48 eina_hash_free(modules);
49 modules = NULL;
50 }
51 if (module_list)
52 {
53 eina_module_list_free(module_list);
54 eina_array_free(module_list);
55 module_list = NULL;
56 }
57}
58
59static Eina_Bool
60_hash_module_available_get(const Eina_Hash *hash __UNUSED__, int *data, void *list)
61{
62 *(Eina_List**)list = eina_list_append(*(Eina_List**)list, data);
63 return EINA_TRUE;
64}
65
66Eina_List *
67ecore_imf_module_available_get(void)
68{
69 Eina_List *values = NULL;
70 Eina_Iterator *it = NULL;
71
72 if (!modules) return NULL;
73
74 it = eina_hash_iterator_data_new(modules);
75 if (!it)
76 return NULL;
77
78 eina_iterator_foreach(it, EINA_EACH_CB(_hash_module_available_get), &values);
79 eina_iterator_free(it);
80
81 return values;
82}
83
84Ecore_IMF_Module *
85ecore_imf_module_get(const char *ctx_id)
86{
87 if (!modules) return NULL;
88 return eina_hash_find(modules, ctx_id);
89}
90
91Ecore_IMF_Context *
92ecore_imf_module_context_create(const char *ctx_id)
93{
94 Ecore_IMF_Module *module;
95 Ecore_IMF_Context *ctx = NULL;
96
97 if (!modules) return NULL;
98 module = eina_hash_find(modules, ctx_id);
99 if (module)
100 {
101 ctx = module->create();
102 if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT))
103 {
104 ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,
105 "ecore_imf_module_context_create");
106 return NULL;
107 }
108 ctx->module = module;
109 }
110 return ctx;
111}
112
113static Eina_Bool
114_hash_ids_get(const Eina_Hash *hash __UNUSED__, const char *key, void *list)
115{
116 *(Eina_List**)list = eina_list_append(*(Eina_List**)list, key);
117 return EINA_TRUE;
118}
119
120Eina_List *
121ecore_imf_module_context_ids_get(void)
122{
123 Eina_List *l = NULL;
124 Eina_Iterator *it = NULL;
125
126 if (!modules) return NULL;
127
128 it = eina_hash_iterator_key_new(modules);
129 if (!it)
130 return NULL;
131
132 eina_iterator_foreach(it, EINA_EACH_CB(_hash_ids_get), &l);
133 eina_iterator_free(it);
134
135 return l;
136}
137
138static Eina_Bool
139_hash_ids_by_canvas_type_get(const Eina_Hash *hash __UNUSED__, void *data, void *fdata)
140{
141 Ecore_IMF_Module *module = data;
142 Ecore_IMF_Selector *selector = fdata;
143
144 if (!strcmp(module->info->canvas_type, selector->toselect))
145 selector->selected = eina_list_append(selector->selected, (void *)module->info->id);
146
147 return EINA_TRUE;
148}
149
150Eina_List *
151ecore_imf_module_context_ids_by_canvas_type_get(const char *canvas_type)
152{
153 Ecore_IMF_Selector selector;
154 Eina_List *values = NULL;
155 Eina_Iterator *it = NULL;
156
157 if (!modules) return NULL;
158
159 if (!canvas_type)
160 return ecore_imf_module_context_ids_get();
161
162 it = eina_hash_iterator_data_new(modules);
163 if (!it)
164 return NULL;
165
166 selector.toselect = canvas_type;
167 selector.selected = values;
168 eina_iterator_foreach(it, EINA_EACH_CB(_hash_ids_by_canvas_type_get), &selector);
169 eina_iterator_free(it);
170
171 return values;
172}
173
174EAPI void
175ecore_imf_module_register(const Ecore_IMF_Context_Info *info,
176 Ecore_IMF_Context *(*imf_module_create)(void),
177 Ecore_IMF_Context *(*imf_module_exit)(void))
178{
179 Ecore_IMF_Module *module;
180
181 if (_ecore_imf_modules_exists(info->id)) return;
182
183 if (!modules)
184 modules = eina_hash_string_superfast_new(EINA_FREE_CB(_ecore_imf_module_free));
185
186 module = malloc(sizeof(Ecore_IMF_Module));
187 module->info = info;
188 /* cache imf_module_create as it may be used several times */
189 module->create = imf_module_create;
190 module->exit = imf_module_exit;
191
192 eina_hash_add(modules, info->id, module);
193}
194
195static void
196_ecore_imf_module_free(Ecore_IMF_Module *module)
197{
198 if (module->exit) module->exit();
199 free(module);
200}
201
202static int
203_ecore_imf_modules_exists(const char *ctx_id)
204{
205 if (!modules) return 0;
206 if (!ctx_id) return 0;
207
208 if (eina_hash_find(modules, ctx_id))
209 return 1;
210
211 return 0;
212}
diff --git a/libraries/ecore/src/lib/ecore_imf/ecore_imf_private.h b/libraries/ecore/src/lib/ecore_imf/ecore_imf_private.h
new file mode 100644
index 0000000..07a5b09
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf/ecore_imf_private.h
@@ -0,0 +1,72 @@
1#ifndef _ECORE_IMF_PRIVATE_H
2#define _ECORE_IMF_PRIVATE_H
3
4#define ECORE_MAGIC_CONTEXT 0x56c1b39a
5
6#ifdef ECORE_IMF_DEFAULT_LOG_COLOR
7#undef ECORE_IMF_DEFAULT_LOG_COLOR
8#endif
9#define ECORE_IMF_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
10
11extern int _ecore_imf_log_dom;
12#ifdef ERR
13# undef ERR
14#endif
15#define ERR(...) EINA_LOG_DOM_ERR(_ecore_imf_log_dom, __VA_ARGS__)
16
17#ifdef DBG
18# undef DBG
19#endif
20#define DBG(...) EINA_LOG_DOM_DBG(_ecore_imf_log_dom, __VA_ARGS__)
21
22#ifdef INF
23# undef INF
24#endif
25#define INF(...) EINA_LOG_DOM_INFO(_ecore_imf_log_dom, __VA_ARGS__)
26
27#ifdef WRN
28# undef WRN
29#endif
30#define WRN(...) EINA_LOG_DOM_WARN(_ecore_imf_log_dom, __VA_ARGS__)
31
32#ifdef CRIT
33# undef CRIT
34#endif
35#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_imf_log_dom, __VA_ARGS__)
36
37typedef struct _Ecore_IMF_Module Ecore_IMF_Module;
38
39struct _Ecore_IMF_Context
40{
41 ECORE_MAGIC;
42 const Ecore_IMF_Module *module;
43 const Ecore_IMF_Context_Class *klass;
44 void *data;
45 int input_mode;
46 void *window;
47 void *client_canvas;
48 Eina_Bool (*retrieve_surrounding_func)(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos);
49 void *retrieve_surrounding_data;
50 Ecore_IMF_Autocapital_Type autocapital_type;
51 Ecore_IMF_Input_Panel_Layout input_panel_layout;
52 Ecore_IMF_Input_Panel_Lang input_panel_lang;
53 Eina_Bool allow_prediction : 1;
54 Eina_Bool input_panel_enabled : 1;
55};
56
57struct _Ecore_IMF_Module
58{
59 const Ecore_IMF_Context_Info *info;
60 Ecore_IMF_Context *(*create)(void);
61 Ecore_IMF_Context *(*exit)(void);
62};
63
64void ecore_imf_module_init(void);
65void ecore_imf_module_shutdown(void);
66Eina_List *ecore_imf_module_available_get(void);
67Ecore_IMF_Module *ecore_imf_module_get(const char *ctx_id);
68Ecore_IMF_Context *ecore_imf_module_context_create(const char *ctx_id);
69Eina_List *ecore_imf_module_context_ids_get(void);
70Eina_List *ecore_imf_module_context_ids_by_canvas_type_get(const char *canvas_type);
71
72#endif
diff --git a/libraries/ecore/src/lib/ecore_imf_evas/Ecore_IMF_Evas.h b/libraries/ecore/src/lib/ecore_imf_evas/Ecore_IMF_Evas.h
new file mode 100644
index 0000000..5f7cdb9
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf_evas/Ecore_IMF_Evas.h
@@ -0,0 +1,50 @@
1#ifndef _ECORE_IMF_EVAS_H
2#define _ECORE_IMF_EVAS_H
3
4#include <Ecore_IMF.h>
5#include <Evas.h>
6
7#ifdef EAPI
8# undef EAPI
9#endif
10
11#ifdef _WIN32
12# ifdef EFL_ECORE_IMF_EVAS_BUILD
13# ifdef DLL_EXPORT
14# define EAPI __declspec(dllexport)
15# else
16# define EAPI
17# endif /* ! DLL_EXPORT */
18# else
19# define EAPI __declspec(dllimport)
20# endif /* ! EFL_ECORE_IMF_BUILD */
21#else
22# ifdef __GNUC__
23# if __GNUC__ >= 4
24# define EAPI __attribute__ ((visibility("default")))
25# else
26# define EAPI
27# endif
28# else
29# define EAPI
30# endif
31#endif /* ! _WIN32 */
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37EAPI void ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event, Ecore_IMF_Event_Mouse_In *imf_event);
38EAPI void ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event, Ecore_IMF_Event_Mouse_Out *imf_event);
39EAPI void ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event, Ecore_IMF_Event_Mouse_Move *imf_event);
40EAPI void ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event, Ecore_IMF_Event_Mouse_Down *imf_event);
41EAPI void ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event, Ecore_IMF_Event_Mouse_Up *imf_event);
42EAPI void ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event, Ecore_IMF_Event_Mouse_Wheel *imf_event);
43EAPI void ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event, Ecore_IMF_Event_Key_Down *imf_event);
44EAPI void ecore_imf_evas_event_key_up_wrap(Evas_Event_Key_Up *evas_event, Ecore_IMF_Event_Key_Up *imf_event);
45
46#ifdef __cplusplus
47}
48#endif
49
50#endif
diff --git a/libraries/ecore/src/lib/ecore_imf_evas/Makefile.am b/libraries/ecore/src/lib/ecore_imf_evas/Makefile.am
new file mode 100644
index 0000000..fa5c491
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf_evas/Makefile.am
@@ -0,0 +1,22 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_imf \
6@EFL_ECORE_IMF_EVAS_BUILD@ \
7@EVAS_CFLAGS@ \
8@EINA_CFLAGS@
9
10lib_LTLIBRARIES = libecore_imf_evas.la
11includes_HEADERS = Ecore_IMF_Evas.h
12includesdir = $(includedir)/ecore-@VMAJ@
13
14libecore_imf_evas_la_SOURCES = \
15ecore_imf_evas.c
16
17libecore_imf_evas_la_LIBADD = \
18$(top_builddir)/src/lib/ecore_imf/libecore_imf.la \
19@EVAS_LIBS@ \
20@EINA_LIBS@
21
22libecore_imf_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
diff --git a/libraries/ecore/src/lib/ecore_imf_evas/Makefile.in b/libraries/ecore/src/lib/ecore_imf_evas/Makefile.in
new file mode 100644
index 0000000..9b26915
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf_evas/Makefile.in
@@ -0,0 +1,815 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_imf_evas
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_imf_evas_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore_imf/libecore_imf.la
91am_libecore_imf_evas_la_OBJECTS = ecore_imf_evas.lo
92libecore_imf_evas_la_OBJECTS = $(am_libecore_imf_evas_la_OBJECTS)
93AM_V_lt = $(am__v_lt_$(V))
94am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
95am__v_lt_0 = --silent
96libecore_imf_evas_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
97 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
98 $(AM_CFLAGS) $(CFLAGS) $(libecore_imf_evas_la_LDFLAGS) \
99 $(LDFLAGS) -o $@
100DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
101depcomp = $(SHELL) $(top_srcdir)/depcomp
102am__depfiles_maybe = depfiles
103am__mv = mv -f
104COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
105 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
106LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
107 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
108 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
109 $(AM_CFLAGS) $(CFLAGS)
110AM_V_CC = $(am__v_CC_$(V))
111am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
112am__v_CC_0 = @echo " CC " $@;
113AM_V_at = $(am__v_at_$(V))
114am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
115am__v_at_0 = @
116CCLD = $(CC)
117LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
118 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
119 $(AM_LDFLAGS) $(LDFLAGS) -o $@
120AM_V_CCLD = $(am__v_CCLD_$(V))
121am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
122am__v_CCLD_0 = @echo " CCLD " $@;
123AM_V_GEN = $(am__v_GEN_$(V))
124am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
125am__v_GEN_0 = @echo " GEN " $@;
126SOURCES = $(libecore_imf_evas_la_SOURCES)
127DIST_SOURCES = $(libecore_imf_evas_la_SOURCES)
128HEADERS = $(includes_HEADERS)
129ETAGS = etags
130CTAGS = ctags
131DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
132ACLOCAL = @ACLOCAL@
133ALLOCA = @ALLOCA@
134AMTAR = @AMTAR@
135AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
136AR = @AR@
137AS = @AS@
138AUTOCONF = @AUTOCONF@
139AUTOHEADER = @AUTOHEADER@
140AUTOMAKE = @AUTOMAKE@
141AWK = @AWK@
142CARES_CFLAGS = @CARES_CFLAGS@
143CARES_LIBS = @CARES_LIBS@
144CC = @CC@
145CCDEPMODE = @CCDEPMODE@
146CFLAGS = @CFLAGS@
147CHECK_CFLAGS = @CHECK_CFLAGS@
148CHECK_LIBS = @CHECK_LIBS@
149CPP = @CPP@
150CPPFLAGS = @CPPFLAGS@
151CURL_CFLAGS = @CURL_CFLAGS@
152CURL_LIBS = @CURL_LIBS@
153CXX = @CXX@
154CXXCPP = @CXXCPP@
155CXXDEPMODE = @CXXDEPMODE@
156CXXFLAGS = @CXXFLAGS@
157CYGPATH_W = @CYGPATH_W@
158DEFS = @DEFS@
159DEPDIR = @DEPDIR@
160DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
161DIRECTFB_LIBS = @DIRECTFB_LIBS@
162DLLTOOL = @DLLTOOL@
163DSYMUTIL = @DSYMUTIL@
164DUMPBIN = @DUMPBIN@
165ECHO_C = @ECHO_C@
166ECHO_N = @ECHO_N@
167ECHO_T = @ECHO_T@
168ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
169ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
170EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
171EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
172EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
173EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
174EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
175EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
176EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
177EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
178EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
179EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
180EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
181EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
182EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
183EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
184EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
185EGREP = @EGREP@
186EINA_CFLAGS = @EINA_CFLAGS@
187EINA_LIBS = @EINA_LIBS@
188ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
189ESCAPE_LIBS = @ESCAPE_LIBS@
190EVAS_CFLAGS = @EVAS_CFLAGS@
191EVAS_LIBS = @EVAS_LIBS@
192EVIL_CFLAGS = @EVIL_CFLAGS@
193EVIL_LIBS = @EVIL_LIBS@
194EXEEXT = @EXEEXT@
195FGREP = @FGREP@
196GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
197GLIB_CFLAGS = @GLIB_CFLAGS@
198GLIB_LIBS = @GLIB_LIBS@
199GMSGFMT = @GMSGFMT@
200GMSGFMT_015 = @GMSGFMT_015@
201GREP = @GREP@
202INSTALL = @INSTALL@
203INSTALL_DATA = @INSTALL_DATA@
204INSTALL_PROGRAM = @INSTALL_PROGRAM@
205INSTALL_SCRIPT = @INSTALL_SCRIPT@
206INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
207INTLLIBS = @INTLLIBS@
208INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
209KEYSYMDEFS = @KEYSYMDEFS@
210LD = @LD@
211LDFLAGS = @LDFLAGS@
212LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
213LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
214LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
215LIBICONV = @LIBICONV@
216LIBINTL = @LIBINTL@
217LIBOBJS = @LIBOBJS@
218LIBS = @LIBS@
219LIBTOOL = @LIBTOOL@
220LIPO = @LIPO@
221LN_S = @LN_S@
222LTLIBICONV = @LTLIBICONV@
223LTLIBINTL = @LTLIBINTL@
224LTLIBOBJS = @LTLIBOBJS@
225MAKEINFO = @MAKEINFO@
226MKDIR_P = @MKDIR_P@
227MSGFMT = @MSGFMT@
228MSGFMT_015 = @MSGFMT_015@
229MSGMERGE = @MSGMERGE@
230NM = @NM@
231NMEDIT = @NMEDIT@
232OBJC = @OBJC@
233OBJCDEPMODE = @OBJCDEPMODE@
234OBJCFLAGS = @OBJCFLAGS@
235OBJDUMP = @OBJDUMP@
236OBJEXT = @OBJEXT@
237OTOOL = @OTOOL@
238OTOOL64 = @OTOOL64@
239PACKAGE = @PACKAGE@
240PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
241PACKAGE_NAME = @PACKAGE_NAME@
242PACKAGE_STRING = @PACKAGE_STRING@
243PACKAGE_TARNAME = @PACKAGE_TARNAME@
244PACKAGE_URL = @PACKAGE_URL@
245PACKAGE_VERSION = @PACKAGE_VERSION@
246PATH_SEPARATOR = @PATH_SEPARATOR@
247PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
248PIXMAN_LIBS = @PIXMAN_LIBS@
249PKG_CONFIG = @PKG_CONFIG@
250PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
251PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
252POSUB = @POSUB@
253RANLIB = @RANLIB@
254SDL_CFLAGS = @SDL_CFLAGS@
255SDL_CONFIG = @SDL_CONFIG@
256SDL_LIBS = @SDL_LIBS@
257SED = @SED@
258SET_MAKE = @SET_MAKE@
259SHELL = @SHELL@
260SSL_CFLAGS = @SSL_CFLAGS@
261SSL_LIBS = @SSL_LIBS@
262STRIP = @STRIP@
263TLS2_CFLAGS = @TLS2_CFLAGS@
264TLS2_LIBS = @TLS2_LIBS@
265TLS_CFLAGS = @TLS_CFLAGS@
266TLS_LIBS = @TLS_LIBS@
267TSLIB_CFLAGS = @TSLIB_CFLAGS@
268TSLIB_LIBS = @TSLIB_LIBS@
269USE_NLS = @USE_NLS@
270VERSION = @VERSION@
271VMAJ = @VMAJ@
272WIN32_CFLAGS = @WIN32_CFLAGS@
273WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
274WIN32_LIBS = @WIN32_LIBS@
275XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
276XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
277XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
278XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
279XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
280XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
281XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
282XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
283XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
284XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
285XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
286XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
287XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
288XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
289XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
290XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
291XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
292XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
293XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
294XCB_X11_LIBS = @XCB_X11_LIBS@
295XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
296XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
297XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
298XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
299XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
300XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
301XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
302XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
303XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
304XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
305XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
306XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
307XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
308XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
309XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
310XDAMAGE_LIBS = @XDAMAGE_LIBS@
311XDPMS_CFLAGS = @XDPMS_CFLAGS@
312XDPMS_LIBS = @XDPMS_LIBS@
313XFIXES_CFLAGS = @XFIXES_CFLAGS@
314XFIXES_LIBS = @XFIXES_LIBS@
315XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
316XGESTURE_LIBS = @XGESTURE_LIBS@
317XGETTEXT = @XGETTEXT@
318XGETTEXT_015 = @XGETTEXT_015@
319XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
320XI2_CFLAGS = @XI2_CFLAGS@
321XI2_LIBS = @XI2_LIBS@
322XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
323XINERAMA_LIBS = @XINERAMA_LIBS@
324XKB_CFLAGS = @XKB_CFLAGS@
325XKB_LIBS = @XKB_LIBS@
326XMKMF = @XMKMF@
327XPRINT_CFLAGS = @XPRINT_CFLAGS@
328XPRINT_LIBS = @XPRINT_LIBS@
329XRANDR_CFLAGS = @XRANDR_CFLAGS@
330XRANDR_LIBS = @XRANDR_LIBS@
331XRENDER_CFLAGS = @XRENDER_CFLAGS@
332XRENDER_LIBS = @XRENDER_LIBS@
333XSS_CFLAGS = @XSS_CFLAGS@
334XSS_LIBS = @XSS_LIBS@
335XTEST_CFLAGS = @XTEST_CFLAGS@
336XTEST_LIBS = @XTEST_LIBS@
337X_CFLAGS = @X_CFLAGS@
338X_EXTRA_LIBS = @X_EXTRA_LIBS@
339X_LIBS = @X_LIBS@
340X_PRE_LIBS = @X_PRE_LIBS@
341Xcursor_cflags = @Xcursor_cflags@
342Xcursor_libs = @Xcursor_libs@
343abs_builddir = @abs_builddir@
344abs_srcdir = @abs_srcdir@
345abs_top_builddir = @abs_top_builddir@
346abs_top_srcdir = @abs_top_srcdir@
347ac_ct_CC = @ac_ct_CC@
348ac_ct_CXX = @ac_ct_CXX@
349ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
350ac_ct_OBJC = @ac_ct_OBJC@
351am__include = @am__include@
352am__leading_dot = @am__leading_dot@
353am__quote = @am__quote@
354am__tar = @am__tar@
355am__untar = @am__untar@
356bindir = @bindir@
357build = @build@
358build_alias = @build_alias@
359build_cpu = @build_cpu@
360build_os = @build_os@
361build_vendor = @build_vendor@
362builddir = @builddir@
363cocoa_ldflags = @cocoa_ldflags@
364datadir = @datadir@
365datarootdir = @datarootdir@
366dlopen_libs = @dlopen_libs@
367docdir = @docdir@
368dvidir = @dvidir@
369ecore_cocoa_cflags = @ecore_cocoa_cflags@
370ecore_cocoa_libs = @ecore_cocoa_libs@
371ecore_con_cflags = @ecore_con_cflags@
372ecore_con_libs = @ecore_con_libs@
373ecore_directfb_cflags = @ecore_directfb_cflags@
374ecore_directfb_libs = @ecore_directfb_libs@
375ecore_evas_cflags = @ecore_evas_cflags@
376ecore_evas_libs = @ecore_evas_libs@
377ecore_fb_cflags = @ecore_fb_cflags@
378ecore_fb_libs = @ecore_fb_libs@
379ecore_file_cflags = @ecore_file_cflags@
380ecore_file_libs = @ecore_file_libs@
381ecore_imf_cflags = @ecore_imf_cflags@
382ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
383ecore_imf_evas_libs = @ecore_imf_evas_libs@
384ecore_imf_libs = @ecore_imf_libs@
385ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
386ecore_imf_xim_libs = @ecore_imf_xim_libs@
387ecore_input_cflags = @ecore_input_cflags@
388ecore_input_evas_cflags = @ecore_input_evas_cflags@
389ecore_input_evas_libs = @ecore_input_evas_libs@
390ecore_input_libs = @ecore_input_libs@
391ecore_ipc_cflags = @ecore_ipc_cflags@
392ecore_ipc_libs = @ecore_ipc_libs@
393ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
394ecore_psl1ght_libs = @ecore_psl1ght_libs@
395ecore_sdl_cflags = @ecore_sdl_cflags@
396ecore_sdl_libs = @ecore_sdl_libs@
397ecore_win32_cflags = @ecore_win32_cflags@
398ecore_win32_libs = @ecore_win32_libs@
399ecore_wince_cflags = @ecore_wince_cflags@
400ecore_wince_libs = @ecore_wince_libs@
401ecore_x_cflags = @ecore_x_cflags@
402ecore_x_libs = @ecore_x_libs@
403ecore_x_libs_private = @ecore_x_libs_private@
404efl_doxygen = @efl_doxygen@
405efl_have_doxygen = @efl_have_doxygen@
406exec_prefix = @exec_prefix@
407have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
408host = @host@
409host_alias = @host_alias@
410host_cpu = @host_cpu@
411host_os = @host_os@
412host_vendor = @host_vendor@
413htmldir = @htmldir@
414includedir = @includedir@
415infodir = @infodir@
416install_sh = @install_sh@
417libdir = @libdir@
418libexecdir = @libexecdir@
419localedir = @localedir@
420localstatedir = @localstatedir@
421lt_ECHO = @lt_ECHO@
422lt_enable_auto_import = @lt_enable_auto_import@
423mandir = @mandir@
424mkdir_p = @mkdir_p@
425oldincludedir = @oldincludedir@
426pdfdir = @pdfdir@
427pkgconfig_requires_private = @pkgconfig_requires_private@
428prefix = @prefix@
429program_transform_name = @program_transform_name@
430psdir = @psdir@
431release_info = @release_info@
432requirements_ecore = @requirements_ecore@
433requirements_ecore_cocoa = @requirements_ecore_cocoa@
434requirements_ecore_con = @requirements_ecore_con@
435requirements_ecore_directfb = @requirements_ecore_directfb@
436requirements_ecore_evas = @requirements_ecore_evas@
437requirements_ecore_fb = @requirements_ecore_fb@
438requirements_ecore_file = @requirements_ecore_file@
439requirements_ecore_imf = @requirements_ecore_imf@
440requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
441requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
442requirements_ecore_input = @requirements_ecore_input@
443requirements_ecore_input_evas = @requirements_ecore_input_evas@
444requirements_ecore_ipc = @requirements_ecore_ipc@
445requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
446requirements_ecore_sdl = @requirements_ecore_sdl@
447requirements_ecore_win32 = @requirements_ecore_win32@
448requirements_ecore_wince = @requirements_ecore_wince@
449requirements_ecore_x = @requirements_ecore_x@
450rt_libs = @rt_libs@
451sbindir = @sbindir@
452sharedstatedir = @sharedstatedir@
453srcdir = @srcdir@
454sysconfdir = @sysconfdir@
455target_alias = @target_alias@
456top_build_prefix = @top_build_prefix@
457top_builddir = @top_builddir@
458top_srcdir = @top_srcdir@
459version_info = @version_info@
460x_cflags = @x_cflags@
461x_includes = @x_includes@
462x_libs = @x_libs@
463MAINTAINERCLEANFILES = Makefile.in
464AM_CPPFLAGS = \
465-I$(top_srcdir)/src/lib/ecore \
466-I$(top_srcdir)/src/lib/ecore_imf \
467@EFL_ECORE_IMF_EVAS_BUILD@ \
468@EVAS_CFLAGS@ \
469@EINA_CFLAGS@
470
471lib_LTLIBRARIES = libecore_imf_evas.la
472includes_HEADERS = Ecore_IMF_Evas.h
473includesdir = $(includedir)/ecore-@VMAJ@
474libecore_imf_evas_la_SOURCES = \
475ecore_imf_evas.c
476
477libecore_imf_evas_la_LIBADD = \
478$(top_builddir)/src/lib/ecore_imf/libecore_imf.la \
479@EVAS_LIBS@ \
480@EINA_LIBS@
481
482libecore_imf_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
483all: all-am
484
485.SUFFIXES:
486.SUFFIXES: .c .lo .o .obj
487$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
488 @for dep in $?; do \
489 case '$(am__configure_deps)' in \
490 *$$dep*) \
491 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
492 && { if test -f $@; then exit 0; else break; fi; }; \
493 exit 1;; \
494 esac; \
495 done; \
496 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_imf_evas/Makefile'; \
497 $(am__cd) $(top_srcdir) && \
498 $(AUTOMAKE) --gnu src/lib/ecore_imf_evas/Makefile
499.PRECIOUS: Makefile
500Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
501 @case '$?' in \
502 *config.status*) \
503 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
504 *) \
505 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
506 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
507 esac;
508
509$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
510 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
511
512$(top_srcdir)/configure: $(am__configure_deps)
513 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
514$(ACLOCAL_M4): $(am__aclocal_m4_deps)
515 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
516$(am__aclocal_m4_deps):
517install-libLTLIBRARIES: $(lib_LTLIBRARIES)
518 @$(NORMAL_INSTALL)
519 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
520 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
521 list2=; for p in $$list; do \
522 if test -f $$p; then \
523 list2="$$list2 $$p"; \
524 else :; fi; \
525 done; \
526 test -z "$$list2" || { \
527 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
528 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
529 }
530
531uninstall-libLTLIBRARIES:
532 @$(NORMAL_UNINSTALL)
533 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
534 for p in $$list; do \
535 $(am__strip_dir) \
536 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
537 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
538 done
539
540clean-libLTLIBRARIES:
541 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
542 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
543 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
544 test "$$dir" != "$$p" || dir=.; \
545 echo "rm -f \"$${dir}/so_locations\""; \
546 rm -f "$${dir}/so_locations"; \
547 done
548libecore_imf_evas.la: $(libecore_imf_evas_la_OBJECTS) $(libecore_imf_evas_la_DEPENDENCIES)
549 $(AM_V_CCLD)$(libecore_imf_evas_la_LINK) -rpath $(libdir) $(libecore_imf_evas_la_OBJECTS) $(libecore_imf_evas_la_LIBADD) $(LIBS)
550
551mostlyclean-compile:
552 -rm -f *.$(OBJEXT)
553
554distclean-compile:
555 -rm -f *.tab.c
556
557@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_imf_evas.Plo@am__quote@
558
559.c.o:
560@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
561@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
562@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
563@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
564@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
565@am__fastdepCC_FALSE@ $(COMPILE) -c $<
566
567.c.obj:
568@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
569@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
570@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
572@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
573@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
574
575.c.lo:
576@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
577@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
578@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
580@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
581@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
582
583mostlyclean-libtool:
584 -rm -f *.lo
585
586clean-libtool:
587 -rm -rf .libs _libs
588install-includesHEADERS: $(includes_HEADERS)
589 @$(NORMAL_INSTALL)
590 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
591 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
592 for p in $$list; do \
593 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
594 echo "$$d$$p"; \
595 done | $(am__base_list) | \
596 while read files; do \
597 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
598 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
599 done
600
601uninstall-includesHEADERS:
602 @$(NORMAL_UNINSTALL)
603 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
604 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
605 test -n "$$files" || exit 0; \
606 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
607 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
608
609ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
610 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
611 unique=`for i in $$list; do \
612 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
613 done | \
614 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
615 END { if (nonempty) { for (i in files) print i; }; }'`; \
616 mkid -fID $$unique
617tags: TAGS
618
619TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
620 $(TAGS_FILES) $(LISP)
621 set x; \
622 here=`pwd`; \
623 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
624 unique=`for i in $$list; do \
625 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
626 done | \
627 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
628 END { if (nonempty) { for (i in files) print i; }; }'`; \
629 shift; \
630 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
631 test -n "$$unique" || unique=$$empty_fix; \
632 if test $$# -gt 0; then \
633 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
634 "$$@" $$unique; \
635 else \
636 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
637 $$unique; \
638 fi; \
639 fi
640ctags: CTAGS
641CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
642 $(TAGS_FILES) $(LISP)
643 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
644 unique=`for i in $$list; do \
645 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
646 done | \
647 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
648 END { if (nonempty) { for (i in files) print i; }; }'`; \
649 test -z "$(CTAGS_ARGS)$$unique" \
650 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
651 $$unique
652
653GTAGS:
654 here=`$(am__cd) $(top_builddir) && pwd` \
655 && $(am__cd) $(top_srcdir) \
656 && gtags -i $(GTAGS_ARGS) "$$here"
657
658distclean-tags:
659 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
660
661distdir: $(DISTFILES)
662 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
663 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
664 list='$(DISTFILES)'; \
665 dist_files=`for file in $$list; do echo $$file; done | \
666 sed -e "s|^$$srcdirstrip/||;t" \
667 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
668 case $$dist_files in \
669 */*) $(MKDIR_P) `echo "$$dist_files" | \
670 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
671 sort -u` ;; \
672 esac; \
673 for file in $$dist_files; do \
674 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
675 if test -d $$d/$$file; then \
676 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
677 if test -d "$(distdir)/$$file"; then \
678 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
679 fi; \
680 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
681 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
682 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
683 fi; \
684 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
685 else \
686 test -f "$(distdir)/$$file" \
687 || cp -p $$d/$$file "$(distdir)/$$file" \
688 || exit 1; \
689 fi; \
690 done
691check-am: all-am
692check: check-am
693all-am: Makefile $(LTLIBRARIES) $(HEADERS)
694installdirs:
695 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
696 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
697 done
698install: install-am
699install-exec: install-exec-am
700install-data: install-data-am
701uninstall: uninstall-am
702
703install-am: all-am
704 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
705
706installcheck: installcheck-am
707install-strip:
708 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
709 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
710 `test -z '$(STRIP)' || \
711 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
712mostlyclean-generic:
713
714clean-generic:
715
716distclean-generic:
717 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
718 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
719
720maintainer-clean-generic:
721 @echo "This command is intended for maintainers to use"
722 @echo "it deletes files that may require special tools to rebuild."
723 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
724clean: clean-am
725
726clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
727 mostlyclean-am
728
729distclean: distclean-am
730 -rm -rf ./$(DEPDIR)
731 -rm -f Makefile
732distclean-am: clean-am distclean-compile distclean-generic \
733 distclean-tags
734
735dvi: dvi-am
736
737dvi-am:
738
739html: html-am
740
741html-am:
742
743info: info-am
744
745info-am:
746
747install-data-am: install-includesHEADERS
748
749install-dvi: install-dvi-am
750
751install-dvi-am:
752
753install-exec-am: install-libLTLIBRARIES
754
755install-html: install-html-am
756
757install-html-am:
758
759install-info: install-info-am
760
761install-info-am:
762
763install-man:
764
765install-pdf: install-pdf-am
766
767install-pdf-am:
768
769install-ps: install-ps-am
770
771install-ps-am:
772
773installcheck-am:
774
775maintainer-clean: maintainer-clean-am
776 -rm -rf ./$(DEPDIR)
777 -rm -f Makefile
778maintainer-clean-am: distclean-am maintainer-clean-generic
779
780mostlyclean: mostlyclean-am
781
782mostlyclean-am: mostlyclean-compile mostlyclean-generic \
783 mostlyclean-libtool
784
785pdf: pdf-am
786
787pdf-am:
788
789ps: ps-am
790
791ps-am:
792
793uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
794
795.MAKE: install-am install-strip
796
797.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
798 clean-libLTLIBRARIES clean-libtool ctags distclean \
799 distclean-compile distclean-generic distclean-libtool \
800 distclean-tags distdir dvi dvi-am html html-am info info-am \
801 install install-am install-data install-data-am install-dvi \
802 install-dvi-am install-exec install-exec-am install-html \
803 install-html-am install-includesHEADERS install-info \
804 install-info-am install-libLTLIBRARIES install-man install-pdf \
805 install-pdf-am install-ps install-ps-am install-strip \
806 installcheck installcheck-am installdirs maintainer-clean \
807 maintainer-clean-generic mostlyclean mostlyclean-compile \
808 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
809 tags uninstall uninstall-am uninstall-includesHEADERS \
810 uninstall-libLTLIBRARIES
811
812
813# Tell versions [3.59,3.63) of GNU make to not export all variables.
814# Otherwise a system limit (for SysV at least) may be exceeded.
815.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_imf_evas/ecore_imf_evas.c b/libraries/ecore/src/lib/ecore_imf_evas/ecore_imf_evas.c
new file mode 100644
index 0000000..86badf5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_imf_evas/ecore_imf_evas.c
@@ -0,0 +1,259 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include "Ecore_IMF_Evas.h"
6
7/**
8 * @defgroup Ecore_IMF_Evas_Group Ecore Input Method Context Evas Helper Functions
9 *
10 * Helper functions to make it easy to use Evas with Ecore_IMF.
11 */
12
13static const char *_ecore_imf_evas_event_empty = "";
14
15/* Converts the Evas modifiers to Ecore_IMF keyboard modifiers */
16static void
17_ecore_imf_evas_event_modifiers_wrap(Evas_Modifier *evas_modifiers,
18 Ecore_IMF_Keyboard_Modifiers *imf_keyboard_modifiers)
19{
20 if (!evas_modifiers || !imf_keyboard_modifiers)
21 return;
22
23 *imf_keyboard_modifiers = ECORE_IMF_KEYBOARD_MODIFIER_NONE;
24 if (evas_key_modifier_is_set(evas_modifiers, "Control"))
25 *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_CTRL;
26 if (evas_key_modifier_is_set(evas_modifiers, "Alt"))
27 *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_ALT;
28 if (evas_key_modifier_is_set(evas_modifiers, "Shift"))
29 *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_SHIFT;
30 if (evas_key_modifier_is_set(evas_modifiers, "Super") || evas_key_modifier_is_set(evas_modifiers, "Hyper"))
31 *imf_keyboard_modifiers |= ECORE_IMF_KEYBOARD_MODIFIER_WIN;
32}
33
34/* Converts the Evas locks to Ecore_IMF keyboard locks */
35static void
36_ecore_imf_evas_event_locks_wrap(Evas_Lock *evas_locks,
37 Ecore_IMF_Keyboard_Locks *imf_keyboard_locks)
38{
39 if (!evas_locks || !imf_keyboard_locks)
40 return;
41
42 *imf_keyboard_locks = ECORE_IMF_KEYBOARD_LOCK_NONE;
43 if (evas_key_lock_is_set(evas_locks, "Num_Lock"))
44 *imf_keyboard_locks |= ECORE_IMF_KEYBOARD_LOCK_NUM;
45 if (evas_key_lock_is_set(evas_locks, "Caps_Lock"))
46 *imf_keyboard_locks |= ECORE_IMF_KEYBOARD_LOCK_CAPS;
47 if (evas_key_lock_is_set(evas_locks, "Scroll_Lock"))
48 *imf_keyboard_locks |= ECORE_IMF_KEYBOARD_LOCK_SCROLL;
49}
50
51/* Converts the Evas mouse flags to Ecore_IMF mouse flags */
52static void
53_ecore_imf_evas_event_mouse_flags_wrap(Evas_Button_Flags evas_flags,
54 Ecore_IMF_Mouse_Flags *imf_flags)
55{
56 if (!imf_flags)
57 return;
58
59 *imf_flags = ECORE_IMF_MOUSE_NONE;
60 if (evas_flags & EVAS_BUTTON_DOUBLE_CLICK)
61 *imf_flags |= ECORE_IMF_MOUSE_DOUBLE_CLICK;
62 if (evas_flags & EVAS_BUTTON_TRIPLE_CLICK)
63 *imf_flags |= ECORE_IMF_MOUSE_TRIPLE_CLICK;
64}
65
66/**
67 * Converts a "mouse_in" event from Evas to the corresponding event of Ecore_IMF.
68 *
69 * @param evas_event The received Evas event.
70 * @param imf_event The location to store the converted Ecore_IMF event.
71 * @ingroup Ecore_IMF_Evas_Group
72 */
73EAPI void
74ecore_imf_evas_event_mouse_in_wrap(Evas_Event_Mouse_In *evas_event,
75 Ecore_IMF_Event_Mouse_In *imf_event)
76{
77 if (!evas_event || !imf_event)
78 return;
79
80 imf_event->buttons = evas_event->buttons;
81 imf_event->output.x = evas_event->output.x;
82 imf_event->output.y = evas_event->output.y;
83 imf_event->canvas.x = evas_event->canvas.x;
84 imf_event->canvas.y = evas_event->canvas.y;
85 imf_event->timestamp = evas_event->timestamp;
86 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
87 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
88}
89
90/**
91 * Converts a "mouse_out" event from Evas to the corresponding event of Ecore_IMF.
92 *
93 * @param evas_event The received Evas event.
94 * @param imf_event The location to store the converted Ecore_IMF event.
95 * @ingroup Ecore_IMF_Evas_Group
96 */
97EAPI void
98ecore_imf_evas_event_mouse_out_wrap(Evas_Event_Mouse_Out *evas_event,
99 Ecore_IMF_Event_Mouse_Out *imf_event)
100{
101 if (!evas_event || !imf_event)
102 return;
103
104 imf_event->buttons = evas_event->buttons;
105 imf_event->output.x = evas_event->output.x;
106 imf_event->output.y = evas_event->output.y;
107 imf_event->canvas.x = evas_event->canvas.x;
108 imf_event->canvas.y = evas_event->canvas.y;
109 imf_event->timestamp = evas_event->timestamp;
110 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
111 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
112}
113
114/**
115 * Converts a "mouse_move" event from Evas to the corresponding event of Ecore_IMF.
116 *
117 * @param evas_event The received Evas event.
118 * @param imf_event The location to store the converted Ecore_IMF event.
119 * @ingroup Ecore_IMF_Evas_Group
120 */
121EAPI void
122ecore_imf_evas_event_mouse_move_wrap(Evas_Event_Mouse_Move *evas_event,
123 Ecore_IMF_Event_Mouse_Move *imf_event)
124{
125 if (!evas_event || !imf_event)
126 return;
127
128 imf_event->buttons = evas_event->buttons;
129 imf_event->cur.output.x = evas_event->cur.output.x;
130 imf_event->cur.output.y = evas_event->cur.output.y;
131 imf_event->prev.output.x = evas_event->prev.output.x;
132 imf_event->prev.output.y = evas_event->prev.output.y;
133 imf_event->cur.canvas.x = evas_event->cur.canvas.x;
134 imf_event->cur.canvas.y = evas_event->cur.canvas.y;
135 imf_event->prev.canvas.x = evas_event->prev.canvas.x;
136 imf_event->prev.canvas.y = evas_event->prev.canvas.y;
137 imf_event->timestamp = evas_event->timestamp;
138 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
139 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
140}
141
142/**
143 * Converts a "mouse_down" event from Evas to the corresponding event of Ecore_IMF.
144 *
145 * @param evas_event The received Evas event.
146 * @param imf_event The location to store the converted Ecore_IMF event.
147 * @ingroup Ecore_IMF_Evas_Group
148 */
149EAPI void
150ecore_imf_evas_event_mouse_down_wrap(Evas_Event_Mouse_Down *evas_event,
151 Ecore_IMF_Event_Mouse_Down *imf_event)
152{
153 if (!evas_event || !imf_event)
154 return;
155
156 imf_event->button = evas_event->button;
157 imf_event->output.x = evas_event->output.x;
158 imf_event->output.y = evas_event->output.y;
159 imf_event->canvas.x = evas_event->canvas.x;
160 imf_event->canvas.y = evas_event->canvas.y;
161 imf_event->timestamp = evas_event->timestamp;
162 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
163 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
164 _ecore_imf_evas_event_mouse_flags_wrap(evas_event->flags, &imf_event->flags);
165}
166
167/**
168 * Converts a "mouse_up" event from Evas to the corresponding event of Ecore_IMF.
169 *
170 * @param evas_event The received Evas event.
171 * @param imf_event The location to store the converted Ecore_IMF event.
172 * @ingroup Ecore_IMF_Evas_Group
173 */
174EAPI void
175ecore_imf_evas_event_mouse_up_wrap(Evas_Event_Mouse_Up *evas_event,
176 Ecore_IMF_Event_Mouse_Up *imf_event)
177{
178 if (!evas_event || !imf_event)
179 return;
180
181 imf_event->button = evas_event->button;
182 imf_event->output.x = evas_event->output.x;
183 imf_event->output.y = evas_event->output.y;
184 imf_event->canvas.x = evas_event->canvas.x;
185 imf_event->canvas.y = evas_event->canvas.y;
186 imf_event->timestamp = evas_event->timestamp;
187 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
188 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
189 _ecore_imf_evas_event_mouse_flags_wrap(evas_event->flags, &imf_event->flags);
190}
191
192/**
193 * Converts a "mouse_wheel" event from Evas to the corresponding event of Ecore_IMF.
194 *
195 * @param evas_event The received Evas event.
196 * @param imf_event The location to store the converted Ecore_IMF event.
197 * @ingroup Ecore_IMF_Evas_Group
198 */
199EAPI void
200ecore_imf_evas_event_mouse_wheel_wrap(Evas_Event_Mouse_Wheel *evas_event,
201 Ecore_IMF_Event_Mouse_Wheel *imf_event)
202{
203 if (!evas_event || !imf_event)
204 return;
205
206 imf_event->direction = evas_event->direction;
207 imf_event->z = evas_event->z;
208 imf_event->output.x = evas_event->output.x;
209 imf_event->output.y = evas_event->output.y;
210 imf_event->canvas.x = evas_event->canvas.x;
211 imf_event->canvas.y = evas_event->canvas.y;
212 imf_event->timestamp = evas_event->timestamp;
213 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
214 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
215 imf_event->timestamp = evas_event->timestamp;
216}
217
218/**
219 * Converts a "key_down" event from Evas to the corresponding event of Ecore_IMF.
220 *
221 * @param evas_event The received Evas event.
222 * @param imf_event The location to store the converted Ecore_IMF event.
223 * @ingroup Ecore_IMF_Evas_Group
224 */
225EAPI void
226ecore_imf_evas_event_key_down_wrap(Evas_Event_Key_Down *evas_event,
227 Ecore_IMF_Event_Key_Down *imf_event)
228{
229 if (!evas_event || !imf_event)
230 return;
231
232 imf_event->keyname = evas_event->keyname ? evas_event->keyname : _ecore_imf_evas_event_empty;
233 imf_event->key = evas_event->key ? evas_event->key : _ecore_imf_evas_event_empty;
234 imf_event->string = evas_event->string ? evas_event->string : _ecore_imf_evas_event_empty;
235 imf_event->compose = evas_event->compose ? evas_event->compose : _ecore_imf_evas_event_empty;
236 imf_event->timestamp = evas_event->timestamp;
237 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
238 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
239}
240
241/**
242 * Converts a "key_up" event from Evas to the corresponding event of Ecore_IMF.
243 *
244 * @param evas_event The received Evas event.
245 * @param imf_event The location to store the converted Ecore_IMF event.
246 * @ingroup Ecore_IMF_Evas_Group
247 */
248EAPI void
249ecore_imf_evas_event_key_up_wrap(Evas_Event_Key_Up *evas_event,
250 Ecore_IMF_Event_Key_Up *imf_event)
251{
252 imf_event->keyname = evas_event->keyname ? evas_event->keyname : _ecore_imf_evas_event_empty;
253 imf_event->key = evas_event->key ? evas_event->key : _ecore_imf_evas_event_empty;
254 imf_event->string = evas_event->string ? evas_event->string : _ecore_imf_evas_event_empty;
255 imf_event->compose = evas_event->compose ? evas_event->compose : _ecore_imf_evas_event_empty;
256 imf_event->timestamp = evas_event->timestamp;
257 _ecore_imf_evas_event_modifiers_wrap(evas_event->modifiers, &imf_event->modifiers);
258 _ecore_imf_evas_event_locks_wrap(evas_event->locks, &imf_event->locks);
259}
diff --git a/libraries/ecore/src/lib/ecore_input/Ecore_Input.h b/libraries/ecore/src/lib/ecore_input/Ecore_Input.h
new file mode 100644
index 0000000..a64bb2b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input/Ecore_Input.h
@@ -0,0 +1,220 @@
1#ifndef _ECORE_INPUT_H
2#define _ECORE_INPUT_H
3
4#ifdef _WIN32
5# include <stddef.h>
6#else
7# include <inttypes.h>
8#endif
9
10#ifdef EAPI
11# undef EAPI
12#endif
13
14#ifdef _WIN32
15# ifdef EFL_ECORE_INPUT_BUILD
16# ifdef DLL_EXPORT
17# define EAPI __declspec(dllexport)
18# else
19# define EAPI
20# endif /* ! DLL_EXPORT */
21# else
22# define EAPI __declspec(dllimport)
23# endif /* ! EFL_ECORE_INPUT_BUILD */
24#else
25# ifdef __GNUC__
26# if __GNUC__ >= 4
27# define EAPI __attribute__ ((visibility("default")))
28# else
29# define EAPI
30# endif
31# else
32# define EAPI
33# endif
34#endif
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40 EAPI extern int ECORE_EVENT_KEY_DOWN;
41 EAPI extern int ECORE_EVENT_KEY_UP;
42 EAPI extern int ECORE_EVENT_MOUSE_BUTTON_DOWN;
43 EAPI extern int ECORE_EVENT_MOUSE_BUTTON_UP;
44 EAPI extern int ECORE_EVENT_MOUSE_MOVE;
45 EAPI extern int ECORE_EVENT_MOUSE_WHEEL;
46 EAPI extern int ECORE_EVENT_MOUSE_IN;
47 EAPI extern int ECORE_EVENT_MOUSE_OUT;
48
49#define ECORE_EVENT_MODIFIER_SHIFT 0x0001
50#define ECORE_EVENT_MODIFIER_CTRL 0x0002
51#define ECORE_EVENT_MODIFIER_ALT 0x0004
52#define ECORE_EVENT_MODIFIER_WIN 0x0008
53#define ECORE_EVENT_MODIFIER_SCROLL 0x0010
54#define ECORE_EVENT_MODIFIER_NUM 0x0020
55#define ECORE_EVENT_MODIFIER_CAPS 0x0040
56#define ECORE_EVENT_LOCK_SCROLL 0x0080
57#define ECORE_EVENT_LOCK_NUM 0x0100
58#define ECORE_EVENT_LOCK_CAPS 0x0200
59#define ECORE_EVENT_LOCK_SHIFT 0x0300
60
61 typedef uintptr_t Ecore_Window;
62 typedef struct _Ecore_Event_Key Ecore_Event_Key;
63 typedef struct _Ecore_Event_Mouse_Button Ecore_Event_Mouse_Button;
64 typedef struct _Ecore_Event_Mouse_Wheel Ecore_Event_Mouse_Wheel;
65 typedef struct _Ecore_Event_Mouse_Move Ecore_Event_Mouse_Move;
66 typedef struct _Ecore_Event_Mouse_IO Ecore_Event_Mouse_IO;
67 typedef struct _Ecore_Event_Modifiers Ecore_Event_Modifiers;
68
69 typedef enum _Ecore_Event_Modifier
70 {
71 ECORE_NONE,
72 ECORE_SHIFT,
73 ECORE_CTRL,
74 ECORE_ALT,
75 ECORE_WIN,
76 ECORE_SCROLL,
77 ECORE_CAPS,
78 ECORE_LAST
79 } Ecore_Event_Modifier;
80
81 typedef enum _Ecore_Event_Press
82 {
83 ECORE_DOWN,
84 ECORE_UP
85 } Ecore_Event_Press;
86
87 typedef enum _Ecore_Event_IO
88 {
89 ECORE_IN,
90 ECORE_OUT
91 } Ecore_Event_IO;
92
93 struct _Ecore_Event_Key
94 {
95 const char *keyname;
96 const char *key;
97 const char *string;
98 const char *compose;
99 Ecore_Window window;
100 Ecore_Window root_window;
101 Ecore_Window event_window;
102
103 unsigned int timestamp;
104 unsigned int modifiers;
105
106 int same_screen;
107 };
108
109 struct _Ecore_Event_Mouse_Button
110 {
111 Ecore_Window window;
112 Ecore_Window root_window;
113 Ecore_Window event_window;
114
115 unsigned int timestamp;
116 unsigned int modifiers;
117 unsigned int buttons;
118 unsigned int double_click;
119 unsigned int triple_click;
120 int same_screen;
121
122 int x;
123 int y;
124 struct {
125 int x;
126 int y;
127 } root;
128
129 struct {
130 int device; /* 0 if normal mouse, 1+ for other mouse-devices (eg multi-touch - other fingers) */
131 double radius, radius_x, radius_y; /* radius of press point - radius_x and y if its an ellipse (radius is the average of the 2) */
132 double pressure; /* pressure - 1.0 == normal, > 1.0 == more, 0.0 == none */
133 double angle; /* angle relative to perpendicular (0.0 == perpendicular), in degrees */
134 double x, y; /* same as x, y root.x, root.y, but with sub-pixel precision, if available */
135 struct {
136 double x, y;
137 } root;
138 } multi;
139 };
140
141 struct _Ecore_Event_Mouse_Wheel
142 {
143 Ecore_Window window;
144 Ecore_Window root_window;
145 Ecore_Window event_window;
146
147 unsigned int timestamp;
148 unsigned int modifiers;
149
150 int same_screen;
151 int direction;
152 int z;
153
154 int x;
155 int y;
156 struct {
157 int x;
158 int y;
159 } root;
160 };
161
162 struct _Ecore_Event_Mouse_Move
163 {
164 Ecore_Window window;
165 Ecore_Window root_window;
166 Ecore_Window event_window;
167
168 unsigned int timestamp;
169 unsigned int modifiers;
170
171 int same_screen;
172
173 int x;
174 int y;
175 struct {
176 int x;
177 int y;
178 } root;
179
180 struct {
181 int device; /* 0 if normal mouse, 1+ for other mouse-devices (eg multi-touch - other fingers) */
182 double radius, radius_x, radius_y; /* radius of press point - radius_x and y if its an ellipse (radius is the average of the 2) */
183 double pressure; /* pressure - 1.0 == normal, > 1.0 == more, 0.0 == none */
184 double angle; /* angle relative to perpendicular (0.0 == perpendicular), in degrees */
185 double x, y; /* same as x, y root.x, root.y, but with sub-pixel precision, if available */
186 struct {
187 double x, y;
188 } root;
189 } multi;
190 };
191
192 struct _Ecore_Event_Mouse_IO
193 {
194 Ecore_Window window;
195 Ecore_Window event_window;
196
197 unsigned int timestamp;
198 unsigned int modifiers;
199
200 int x;
201 int y;
202 };
203
204 struct _Ecore_Event_Modifiers
205 {
206 unsigned int size;
207 unsigned int array[ECORE_LAST];
208 };
209
210 EAPI int ecore_event_init(void);
211 EAPI int ecore_event_shutdown(void);
212
213 EAPI unsigned int ecore_event_modifier_mask(Ecore_Event_Modifier modifier);
214 EAPI Ecore_Event_Modifier ecore_event_update_modifier(const char *key, Ecore_Event_Modifiers *modifiers, int inc);
215
216#ifdef __cplusplus
217}
218#endif
219
220#endif
diff --git a/libraries/ecore/src/lib/ecore_input/Makefile.am b/libraries/ecore/src/lib/ecore_input/Makefile.am
new file mode 100644
index 0000000..427dc1a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input/Makefile.am
@@ -0,0 +1,24 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_builddir)/src/lib/ecore \
6@EFL_ECORE_INPUT_BUILD@ \
7@EINA_CFLAGS@ \
8@EVIL_CFLAGS@
9
10lib_LTLIBRARIES = libecore_input.la
11includes_HEADERS = Ecore_Input.h
12includesdir = $(includedir)/ecore-@VMAJ@
13
14libecore_input_la_SOURCES = \
15ecore_input.c
16
17libecore_input_la_LIBADD = \
18$(top_builddir)/src/lib/ecore/libecore.la \
19@EINA_LIBS@ \
20@EVIL_LIBS@
21
22libecore_input_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
23
24EXTRA_DIST = ecore_input_private.h
diff --git a/libraries/ecore/src/lib/ecore_input/Makefile.in b/libraries/ecore/src/lib/ecore_input/Makefile.in
new file mode 100644
index 0000000..dd4d663
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input/Makefile.in
@@ -0,0 +1,816 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_input
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_input_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la
91am_libecore_input_la_OBJECTS = ecore_input.lo
92libecore_input_la_OBJECTS = $(am_libecore_input_la_OBJECTS)
93AM_V_lt = $(am__v_lt_$(V))
94am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
95am__v_lt_0 = --silent
96libecore_input_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
97 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
98 $(AM_CFLAGS) $(CFLAGS) $(libecore_input_la_LDFLAGS) $(LDFLAGS) \
99 -o $@
100DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
101depcomp = $(SHELL) $(top_srcdir)/depcomp
102am__depfiles_maybe = depfiles
103am__mv = mv -f
104COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
105 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
106LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
107 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
108 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
109 $(AM_CFLAGS) $(CFLAGS)
110AM_V_CC = $(am__v_CC_$(V))
111am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
112am__v_CC_0 = @echo " CC " $@;
113AM_V_at = $(am__v_at_$(V))
114am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
115am__v_at_0 = @
116CCLD = $(CC)
117LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
118 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
119 $(AM_LDFLAGS) $(LDFLAGS) -o $@
120AM_V_CCLD = $(am__v_CCLD_$(V))
121am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
122am__v_CCLD_0 = @echo " CCLD " $@;
123AM_V_GEN = $(am__v_GEN_$(V))
124am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
125am__v_GEN_0 = @echo " GEN " $@;
126SOURCES = $(libecore_input_la_SOURCES)
127DIST_SOURCES = $(libecore_input_la_SOURCES)
128HEADERS = $(includes_HEADERS)
129ETAGS = etags
130CTAGS = ctags
131DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
132ACLOCAL = @ACLOCAL@
133ALLOCA = @ALLOCA@
134AMTAR = @AMTAR@
135AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
136AR = @AR@
137AS = @AS@
138AUTOCONF = @AUTOCONF@
139AUTOHEADER = @AUTOHEADER@
140AUTOMAKE = @AUTOMAKE@
141AWK = @AWK@
142CARES_CFLAGS = @CARES_CFLAGS@
143CARES_LIBS = @CARES_LIBS@
144CC = @CC@
145CCDEPMODE = @CCDEPMODE@
146CFLAGS = @CFLAGS@
147CHECK_CFLAGS = @CHECK_CFLAGS@
148CHECK_LIBS = @CHECK_LIBS@
149CPP = @CPP@
150CPPFLAGS = @CPPFLAGS@
151CURL_CFLAGS = @CURL_CFLAGS@
152CURL_LIBS = @CURL_LIBS@
153CXX = @CXX@
154CXXCPP = @CXXCPP@
155CXXDEPMODE = @CXXDEPMODE@
156CXXFLAGS = @CXXFLAGS@
157CYGPATH_W = @CYGPATH_W@
158DEFS = @DEFS@
159DEPDIR = @DEPDIR@
160DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
161DIRECTFB_LIBS = @DIRECTFB_LIBS@
162DLLTOOL = @DLLTOOL@
163DSYMUTIL = @DSYMUTIL@
164DUMPBIN = @DUMPBIN@
165ECHO_C = @ECHO_C@
166ECHO_N = @ECHO_N@
167ECHO_T = @ECHO_T@
168ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
169ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
170EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
171EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
172EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
173EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
174EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
175EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
176EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
177EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
178EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
179EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
180EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
181EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
182EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
183EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
184EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
185EGREP = @EGREP@
186EINA_CFLAGS = @EINA_CFLAGS@
187EINA_LIBS = @EINA_LIBS@
188ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
189ESCAPE_LIBS = @ESCAPE_LIBS@
190EVAS_CFLAGS = @EVAS_CFLAGS@
191EVAS_LIBS = @EVAS_LIBS@
192EVIL_CFLAGS = @EVIL_CFLAGS@
193EVIL_LIBS = @EVIL_LIBS@
194EXEEXT = @EXEEXT@
195FGREP = @FGREP@
196GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
197GLIB_CFLAGS = @GLIB_CFLAGS@
198GLIB_LIBS = @GLIB_LIBS@
199GMSGFMT = @GMSGFMT@
200GMSGFMT_015 = @GMSGFMT_015@
201GREP = @GREP@
202INSTALL = @INSTALL@
203INSTALL_DATA = @INSTALL_DATA@
204INSTALL_PROGRAM = @INSTALL_PROGRAM@
205INSTALL_SCRIPT = @INSTALL_SCRIPT@
206INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
207INTLLIBS = @INTLLIBS@
208INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
209KEYSYMDEFS = @KEYSYMDEFS@
210LD = @LD@
211LDFLAGS = @LDFLAGS@
212LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
213LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
214LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
215LIBICONV = @LIBICONV@
216LIBINTL = @LIBINTL@
217LIBOBJS = @LIBOBJS@
218LIBS = @LIBS@
219LIBTOOL = @LIBTOOL@
220LIPO = @LIPO@
221LN_S = @LN_S@
222LTLIBICONV = @LTLIBICONV@
223LTLIBINTL = @LTLIBINTL@
224LTLIBOBJS = @LTLIBOBJS@
225MAKEINFO = @MAKEINFO@
226MKDIR_P = @MKDIR_P@
227MSGFMT = @MSGFMT@
228MSGFMT_015 = @MSGFMT_015@
229MSGMERGE = @MSGMERGE@
230NM = @NM@
231NMEDIT = @NMEDIT@
232OBJC = @OBJC@
233OBJCDEPMODE = @OBJCDEPMODE@
234OBJCFLAGS = @OBJCFLAGS@
235OBJDUMP = @OBJDUMP@
236OBJEXT = @OBJEXT@
237OTOOL = @OTOOL@
238OTOOL64 = @OTOOL64@
239PACKAGE = @PACKAGE@
240PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
241PACKAGE_NAME = @PACKAGE_NAME@
242PACKAGE_STRING = @PACKAGE_STRING@
243PACKAGE_TARNAME = @PACKAGE_TARNAME@
244PACKAGE_URL = @PACKAGE_URL@
245PACKAGE_VERSION = @PACKAGE_VERSION@
246PATH_SEPARATOR = @PATH_SEPARATOR@
247PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
248PIXMAN_LIBS = @PIXMAN_LIBS@
249PKG_CONFIG = @PKG_CONFIG@
250PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
251PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
252POSUB = @POSUB@
253RANLIB = @RANLIB@
254SDL_CFLAGS = @SDL_CFLAGS@
255SDL_CONFIG = @SDL_CONFIG@
256SDL_LIBS = @SDL_LIBS@
257SED = @SED@
258SET_MAKE = @SET_MAKE@
259SHELL = @SHELL@
260SSL_CFLAGS = @SSL_CFLAGS@
261SSL_LIBS = @SSL_LIBS@
262STRIP = @STRIP@
263TLS2_CFLAGS = @TLS2_CFLAGS@
264TLS2_LIBS = @TLS2_LIBS@
265TLS_CFLAGS = @TLS_CFLAGS@
266TLS_LIBS = @TLS_LIBS@
267TSLIB_CFLAGS = @TSLIB_CFLAGS@
268TSLIB_LIBS = @TSLIB_LIBS@
269USE_NLS = @USE_NLS@
270VERSION = @VERSION@
271VMAJ = @VMAJ@
272WIN32_CFLAGS = @WIN32_CFLAGS@
273WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
274WIN32_LIBS = @WIN32_LIBS@
275XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
276XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
277XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
278XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
279XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
280XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
281XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
282XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
283XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
284XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
285XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
286XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
287XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
288XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
289XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
290XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
291XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
292XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
293XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
294XCB_X11_LIBS = @XCB_X11_LIBS@
295XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
296XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
297XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
298XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
299XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
300XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
301XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
302XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
303XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
304XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
305XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
306XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
307XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
308XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
309XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
310XDAMAGE_LIBS = @XDAMAGE_LIBS@
311XDPMS_CFLAGS = @XDPMS_CFLAGS@
312XDPMS_LIBS = @XDPMS_LIBS@
313XFIXES_CFLAGS = @XFIXES_CFLAGS@
314XFIXES_LIBS = @XFIXES_LIBS@
315XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
316XGESTURE_LIBS = @XGESTURE_LIBS@
317XGETTEXT = @XGETTEXT@
318XGETTEXT_015 = @XGETTEXT_015@
319XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
320XI2_CFLAGS = @XI2_CFLAGS@
321XI2_LIBS = @XI2_LIBS@
322XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
323XINERAMA_LIBS = @XINERAMA_LIBS@
324XKB_CFLAGS = @XKB_CFLAGS@
325XKB_LIBS = @XKB_LIBS@
326XMKMF = @XMKMF@
327XPRINT_CFLAGS = @XPRINT_CFLAGS@
328XPRINT_LIBS = @XPRINT_LIBS@
329XRANDR_CFLAGS = @XRANDR_CFLAGS@
330XRANDR_LIBS = @XRANDR_LIBS@
331XRENDER_CFLAGS = @XRENDER_CFLAGS@
332XRENDER_LIBS = @XRENDER_LIBS@
333XSS_CFLAGS = @XSS_CFLAGS@
334XSS_LIBS = @XSS_LIBS@
335XTEST_CFLAGS = @XTEST_CFLAGS@
336XTEST_LIBS = @XTEST_LIBS@
337X_CFLAGS = @X_CFLAGS@
338X_EXTRA_LIBS = @X_EXTRA_LIBS@
339X_LIBS = @X_LIBS@
340X_PRE_LIBS = @X_PRE_LIBS@
341Xcursor_cflags = @Xcursor_cflags@
342Xcursor_libs = @Xcursor_libs@
343abs_builddir = @abs_builddir@
344abs_srcdir = @abs_srcdir@
345abs_top_builddir = @abs_top_builddir@
346abs_top_srcdir = @abs_top_srcdir@
347ac_ct_CC = @ac_ct_CC@
348ac_ct_CXX = @ac_ct_CXX@
349ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
350ac_ct_OBJC = @ac_ct_OBJC@
351am__include = @am__include@
352am__leading_dot = @am__leading_dot@
353am__quote = @am__quote@
354am__tar = @am__tar@
355am__untar = @am__untar@
356bindir = @bindir@
357build = @build@
358build_alias = @build_alias@
359build_cpu = @build_cpu@
360build_os = @build_os@
361build_vendor = @build_vendor@
362builddir = @builddir@
363cocoa_ldflags = @cocoa_ldflags@
364datadir = @datadir@
365datarootdir = @datarootdir@
366dlopen_libs = @dlopen_libs@
367docdir = @docdir@
368dvidir = @dvidir@
369ecore_cocoa_cflags = @ecore_cocoa_cflags@
370ecore_cocoa_libs = @ecore_cocoa_libs@
371ecore_con_cflags = @ecore_con_cflags@
372ecore_con_libs = @ecore_con_libs@
373ecore_directfb_cflags = @ecore_directfb_cflags@
374ecore_directfb_libs = @ecore_directfb_libs@
375ecore_evas_cflags = @ecore_evas_cflags@
376ecore_evas_libs = @ecore_evas_libs@
377ecore_fb_cflags = @ecore_fb_cflags@
378ecore_fb_libs = @ecore_fb_libs@
379ecore_file_cflags = @ecore_file_cflags@
380ecore_file_libs = @ecore_file_libs@
381ecore_imf_cflags = @ecore_imf_cflags@
382ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
383ecore_imf_evas_libs = @ecore_imf_evas_libs@
384ecore_imf_libs = @ecore_imf_libs@
385ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
386ecore_imf_xim_libs = @ecore_imf_xim_libs@
387ecore_input_cflags = @ecore_input_cflags@
388ecore_input_evas_cflags = @ecore_input_evas_cflags@
389ecore_input_evas_libs = @ecore_input_evas_libs@
390ecore_input_libs = @ecore_input_libs@
391ecore_ipc_cflags = @ecore_ipc_cflags@
392ecore_ipc_libs = @ecore_ipc_libs@
393ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
394ecore_psl1ght_libs = @ecore_psl1ght_libs@
395ecore_sdl_cflags = @ecore_sdl_cflags@
396ecore_sdl_libs = @ecore_sdl_libs@
397ecore_win32_cflags = @ecore_win32_cflags@
398ecore_win32_libs = @ecore_win32_libs@
399ecore_wince_cflags = @ecore_wince_cflags@
400ecore_wince_libs = @ecore_wince_libs@
401ecore_x_cflags = @ecore_x_cflags@
402ecore_x_libs = @ecore_x_libs@
403ecore_x_libs_private = @ecore_x_libs_private@
404efl_doxygen = @efl_doxygen@
405efl_have_doxygen = @efl_have_doxygen@
406exec_prefix = @exec_prefix@
407have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
408host = @host@
409host_alias = @host_alias@
410host_cpu = @host_cpu@
411host_os = @host_os@
412host_vendor = @host_vendor@
413htmldir = @htmldir@
414includedir = @includedir@
415infodir = @infodir@
416install_sh = @install_sh@
417libdir = @libdir@
418libexecdir = @libexecdir@
419localedir = @localedir@
420localstatedir = @localstatedir@
421lt_ECHO = @lt_ECHO@
422lt_enable_auto_import = @lt_enable_auto_import@
423mandir = @mandir@
424mkdir_p = @mkdir_p@
425oldincludedir = @oldincludedir@
426pdfdir = @pdfdir@
427pkgconfig_requires_private = @pkgconfig_requires_private@
428prefix = @prefix@
429program_transform_name = @program_transform_name@
430psdir = @psdir@
431release_info = @release_info@
432requirements_ecore = @requirements_ecore@
433requirements_ecore_cocoa = @requirements_ecore_cocoa@
434requirements_ecore_con = @requirements_ecore_con@
435requirements_ecore_directfb = @requirements_ecore_directfb@
436requirements_ecore_evas = @requirements_ecore_evas@
437requirements_ecore_fb = @requirements_ecore_fb@
438requirements_ecore_file = @requirements_ecore_file@
439requirements_ecore_imf = @requirements_ecore_imf@
440requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
441requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
442requirements_ecore_input = @requirements_ecore_input@
443requirements_ecore_input_evas = @requirements_ecore_input_evas@
444requirements_ecore_ipc = @requirements_ecore_ipc@
445requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
446requirements_ecore_sdl = @requirements_ecore_sdl@
447requirements_ecore_win32 = @requirements_ecore_win32@
448requirements_ecore_wince = @requirements_ecore_wince@
449requirements_ecore_x = @requirements_ecore_x@
450rt_libs = @rt_libs@
451sbindir = @sbindir@
452sharedstatedir = @sharedstatedir@
453srcdir = @srcdir@
454sysconfdir = @sysconfdir@
455target_alias = @target_alias@
456top_build_prefix = @top_build_prefix@
457top_builddir = @top_builddir@
458top_srcdir = @top_srcdir@
459version_info = @version_info@
460x_cflags = @x_cflags@
461x_includes = @x_includes@
462x_libs = @x_libs@
463MAINTAINERCLEANFILES = Makefile.in
464AM_CPPFLAGS = \
465-I$(top_srcdir)/src/lib/ecore \
466-I$(top_builddir)/src/lib/ecore \
467@EFL_ECORE_INPUT_BUILD@ \
468@EINA_CFLAGS@ \
469@EVIL_CFLAGS@
470
471lib_LTLIBRARIES = libecore_input.la
472includes_HEADERS = Ecore_Input.h
473includesdir = $(includedir)/ecore-@VMAJ@
474libecore_input_la_SOURCES = \
475ecore_input.c
476
477libecore_input_la_LIBADD = \
478$(top_builddir)/src/lib/ecore/libecore.la \
479@EINA_LIBS@ \
480@EVIL_LIBS@
481
482libecore_input_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
483EXTRA_DIST = ecore_input_private.h
484all: all-am
485
486.SUFFIXES:
487.SUFFIXES: .c .lo .o .obj
488$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
489 @for dep in $?; do \
490 case '$(am__configure_deps)' in \
491 *$$dep*) \
492 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
493 && { if test -f $@; then exit 0; else break; fi; }; \
494 exit 1;; \
495 esac; \
496 done; \
497 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_input/Makefile'; \
498 $(am__cd) $(top_srcdir) && \
499 $(AUTOMAKE) --gnu src/lib/ecore_input/Makefile
500.PRECIOUS: Makefile
501Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
502 @case '$?' in \
503 *config.status*) \
504 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
505 *) \
506 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
507 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
508 esac;
509
510$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
511 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
512
513$(top_srcdir)/configure: $(am__configure_deps)
514 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
515$(ACLOCAL_M4): $(am__aclocal_m4_deps)
516 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
517$(am__aclocal_m4_deps):
518install-libLTLIBRARIES: $(lib_LTLIBRARIES)
519 @$(NORMAL_INSTALL)
520 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
521 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
522 list2=; for p in $$list; do \
523 if test -f $$p; then \
524 list2="$$list2 $$p"; \
525 else :; fi; \
526 done; \
527 test -z "$$list2" || { \
528 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
529 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
530 }
531
532uninstall-libLTLIBRARIES:
533 @$(NORMAL_UNINSTALL)
534 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
535 for p in $$list; do \
536 $(am__strip_dir) \
537 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
538 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
539 done
540
541clean-libLTLIBRARIES:
542 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
543 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
544 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
545 test "$$dir" != "$$p" || dir=.; \
546 echo "rm -f \"$${dir}/so_locations\""; \
547 rm -f "$${dir}/so_locations"; \
548 done
549libecore_input.la: $(libecore_input_la_OBJECTS) $(libecore_input_la_DEPENDENCIES)
550 $(AM_V_CCLD)$(libecore_input_la_LINK) -rpath $(libdir) $(libecore_input_la_OBJECTS) $(libecore_input_la_LIBADD) $(LIBS)
551
552mostlyclean-compile:
553 -rm -f *.$(OBJEXT)
554
555distclean-compile:
556 -rm -f *.tab.c
557
558@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_input.Plo@am__quote@
559
560.c.o:
561@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
562@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
563@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
564@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
565@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
566@am__fastdepCC_FALSE@ $(COMPILE) -c $<
567
568.c.obj:
569@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
570@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
571@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
572@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
573@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
574@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
575
576.c.lo:
577@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
578@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
579@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
580@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
581@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
582@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
583
584mostlyclean-libtool:
585 -rm -f *.lo
586
587clean-libtool:
588 -rm -rf .libs _libs
589install-includesHEADERS: $(includes_HEADERS)
590 @$(NORMAL_INSTALL)
591 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
592 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
593 for p in $$list; do \
594 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
595 echo "$$d$$p"; \
596 done | $(am__base_list) | \
597 while read files; do \
598 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
599 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
600 done
601
602uninstall-includesHEADERS:
603 @$(NORMAL_UNINSTALL)
604 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
605 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
606 test -n "$$files" || exit 0; \
607 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
608 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
609
610ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
611 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
612 unique=`for i in $$list; do \
613 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
614 done | \
615 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
616 END { if (nonempty) { for (i in files) print i; }; }'`; \
617 mkid -fID $$unique
618tags: TAGS
619
620TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
621 $(TAGS_FILES) $(LISP)
622 set x; \
623 here=`pwd`; \
624 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
625 unique=`for i in $$list; do \
626 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
627 done | \
628 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
629 END { if (nonempty) { for (i in files) print i; }; }'`; \
630 shift; \
631 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
632 test -n "$$unique" || unique=$$empty_fix; \
633 if test $$# -gt 0; then \
634 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
635 "$$@" $$unique; \
636 else \
637 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
638 $$unique; \
639 fi; \
640 fi
641ctags: CTAGS
642CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
643 $(TAGS_FILES) $(LISP)
644 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
645 unique=`for i in $$list; do \
646 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
647 done | \
648 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
649 END { if (nonempty) { for (i in files) print i; }; }'`; \
650 test -z "$(CTAGS_ARGS)$$unique" \
651 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
652 $$unique
653
654GTAGS:
655 here=`$(am__cd) $(top_builddir) && pwd` \
656 && $(am__cd) $(top_srcdir) \
657 && gtags -i $(GTAGS_ARGS) "$$here"
658
659distclean-tags:
660 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
661
662distdir: $(DISTFILES)
663 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
664 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
665 list='$(DISTFILES)'; \
666 dist_files=`for file in $$list; do echo $$file; done | \
667 sed -e "s|^$$srcdirstrip/||;t" \
668 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
669 case $$dist_files in \
670 */*) $(MKDIR_P) `echo "$$dist_files" | \
671 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
672 sort -u` ;; \
673 esac; \
674 for file in $$dist_files; do \
675 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
676 if test -d $$d/$$file; then \
677 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
678 if test -d "$(distdir)/$$file"; then \
679 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
680 fi; \
681 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
682 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
683 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
684 fi; \
685 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
686 else \
687 test -f "$(distdir)/$$file" \
688 || cp -p $$d/$$file "$(distdir)/$$file" \
689 || exit 1; \
690 fi; \
691 done
692check-am: all-am
693check: check-am
694all-am: Makefile $(LTLIBRARIES) $(HEADERS)
695installdirs:
696 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
697 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
698 done
699install: install-am
700install-exec: install-exec-am
701install-data: install-data-am
702uninstall: uninstall-am
703
704install-am: all-am
705 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
706
707installcheck: installcheck-am
708install-strip:
709 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
710 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
711 `test -z '$(STRIP)' || \
712 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
713mostlyclean-generic:
714
715clean-generic:
716
717distclean-generic:
718 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
719 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
720
721maintainer-clean-generic:
722 @echo "This command is intended for maintainers to use"
723 @echo "it deletes files that may require special tools to rebuild."
724 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
725clean: clean-am
726
727clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
728 mostlyclean-am
729
730distclean: distclean-am
731 -rm -rf ./$(DEPDIR)
732 -rm -f Makefile
733distclean-am: clean-am distclean-compile distclean-generic \
734 distclean-tags
735
736dvi: dvi-am
737
738dvi-am:
739
740html: html-am
741
742html-am:
743
744info: info-am
745
746info-am:
747
748install-data-am: install-includesHEADERS
749
750install-dvi: install-dvi-am
751
752install-dvi-am:
753
754install-exec-am: install-libLTLIBRARIES
755
756install-html: install-html-am
757
758install-html-am:
759
760install-info: install-info-am
761
762install-info-am:
763
764install-man:
765
766install-pdf: install-pdf-am
767
768install-pdf-am:
769
770install-ps: install-ps-am
771
772install-ps-am:
773
774installcheck-am:
775
776maintainer-clean: maintainer-clean-am
777 -rm -rf ./$(DEPDIR)
778 -rm -f Makefile
779maintainer-clean-am: distclean-am maintainer-clean-generic
780
781mostlyclean: mostlyclean-am
782
783mostlyclean-am: mostlyclean-compile mostlyclean-generic \
784 mostlyclean-libtool
785
786pdf: pdf-am
787
788pdf-am:
789
790ps: ps-am
791
792ps-am:
793
794uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
795
796.MAKE: install-am install-strip
797
798.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
799 clean-libLTLIBRARIES clean-libtool ctags distclean \
800 distclean-compile distclean-generic distclean-libtool \
801 distclean-tags distdir dvi dvi-am html html-am info info-am \
802 install install-am install-data install-data-am install-dvi \
803 install-dvi-am install-exec install-exec-am install-html \
804 install-html-am install-includesHEADERS install-info \
805 install-info-am install-libLTLIBRARIES install-man install-pdf \
806 install-pdf-am install-ps install-ps-am install-strip \
807 installcheck installcheck-am installdirs maintainer-clean \
808 maintainer-clean-generic mostlyclean mostlyclean-compile \
809 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
810 tags uninstall uninstall-am uninstall-includesHEADERS \
811 uninstall-libLTLIBRARIES
812
813
814# Tell versions [3.59,3.63) of GNU make to not export all variables.
815# Otherwise a system limit (for SysV at least) may be exceeded.
816.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_input/ecore_input.c b/libraries/ecore/src/lib/ecore_input/ecore_input.c
new file mode 100644
index 0000000..ce4c275
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input/ecore_input.c
@@ -0,0 +1,120 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdio.h>
6#include <string.h>
7
8#include "Ecore.h"
9#include "ecore_private.h"
10
11#include "Ecore_Input.h"
12#include "ecore_input_private.h"
13
14
15int _ecore_input_log_dom = -1;
16
17EAPI int ECORE_EVENT_KEY_DOWN = 0;
18EAPI int ECORE_EVENT_KEY_UP = 0;
19EAPI int ECORE_EVENT_MOUSE_BUTTON_DOWN = 0;
20EAPI int ECORE_EVENT_MOUSE_BUTTON_UP = 0;
21EAPI int ECORE_EVENT_MOUSE_MOVE = 0;
22EAPI int ECORE_EVENT_MOUSE_WHEEL = 0;
23EAPI int ECORE_EVENT_MOUSE_IN = 0;
24EAPI int ECORE_EVENT_MOUSE_OUT = 0;
25
26static int _ecore_event_init_count = 0;
27
28EAPI int
29ecore_event_init(void)
30{
31 if (++_ecore_event_init_count != 1)
32 return _ecore_event_init_count;
33
34 _ecore_input_log_dom = eina_log_domain_register
35 ("ecore_input", ECORE_INPUT_DEFAULT_LOG_COLOR);
36 if(_ecore_input_log_dom < 0)
37 {
38 EINA_LOG_ERR("Impossible to create a log domain for the ecore input module.");
39 return --_ecore_event_init_count;
40 }
41
42 ECORE_EVENT_KEY_DOWN = ecore_event_type_new();
43 ECORE_EVENT_KEY_UP = ecore_event_type_new();
44 ECORE_EVENT_MOUSE_BUTTON_DOWN = ecore_event_type_new();
45 ECORE_EVENT_MOUSE_BUTTON_UP = ecore_event_type_new();
46 ECORE_EVENT_MOUSE_MOVE = ecore_event_type_new();
47 ECORE_EVENT_MOUSE_WHEEL = ecore_event_type_new();
48 ECORE_EVENT_MOUSE_IN = ecore_event_type_new();
49 ECORE_EVENT_MOUSE_OUT = ecore_event_type_new();
50
51 return _ecore_event_init_count;
52}
53
54EAPI int
55ecore_event_shutdown(void)
56{
57 if (--_ecore_event_init_count != 0)
58 return _ecore_event_init_count;
59
60 ECORE_EVENT_KEY_DOWN = 0;
61 ECORE_EVENT_KEY_UP = 0;
62 ECORE_EVENT_MOUSE_BUTTON_DOWN = 0;
63 ECORE_EVENT_MOUSE_BUTTON_UP = 0;
64 ECORE_EVENT_MOUSE_MOVE = 0;
65 ECORE_EVENT_MOUSE_WHEEL = 0;
66 ECORE_EVENT_MOUSE_IN = 0;
67 ECORE_EVENT_MOUSE_OUT = 0;
68 eina_log_domain_unregister(_ecore_input_log_dom);
69 _ecore_input_log_dom = -1;
70 return _ecore_event_init_count;
71}
72
73typedef struct _Ecore_Event_Modifier_Match Ecore_Event_Modifier_Match;
74struct _Ecore_Event_Modifier_Match
75{
76 const char *key;
77 Ecore_Event_Modifier modifier;
78 unsigned int event_modifier;
79};
80
81static const Ecore_Event_Modifier_Match matchs[] = {
82 { "Shift_L", ECORE_SHIFT, ECORE_EVENT_MODIFIER_SHIFT },
83 { "Shift_R", ECORE_SHIFT, ECORE_EVENT_MODIFIER_SHIFT },
84 { "Alt_L", ECORE_ALT, ECORE_EVENT_MODIFIER_ALT },
85 { "Alt_R", ECORE_ALT, ECORE_EVENT_MODIFIER_ALT },
86 { "Control_L", ECORE_CTRL, ECORE_EVENT_MODIFIER_CTRL },
87 { "Control_R", ECORE_CTRL, ECORE_EVENT_MODIFIER_CTRL },
88 { "Caps_Lock", ECORE_CAPS, ECORE_EVENT_MODIFIER_CAPS },
89 { "Super_L", ECORE_WIN, ECORE_EVENT_MODIFIER_WIN },
90 { "Super_R", ECORE_WIN, ECORE_EVENT_MODIFIER_WIN },
91 { "Scroll_Lock", ECORE_SCROLL, ECORE_EVENT_MODIFIER_SCROLL }
92};
93
94EAPI unsigned int
95ecore_event_modifier_mask(Ecore_Event_Modifier modifier)
96{
97 size_t i;
98
99 for (i = 0; i < sizeof (matchs) / sizeof (Ecore_Event_Modifier_Match); i++)
100 if (matchs[i].modifier == modifier)
101 return matchs[i].event_modifier;
102
103 return 0;
104}
105
106EAPI Ecore_Event_Modifier
107ecore_event_update_modifier(const char *key, Ecore_Event_Modifiers *modifiers, int inc)
108{
109 size_t i;
110
111 for (i = 0; i < sizeof (matchs) / sizeof (Ecore_Event_Modifier_Match); i++)
112 if (strcmp(matchs[i].key, key) == 0)
113 {
114 if (modifiers && matchs[i].modifier < modifiers->size)
115 modifiers->array[matchs[i].modifier] += inc;
116 return matchs[i].modifier;
117 }
118
119 return ECORE_NONE;
120}
diff --git a/libraries/ecore/src/lib/ecore_input/ecore_input_private.h b/libraries/ecore/src/lib/ecore_input/ecore_input_private.h
new file mode 100644
index 0000000..5660a20
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input/ecore_input_private.h
@@ -0,0 +1,37 @@
1#ifndef _ECORE_INPUT_PRIVATE_H
2#define _ECORE_INPUT_PRIVATE_H
3
4extern int _ecore_input_log_dom;
5
6#ifdef ECORE_INPUT_DEFAULT_LOG_COLOR
7# undef ECORE_INPUT_DEFAULT_LOG_COLOR
8#endif
9
10#define ECORE_INPUT_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
11
12#ifdef ERR
13# undef ERR
14#endif
15#define ERR(...) EINA_LOG_DOM_ERR(_ecore_input_log_dom, __VA_ARGS__)
16
17#ifdef DBG
18# undef DBG
19#endif
20#define DBG(...) EINA_LOG_DOM_DBG(_ecore_input_log_dom, __VA_ARGS__)
21
22#ifdef INF
23# undef INF
24#endif
25#define INF(...) EINA_LOG_DOM_INFO(_ecore_input_log_dom, __VA_ARGS__)
26
27#ifdef WRN
28# undef WRN
29#endif
30#define WRN(...) EINA_LOG_DOM_WARN(_ecore_input_log_dom, __VA_ARGS__)
31
32#ifdef CRIT
33# undef CRIT
34#endif
35#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_input_log_dom, __VA_ARGS__)
36
37#endif
diff --git a/libraries/ecore/src/lib/ecore_input_evas/Ecore_Input_Evas.h b/libraries/ecore/src/lib/ecore_input_evas/Ecore_Input_Evas.h
new file mode 100644
index 0000000..c97274e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input_evas/Ecore_Input_Evas.h
@@ -0,0 +1,64 @@
1#ifndef _ECORE_INPUT_EVAS_H
2#define _ECORE_INPUT_EVAS_H
3
4#include <Evas.h>
5
6#ifdef EAPI
7# undef EAPI
8#endif
9
10#ifdef _WIN32
11# ifdef EFL_ECORE_INPUT_EVAS_BUILD
12# ifdef DLL_EXPORT
13# define EAPI __declspec(dllexport)
14# else
15# define EAPI
16# endif /* ! DLL_EXPORT */
17# else
18# define EAPI __declspec(dllimport)
19# endif /* ! EFL_ECORE_INPUT_EVAS_BUILD */
20#else
21# ifdef __GNUC__
22# if __GNUC__ >= 4
23# define EAPI __attribute__ ((visibility("default")))
24# else
25# define EAPI
26# endif
27# else
28# define EAPI
29# endif
30#endif
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36typedef void (*Ecore_Event_Mouse_Move_Cb)(void *window, int x, int y, unsigned int timestamp);
37typedef void (*Ecore_Event_Multi_Move_Cb)(void *window, int device, int x, int y, double radius, double radius_x, double radius_y, double pressure, double angle, double mx, double my, unsigned int timestamp);
38typedef void (*Ecore_Event_Multi_Down_Cb)(void *window, int device, int x, int y, double radius, double radius_x, double radius_y, double pressure, double angle, double mx, double my, Evas_Button_Flags flags, unsigned int timestamp);
39typedef void (*Ecore_Event_Multi_Up_Cb)(void *window, int device, int x, int y, double radius, double radius_x, double radius_y, double pressure, double angle, double mx, double my, Evas_Button_Flags flags, unsigned int timestamp);
40
41EAPI int ecore_event_evas_init(void);
42EAPI int ecore_event_evas_shutdown(void);
43
44EAPI Eina_Bool ecore_event_evas_key_down(void *data, int type, void *event);
45EAPI Eina_Bool ecore_event_evas_key_up(void *data, int type, void *event);
46EAPI Eina_Bool ecore_event_evas_mouse_button_up(void *data, int type, void *event);
47EAPI Eina_Bool ecore_event_evas_mouse_button_down(void *data, int type, void *event);
48EAPI Eina_Bool ecore_event_evas_mouse_wheel(void *data, int type, void *event);
49EAPI Eina_Bool ecore_event_evas_mouse_move(void *data, int type, void *event);
50EAPI Eina_Bool ecore_event_evas_mouse_in(void *data, int type, void *event);
51EAPI Eina_Bool ecore_event_evas_mouse_out(void *data, int type, void *event);
52
53EAPI void ecore_event_window_register(Ecore_Window id, void *window, Evas *evas, Ecore_Event_Mouse_Move_Cb move_mouse, Ecore_Event_Multi_Move_Cb move_multi, Ecore_Event_Multi_Down_Cb down_multi, Ecore_Event_Multi_Up_Cb up_multi);
54EAPI void ecore_event_window_unregister(Ecore_Window id);
55EAPI void *ecore_event_window_match(Ecore_Window id);
56EAPI void ecore_event_window_ignore_events(Ecore_Window id, int ignore_event);
57
58EAPI void ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers);
59
60#ifdef __cplusplus
61}
62#endif
63
64#endif
diff --git a/libraries/ecore/src/lib/ecore_input_evas/Makefile.am b/libraries/ecore/src/lib/ecore_input_evas/Makefile.am
new file mode 100644
index 0000000..ab5cd3b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input_evas/Makefile.am
@@ -0,0 +1,29 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore_input \
5-I$(top_builddir)/src/lib/ecore_input \
6-I$(top_srcdir)/src/lib/ecore \
7-I$(top_builddir)/src/lib/ecore \
8@EFL_ECORE_INPUT_EVAS_BUILD@ \
9@EVAS_CFLAGS@ \
10@EINA_CFLAGS@ \
11@EVIL_CFLAGS@
12
13lib_LTLIBRARIES = libecore_input_evas.la
14includes_HEADERS = Ecore_Input_Evas.h
15includesdir = $(includedir)/ecore-@VMAJ@
16
17libecore_input_evas_la_SOURCES = \
18ecore_input_evas.c
19
20libecore_input_evas_la_LIBADD = \
21$(top_builddir)/src/lib/ecore_input/libecore_input.la \
22$(top_builddir)/src/lib/ecore/libecore.la \
23@EVAS_LIBS@ \
24@EINA_LIBS@ \
25@EVIL_LIBS@
26
27libecore_input_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
28
29EXTRA_DIST = ecore_input_evas_private.h
diff --git a/libraries/ecore/src/lib/ecore_input_evas/Makefile.in b/libraries/ecore/src/lib/ecore_input_evas/Makefile.in
new file mode 100644
index 0000000..9097992
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input_evas/Makefile.in
@@ -0,0 +1,822 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_input_evas
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_input_evas_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore_input/libecore_input.la \
91 $(top_builddir)/src/lib/ecore/libecore.la
92am_libecore_input_evas_la_OBJECTS = ecore_input_evas.lo
93libecore_input_evas_la_OBJECTS = $(am_libecore_input_evas_la_OBJECTS)
94AM_V_lt = $(am__v_lt_$(V))
95am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
96am__v_lt_0 = --silent
97libecore_input_evas_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
98 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
99 $(AM_CFLAGS) $(CFLAGS) $(libecore_input_evas_la_LDFLAGS) \
100 $(LDFLAGS) -o $@
101DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
102depcomp = $(SHELL) $(top_srcdir)/depcomp
103am__depfiles_maybe = depfiles
104am__mv = mv -f
105COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
106 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
107LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
108 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
109 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
110 $(AM_CFLAGS) $(CFLAGS)
111AM_V_CC = $(am__v_CC_$(V))
112am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
113am__v_CC_0 = @echo " CC " $@;
114AM_V_at = $(am__v_at_$(V))
115am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
116am__v_at_0 = @
117CCLD = $(CC)
118LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
119 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
120 $(AM_LDFLAGS) $(LDFLAGS) -o $@
121AM_V_CCLD = $(am__v_CCLD_$(V))
122am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
123am__v_CCLD_0 = @echo " CCLD " $@;
124AM_V_GEN = $(am__v_GEN_$(V))
125am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
126am__v_GEN_0 = @echo " GEN " $@;
127SOURCES = $(libecore_input_evas_la_SOURCES)
128DIST_SOURCES = $(libecore_input_evas_la_SOURCES)
129HEADERS = $(includes_HEADERS)
130ETAGS = etags
131CTAGS = ctags
132DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
133ACLOCAL = @ACLOCAL@
134ALLOCA = @ALLOCA@
135AMTAR = @AMTAR@
136AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
137AR = @AR@
138AS = @AS@
139AUTOCONF = @AUTOCONF@
140AUTOHEADER = @AUTOHEADER@
141AUTOMAKE = @AUTOMAKE@
142AWK = @AWK@
143CARES_CFLAGS = @CARES_CFLAGS@
144CARES_LIBS = @CARES_LIBS@
145CC = @CC@
146CCDEPMODE = @CCDEPMODE@
147CFLAGS = @CFLAGS@
148CHECK_CFLAGS = @CHECK_CFLAGS@
149CHECK_LIBS = @CHECK_LIBS@
150CPP = @CPP@
151CPPFLAGS = @CPPFLAGS@
152CURL_CFLAGS = @CURL_CFLAGS@
153CURL_LIBS = @CURL_LIBS@
154CXX = @CXX@
155CXXCPP = @CXXCPP@
156CXXDEPMODE = @CXXDEPMODE@
157CXXFLAGS = @CXXFLAGS@
158CYGPATH_W = @CYGPATH_W@
159DEFS = @DEFS@
160DEPDIR = @DEPDIR@
161DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
162DIRECTFB_LIBS = @DIRECTFB_LIBS@
163DLLTOOL = @DLLTOOL@
164DSYMUTIL = @DSYMUTIL@
165DUMPBIN = @DUMPBIN@
166ECHO_C = @ECHO_C@
167ECHO_N = @ECHO_N@
168ECHO_T = @ECHO_T@
169ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
170ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
171EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
172EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
173EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
174EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
175EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
176EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
177EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
178EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
179EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
180EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
181EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
182EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
183EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
184EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
185EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
186EGREP = @EGREP@
187EINA_CFLAGS = @EINA_CFLAGS@
188EINA_LIBS = @EINA_LIBS@
189ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
190ESCAPE_LIBS = @ESCAPE_LIBS@
191EVAS_CFLAGS = @EVAS_CFLAGS@
192EVAS_LIBS = @EVAS_LIBS@
193EVIL_CFLAGS = @EVIL_CFLAGS@
194EVIL_LIBS = @EVIL_LIBS@
195EXEEXT = @EXEEXT@
196FGREP = @FGREP@
197GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
198GLIB_CFLAGS = @GLIB_CFLAGS@
199GLIB_LIBS = @GLIB_LIBS@
200GMSGFMT = @GMSGFMT@
201GMSGFMT_015 = @GMSGFMT_015@
202GREP = @GREP@
203INSTALL = @INSTALL@
204INSTALL_DATA = @INSTALL_DATA@
205INSTALL_PROGRAM = @INSTALL_PROGRAM@
206INSTALL_SCRIPT = @INSTALL_SCRIPT@
207INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
208INTLLIBS = @INTLLIBS@
209INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
210KEYSYMDEFS = @KEYSYMDEFS@
211LD = @LD@
212LDFLAGS = @LDFLAGS@
213LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
214LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
215LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
216LIBICONV = @LIBICONV@
217LIBINTL = @LIBINTL@
218LIBOBJS = @LIBOBJS@
219LIBS = @LIBS@
220LIBTOOL = @LIBTOOL@
221LIPO = @LIPO@
222LN_S = @LN_S@
223LTLIBICONV = @LTLIBICONV@
224LTLIBINTL = @LTLIBINTL@
225LTLIBOBJS = @LTLIBOBJS@
226MAKEINFO = @MAKEINFO@
227MKDIR_P = @MKDIR_P@
228MSGFMT = @MSGFMT@
229MSGFMT_015 = @MSGFMT_015@
230MSGMERGE = @MSGMERGE@
231NM = @NM@
232NMEDIT = @NMEDIT@
233OBJC = @OBJC@
234OBJCDEPMODE = @OBJCDEPMODE@
235OBJCFLAGS = @OBJCFLAGS@
236OBJDUMP = @OBJDUMP@
237OBJEXT = @OBJEXT@
238OTOOL = @OTOOL@
239OTOOL64 = @OTOOL64@
240PACKAGE = @PACKAGE@
241PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
242PACKAGE_NAME = @PACKAGE_NAME@
243PACKAGE_STRING = @PACKAGE_STRING@
244PACKAGE_TARNAME = @PACKAGE_TARNAME@
245PACKAGE_URL = @PACKAGE_URL@
246PACKAGE_VERSION = @PACKAGE_VERSION@
247PATH_SEPARATOR = @PATH_SEPARATOR@
248PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
249PIXMAN_LIBS = @PIXMAN_LIBS@
250PKG_CONFIG = @PKG_CONFIG@
251PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
252PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
253POSUB = @POSUB@
254RANLIB = @RANLIB@
255SDL_CFLAGS = @SDL_CFLAGS@
256SDL_CONFIG = @SDL_CONFIG@
257SDL_LIBS = @SDL_LIBS@
258SED = @SED@
259SET_MAKE = @SET_MAKE@
260SHELL = @SHELL@
261SSL_CFLAGS = @SSL_CFLAGS@
262SSL_LIBS = @SSL_LIBS@
263STRIP = @STRIP@
264TLS2_CFLAGS = @TLS2_CFLAGS@
265TLS2_LIBS = @TLS2_LIBS@
266TLS_CFLAGS = @TLS_CFLAGS@
267TLS_LIBS = @TLS_LIBS@
268TSLIB_CFLAGS = @TSLIB_CFLAGS@
269TSLIB_LIBS = @TSLIB_LIBS@
270USE_NLS = @USE_NLS@
271VERSION = @VERSION@
272VMAJ = @VMAJ@
273WIN32_CFLAGS = @WIN32_CFLAGS@
274WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
275WIN32_LIBS = @WIN32_LIBS@
276XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
277XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
278XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
279XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
280XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
281XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
282XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
283XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
284XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
285XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
286XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
287XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
288XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
289XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
290XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
291XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
292XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
293XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
294XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
295XCB_X11_LIBS = @XCB_X11_LIBS@
296XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
297XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
298XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
299XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
300XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
301XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
302XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
303XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
304XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
305XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
306XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
307XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
308XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
309XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
310XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
311XDAMAGE_LIBS = @XDAMAGE_LIBS@
312XDPMS_CFLAGS = @XDPMS_CFLAGS@
313XDPMS_LIBS = @XDPMS_LIBS@
314XFIXES_CFLAGS = @XFIXES_CFLAGS@
315XFIXES_LIBS = @XFIXES_LIBS@
316XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
317XGESTURE_LIBS = @XGESTURE_LIBS@
318XGETTEXT = @XGETTEXT@
319XGETTEXT_015 = @XGETTEXT_015@
320XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
321XI2_CFLAGS = @XI2_CFLAGS@
322XI2_LIBS = @XI2_LIBS@
323XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
324XINERAMA_LIBS = @XINERAMA_LIBS@
325XKB_CFLAGS = @XKB_CFLAGS@
326XKB_LIBS = @XKB_LIBS@
327XMKMF = @XMKMF@
328XPRINT_CFLAGS = @XPRINT_CFLAGS@
329XPRINT_LIBS = @XPRINT_LIBS@
330XRANDR_CFLAGS = @XRANDR_CFLAGS@
331XRANDR_LIBS = @XRANDR_LIBS@
332XRENDER_CFLAGS = @XRENDER_CFLAGS@
333XRENDER_LIBS = @XRENDER_LIBS@
334XSS_CFLAGS = @XSS_CFLAGS@
335XSS_LIBS = @XSS_LIBS@
336XTEST_CFLAGS = @XTEST_CFLAGS@
337XTEST_LIBS = @XTEST_LIBS@
338X_CFLAGS = @X_CFLAGS@
339X_EXTRA_LIBS = @X_EXTRA_LIBS@
340X_LIBS = @X_LIBS@
341X_PRE_LIBS = @X_PRE_LIBS@
342Xcursor_cflags = @Xcursor_cflags@
343Xcursor_libs = @Xcursor_libs@
344abs_builddir = @abs_builddir@
345abs_srcdir = @abs_srcdir@
346abs_top_builddir = @abs_top_builddir@
347abs_top_srcdir = @abs_top_srcdir@
348ac_ct_CC = @ac_ct_CC@
349ac_ct_CXX = @ac_ct_CXX@
350ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
351ac_ct_OBJC = @ac_ct_OBJC@
352am__include = @am__include@
353am__leading_dot = @am__leading_dot@
354am__quote = @am__quote@
355am__tar = @am__tar@
356am__untar = @am__untar@
357bindir = @bindir@
358build = @build@
359build_alias = @build_alias@
360build_cpu = @build_cpu@
361build_os = @build_os@
362build_vendor = @build_vendor@
363builddir = @builddir@
364cocoa_ldflags = @cocoa_ldflags@
365datadir = @datadir@
366datarootdir = @datarootdir@
367dlopen_libs = @dlopen_libs@
368docdir = @docdir@
369dvidir = @dvidir@
370ecore_cocoa_cflags = @ecore_cocoa_cflags@
371ecore_cocoa_libs = @ecore_cocoa_libs@
372ecore_con_cflags = @ecore_con_cflags@
373ecore_con_libs = @ecore_con_libs@
374ecore_directfb_cflags = @ecore_directfb_cflags@
375ecore_directfb_libs = @ecore_directfb_libs@
376ecore_evas_cflags = @ecore_evas_cflags@
377ecore_evas_libs = @ecore_evas_libs@
378ecore_fb_cflags = @ecore_fb_cflags@
379ecore_fb_libs = @ecore_fb_libs@
380ecore_file_cflags = @ecore_file_cflags@
381ecore_file_libs = @ecore_file_libs@
382ecore_imf_cflags = @ecore_imf_cflags@
383ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
384ecore_imf_evas_libs = @ecore_imf_evas_libs@
385ecore_imf_libs = @ecore_imf_libs@
386ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
387ecore_imf_xim_libs = @ecore_imf_xim_libs@
388ecore_input_cflags = @ecore_input_cflags@
389ecore_input_evas_cflags = @ecore_input_evas_cflags@
390ecore_input_evas_libs = @ecore_input_evas_libs@
391ecore_input_libs = @ecore_input_libs@
392ecore_ipc_cflags = @ecore_ipc_cflags@
393ecore_ipc_libs = @ecore_ipc_libs@
394ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
395ecore_psl1ght_libs = @ecore_psl1ght_libs@
396ecore_sdl_cflags = @ecore_sdl_cflags@
397ecore_sdl_libs = @ecore_sdl_libs@
398ecore_win32_cflags = @ecore_win32_cflags@
399ecore_win32_libs = @ecore_win32_libs@
400ecore_wince_cflags = @ecore_wince_cflags@
401ecore_wince_libs = @ecore_wince_libs@
402ecore_x_cflags = @ecore_x_cflags@
403ecore_x_libs = @ecore_x_libs@
404ecore_x_libs_private = @ecore_x_libs_private@
405efl_doxygen = @efl_doxygen@
406efl_have_doxygen = @efl_have_doxygen@
407exec_prefix = @exec_prefix@
408have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
409host = @host@
410host_alias = @host_alias@
411host_cpu = @host_cpu@
412host_os = @host_os@
413host_vendor = @host_vendor@
414htmldir = @htmldir@
415includedir = @includedir@
416infodir = @infodir@
417install_sh = @install_sh@
418libdir = @libdir@
419libexecdir = @libexecdir@
420localedir = @localedir@
421localstatedir = @localstatedir@
422lt_ECHO = @lt_ECHO@
423lt_enable_auto_import = @lt_enable_auto_import@
424mandir = @mandir@
425mkdir_p = @mkdir_p@
426oldincludedir = @oldincludedir@
427pdfdir = @pdfdir@
428pkgconfig_requires_private = @pkgconfig_requires_private@
429prefix = @prefix@
430program_transform_name = @program_transform_name@
431psdir = @psdir@
432release_info = @release_info@
433requirements_ecore = @requirements_ecore@
434requirements_ecore_cocoa = @requirements_ecore_cocoa@
435requirements_ecore_con = @requirements_ecore_con@
436requirements_ecore_directfb = @requirements_ecore_directfb@
437requirements_ecore_evas = @requirements_ecore_evas@
438requirements_ecore_fb = @requirements_ecore_fb@
439requirements_ecore_file = @requirements_ecore_file@
440requirements_ecore_imf = @requirements_ecore_imf@
441requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
442requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
443requirements_ecore_input = @requirements_ecore_input@
444requirements_ecore_input_evas = @requirements_ecore_input_evas@
445requirements_ecore_ipc = @requirements_ecore_ipc@
446requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
447requirements_ecore_sdl = @requirements_ecore_sdl@
448requirements_ecore_win32 = @requirements_ecore_win32@
449requirements_ecore_wince = @requirements_ecore_wince@
450requirements_ecore_x = @requirements_ecore_x@
451rt_libs = @rt_libs@
452sbindir = @sbindir@
453sharedstatedir = @sharedstatedir@
454srcdir = @srcdir@
455sysconfdir = @sysconfdir@
456target_alias = @target_alias@
457top_build_prefix = @top_build_prefix@
458top_builddir = @top_builddir@
459top_srcdir = @top_srcdir@
460version_info = @version_info@
461x_cflags = @x_cflags@
462x_includes = @x_includes@
463x_libs = @x_libs@
464MAINTAINERCLEANFILES = Makefile.in
465AM_CPPFLAGS = \
466-I$(top_srcdir)/src/lib/ecore_input \
467-I$(top_builddir)/src/lib/ecore_input \
468-I$(top_srcdir)/src/lib/ecore \
469-I$(top_builddir)/src/lib/ecore \
470@EFL_ECORE_INPUT_EVAS_BUILD@ \
471@EVAS_CFLAGS@ \
472@EINA_CFLAGS@ \
473@EVIL_CFLAGS@
474
475lib_LTLIBRARIES = libecore_input_evas.la
476includes_HEADERS = Ecore_Input_Evas.h
477includesdir = $(includedir)/ecore-@VMAJ@
478libecore_input_evas_la_SOURCES = \
479ecore_input_evas.c
480
481libecore_input_evas_la_LIBADD = \
482$(top_builddir)/src/lib/ecore_input/libecore_input.la \
483$(top_builddir)/src/lib/ecore/libecore.la \
484@EVAS_LIBS@ \
485@EINA_LIBS@ \
486@EVIL_LIBS@
487
488libecore_input_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
489EXTRA_DIST = ecore_input_evas_private.h
490all: all-am
491
492.SUFFIXES:
493.SUFFIXES: .c .lo .o .obj
494$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
495 @for dep in $?; do \
496 case '$(am__configure_deps)' in \
497 *$$dep*) \
498 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
499 && { if test -f $@; then exit 0; else break; fi; }; \
500 exit 1;; \
501 esac; \
502 done; \
503 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_input_evas/Makefile'; \
504 $(am__cd) $(top_srcdir) && \
505 $(AUTOMAKE) --gnu src/lib/ecore_input_evas/Makefile
506.PRECIOUS: Makefile
507Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
508 @case '$?' in \
509 *config.status*) \
510 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
511 *) \
512 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
513 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
514 esac;
515
516$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
517 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
518
519$(top_srcdir)/configure: $(am__configure_deps)
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
521$(ACLOCAL_M4): $(am__aclocal_m4_deps)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523$(am__aclocal_m4_deps):
524install-libLTLIBRARIES: $(lib_LTLIBRARIES)
525 @$(NORMAL_INSTALL)
526 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
527 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
528 list2=; for p in $$list; do \
529 if test -f $$p; then \
530 list2="$$list2 $$p"; \
531 else :; fi; \
532 done; \
533 test -z "$$list2" || { \
534 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
535 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
536 }
537
538uninstall-libLTLIBRARIES:
539 @$(NORMAL_UNINSTALL)
540 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
541 for p in $$list; do \
542 $(am__strip_dir) \
543 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
544 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
545 done
546
547clean-libLTLIBRARIES:
548 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
549 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
550 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
551 test "$$dir" != "$$p" || dir=.; \
552 echo "rm -f \"$${dir}/so_locations\""; \
553 rm -f "$${dir}/so_locations"; \
554 done
555libecore_input_evas.la: $(libecore_input_evas_la_OBJECTS) $(libecore_input_evas_la_DEPENDENCIES)
556 $(AM_V_CCLD)$(libecore_input_evas_la_LINK) -rpath $(libdir) $(libecore_input_evas_la_OBJECTS) $(libecore_input_evas_la_LIBADD) $(LIBS)
557
558mostlyclean-compile:
559 -rm -f *.$(OBJEXT)
560
561distclean-compile:
562 -rm -f *.tab.c
563
564@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_input_evas.Plo@am__quote@
565
566.c.o:
567@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
568@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
569@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
570@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
572@am__fastdepCC_FALSE@ $(COMPILE) -c $<
573
574.c.obj:
575@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
576@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
577@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
578@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
580@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
581
582.c.lo:
583@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
584@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
585@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
587@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
588@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
589
590mostlyclean-libtool:
591 -rm -f *.lo
592
593clean-libtool:
594 -rm -rf .libs _libs
595install-includesHEADERS: $(includes_HEADERS)
596 @$(NORMAL_INSTALL)
597 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
598 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
599 for p in $$list; do \
600 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
601 echo "$$d$$p"; \
602 done | $(am__base_list) | \
603 while read files; do \
604 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
605 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
606 done
607
608uninstall-includesHEADERS:
609 @$(NORMAL_UNINSTALL)
610 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
611 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
612 test -n "$$files" || exit 0; \
613 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
614 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
615
616ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
617 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
618 unique=`for i in $$list; do \
619 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
620 done | \
621 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
622 END { if (nonempty) { for (i in files) print i; }; }'`; \
623 mkid -fID $$unique
624tags: TAGS
625
626TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
627 $(TAGS_FILES) $(LISP)
628 set x; \
629 here=`pwd`; \
630 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
631 unique=`for i in $$list; do \
632 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
633 done | \
634 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
635 END { if (nonempty) { for (i in files) print i; }; }'`; \
636 shift; \
637 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
638 test -n "$$unique" || unique=$$empty_fix; \
639 if test $$# -gt 0; then \
640 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
641 "$$@" $$unique; \
642 else \
643 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
644 $$unique; \
645 fi; \
646 fi
647ctags: CTAGS
648CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
649 $(TAGS_FILES) $(LISP)
650 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
651 unique=`for i in $$list; do \
652 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
653 done | \
654 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
655 END { if (nonempty) { for (i in files) print i; }; }'`; \
656 test -z "$(CTAGS_ARGS)$$unique" \
657 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
658 $$unique
659
660GTAGS:
661 here=`$(am__cd) $(top_builddir) && pwd` \
662 && $(am__cd) $(top_srcdir) \
663 && gtags -i $(GTAGS_ARGS) "$$here"
664
665distclean-tags:
666 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
667
668distdir: $(DISTFILES)
669 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
670 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
671 list='$(DISTFILES)'; \
672 dist_files=`for file in $$list; do echo $$file; done | \
673 sed -e "s|^$$srcdirstrip/||;t" \
674 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
675 case $$dist_files in \
676 */*) $(MKDIR_P) `echo "$$dist_files" | \
677 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
678 sort -u` ;; \
679 esac; \
680 for file in $$dist_files; do \
681 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
682 if test -d $$d/$$file; then \
683 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
684 if test -d "$(distdir)/$$file"; then \
685 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
686 fi; \
687 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
688 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
689 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
690 fi; \
691 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
692 else \
693 test -f "$(distdir)/$$file" \
694 || cp -p $$d/$$file "$(distdir)/$$file" \
695 || exit 1; \
696 fi; \
697 done
698check-am: all-am
699check: check-am
700all-am: Makefile $(LTLIBRARIES) $(HEADERS)
701installdirs:
702 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
703 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
704 done
705install: install-am
706install-exec: install-exec-am
707install-data: install-data-am
708uninstall: uninstall-am
709
710install-am: all-am
711 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
712
713installcheck: installcheck-am
714install-strip:
715 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
716 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
717 `test -z '$(STRIP)' || \
718 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
719mostlyclean-generic:
720
721clean-generic:
722
723distclean-generic:
724 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
725 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
726
727maintainer-clean-generic:
728 @echo "This command is intended for maintainers to use"
729 @echo "it deletes files that may require special tools to rebuild."
730 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
731clean: clean-am
732
733clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
734 mostlyclean-am
735
736distclean: distclean-am
737 -rm -rf ./$(DEPDIR)
738 -rm -f Makefile
739distclean-am: clean-am distclean-compile distclean-generic \
740 distclean-tags
741
742dvi: dvi-am
743
744dvi-am:
745
746html: html-am
747
748html-am:
749
750info: info-am
751
752info-am:
753
754install-data-am: install-includesHEADERS
755
756install-dvi: install-dvi-am
757
758install-dvi-am:
759
760install-exec-am: install-libLTLIBRARIES
761
762install-html: install-html-am
763
764install-html-am:
765
766install-info: install-info-am
767
768install-info-am:
769
770install-man:
771
772install-pdf: install-pdf-am
773
774install-pdf-am:
775
776install-ps: install-ps-am
777
778install-ps-am:
779
780installcheck-am:
781
782maintainer-clean: maintainer-clean-am
783 -rm -rf ./$(DEPDIR)
784 -rm -f Makefile
785maintainer-clean-am: distclean-am maintainer-clean-generic
786
787mostlyclean: mostlyclean-am
788
789mostlyclean-am: mostlyclean-compile mostlyclean-generic \
790 mostlyclean-libtool
791
792pdf: pdf-am
793
794pdf-am:
795
796ps: ps-am
797
798ps-am:
799
800uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
801
802.MAKE: install-am install-strip
803
804.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
805 clean-libLTLIBRARIES clean-libtool ctags distclean \
806 distclean-compile distclean-generic distclean-libtool \
807 distclean-tags distdir dvi dvi-am html html-am info info-am \
808 install install-am install-data install-data-am install-dvi \
809 install-dvi-am install-exec install-exec-am install-html \
810 install-html-am install-includesHEADERS install-info \
811 install-info-am install-libLTLIBRARIES install-man install-pdf \
812 install-pdf-am install-ps install-ps-am install-strip \
813 installcheck installcheck-am installdirs maintainer-clean \
814 maintainer-clean-generic mostlyclean mostlyclean-compile \
815 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
816 tags uninstall uninstall-am uninstall-includesHEADERS \
817 uninstall-libLTLIBRARIES
818
819
820# Tell versions [3.59,3.63) of GNU make to not export all variables.
821# Otherwise a system limit (for SysV at least) may be exceeded.
822.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas.c b/libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas.c
new file mode 100644
index 0000000..0cfe20a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas.c
@@ -0,0 +1,412 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6
7#include "Ecore.h"
8#include "Ecore_Input.h"
9
10#include "Ecore_Input_Evas.h"
11#include "ecore_input_evas_private.h"
12
13int _ecore_input_evas_log_dom = -1;
14
15typedef struct _Ecore_Input_Window Ecore_Input_Window;
16struct _Ecore_Input_Window
17{
18 Evas *evas;
19 void *window;
20 Ecore_Event_Mouse_Move_Cb move_mouse;
21 Ecore_Event_Multi_Move_Cb move_multi;
22 Ecore_Event_Multi_Down_Cb down_multi;
23 Ecore_Event_Multi_Up_Cb up_multi;
24 int ignore_event;
25};
26
27static int _ecore_event_evas_init_count = 0;
28static Ecore_Event_Handler *ecore_event_evas_handlers[8];
29static Eina_Hash *_window_hash = NULL;
30
31EAPI void
32ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
33{
34 if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
35 evas_key_modifier_on(e, "Shift");
36 else evas_key_modifier_off(e, "Shift");
37
38 if (modifiers & ECORE_EVENT_MODIFIER_CTRL)
39 evas_key_modifier_on(e, "Control");
40 else evas_key_modifier_off(e, "Control");
41
42 if (modifiers & ECORE_EVENT_MODIFIER_ALT)
43 evas_key_modifier_on(e, "Alt");
44 else evas_key_modifier_off(e, "Alt");
45
46 if (modifiers & ECORE_EVENT_MODIFIER_WIN)
47 {
48 evas_key_modifier_on(e, "Super");
49 evas_key_modifier_on(e, "Hyper");
50 }
51 else
52 {
53 evas_key_modifier_off(e, "Super");
54 evas_key_modifier_off(e, "Hyper");
55 }
56
57 if (modifiers & ECORE_EVENT_LOCK_SCROLL)
58 evas_key_lock_on(e, "Scroll_Lock");
59 else evas_key_lock_off(e, "Scroll_Lock");
60
61 if (modifiers & ECORE_EVENT_LOCK_NUM)
62 evas_key_lock_on(e, "Num_Lock");
63 else evas_key_lock_off(e, "Num_Lock");
64
65 if (modifiers & ECORE_EVENT_LOCK_CAPS)
66 evas_key_lock_on(e, "Caps_Lock");
67 else evas_key_lock_off(e, "Caps_Lock");
68
69 if (modifiers & ECORE_EVENT_LOCK_SHIFT)
70 evas_key_lock_on(e, "Shift_Lock");
71 else evas_key_lock_off(e, "Shift_Lock");
72}
73
74EAPI void
75ecore_event_window_register(Ecore_Window id, void *window, Evas *evas,
76 Ecore_Event_Mouse_Move_Cb move_mouse,
77 Ecore_Event_Multi_Move_Cb move_multi,
78 Ecore_Event_Multi_Down_Cb down_multi,
79 Ecore_Event_Multi_Up_Cb up_multi)
80{
81 Ecore_Input_Window *w;
82
83 w = calloc(1, sizeof(Ecore_Input_Window));
84 if (!w) return;
85
86 w->evas = evas;
87 w->window = window;
88 w->move_mouse = move_mouse;
89 w->move_multi = move_multi;
90 w->down_multi = down_multi;
91 w->up_multi = up_multi;
92 w->ignore_event = 0;
93
94 eina_hash_add(_window_hash, &id, w);
95
96 evas_key_modifier_add(evas, "Shift");
97 evas_key_modifier_add(evas, "Control");
98 evas_key_modifier_add(evas, "Alt");
99 evas_key_modifier_add(evas, "Meta");
100 evas_key_modifier_add(evas, "Hyper");
101 evas_key_modifier_add(evas, "Super");
102 evas_key_lock_add(evas, "Caps_Lock");
103 evas_key_lock_add(evas, "Num_Lock");
104 evas_key_lock_add(evas, "Scroll_Lock");
105}
106
107EAPI void
108ecore_event_window_unregister(Ecore_Window id)
109{
110 eina_hash_del(_window_hash, &id, NULL);
111}
112
113EAPI void *
114ecore_event_window_match(Ecore_Window id)
115{
116 Ecore_Input_Window *lookup;
117
118 lookup = eina_hash_find(_window_hash, &id);
119 if (lookup) return lookup->window;
120 return NULL;
121}
122
123EAPI void
124ecore_event_window_ignore_events(Ecore_Window id, int ignore_event)
125{
126 Ecore_Input_Window *lookup;
127
128 lookup = eina_hash_find(_window_hash, &id);
129 if (!lookup) return;
130 lookup->ignore_event = ignore_event;
131}
132
133static Ecore_Input_Window*
134_ecore_event_window_match(Ecore_Window id)
135{
136 Ecore_Input_Window *lookup;
137
138 lookup = eina_hash_find(_window_hash, &id);
139 if (!lookup) return NULL;
140 if (lookup->ignore_event) return NULL; /* Pass on event. */
141 return lookup;
142}
143
144static Eina_Bool
145_ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press)
146{
147 Ecore_Input_Window *lookup;
148
149 lookup = _ecore_event_window_match(e->event_window);
150 if (!lookup) return ECORE_CALLBACK_RENEW;
151 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
152 if (press == ECORE_DOWN)
153 evas_event_feed_key_down(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
154 else
155 evas_event_feed_key_up(lookup->evas, e->keyname, e->key, e->string, e->compose, e->timestamp, NULL);
156 return ECORE_CALLBACK_RENEW;
157}
158
159static Eina_Bool
160_ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press press)
161{
162 Ecore_Input_Window *lookup;
163 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
164
165 lookup = _ecore_event_window_match(e->event_window);
166 if (!lookup) return ECORE_CALLBACK_RENEW;
167 if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
168 if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
169 if (e->multi.device == 0)
170 {
171 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
172 if (press == ECORE_DOWN)
173 evas_event_feed_mouse_down(lookup->evas, e->buttons, flags,
174 e->timestamp, NULL);
175 else
176 evas_event_feed_mouse_up(lookup->evas, e->buttons, flags,
177 e->timestamp, NULL);
178 }
179 else
180 {
181 if (press == ECORE_DOWN)
182 {
183 if (lookup->down_multi)
184 lookup->down_multi(lookup->window, e->multi.device,
185 e->x, e->y, e->multi.radius,
186 e->multi.radius_x, e->multi.radius_y,
187 e->multi.pressure, e->multi.angle,
188 e->multi.x, e->multi.y, flags,
189 e->timestamp);
190 else
191 evas_event_feed_multi_down(lookup->evas, e->multi.device,
192 e->x, e->y, e->multi.radius,
193 e->multi.radius_x, e->multi.radius_y,
194 e->multi.pressure, e->multi.angle,
195 e->multi.x, e->multi.y, flags,
196 e->timestamp, NULL);
197 }
198 else
199 {
200 if (lookup->up_multi)
201 lookup->up_multi(lookup->window, e->multi.device,
202 e->x, e->y, e->multi.radius,
203 e->multi.radius_x, e->multi.radius_y,
204 e->multi.pressure, e->multi.angle,
205 e->multi.x, e->multi.y, flags,
206 e->timestamp);
207 else
208 evas_event_feed_multi_up(lookup->evas, e->multi.device,
209 e->x, e->y, e->multi.radius,
210 e->multi.radius_x, e->multi.radius_y,
211 e->multi.pressure, e->multi.angle,
212 e->multi.x, e->multi.y, flags,
213 e->timestamp, NULL);
214 }
215 }
216 return ECORE_CALLBACK_RENEW;
217}
218
219EAPI Eina_Bool
220ecore_event_evas_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
221{
222 Ecore_Event_Mouse_Move *e;
223 Ecore_Input_Window *lookup;
224
225 e = event;
226 lookup = _ecore_event_window_match(e->event_window);
227 if (!lookup) return ECORE_CALLBACK_RENEW;
228 if (e->multi.device == 0)
229 {
230 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
231 if (lookup->move_mouse)
232 lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
233 else
234 evas_event_feed_mouse_move(lookup->evas, e->x, e->y, e->timestamp,
235 NULL);
236 }
237 else
238 {
239 if (lookup->move_multi)
240 lookup->move_multi(lookup->window, e->multi.device,
241 e->x, e->y, e->multi.radius,
242 e->multi.radius_x, e->multi.radius_y,
243 e->multi.pressure, e->multi.angle,
244 e->multi.x, e->multi.y, e->timestamp);
245 else
246 evas_event_feed_multi_move(lookup->evas, e->multi.device,
247 e->x, e->y, e->multi.radius,
248 e->multi.radius_x, e->multi.radius_y,
249 e->multi.pressure, e->multi.angle,
250 e->multi.x, e->multi.y, e->timestamp,
251 NULL);
252 }
253 return ECORE_CALLBACK_RENEW;
254}
255
256EAPI Eina_Bool
257ecore_event_evas_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
258{
259 return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_DOWN);
260}
261
262EAPI Eina_Bool
263ecore_event_evas_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
264{
265 return _ecore_event_evas_mouse_button((Ecore_Event_Mouse_Button *)event, ECORE_UP);
266}
267
268static Eina_Bool
269_ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io)
270{
271 Ecore_Input_Window *lookup;
272
273 lookup = _ecore_event_window_match(e->event_window);
274 if (!lookup) return ECORE_CALLBACK_RENEW;
275 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
276 switch (io)
277 {
278 case ECORE_IN:
279 evas_event_feed_mouse_in(lookup->evas, e->timestamp, NULL);
280 break;
281 case ECORE_OUT:
282 evas_event_feed_mouse_out(lookup->evas, e->timestamp, NULL);
283 break;
284 default:
285 break;
286 }
287
288 lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp);
289 return ECORE_CALLBACK_RENEW;
290}
291
292EAPI Eina_Bool
293ecore_event_evas_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
294{
295 return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_DOWN);
296}
297
298EAPI Eina_Bool
299ecore_event_evas_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
300{
301 return _ecore_event_evas_key((Ecore_Event_Key *)event, ECORE_UP);
302}
303
304EAPI Eina_Bool
305ecore_event_evas_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
306{
307 Ecore_Event_Mouse_Wheel *e;
308 Ecore_Input_Window *lookup;
309
310 e = event;
311 lookup = _ecore_event_window_match(e->event_window);
312 if (!lookup) return ECORE_CALLBACK_RENEW;
313 ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
314 evas_event_feed_mouse_wheel(lookup->evas, e->direction, e->z, e->timestamp, NULL);
315 return ECORE_CALLBACK_RENEW;
316}
317
318EAPI Eina_Bool
319ecore_event_evas_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
320{
321 return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_IN);
322}
323
324EAPI Eina_Bool
325ecore_event_evas_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
326{
327 return _ecore_event_evas_mouse_io((Ecore_Event_Mouse_IO *)event, ECORE_OUT);
328}
329
330EAPI int
331ecore_event_evas_init(void)
332{
333 if (++_ecore_event_evas_init_count != 1)
334 return _ecore_event_evas_init_count;
335
336 _ecore_input_evas_log_dom = eina_log_domain_register
337 ("ecore_input_evas", ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR);
338 if (_ecore_input_evas_log_dom < 0)
339 {
340 EINA_LOG_ERR("Impossible to create a log domain for the ecore input evas_module.");
341 return --_ecore_event_evas_init_count;
342 }
343
344 if (!ecore_init())
345 {
346 return --_ecore_event_evas_init_count;
347 }
348
349 if (!ecore_event_init())
350 {
351 goto shutdown_ecore;
352 }
353
354 ecore_event_evas_handlers[0] = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
355 ecore_event_evas_key_down,
356 NULL);
357 ecore_event_evas_handlers[1] = ecore_event_handler_add(ECORE_EVENT_KEY_UP,
358 ecore_event_evas_key_up,
359 NULL);
360 ecore_event_evas_handlers[2] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
361 ecore_event_evas_mouse_button_down,
362 NULL);
363 ecore_event_evas_handlers[3] = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
364 ecore_event_evas_mouse_button_up,
365 NULL);
366 ecore_event_evas_handlers[4] = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
367 ecore_event_evas_mouse_move,
368 NULL);
369 ecore_event_evas_handlers[5] = ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
370 ecore_event_evas_mouse_wheel,
371 NULL);
372 ecore_event_evas_handlers[6] = ecore_event_handler_add(ECORE_EVENT_MOUSE_IN,
373 ecore_event_evas_mouse_in,
374 NULL);
375 ecore_event_evas_handlers[7] = ecore_event_handler_add(ECORE_EVENT_MOUSE_OUT,
376 ecore_event_evas_mouse_out,
377 NULL);
378
379 _window_hash = eina_hash_pointer_new(free);
380
381 return _ecore_event_evas_init_count;
382
383 shutdown_ecore:
384 ecore_shutdown();
385
386 return --_ecore_event_evas_init_count;
387}
388
389EAPI int
390ecore_event_evas_shutdown(void)
391{
392 size_t i;
393
394 if (--_ecore_event_evas_init_count != 0)
395 return _ecore_event_evas_init_count;
396
397 eina_hash_free(_window_hash);
398 _window_hash = NULL;
399 for (i = 0; i < sizeof(ecore_event_evas_handlers) / sizeof(Ecore_Event_Handler *); i++)
400 {
401 ecore_event_handler_del(ecore_event_evas_handlers[i]);
402 ecore_event_evas_handlers[i] = NULL;
403 }
404
405 ecore_event_shutdown();
406 ecore_shutdown();
407
408 eina_log_domain_unregister(_ecore_input_evas_log_dom);
409 _ecore_input_evas_log_dom = -1;
410
411 return _ecore_event_evas_init_count;
412}
diff --git a/libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas_private.h b/libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas_private.h
new file mode 100644
index 0000000..c19cfbf
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_input_evas/ecore_input_evas_private.h
@@ -0,0 +1,37 @@
1#ifndef _ECORE_INPUT_PRIVATE_H
2#define _ECORE_INPUT_PRIVATE_H
3
4extern int _ecore_input_evas_log_dom;
5
6#ifdef ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR
7#undef ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR
8#endif
9
10#define ECORE_INPUT_EVAS_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
11
12#ifdef ERR
13#undef ERR
14#endif
15#define ERR(...) EINA_LOG_DOM_ERR(_ecore_input_evas_log_dom, __VA_ARGS__)
16
17#ifdef DBG
18#undef DBG
19#endif
20#define DBG(...) EINA_LOG_DOM_DBG(_ecore_input_evas_log_dom, __VA_ARGS__)
21
22#ifdef INF
23#undef INF
24#endif
25#define INF(...) EINA_LOG_DOM_INFO(_ecore_input_evas_log_dom, __VA_ARGS__)
26
27#ifdef WRN
28#undef WRN
29#endif
30#define WRN(...) EINA_LOG_DOM_WARN(_ecore_input_evas_log_dom, __VA_ARGS__)
31
32#ifdef CRIT
33#undef CRIT
34#endif
35#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_input_evas_log_dom, __VA_ARGS__)
36
37#endif
diff --git a/libraries/ecore/src/lib/ecore_ipc/Ecore_Ipc.h b/libraries/ecore/src/lib/ecore_ipc/Ecore_Ipc.h
new file mode 100644
index 0000000..40ae621
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_ipc/Ecore_Ipc.h
@@ -0,0 +1,325 @@
1#ifndef _ECORE_IPC_H
2#define _ECORE_IPC_H
3
4#ifdef EAPI
5# undef EAPI
6#endif
7
8#ifdef _WIN32
9# ifdef EFL_ECORE_IPC_BUILD
10# ifdef DLL_EXPORT
11# define EAPI __declspec(dllexport)
12# else
13# define EAPI
14# endif
15# else
16# define EAPI __declspec(dllimport)
17# endif
18#else
19# ifdef __GNUC__
20# if __GNUC__ >= 4
21# define EAPI __attribute__ ((visibility("default")))
22# else
23# define EAPI
24# endif
25# else
26# define EAPI
27# endif
28#endif
29
30/**
31 * @file Ecore_Ipc.h
32 * @brief Ecore inter-process communication functions.
33 */
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39typedef struct _Ecore_Ipc_Server Ecore_Ipc_Server; /**< An IPC connection handle */
40typedef struct _Ecore_Ipc_Client Ecore_Ipc_Client; /**< An IPC connection handle */
41
42EAPI unsigned short _ecore_ipc_swap_16(unsigned short v);
43EAPI unsigned int _ecore_ipc_swap_32(unsigned int v);
44EAPI unsigned long long _ecore_ipc_swap_64(unsigned long long v);
45
46#ifdef WORDS_BIGENDIAN
47#define ECORE_IPC_SWAP2NET64(x) _ecore_ipc_swap_64(x)
48#define ECORE_IPC_SWAP2CPU64(x) _ecore_ipc_swap_64(x)
49#define ECORE_IPC_SWAP2NET32(x) _ecore_ipc_swap_32(x)
50#define ECORE_IPC_SWAP2CPU32(x) _ecore_ipc_swap_32(x)
51#define ECORE_IPC_SWAP2NET16(x) _ecore_ipc_swap_16(x)
52#define ECORE_IPC_SWAP2CPU16(x) _ecore_ipc_swap_16(x)
53#define ECORE_IPC_SWAP2NET8(x) (x)
54#define ECORE_IPC_SWAP2CPU8(x) (x)
55#else
56#define ECORE_IPC_SWAP2NET64(x) (x)
57#define ECORE_IPC_SWAP2CPU64(x) (x)
58#define ECORE_IPC_SWAP2NET32(x) (x)
59#define ECORE_IPC_SWAP2CPU32(x) (x)
60#define ECORE_IPC_SWAP2NET16(x) (x)
61#define ECORE_IPC_SWAP2CPU16(x) (x)
62#define ECORE_IPC_SWAP2NET8(x) (x)
63#define ECORE_IPC_SWAP2CPU8(x) (x)
64#endif
65
66/* 1, 2, 4 and 8 byte datatypes */
67/* unpacking */
68#define ECORE_IPC_GET64(v)\
69 { \
70 p->v = ECORE_IPC_SWAP2CPU64(*(long long *)(ptr)); \
71 ptr += 8; \
72 }
73#define ECORE_IPC_GET32(v)\
74 { \
75 p->v = ECORE_IPC_SWAP2CPU32(*(int *)(ptr)); \
76 ptr += 4; \
77 }
78#define ECORE_IPC_GET16(v)\
79 { \
80 p->v = ECORE_IPC_SWAP2CPU16(*(short *)(ptr)); \
81 ptr += 2; \
82 }
83#define ECORE_IPC_GET8(v) \
84 { \
85 p->v = ECORE_IPC_SWAP2CPU8(*(char *)(ptr)); \
86 ptr += 1; \
87 }
88/* packing */
89#define ECORE_IPC_PUT64(v)\
90 { \
91 *(long long *)(ptr) = ECORE_IPC_SWAP2NET64(p->v); \
92 ptr += 8; \
93 }
94#define ECORE_IPC_PUT32(v)\
95 { \
96 *(int *)(ptr) = ECORE_IPC_SWAP2NET32(p->v); \
97 ptr += 4; \
98 }
99#define ECORE_IPC_PUT16(v)\
100 { \
101 *(short *)(ptr) = ECORE_IPC_SWAP2NET16(p->v); \
102 ptr += 2; \
103 }
104#define ECORE_IPC_PUT8(v) \
105 { \
106 *(char *)(ptr) = ECORE_IPC_SWAP2NET8(p->v); \
107 ptr += 1; \
108 }
109/* padding data */
110#define ECORE_IPC_PAD8() ptr += 1
111#define ECORE_IPC_PAD16() ptr += 2
112#define ECORE_IPC_PAD32() ptr += 4
113#define ECORE_IPC_PAD64() ptr += 8
114
115/* counting data when encoding lists */
116#define ECORE_IPC_CNT8() len += 1
117#define ECORE_IPC_CNT16() len += 2
118#define ECORE_IPC_CNT32() len += 4
119#define ECORE_IPC_CNT64() len += 8
120
121/* strings */
122#define ECORE_IPC_CHEKS() if (*((unsigned char *)d + s - 1) != 0) return 0;
123#define ECORE_IPC_GETS(v) \
124 { \
125 if (ptr < ((unsigned char *)d + s)) \
126 { \
127 p->v = (char *)ptr; \
128 ptr += strlen(p->v) + 1; \
129 } \
130 }
131#define ECORE_IPC_PUTS(v, l)\
132 { \
133 strcpy((char *)ptr, p->v); \
134 ptr += l + 1; \
135 }
136
137/* handy to calculate what sized block we need to alloc */
138#define ECORE_IPC_SLEN(l, v) ((l = strlen(p->v)) + 1)
139#define ECORE_IPC_CNTS(v) len += strlen(p->v) + 1
140
141/* saves typing function headers */
142#define ECORE_IPC_DEC_STRUCT_PROTO(x) static int x(void *d, int s, void *pp)
143#define ECORE_IPC_ENC_STRUCT_PROTO(x) static void *x(void *pp, int *s)
144#define ECORE_IPC_DEC_EINA_LIST_PROTO(x) static Eina_List *x(void *d, int s)
145#define ECORE_IPC_ENC_EINA_LIST_PROTO(x) static void *x(Eina_List *lp, int *s)
146
147
148/* decoder setup - saves typing. requires data packet of exact size, or fail */
149#define ECORE_IPC_DEC_STRUCT_HEAD_EXACT(typ, x) \
150 typ *p; \
151 unsigned char *ptr; \
152 p = (typ *)pp; \
153 if (!d) return 0; if (s != (x)) return 0; \
154 ptr = d;
155/* decoder setup - saves typing. requires data packet of a minimum size */
156#define ECORE_IPC_DEC_STRUCT_HEAD_MIN(typ, x) \
157 typ *p; \
158 unsigned char *ptr; \
159 p = (typ *)pp; \
160 if (!d) return 0; if (s < (x)) return 0; \
161 ptr = d;
162/* footer for the hell of it */
163#define ECORE_IPC_DEC_STRUCT_FOOT() return 1
164/* header for encoder - gives native strct type and size of flattened packet */
165#define ECORE_IPC_ENC_STRUCT_HEAD(typ, sz) \
166 typ *p; \
167 unsigned char *d, *ptr; \
168 int len; \
169 *s = 0; \
170 if(!pp) return NULL; \
171 p = (typ *)pp; \
172 len = sz; \
173 d = malloc(len); \
174 if (!d) return NULL; \
175 *s = len; \
176 ptr = d;
177/* footer for the hell of it */
178#define ECORE_IPC_ENC_STRUCT_FOOT() return d
179
180#define ECORE_IPC_DEC_EINA_LIST_HEAD(typ) \
181 unsigned char *ptr; \
182 Eina_List *l; \
183 typ *p; \
184 l = NULL; \
185 ptr = d; \
186 while(ptr < (unsigned char *)(d + s)) \
187 { \
188 p = malloc(sizeof(typ));
189
190#define ECORE_IPC_DEC_EINA_LIST_FOOT() \
191 l = eina_list_append(l, p); \
192 } \
193 return l
194#define ECORE_IPC_ENC_EINA_LIST_HEAD_START(typ) \
195 Eina_List *l; \
196 typ *p; \
197 unsigned char *d, *ptr; \
198 int len; \
199 *s = 0; \
200 len = 0; \
201 for (l = lp; l; l = l->next) \
202 { \
203 p = l->data;
204#define ECORE_IPC_ENC_EINA_LIST_HEAD_FINISH() \
205 } \
206 d = malloc(len); \
207 if(!d) return NULL; \
208 *s = len; \
209 ptr = d; \
210 for (l = lp; l; l = l->next) \
211 { \
212 p = l->data;
213
214#define ECORE_IPC_ENC_EINA_LIST_FOOT() \
215 } \
216 return d
217
218typedef enum _Ecore_Ipc_Type
219{
220 ECORE_IPC_LOCAL_USER,
221 ECORE_IPC_LOCAL_SYSTEM,
222 ECORE_IPC_REMOTE_SYSTEM,
223 ECORE_IPC_USE_SSL = 16
224} Ecore_Ipc_Type;
225
226typedef struct _Ecore_Ipc_Event_Client_Add Ecore_Ipc_Event_Client_Add;
227typedef struct _Ecore_Ipc_Event_Client_Del Ecore_Ipc_Event_Client_Del;
228typedef struct _Ecore_Ipc_Event_Server_Add Ecore_Ipc_Event_Server_Add;
229typedef struct _Ecore_Ipc_Event_Server_Del Ecore_Ipc_Event_Server_Del;
230typedef struct _Ecore_Ipc_Event_Client_Data Ecore_Ipc_Event_Client_Data;
231typedef struct _Ecore_Ipc_Event_Server_Data Ecore_Ipc_Event_Server_Data;
232
233struct _Ecore_Ipc_Event_Client_Add
234{
235 Ecore_Ipc_Client *client;
236};
237
238struct _Ecore_Ipc_Event_Client_Del
239{
240 Ecore_Ipc_Client *client;
241};
242
243struct _Ecore_Ipc_Event_Server_Add
244{
245 Ecore_Ipc_Server *server;
246};
247
248struct _Ecore_Ipc_Event_Server_Del
249{
250 Ecore_Ipc_Server *server;
251};
252
253struct _Ecore_Ipc_Event_Client_Data
254{
255 Ecore_Ipc_Client *client;
256 /* FIXME: this needs to become an ipc message */
257 int major;
258 int minor;
259 int ref;
260 int ref_to;
261 int response;
262 void *data;
263 int size;
264};
265
266struct _Ecore_Ipc_Event_Server_Data
267{
268 Ecore_Ipc_Server *server;
269 /* FIXME: this needs to become an ipc message */
270 int major;
271 int minor;
272 int ref;
273 int ref_to;
274 int response;
275 void *data;
276 int size;
277};
278
279EAPI extern int ECORE_IPC_EVENT_CLIENT_ADD;
280EAPI extern int ECORE_IPC_EVENT_CLIENT_DEL;
281EAPI extern int ECORE_IPC_EVENT_SERVER_ADD;
282EAPI extern int ECORE_IPC_EVENT_SERVER_DEL;
283EAPI extern int ECORE_IPC_EVENT_CLIENT_DATA;
284EAPI extern int ECORE_IPC_EVENT_SERVER_DATA;
285
286EAPI int ecore_ipc_init(void);
287EAPI int ecore_ipc_shutdown(void);
288
289/* FIXME: need to add protocol type parameter */
290EAPI Ecore_Ipc_Server *ecore_ipc_server_add(Ecore_Ipc_Type type, const char *name, int port, const void *data);
291
292/* FIXME: need to add protocol type parameter */
293EAPI Ecore_Ipc_Server *ecore_ipc_server_connect(Ecore_Ipc_Type type, char *name, int port, const void *data);
294EAPI void *ecore_ipc_server_del(Ecore_Ipc_Server *svr);
295EAPI void *ecore_ipc_server_data_get(Ecore_Ipc_Server *svr);
296EAPI Eina_Bool ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr);
297EAPI Eina_List *ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr);
298/* FIXME: this needs to become an ipc message */
299EAPI int ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
300EAPI void ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients);
301EAPI void ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *srv, int size);
302EAPI int ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *srv);
303EAPI const char *ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr);
304EAPI void ecore_ipc_server_flush(Ecore_Ipc_Server *svr);
305
306/* FIXME: this needs to become an ipc message */
307EAPI int ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size);
308EAPI Ecore_Ipc_Server *ecore_ipc_client_server_get(Ecore_Ipc_Client *cl);
309EAPI void *ecore_ipc_client_del(Ecore_Ipc_Client *cl);
310EAPI void ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data);
311EAPI void *ecore_ipc_client_data_get(Ecore_Ipc_Client *cl);
312EAPI void ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size);
313EAPI int ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl);
314EAPI const char *ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl);
315EAPI void ecore_ipc_client_flush(Ecore_Ipc_Client *cl);
316
317EAPI int ecore_ipc_ssl_available_get(void);
318/* FIXME: need to add a callback to "ok" large ipc messages greater than */
319/* a certain size (seurity/DOS attack safety) */
320
321#ifdef __cplusplus
322}
323#endif
324
325#endif
diff --git a/libraries/ecore/src/lib/ecore_ipc/Makefile.am b/libraries/ecore/src/lib/ecore_ipc/Makefile.am
new file mode 100644
index 0000000..9cbed43
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_ipc/Makefile.am
@@ -0,0 +1,29 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_builddir)/src/lib/ecore \
5-I$(top_builddir)/src/lib/ecore_con \
6-I$(top_builddir)/src/lib/ecore_ipc \
7-I$(top_srcdir)/src/lib/ecore \
8-I$(top_srcdir)/src/lib/ecore_con \
9-I$(top_srcdir)/src/lib/ecore_ipc \
10@EFL_ECORE_IPC_BUILD@ \
11@SSL_CFLAGS@ \
12@EINA_CFLAGS@
13
14lib_LTLIBRARIES = libecore_ipc.la
15includes_HEADERS = Ecore_Ipc.h
16includesdir = $(includedir)/ecore-@VMAJ@
17
18libecore_ipc_la_SOURCES = \
19ecore_ipc.c
20
21libecore_ipc_la_LIBADD = \
22$(top_builddir)/src/lib/ecore/libecore.la \
23$(top_builddir)/src/lib/ecore_con/libecore_con.la \
24@SSL_LIBS@ \
25@EINA_LIBS@
26
27libecore_ipc_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
28
29EXTRA_DIST = ecore_ipc_private.h
diff --git a/libraries/ecore/src/lib/ecore_ipc/Makefile.in b/libraries/ecore/src/lib/ecore_ipc/Makefile.in
new file mode 100644
index 0000000..189e069
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_ipc/Makefile.in
@@ -0,0 +1,822 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_ipc
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_ipc_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la \
91 $(top_builddir)/src/lib/ecore_con/libecore_con.la
92am_libecore_ipc_la_OBJECTS = ecore_ipc.lo
93libecore_ipc_la_OBJECTS = $(am_libecore_ipc_la_OBJECTS)
94AM_V_lt = $(am__v_lt_$(V))
95am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
96am__v_lt_0 = --silent
97libecore_ipc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
98 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
99 $(AM_CFLAGS) $(CFLAGS) $(libecore_ipc_la_LDFLAGS) $(LDFLAGS) \
100 -o $@
101DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
102depcomp = $(SHELL) $(top_srcdir)/depcomp
103am__depfiles_maybe = depfiles
104am__mv = mv -f
105COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
106 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
107LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
108 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
109 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
110 $(AM_CFLAGS) $(CFLAGS)
111AM_V_CC = $(am__v_CC_$(V))
112am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
113am__v_CC_0 = @echo " CC " $@;
114AM_V_at = $(am__v_at_$(V))
115am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
116am__v_at_0 = @
117CCLD = $(CC)
118LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
119 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
120 $(AM_LDFLAGS) $(LDFLAGS) -o $@
121AM_V_CCLD = $(am__v_CCLD_$(V))
122am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
123am__v_CCLD_0 = @echo " CCLD " $@;
124AM_V_GEN = $(am__v_GEN_$(V))
125am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
126am__v_GEN_0 = @echo " GEN " $@;
127SOURCES = $(libecore_ipc_la_SOURCES)
128DIST_SOURCES = $(libecore_ipc_la_SOURCES)
129HEADERS = $(includes_HEADERS)
130ETAGS = etags
131CTAGS = ctags
132DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
133ACLOCAL = @ACLOCAL@
134ALLOCA = @ALLOCA@
135AMTAR = @AMTAR@
136AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
137AR = @AR@
138AS = @AS@
139AUTOCONF = @AUTOCONF@
140AUTOHEADER = @AUTOHEADER@
141AUTOMAKE = @AUTOMAKE@
142AWK = @AWK@
143CARES_CFLAGS = @CARES_CFLAGS@
144CARES_LIBS = @CARES_LIBS@
145CC = @CC@
146CCDEPMODE = @CCDEPMODE@
147CFLAGS = @CFLAGS@
148CHECK_CFLAGS = @CHECK_CFLAGS@
149CHECK_LIBS = @CHECK_LIBS@
150CPP = @CPP@
151CPPFLAGS = @CPPFLAGS@
152CURL_CFLAGS = @CURL_CFLAGS@
153CURL_LIBS = @CURL_LIBS@
154CXX = @CXX@
155CXXCPP = @CXXCPP@
156CXXDEPMODE = @CXXDEPMODE@
157CXXFLAGS = @CXXFLAGS@
158CYGPATH_W = @CYGPATH_W@
159DEFS = @DEFS@
160DEPDIR = @DEPDIR@
161DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
162DIRECTFB_LIBS = @DIRECTFB_LIBS@
163DLLTOOL = @DLLTOOL@
164DSYMUTIL = @DSYMUTIL@
165DUMPBIN = @DUMPBIN@
166ECHO_C = @ECHO_C@
167ECHO_N = @ECHO_N@
168ECHO_T = @ECHO_T@
169ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
170ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
171EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
172EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
173EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
174EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
175EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
176EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
177EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
178EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
179EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
180EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
181EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
182EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
183EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
184EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
185EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
186EGREP = @EGREP@
187EINA_CFLAGS = @EINA_CFLAGS@
188EINA_LIBS = @EINA_LIBS@
189ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
190ESCAPE_LIBS = @ESCAPE_LIBS@
191EVAS_CFLAGS = @EVAS_CFLAGS@
192EVAS_LIBS = @EVAS_LIBS@
193EVIL_CFLAGS = @EVIL_CFLAGS@
194EVIL_LIBS = @EVIL_LIBS@
195EXEEXT = @EXEEXT@
196FGREP = @FGREP@
197GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
198GLIB_CFLAGS = @GLIB_CFLAGS@
199GLIB_LIBS = @GLIB_LIBS@
200GMSGFMT = @GMSGFMT@
201GMSGFMT_015 = @GMSGFMT_015@
202GREP = @GREP@
203INSTALL = @INSTALL@
204INSTALL_DATA = @INSTALL_DATA@
205INSTALL_PROGRAM = @INSTALL_PROGRAM@
206INSTALL_SCRIPT = @INSTALL_SCRIPT@
207INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
208INTLLIBS = @INTLLIBS@
209INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
210KEYSYMDEFS = @KEYSYMDEFS@
211LD = @LD@
212LDFLAGS = @LDFLAGS@
213LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
214LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
215LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
216LIBICONV = @LIBICONV@
217LIBINTL = @LIBINTL@
218LIBOBJS = @LIBOBJS@
219LIBS = @LIBS@
220LIBTOOL = @LIBTOOL@
221LIPO = @LIPO@
222LN_S = @LN_S@
223LTLIBICONV = @LTLIBICONV@
224LTLIBINTL = @LTLIBINTL@
225LTLIBOBJS = @LTLIBOBJS@
226MAKEINFO = @MAKEINFO@
227MKDIR_P = @MKDIR_P@
228MSGFMT = @MSGFMT@
229MSGFMT_015 = @MSGFMT_015@
230MSGMERGE = @MSGMERGE@
231NM = @NM@
232NMEDIT = @NMEDIT@
233OBJC = @OBJC@
234OBJCDEPMODE = @OBJCDEPMODE@
235OBJCFLAGS = @OBJCFLAGS@
236OBJDUMP = @OBJDUMP@
237OBJEXT = @OBJEXT@
238OTOOL = @OTOOL@
239OTOOL64 = @OTOOL64@
240PACKAGE = @PACKAGE@
241PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
242PACKAGE_NAME = @PACKAGE_NAME@
243PACKAGE_STRING = @PACKAGE_STRING@
244PACKAGE_TARNAME = @PACKAGE_TARNAME@
245PACKAGE_URL = @PACKAGE_URL@
246PACKAGE_VERSION = @PACKAGE_VERSION@
247PATH_SEPARATOR = @PATH_SEPARATOR@
248PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
249PIXMAN_LIBS = @PIXMAN_LIBS@
250PKG_CONFIG = @PKG_CONFIG@
251PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
252PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
253POSUB = @POSUB@
254RANLIB = @RANLIB@
255SDL_CFLAGS = @SDL_CFLAGS@
256SDL_CONFIG = @SDL_CONFIG@
257SDL_LIBS = @SDL_LIBS@
258SED = @SED@
259SET_MAKE = @SET_MAKE@
260SHELL = @SHELL@
261SSL_CFLAGS = @SSL_CFLAGS@
262SSL_LIBS = @SSL_LIBS@
263STRIP = @STRIP@
264TLS2_CFLAGS = @TLS2_CFLAGS@
265TLS2_LIBS = @TLS2_LIBS@
266TLS_CFLAGS = @TLS_CFLAGS@
267TLS_LIBS = @TLS_LIBS@
268TSLIB_CFLAGS = @TSLIB_CFLAGS@
269TSLIB_LIBS = @TSLIB_LIBS@
270USE_NLS = @USE_NLS@
271VERSION = @VERSION@
272VMAJ = @VMAJ@
273WIN32_CFLAGS = @WIN32_CFLAGS@
274WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
275WIN32_LIBS = @WIN32_LIBS@
276XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
277XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
278XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
279XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
280XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
281XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
282XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
283XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
284XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
285XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
286XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
287XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
288XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
289XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
290XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
291XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
292XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
293XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
294XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
295XCB_X11_LIBS = @XCB_X11_LIBS@
296XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
297XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
298XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
299XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
300XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
301XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
302XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
303XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
304XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
305XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
306XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
307XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
308XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
309XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
310XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
311XDAMAGE_LIBS = @XDAMAGE_LIBS@
312XDPMS_CFLAGS = @XDPMS_CFLAGS@
313XDPMS_LIBS = @XDPMS_LIBS@
314XFIXES_CFLAGS = @XFIXES_CFLAGS@
315XFIXES_LIBS = @XFIXES_LIBS@
316XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
317XGESTURE_LIBS = @XGESTURE_LIBS@
318XGETTEXT = @XGETTEXT@
319XGETTEXT_015 = @XGETTEXT_015@
320XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
321XI2_CFLAGS = @XI2_CFLAGS@
322XI2_LIBS = @XI2_LIBS@
323XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
324XINERAMA_LIBS = @XINERAMA_LIBS@
325XKB_CFLAGS = @XKB_CFLAGS@
326XKB_LIBS = @XKB_LIBS@
327XMKMF = @XMKMF@
328XPRINT_CFLAGS = @XPRINT_CFLAGS@
329XPRINT_LIBS = @XPRINT_LIBS@
330XRANDR_CFLAGS = @XRANDR_CFLAGS@
331XRANDR_LIBS = @XRANDR_LIBS@
332XRENDER_CFLAGS = @XRENDER_CFLAGS@
333XRENDER_LIBS = @XRENDER_LIBS@
334XSS_CFLAGS = @XSS_CFLAGS@
335XSS_LIBS = @XSS_LIBS@
336XTEST_CFLAGS = @XTEST_CFLAGS@
337XTEST_LIBS = @XTEST_LIBS@
338X_CFLAGS = @X_CFLAGS@
339X_EXTRA_LIBS = @X_EXTRA_LIBS@
340X_LIBS = @X_LIBS@
341X_PRE_LIBS = @X_PRE_LIBS@
342Xcursor_cflags = @Xcursor_cflags@
343Xcursor_libs = @Xcursor_libs@
344abs_builddir = @abs_builddir@
345abs_srcdir = @abs_srcdir@
346abs_top_builddir = @abs_top_builddir@
347abs_top_srcdir = @abs_top_srcdir@
348ac_ct_CC = @ac_ct_CC@
349ac_ct_CXX = @ac_ct_CXX@
350ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
351ac_ct_OBJC = @ac_ct_OBJC@
352am__include = @am__include@
353am__leading_dot = @am__leading_dot@
354am__quote = @am__quote@
355am__tar = @am__tar@
356am__untar = @am__untar@
357bindir = @bindir@
358build = @build@
359build_alias = @build_alias@
360build_cpu = @build_cpu@
361build_os = @build_os@
362build_vendor = @build_vendor@
363builddir = @builddir@
364cocoa_ldflags = @cocoa_ldflags@
365datadir = @datadir@
366datarootdir = @datarootdir@
367dlopen_libs = @dlopen_libs@
368docdir = @docdir@
369dvidir = @dvidir@
370ecore_cocoa_cflags = @ecore_cocoa_cflags@
371ecore_cocoa_libs = @ecore_cocoa_libs@
372ecore_con_cflags = @ecore_con_cflags@
373ecore_con_libs = @ecore_con_libs@
374ecore_directfb_cflags = @ecore_directfb_cflags@
375ecore_directfb_libs = @ecore_directfb_libs@
376ecore_evas_cflags = @ecore_evas_cflags@
377ecore_evas_libs = @ecore_evas_libs@
378ecore_fb_cflags = @ecore_fb_cflags@
379ecore_fb_libs = @ecore_fb_libs@
380ecore_file_cflags = @ecore_file_cflags@
381ecore_file_libs = @ecore_file_libs@
382ecore_imf_cflags = @ecore_imf_cflags@
383ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
384ecore_imf_evas_libs = @ecore_imf_evas_libs@
385ecore_imf_libs = @ecore_imf_libs@
386ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
387ecore_imf_xim_libs = @ecore_imf_xim_libs@
388ecore_input_cflags = @ecore_input_cflags@
389ecore_input_evas_cflags = @ecore_input_evas_cflags@
390ecore_input_evas_libs = @ecore_input_evas_libs@
391ecore_input_libs = @ecore_input_libs@
392ecore_ipc_cflags = @ecore_ipc_cflags@
393ecore_ipc_libs = @ecore_ipc_libs@
394ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
395ecore_psl1ght_libs = @ecore_psl1ght_libs@
396ecore_sdl_cflags = @ecore_sdl_cflags@
397ecore_sdl_libs = @ecore_sdl_libs@
398ecore_win32_cflags = @ecore_win32_cflags@
399ecore_win32_libs = @ecore_win32_libs@
400ecore_wince_cflags = @ecore_wince_cflags@
401ecore_wince_libs = @ecore_wince_libs@
402ecore_x_cflags = @ecore_x_cflags@
403ecore_x_libs = @ecore_x_libs@
404ecore_x_libs_private = @ecore_x_libs_private@
405efl_doxygen = @efl_doxygen@
406efl_have_doxygen = @efl_have_doxygen@
407exec_prefix = @exec_prefix@
408have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
409host = @host@
410host_alias = @host_alias@
411host_cpu = @host_cpu@
412host_os = @host_os@
413host_vendor = @host_vendor@
414htmldir = @htmldir@
415includedir = @includedir@
416infodir = @infodir@
417install_sh = @install_sh@
418libdir = @libdir@
419libexecdir = @libexecdir@
420localedir = @localedir@
421localstatedir = @localstatedir@
422lt_ECHO = @lt_ECHO@
423lt_enable_auto_import = @lt_enable_auto_import@
424mandir = @mandir@
425mkdir_p = @mkdir_p@
426oldincludedir = @oldincludedir@
427pdfdir = @pdfdir@
428pkgconfig_requires_private = @pkgconfig_requires_private@
429prefix = @prefix@
430program_transform_name = @program_transform_name@
431psdir = @psdir@
432release_info = @release_info@
433requirements_ecore = @requirements_ecore@
434requirements_ecore_cocoa = @requirements_ecore_cocoa@
435requirements_ecore_con = @requirements_ecore_con@
436requirements_ecore_directfb = @requirements_ecore_directfb@
437requirements_ecore_evas = @requirements_ecore_evas@
438requirements_ecore_fb = @requirements_ecore_fb@
439requirements_ecore_file = @requirements_ecore_file@
440requirements_ecore_imf = @requirements_ecore_imf@
441requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
442requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
443requirements_ecore_input = @requirements_ecore_input@
444requirements_ecore_input_evas = @requirements_ecore_input_evas@
445requirements_ecore_ipc = @requirements_ecore_ipc@
446requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
447requirements_ecore_sdl = @requirements_ecore_sdl@
448requirements_ecore_win32 = @requirements_ecore_win32@
449requirements_ecore_wince = @requirements_ecore_wince@
450requirements_ecore_x = @requirements_ecore_x@
451rt_libs = @rt_libs@
452sbindir = @sbindir@
453sharedstatedir = @sharedstatedir@
454srcdir = @srcdir@
455sysconfdir = @sysconfdir@
456target_alias = @target_alias@
457top_build_prefix = @top_build_prefix@
458top_builddir = @top_builddir@
459top_srcdir = @top_srcdir@
460version_info = @version_info@
461x_cflags = @x_cflags@
462x_includes = @x_includes@
463x_libs = @x_libs@
464MAINTAINERCLEANFILES = Makefile.in
465AM_CPPFLAGS = \
466-I$(top_builddir)/src/lib/ecore \
467-I$(top_builddir)/src/lib/ecore_con \
468-I$(top_builddir)/src/lib/ecore_ipc \
469-I$(top_srcdir)/src/lib/ecore \
470-I$(top_srcdir)/src/lib/ecore_con \
471-I$(top_srcdir)/src/lib/ecore_ipc \
472@EFL_ECORE_IPC_BUILD@ \
473@SSL_CFLAGS@ \
474@EINA_CFLAGS@
475
476lib_LTLIBRARIES = libecore_ipc.la
477includes_HEADERS = Ecore_Ipc.h
478includesdir = $(includedir)/ecore-@VMAJ@
479libecore_ipc_la_SOURCES = \
480ecore_ipc.c
481
482libecore_ipc_la_LIBADD = \
483$(top_builddir)/src/lib/ecore/libecore.la \
484$(top_builddir)/src/lib/ecore_con/libecore_con.la \
485@SSL_LIBS@ \
486@EINA_LIBS@
487
488libecore_ipc_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@
489EXTRA_DIST = ecore_ipc_private.h
490all: all-am
491
492.SUFFIXES:
493.SUFFIXES: .c .lo .o .obj
494$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
495 @for dep in $?; do \
496 case '$(am__configure_deps)' in \
497 *$$dep*) \
498 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
499 && { if test -f $@; then exit 0; else break; fi; }; \
500 exit 1;; \
501 esac; \
502 done; \
503 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_ipc/Makefile'; \
504 $(am__cd) $(top_srcdir) && \
505 $(AUTOMAKE) --gnu src/lib/ecore_ipc/Makefile
506.PRECIOUS: Makefile
507Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
508 @case '$?' in \
509 *config.status*) \
510 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
511 *) \
512 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
513 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
514 esac;
515
516$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
517 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
518
519$(top_srcdir)/configure: $(am__configure_deps)
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
521$(ACLOCAL_M4): $(am__aclocal_m4_deps)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523$(am__aclocal_m4_deps):
524install-libLTLIBRARIES: $(lib_LTLIBRARIES)
525 @$(NORMAL_INSTALL)
526 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
527 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
528 list2=; for p in $$list; do \
529 if test -f $$p; then \
530 list2="$$list2 $$p"; \
531 else :; fi; \
532 done; \
533 test -z "$$list2" || { \
534 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
535 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
536 }
537
538uninstall-libLTLIBRARIES:
539 @$(NORMAL_UNINSTALL)
540 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
541 for p in $$list; do \
542 $(am__strip_dir) \
543 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
544 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
545 done
546
547clean-libLTLIBRARIES:
548 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
549 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
550 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
551 test "$$dir" != "$$p" || dir=.; \
552 echo "rm -f \"$${dir}/so_locations\""; \
553 rm -f "$${dir}/so_locations"; \
554 done
555libecore_ipc.la: $(libecore_ipc_la_OBJECTS) $(libecore_ipc_la_DEPENDENCIES)
556 $(AM_V_CCLD)$(libecore_ipc_la_LINK) -rpath $(libdir) $(libecore_ipc_la_OBJECTS) $(libecore_ipc_la_LIBADD) $(LIBS)
557
558mostlyclean-compile:
559 -rm -f *.$(OBJEXT)
560
561distclean-compile:
562 -rm -f *.tab.c
563
564@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_ipc.Plo@am__quote@
565
566.c.o:
567@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
568@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
569@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
570@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
572@am__fastdepCC_FALSE@ $(COMPILE) -c $<
573
574.c.obj:
575@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
576@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
577@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
578@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
580@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
581
582.c.lo:
583@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
584@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
585@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
587@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
588@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
589
590mostlyclean-libtool:
591 -rm -f *.lo
592
593clean-libtool:
594 -rm -rf .libs _libs
595install-includesHEADERS: $(includes_HEADERS)
596 @$(NORMAL_INSTALL)
597 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
598 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
599 for p in $$list; do \
600 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
601 echo "$$d$$p"; \
602 done | $(am__base_list) | \
603 while read files; do \
604 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
605 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
606 done
607
608uninstall-includesHEADERS:
609 @$(NORMAL_UNINSTALL)
610 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
611 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
612 test -n "$$files" || exit 0; \
613 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
614 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
615
616ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
617 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
618 unique=`for i in $$list; do \
619 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
620 done | \
621 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
622 END { if (nonempty) { for (i in files) print i; }; }'`; \
623 mkid -fID $$unique
624tags: TAGS
625
626TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
627 $(TAGS_FILES) $(LISP)
628 set x; \
629 here=`pwd`; \
630 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
631 unique=`for i in $$list; do \
632 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
633 done | \
634 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
635 END { if (nonempty) { for (i in files) print i; }; }'`; \
636 shift; \
637 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
638 test -n "$$unique" || unique=$$empty_fix; \
639 if test $$# -gt 0; then \
640 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
641 "$$@" $$unique; \
642 else \
643 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
644 $$unique; \
645 fi; \
646 fi
647ctags: CTAGS
648CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
649 $(TAGS_FILES) $(LISP)
650 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
651 unique=`for i in $$list; do \
652 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
653 done | \
654 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
655 END { if (nonempty) { for (i in files) print i; }; }'`; \
656 test -z "$(CTAGS_ARGS)$$unique" \
657 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
658 $$unique
659
660GTAGS:
661 here=`$(am__cd) $(top_builddir) && pwd` \
662 && $(am__cd) $(top_srcdir) \
663 && gtags -i $(GTAGS_ARGS) "$$here"
664
665distclean-tags:
666 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
667
668distdir: $(DISTFILES)
669 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
670 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
671 list='$(DISTFILES)'; \
672 dist_files=`for file in $$list; do echo $$file; done | \
673 sed -e "s|^$$srcdirstrip/||;t" \
674 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
675 case $$dist_files in \
676 */*) $(MKDIR_P) `echo "$$dist_files" | \
677 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
678 sort -u` ;; \
679 esac; \
680 for file in $$dist_files; do \
681 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
682 if test -d $$d/$$file; then \
683 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
684 if test -d "$(distdir)/$$file"; then \
685 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
686 fi; \
687 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
688 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
689 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
690 fi; \
691 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
692 else \
693 test -f "$(distdir)/$$file" \
694 || cp -p $$d/$$file "$(distdir)/$$file" \
695 || exit 1; \
696 fi; \
697 done
698check-am: all-am
699check: check-am
700all-am: Makefile $(LTLIBRARIES) $(HEADERS)
701installdirs:
702 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
703 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
704 done
705install: install-am
706install-exec: install-exec-am
707install-data: install-data-am
708uninstall: uninstall-am
709
710install-am: all-am
711 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
712
713installcheck: installcheck-am
714install-strip:
715 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
716 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
717 `test -z '$(STRIP)' || \
718 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
719mostlyclean-generic:
720
721clean-generic:
722
723distclean-generic:
724 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
725 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
726
727maintainer-clean-generic:
728 @echo "This command is intended for maintainers to use"
729 @echo "it deletes files that may require special tools to rebuild."
730 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
731clean: clean-am
732
733clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
734 mostlyclean-am
735
736distclean: distclean-am
737 -rm -rf ./$(DEPDIR)
738 -rm -f Makefile
739distclean-am: clean-am distclean-compile distclean-generic \
740 distclean-tags
741
742dvi: dvi-am
743
744dvi-am:
745
746html: html-am
747
748html-am:
749
750info: info-am
751
752info-am:
753
754install-data-am: install-includesHEADERS
755
756install-dvi: install-dvi-am
757
758install-dvi-am:
759
760install-exec-am: install-libLTLIBRARIES
761
762install-html: install-html-am
763
764install-html-am:
765
766install-info: install-info-am
767
768install-info-am:
769
770install-man:
771
772install-pdf: install-pdf-am
773
774install-pdf-am:
775
776install-ps: install-ps-am
777
778install-ps-am:
779
780installcheck-am:
781
782maintainer-clean: maintainer-clean-am
783 -rm -rf ./$(DEPDIR)
784 -rm -f Makefile
785maintainer-clean-am: distclean-am maintainer-clean-generic
786
787mostlyclean: mostlyclean-am
788
789mostlyclean-am: mostlyclean-compile mostlyclean-generic \
790 mostlyclean-libtool
791
792pdf: pdf-am
793
794pdf-am:
795
796ps: ps-am
797
798ps-am:
799
800uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
801
802.MAKE: install-am install-strip
803
804.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
805 clean-libLTLIBRARIES clean-libtool ctags distclean \
806 distclean-compile distclean-generic distclean-libtool \
807 distclean-tags distdir dvi dvi-am html html-am info info-am \
808 install install-am install-data install-data-am install-dvi \
809 install-dvi-am install-exec install-exec-am install-html \
810 install-html-am install-includesHEADERS install-info \
811 install-info-am install-libLTLIBRARIES install-man install-pdf \
812 install-pdf-am install-ps install-ps-am install-strip \
813 installcheck installcheck-am installdirs maintainer-clean \
814 maintainer-clean-generic mostlyclean mostlyclean-compile \
815 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
816 tags uninstall uninstall-am uninstall-includesHEADERS \
817 uninstall-libLTLIBRARIES
818
819
820# Tell versions [3.59,3.63) of GNU make to not export all variables.
821# Otherwise a system limit (for SysV at least) may be exceeded.
822.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_ipc/ecore_ipc.c b/libraries/ecore/src/lib/ecore_ipc/ecore_ipc.c
new file mode 100644
index 0000000..c17cadd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_ipc/ecore_ipc.c
@@ -0,0 +1,1591 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <string.h>
6
7#ifdef HAVE_NETINET_IN_H
8# include <sys/types.h>
9# include <netinet/in.h>
10#endif
11
12#ifdef HAVE_WINSOCK2_H
13# include <winsock2.h>
14#endif
15
16#if USE_GNUTLS_OPENSSL
17# include <gnutls/openssl.h>
18#elif USE_OPENSSL
19# include <openssl/ssl.h>
20#endif
21
22#include <Ecore.h>
23#include <ecore_private.h>
24#include <Ecore_Con.h>
25
26#include "Ecore_Ipc.h"
27#include "ecore_ipc_private.h"
28
29#define DLT_ZERO 0
30#define DLT_ONE 1
31#define DLT_SAME 2
32#define DLT_SHL 3
33#define DLT_SHR 4
34#define DLT_ADD8 5
35#define DLT_DEL8 6
36#define DLT_ADDU8 7
37#define DLT_DELU8 8
38#define DLT_ADD16 9
39#define DLT_DEL16 10
40#define DLT_ADDU16 11
41#define DLT_DELU16 12
42#define DLT_SET 13
43#define DLT_R1 14
44#define DLT_R2 15
45
46int _ecore_ipc_log_dom = -1;
47
48EAPI unsigned short
49_ecore_ipc_swap_16(unsigned short v)
50{
51 unsigned char *s, t;
52
53 s = (unsigned char *)(&v);
54 t = s[0]; s[0] = s[1]; s[1] = t;
55 return v;
56}
57
58EAPI unsigned int
59_ecore_ipc_swap_32(unsigned int v)
60{
61 unsigned char *s, t;
62
63 s = (unsigned char *)(&v);
64 t = s[0]; s[0] = s[3]; s[3] = t;
65 t = s[1]; s[1] = s[2]; s[2] = t;
66 return v;
67}
68
69EAPI unsigned long long
70_ecore_ipc_swap_64(unsigned long long v)
71{
72 unsigned char *s, t;
73
74 s = (unsigned char *)(&v);
75 t = s[0]; s[0] = s[7]; s[7] = t;
76 t = s[1]; s[1] = s[6]; s[6] = t;
77 t = s[2]; s[2] = s[5]; s[5] = t;
78 t = s[3]; s[3] = s[4]; s[4] = t;
79 return v;
80}
81
82static int _ecore_ipc_dlt_int(int out, int prev, int *mode);
83static int _ecore_ipc_ddlt_int(int in, int prev, int mode);
84
85static int
86_ecore_ipc_dlt_int(int out, int prev, int *mode)
87{
88 int dlt;
89
90 /* 0 byte */
91 if (out == 0)
92 {
93 *mode = DLT_ZERO;
94 return 0;
95 }
96 if (out == (int)0xffffffff)
97 {
98 *mode = DLT_ONE;
99 return 0;
100 }
101 if (out == prev)
102 {
103 *mode = DLT_SAME;
104 return 0;
105 }
106 if (out == prev << 1)
107 {
108 *mode = DLT_SHL;
109 return 0;
110 }
111 if (out == prev >> 1)
112 {
113 *mode = DLT_SHR;
114 return 0;
115 }
116 /* 1 byte */
117 dlt = out - prev;
118 if (!(dlt & 0xffffff00))
119 {
120 *mode = DLT_ADD8;
121 return dlt & 0xff;
122 }
123 dlt = prev - out;
124 if (!(dlt & 0xffffff00))
125 {
126 *mode = DLT_DEL8;
127 return dlt & 0xff;
128 }
129 dlt = out - prev;
130 if (!(dlt & 0x00ffffff))
131 {
132 *mode = DLT_ADDU8;
133 return (dlt >> 24) & 0xff;
134 }
135 dlt = prev - out;
136 if (!(dlt & 0x00ffffff))
137 {
138 *mode = DLT_DELU8;
139 return (dlt >> 24) & 0xff;
140 }
141 /* 2 byte */
142 dlt = out - prev;
143 if (!(dlt & 0xffff0000))
144 {
145 *mode = DLT_ADD16;
146 return dlt & 0xffff;
147 }
148 dlt = prev - out;
149 if (!(dlt & 0xffff0000))
150 {
151 *mode = DLT_DEL16;
152 return dlt & 0xffff;
153 }
154 dlt = out - prev;
155 if (!(dlt & 0x0000ffff))
156 {
157 *mode = DLT_ADDU16;
158 return (dlt >> 16) & 0xffff;
159 }
160 dlt = prev - out;
161 if (!(dlt & 0x0000ffff))
162 {
163 *mode = DLT_DELU16;
164 return (dlt >> 16) & 0xffff;
165 }
166 /* 4 byte */
167 *mode = DLT_SET;
168 return out;
169}
170
171static int
172_ecore_ipc_ddlt_int(int in, int prev, int mode)
173{
174 switch (mode)
175 {
176 case DLT_ZERO:
177 return 0;
178 break;
179 case DLT_ONE:
180 return 0xffffffff;
181 break;
182 case DLT_SAME:
183 return prev;
184 break;
185 case DLT_SHL:
186 return prev << 1;
187 break;
188 case DLT_SHR:
189 return prev >> 1;
190 break;
191 case DLT_ADD8:
192 return prev + in;
193 break;
194 case DLT_DEL8:
195 return prev - in;
196 break;
197 case DLT_ADDU8:
198 return prev + (in << 24);
199 break;
200 case DLT_DELU8:
201 return prev - (in << 24);
202 break;
203 case DLT_ADD16:
204 return prev + in;
205 break;
206 case DLT_DEL16:
207 return prev - in;
208 break;
209 case DLT_ADDU16:
210 return prev + (in << 16);
211 break;
212 case DLT_DELU16:
213 return prev - (in << 16);
214 break;
215 case DLT_SET:
216 return in;
217 break;
218 case DLT_R1:
219 return 0;
220 break;
221 case DLT_R2:
222 return 0;
223 break;
224 default:
225 break;
226 }
227 return 0;
228}
229
230static Eina_Bool _ecore_ipc_event_client_add(void *data, int ev_type, void *ev);
231static Eina_Bool _ecore_ipc_event_client_del(void *data, int ev_type, void *ev);
232static Eina_Bool _ecore_ipc_event_server_add(void *data, int ev_type, void *ev);
233static Eina_Bool _ecore_ipc_event_server_del(void *data, int ev_type, void *ev);
234static Eina_Bool _ecore_ipc_event_client_data(void *data, int ev_type, void *ev);
235static Eina_Bool _ecore_ipc_event_server_data(void *data, int ev_type, void *ev);
236static void _ecore_ipc_event_client_add_free(void *data, void *ev);
237static void _ecore_ipc_event_client_del_free(void *data, void *ev);
238static void _ecore_ipc_event_client_data_free(void *data, void *ev);
239static void _ecore_ipc_event_server_add_free(void *data, void *ev);
240static void _ecore_ipc_event_server_del_free(void *data, void *ev);
241static void _ecore_ipc_event_server_data_free(void *data, void *ev);
242
243EAPI int ECORE_IPC_EVENT_CLIENT_ADD = 0;
244EAPI int ECORE_IPC_EVENT_CLIENT_DEL = 0;
245EAPI int ECORE_IPC_EVENT_SERVER_ADD = 0;
246EAPI int ECORE_IPC_EVENT_SERVER_DEL = 0;
247EAPI int ECORE_IPC_EVENT_CLIENT_DATA = 0;
248EAPI int ECORE_IPC_EVENT_SERVER_DATA = 0;
249
250static int _ecore_ipc_init_count = 0;
251static Eina_List *servers = NULL;
252static Ecore_Event_Handler *handler[6];
253
254/**
255 * @defgroup Ecore_IPC_Library_Group IPC Library Functions
256 *
257 * Functions that set up and shut down the Ecore IPC Library.
258 */
259
260/**
261 * Initialises the Ecore IPC library.
262 * @return Number of times the library has been initialised without
263 * being shut down.
264 * @ingroup Ecore_IPC_Library_Group
265 */
266EAPI int
267ecore_ipc_init(void)
268{
269 int i = 0;
270
271 if (++_ecore_ipc_init_count != 1)
272 return _ecore_ipc_init_count;
273 _ecore_ipc_log_dom = eina_log_domain_register
274 ("ecore_ipc", ECORE_IPC_DEFAULT_LOG_COLOR);
275 if(_ecore_ipc_log_dom < 0)
276 {
277 EINA_LOG_ERR("Impossible to create a log domain for the Ecore IPC module.");
278 return --_ecore_ipc_init_count;
279 }
280 if (!ecore_con_init())
281 return --_ecore_ipc_init_count;
282
283 ECORE_IPC_EVENT_CLIENT_ADD = ecore_event_type_new();
284 ECORE_IPC_EVENT_CLIENT_DEL = ecore_event_type_new();
285 ECORE_IPC_EVENT_SERVER_ADD = ecore_event_type_new();
286 ECORE_IPC_EVENT_SERVER_DEL = ecore_event_type_new();
287 ECORE_IPC_EVENT_CLIENT_DATA = ecore_event_type_new();
288 ECORE_IPC_EVENT_SERVER_DATA = ecore_event_type_new();
289
290 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD,
291 _ecore_ipc_event_client_add, NULL);
292 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL,
293 _ecore_ipc_event_client_del, NULL);
294 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
295 _ecore_ipc_event_server_add, NULL);
296 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DEL,
297 _ecore_ipc_event_server_del, NULL);
298 handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DATA,
299 _ecore_ipc_event_client_data, NULL);
300 handler[i] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA,
301 _ecore_ipc_event_server_data, NULL);
302 return _ecore_ipc_init_count;
303}
304
305/**
306 * Shuts down the Ecore IPC library.
307 * @return Number of times the library has been initialised without being
308 * shut down.
309 * @ingroup Ecore_IPC_Library_Group
310 */
311EAPI int
312ecore_ipc_shutdown(void)
313{
314 int i;
315
316 if (--_ecore_ipc_init_count != 0)
317 return _ecore_ipc_init_count;
318
319 while (servers) ecore_ipc_server_del(eina_list_data_get(servers));
320
321 for (i = 0; i < 6; i++)
322 ecore_event_handler_del(handler[i]);
323
324 ecore_con_shutdown();
325 eina_log_domain_unregister(_ecore_ipc_log_dom);
326 _ecore_ipc_log_dom = -1;
327 return _ecore_ipc_init_count;
328}
329
330/**
331 * @defgroup Ecore_IPC_Server_Group IPC Server Functions
332 *
333 * Functions the deal with IPC server objects.
334 */
335
336/**
337 * Creates an IPC server that listens for connections.
338 *
339 * For more details about the @p compl_type, @p name and @p port
340 * parameters, see the @ref ecore_con_server_add documentation.
341 *
342 * @param compl_type The connection type.
343 * @param name Name to associate with the socket used for connection.
344 * @param port Number to identify with socket used for connection.
345 * @param data Data to associate with the IPC server.
346 * @return New IPC server. If there is an error, @c NULL is returned.
347 * @ingroup Ecore_IPC_Server_Group
348 * @todo Need to add protocol type parameter to this function.
349 */
350EAPI Ecore_Ipc_Server *
351ecore_ipc_server_add(Ecore_Ipc_Type compl_type, const char *name, int port, const void *data)
352{
353 Ecore_Ipc_Server *svr;
354 Ecore_Ipc_Type type;
355 Ecore_Con_Type extra = 0;
356
357 svr = calloc(1, sizeof(Ecore_Ipc_Server));
358 if (!svr) return NULL;
359 type = compl_type;
360 type &= ~ECORE_IPC_USE_SSL;
361 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
362 switch (type)
363 {
364 case ECORE_IPC_LOCAL_USER:
365 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_USER | extra, name, port, svr);
366 break;
367 case ECORE_IPC_LOCAL_SYSTEM:
368 svr->server = ecore_con_server_add(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
369 break;
370 case ECORE_IPC_REMOTE_SYSTEM:
371 svr->server = ecore_con_server_add(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
372 break;
373 default:
374 free(svr);
375 return NULL;
376 }
377 if (!svr->server)
378 {
379 free(svr);
380 return NULL;
381 }
382 svr->max_buf_size = 32 * 1024;
383 svr->data = (void *)data;
384 servers = eina_list_append(servers, svr);
385 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
386 return svr;
387}
388
389/**
390 * Creates an IPC server object to represent the IPC server listening
391 * on the given port.
392 *
393 * For more details about the @p compl_type, @p name and @p port
394 * parameters, see the @ref ecore_con_server_connect documentation.
395 *
396 * @param compl_type The IPC connection type.
397 * @param name Name used to determine which socket to use for the
398 * IPC connection.
399 * @param port Number used to identify the socket to use for the
400 * IPC connection.
401 * @param data Data to associate with the server.
402 * @return A new IPC server. @c NULL is returned on error.
403 * @ingroup Ecore_IPC_Server_Group
404 * @todo Need to add protocol type parameter.
405 */
406EAPI Ecore_Ipc_Server *
407ecore_ipc_server_connect(Ecore_Ipc_Type compl_type, char *name, int port, const void *data)
408{
409 Ecore_Ipc_Server *svr;
410 Ecore_Ipc_Type type;
411 Ecore_Con_Type extra = 0;
412
413 svr = calloc(1, sizeof(Ecore_Ipc_Server));
414 if (!svr) return NULL;
415 type = compl_type;
416 type &= ~ECORE_IPC_USE_SSL;
417 if (compl_type & ECORE_IPC_USE_SSL) extra = ECORE_CON_USE_SSL;
418 switch (type)
419 {
420 case ECORE_IPC_LOCAL_USER:
421 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, svr);
422 break;
423 case ECORE_IPC_LOCAL_SYSTEM:
424 svr->server = ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, svr);
425 break;
426 case ECORE_IPC_REMOTE_SYSTEM:
427 svr->server = ecore_con_server_connect(ECORE_CON_REMOTE_SYSTEM | extra, name, port, svr);
428 break;
429 default:
430 free(svr);
431 return NULL;
432 }
433 if (!svr->server)
434 {
435 free(svr);
436 return NULL;
437 }
438 svr->max_buf_size = -1;
439 svr->data = (void *)data;
440 servers = eina_list_append(servers, svr);
441 ECORE_MAGIC_SET(svr, ECORE_MAGIC_IPC_SERVER);
442 return svr;
443}
444
445/**
446 * Closes the connection and frees the given IPC server.
447 * @param svr The given IPC server.
448 * @return The data associated with the server when it was created.
449 * @ingroup Ecore_IPC_Server_Group
450 */
451EAPI void *
452ecore_ipc_server_del(Ecore_Ipc_Server *svr)
453{
454 void *data;
455
456 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
457 {
458 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
459 "ecore_ipc_server_del");
460 return NULL;
461 }
462 if (svr->delete_me) return NULL;
463
464 data = svr->data;
465 svr->data = NULL;
466 svr->delete_me = 1;
467 if (svr->event_count == 0)
468 {
469 Ecore_Ipc_Client *cl;
470
471 EINA_LIST_FREE(svr->clients, cl)
472 ecore_ipc_client_del(cl);
473 ecore_con_server_del(svr->server);
474 servers = eina_list_remove(servers, svr);
475
476 if (svr->buf) free(svr->buf);
477 ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE);
478 free(svr);
479 }
480 return data;
481}
482
483/**
484 * Retrieves the data associated with the given IPC server.
485 * @param svr The given IPC server.
486 * @return The associated data.
487 * @ingroup Ecore_IPC_Server_Group
488 */
489EAPI void *
490ecore_ipc_server_data_get(Ecore_Ipc_Server *svr)
491{
492 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
493 {
494 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
495 "ecore_ipc_server_data_get");
496 return NULL;
497 }
498 return svr->data;
499}
500
501/**
502 * Retrieves whether the given IPC server is currently connected.
503 * @param svr The given IPC server.
504 * @return #EINA_TRUE if the server is connected. #EINA_FALSE otherwise.
505 * @ingroup Ecore_IPC_Server_Group
506 */
507EAPI Eina_Bool
508ecore_ipc_server_connected_get(Ecore_Ipc_Server *svr)
509{
510 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
511 {
512 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
513 "ecore_ipc_server_connected_get");
514 return EINA_FALSE;
515 }
516 return ecore_con_server_connected_get(svr->server);
517}
518
519/**
520 * Retrieves the list of clients for this server.
521 * @param svr The given IPC server.
522 * @return An Eina_List with the clients.
523 * @ingroup Ecore_IPC_Server_Group
524 */
525EAPI Eina_List *
526ecore_ipc_server_clients_get(Ecore_Ipc_Server *svr)
527{
528 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
529 {
530 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
531 "ecore_ipc_server_clients_get");
532 return NULL;
533 }
534 return svr->client_list;
535}
536
537#define SVENC(_member) \
538 d = _ecore_ipc_dlt_int(msg._member, svr->prev.o._member, &md); \
539 if (md >= DLT_SET) \
540 { \
541 unsigned int v; \
542 unsigned char *dd; \
543 dd = (unsigned char *)&v; \
544 v = d; \
545 v = htonl(v); \
546 *(dat + s + 0) = dd[0]; \
547 *(dat + s + 1) = dd[1]; \
548 *(dat + s + 2) = dd[2]; \
549 *(dat + s + 3) = dd[3]; \
550 s += 4; \
551 } \
552 else if (md >= DLT_ADD16) \
553 { \
554 unsigned short v; \
555 unsigned char *dd; \
556 dd = (unsigned char *)&v; \
557 v = d; \
558 v = htons(v); \
559 *(dat + s + 0) = dd[0]; \
560 *(dat + s + 1) = dd[1]; \
561 s += 2; \
562 } \
563 else if (md >= DLT_ADD8) \
564 { \
565 *(dat + s + 0) = (unsigned char)d; \
566 s += 1; \
567 }
568
569/**
570 * Sends a message to the given IPC server.
571 *
572 * The content of the parameters, excluding the @p svr paramter, is up to
573 * the client.
574 *
575 * @param svr The given IPC server.
576 * @param major Major opcode of the message.
577 * @param minor Minor opcode of the message.
578 * @param ref Message reference number.
579 * @param ref_to Reference number of the message this message refers to.
580 * @param response Requires response.
581 * @param data The data to send as part of the message.
582 * @param size Length of the data, in bytes, to send.
583 * @return Number of bytes sent. @c 0 is returned if there is an error.
584 * @ingroup Ecore_IPC_Server_Group
585 * @todo This function needs to become an IPC message.
586 * @todo Fix up the documentation: Make sure what ref_to and response are.
587 */
588EAPI int
589ecore_ipc_server_send(Ecore_Ipc_Server *svr, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
590{
591 Ecore_Ipc_Msg_Head msg;
592 int ret;
593 int *head, md = 0, d, s;
594 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
595
596 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
597 {
598 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
599 "ecore_ipc_server_send");
600 return 0;
601 }
602 if (size < 0) size = 0;
603 msg.major = major;
604 msg.minor = minor;
605 msg.ref = ref;
606 msg.ref_to = ref_to;
607 msg.response = response;
608 msg.size = size;
609 head = (int *)dat;
610 s = 4;
611 SVENC(major);
612 *head = md;
613 SVENC(minor);
614 *head |= md << (4 * 1);
615 SVENC(ref);
616 *head |= md << (4 * 2);
617 SVENC(ref_to);
618 *head |= md << (4 * 3);
619 SVENC(response);
620 *head |= md << (4 * 4);
621 SVENC(size);
622 *head |= md << (4 * 5);
623 *head = htonl(*head);
624 svr->prev.o = msg;
625 ret = ecore_con_server_send(svr->server, dat, s);
626 if (size > 0) ret += ecore_con_server_send(svr->server, data, size);
627 return ret;
628}
629
630/**
631 * Sets a limit on the number of clients that can be handled concurrently
632 * by the given server, and a policy on what to do if excess clients try to
633 * connect.
634 * Beware that if you set this once ecore is already running, you may
635 * already have pending CLIENT_ADD events in your event queue. Those
636 * clients have already connected and will not be affected by this call.
637 * Only clients subsequently trying to connect will be affected.
638 * @param svr The given server.
639 * @param client_limit The maximum number of clients to handle
640 * concurrently. -1 means unlimited (default). 0
641 * effectively disables the server.
642 * @param reject_excess_clients Set to 1 to automatically disconnect
643 * excess clients as soon as they connect if you are
644 * already handling client_limit clients. Set to 0
645 * (default) to just hold off on the "accept()"
646 * system call until the number of active clients
647 * drops. This causes the kernel to queue up to 4096
648 * connections (or your kernel's limit, whichever is
649 * lower).
650 * @ingroup Ecore_Ipc_Server_Group
651 */
652EAPI void
653ecore_ipc_server_client_limit_set(Ecore_Ipc_Server *svr, int client_limit, char reject_excess_clients)
654{
655 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
656 {
657 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
658 "ecore_ipc_server_client_limit_set");
659 return;
660 }
661 ecore_con_server_client_limit_set(svr->server, client_limit, reject_excess_clients);
662}
663
664/**
665 * Sets the max data payload size for an Ipc message in bytes
666 *
667 * @param svr The given server.
668 * @param size The maximum data payload size in bytes.
669 * @ingroup Ecore_Ipc_Server_Group
670 */
671EAPI void
672ecore_ipc_server_data_size_max_set(Ecore_Ipc_Server *svr, int size)
673{
674 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
675 {
676 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
677 "ecore_ipc_server_data_size_max_set");
678 return;
679 }
680 svr->max_buf_size = size;
681}
682
683/**
684 * Gets the max data payload size for an Ipc message in bytes
685 *
686 * @param svr The given server.
687 * @return The maximum data payload in bytes.
688 * @ingroup Ecore_Ipc_Server_Group
689 */
690EAPI int
691ecore_ipc_server_data_size_max_get(Ecore_Ipc_Server *svr)
692{
693 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
694 {
695 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
696 "ecore_ipc_server_data_size_max_get");
697 return -1;
698 }
699 return svr->max_buf_size;
700}
701
702/**
703 * Gets the IP address of a server that has been connected to.
704 *
705 * @param svr The given server.
706 * @return A pointer to an internal string that contains the IP address of
707 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
708 * This string should not be modified or trusted to stay valid after
709 * deletion for the @p svr object. If no IP is known NULL is returned.
710 * @ingroup Ecore_Ipc_Server_Group
711 */
712EAPI const char *
713ecore_ipc_server_ip_get(Ecore_Ipc_Server *svr)
714{
715 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
716 {
717 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
718 "ecore_ipc_server_ip_get");
719 return NULL;
720 }
721 return ecore_con_server_ip_get(svr->server);
722}
723
724/**
725 * Flushes all pending data to the given server. Will return when done.
726 *
727 * @param svr The given server.
728 * @ingroup Ecore_Ipc_Server_Group
729 */
730EAPI void
731ecore_ipc_server_flush(Ecore_Ipc_Server *svr)
732{
733 if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_IPC_SERVER))
734 {
735 ECORE_MAGIC_FAIL(svr, ECORE_MAGIC_IPC_SERVER,
736 "ecore_ipc_server_server_flush");
737 return;
738 }
739 ecore_con_server_flush(svr->server);
740}
741
742#define CLENC(_member) \
743 d = _ecore_ipc_dlt_int(msg._member, cl->prev.o._member, &md); \
744 if (md >= DLT_SET) \
745 { \
746 unsigned int v; \
747 unsigned char *dd; \
748 dd = (unsigned char *)&v; \
749 v = d; \
750 v = htonl(v); \
751 *(dat + s + 0) = dd[0]; \
752 *(dat + s + 1) = dd[1]; \
753 *(dat + s + 2) = dd[2]; \
754 *(dat + s + 3) = dd[3]; \
755 s += 4; \
756 } \
757 else if (md >= DLT_ADD16) \
758 { \
759 unsigned short v; \
760 unsigned char *dd; \
761 dd = (unsigned char *)&v; \
762 v = d; \
763 v = htons(v); \
764 *(dat + s + 0) = dd[0]; \
765 *(dat + s + 1) = dd[1]; \
766 s += 2; \
767 } \
768 else if (md >= DLT_ADD8) \
769 { \
770 *(dat + s) = (unsigned char)d; \
771 s += 1; \
772 }
773
774/**
775 * @defgroup Ecore_IPC_Client_Group IPC Client Functions
776 *
777 * Functions that deal with IPC client objects.
778 */
779
780/**
781 * Sends a message to the given IPC client.
782 * @param cl The given IPC client.
783 * @param major Major opcode of the message.
784 * @param minor Minor opcode of the message.
785 * @param ref Reference number of the message.
786 * @param ref_to Reference number of the message this message refers to.
787 * @param response Requires response.
788 * @param data The data to send as part of the message.
789 * @param size Length of the data, in bytes, to send.
790 * @return The number of bytes sent. @c 0 will be returned if there is
791 * an error.
792 * @ingroup Ecore_IPC_Client_Group
793 * @todo This function needs to become an IPC message.
794 * @todo Make sure ref_to and response parameters are described correctly.
795 */
796EAPI int
797ecore_ipc_client_send(Ecore_Ipc_Client *cl, int major, int minor, int ref, int ref_to, int response, const void *data, int size)
798{
799 Ecore_Ipc_Msg_Head msg;
800 int ret;
801 int *head, md = 0, d, s;
802 unsigned char dat[sizeof(Ecore_Ipc_Msg_Head)];
803
804 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
805 {
806 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
807 "ecore_ipc_client_send");
808 return 0;
809 }
810 if (size < 0) size = 0;
811 msg.major = major;
812 msg.minor = minor;
813 msg.ref = ref;
814 msg.ref_to = ref_to;
815 msg.response = response;
816 msg.size = size;
817 head = (int *)dat;
818 s = 4;
819 CLENC(major);
820 *head = md;
821 CLENC(minor);
822 *head |= md << (4 * 1);
823 CLENC(ref);
824 *head |= md << (4 * 2);
825 CLENC(ref_to);
826 *head |= md << (4 * 3);
827 CLENC(response);
828 *head |= md << (4 * 4);
829 CLENC(size);
830 *head |= md << (4 * 5);
831 *head = htonl(*head);
832 cl->prev.o = msg;
833 ret = ecore_con_client_send(cl->client, dat, s);
834 if (size > 0) ret += ecore_con_client_send(cl->client, data, size);
835 return ret;
836}
837
838/**
839 * Retrieves the IPC server that the given IPC client is connected to.
840 * @param cl The given IPC client.
841 * @return The IPC server the IPC client is connected to.
842 * @ingroup Ecore_IPC_Client_Group
843 */
844EAPI Ecore_Ipc_Server *
845ecore_ipc_client_server_get(Ecore_Ipc_Client *cl)
846{
847 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
848 {
849 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
850 "ecore_ipc_client_server_get");
851 return NULL;
852 }
853 return (ecore_con_server_data_get(ecore_con_client_server_get(cl->client)));
854}
855
856/**
857 * Closes the connection and frees memory allocated to the given IPC
858 * client.
859 * @param cl The given client.
860 * @return Data associated with the client.
861 * @ingroup Ecore_IPC_Client_Group
862 */
863EAPI void *
864ecore_ipc_client_del(Ecore_Ipc_Client *cl)
865{
866 void *data;
867 Ecore_Ipc_Server *svr;
868
869 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
870 {
871 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
872 "ecore_ipc_client_del");
873 return NULL;
874 }
875 data = cl->data;
876 cl->data = NULL;
877 cl->delete_me = 1;
878 if (cl->event_count == 0)
879 {
880 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
881 ecore_con_client_del(cl->client);
882 svr->clients = eina_list_remove(svr->clients, cl);
883 if (cl->buf) free(cl->buf);
884 ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE);
885 free(cl);
886 }
887 return data;
888}
889
890/**
891 * Sets the IPC data associated with the given IPC client to @p data.
892 * @param cl The given IPC client.
893 * @param data The data to associate with the IPC client.
894 * @ingroup Ecore_IPC_Client_Group
895 */
896EAPI void
897ecore_ipc_client_data_set(Ecore_Ipc_Client *cl, const void *data)
898{
899 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
900 {
901 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
902 "ecore_ipc_client_data_set");
903 return;
904 }
905 cl->data = (void *)data;
906}
907
908/**
909 * Retrieves the data that has been associated with the given IPC client.
910 * @param cl The given client.
911 * @return The data associated with the IPC client.
912 * @ingroup Ecore_IPC_Client_Group
913 */
914EAPI void *
915ecore_ipc_client_data_get(Ecore_Ipc_Client *cl)
916{
917 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
918 {
919 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
920 "ecore_ipc_client_data_get");
921 return NULL;
922 }
923 return cl->data;
924}
925
926/**
927 * Sets the max data payload size for an Ipc message in bytes
928 *
929 * @param client The given client.
930 * @param size The maximum data payload size in bytes.
931 * @ingroup Ecore_Ipc_Client_Group
932 */
933EAPI void
934ecore_ipc_client_data_size_max_set(Ecore_Ipc_Client *cl, int size)
935{
936 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
937 {
938 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
939 "ecore_ipc_client_data_size_max_set");
940 return;
941 }
942 cl->max_buf_size = size;
943}
944
945/**
946 * Sets the max data payload size for an Ipc message in bytes
947 *
948 * @param cl The given client.
949 * @param size The maximum data payload size in bytes.
950 * @ingroup Ecore_Ipc_Client_Group
951 */
952EAPI int
953ecore_ipc_client_data_size_max_get(Ecore_Ipc_Client *cl)
954{
955 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
956 {
957 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
958 "ecore_ipc_client_data_size_max_get");
959 return -1;
960 }
961 return cl->max_buf_size;
962}
963
964/**
965 * Gets the IP address of a client that has been connected to.
966 *
967 * @param cl The given client.
968 * @return A pointer to an internal string that contains the IP address of
969 * the connected server in the form "XXX.YYY.ZZZ.AAA" IP notation.
970 * This string should not be modified or trusted to stay valid after
971 * deletion for the @p cl object. If no IP is known NULL is returned.
972 * @ingroup Ecore_Ipc_Client_Group
973 */
974EAPI const char *
975ecore_ipc_client_ip_get(Ecore_Ipc_Client *cl)
976{
977 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
978 {
979 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
980 "ecore_ipc_client_ip_get");
981 return NULL;
982 }
983 return ecore_con_client_ip_get(cl->client);
984}
985
986/**
987 * Flushes all pending data to the given client. Will return when done.
988 *
989 * @param cl The given client.
990 * @ingroup Ecore_Ipc_Client_Group
991 */
992EAPI void
993ecore_ipc_client_flush(Ecore_Ipc_Client *cl)
994{
995 if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_IPC_CLIENT))
996 {
997 ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_IPC_CLIENT,
998 "ecore_ipc_client_flush");
999 return;
1000 }
1001 ecore_con_client_flush(cl->client);
1002}
1003
1004/**
1005 * Returns if SSL support is available
1006 * @return 1 if SSL is available, 0 if it is not.
1007 * @ingroup Ecore_Con_Client_Group
1008 */
1009EAPI int
1010ecore_ipc_ssl_available_get(void)
1011{
1012 return ecore_con_ssl_available_get();
1013}
1014
1015
1016static Eina_Bool
1017_ecore_ipc_event_client_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1018{
1019 Ecore_Con_Event_Client_Add *e;
1020
1021 e = ev;
1022 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1023 /* handling code here */
1024 {
1025 Ecore_Ipc_Client *cl;
1026 Ecore_Ipc_Server *svr;
1027
1028 cl = calloc(1, sizeof(Ecore_Ipc_Client));
1029 if (!cl) return ECORE_CALLBACK_CANCEL;
1030 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1031 ECORE_MAGIC_SET(cl, ECORE_MAGIC_IPC_CLIENT);
1032 cl->client = e->client;
1033 cl->max_buf_size = 32 * 1024;
1034 ecore_con_client_data_set(cl->client, (void *)cl);
1035 svr->clients = eina_list_append(svr->clients, cl);
1036 svr->client_list = eina_list_append(svr->client_list, cl);
1037 if (!cl->delete_me)
1038 {
1039 Ecore_Ipc_Event_Client_Add *e2;
1040
1041 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Add));
1042 if (e2)
1043 {
1044 cl->event_count++;
1045 e2->client = cl;
1046 ecore_event_add(ECORE_IPC_EVENT_CLIENT_ADD, e2,
1047 _ecore_ipc_event_client_add_free, NULL);
1048 }
1049 }
1050 }
1051 return ECORE_CALLBACK_CANCEL;
1052}
1053
1054static Eina_Bool
1055_ecore_ipc_event_client_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1056{
1057 Ecore_Con_Event_Client_Del *e;
1058
1059 e = ev;
1060 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1061 /* handling code here */
1062 {
1063 Ecore_Ipc_Client *cl;
1064
1065 cl = ecore_con_client_data_get(e->client);
1066 {
1067 Ecore_Ipc_Event_Client_Del *e2;
1068 Ecore_Ipc_Server *svr;
1069
1070 svr = ecore_con_server_data_get(ecore_con_client_server_get(e->client));
1071 svr->client_list = eina_list_remove(svr->client_list, cl);
1072 if (!cl->delete_me)
1073 {
1074 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Del));
1075 if (e2)
1076 {
1077 cl->event_count++;
1078 e2->client = cl;
1079 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DEL, e2,
1080 _ecore_ipc_event_client_del_free, NULL);
1081 }
1082 }
1083 }
1084 }
1085 return ECORE_CALLBACK_CANCEL;
1086}
1087
1088static Eina_Bool
1089_ecore_ipc_event_server_add(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1090{
1091 Ecore_Con_Event_Server_Add *e;
1092
1093 e = ev;
1094 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1095 /* handling code here */
1096 {
1097 Ecore_Ipc_Server *svr;
1098
1099 svr = ecore_con_server_data_get(e->server);
1100 if (!svr->delete_me)
1101 {
1102 Ecore_Ipc_Event_Server_Add *e2;
1103
1104 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Add));
1105 if (e2)
1106 {
1107 svr->event_count++;
1108 e2->server = svr;
1109 ecore_event_add(ECORE_IPC_EVENT_SERVER_ADD, e2,
1110 _ecore_ipc_event_server_add_free, NULL);
1111 }
1112 }
1113 }
1114 return ECORE_CALLBACK_CANCEL;
1115}
1116
1117static Eina_Bool
1118_ecore_ipc_event_server_del(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1119{
1120 Ecore_Con_Event_Server_Del *e;
1121
1122 e = ev;
1123 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1124 /* handling code here */
1125 {
1126 Ecore_Ipc_Server *svr;
1127
1128 svr = ecore_con_server_data_get(e->server);
1129 if (!svr->delete_me)
1130 {
1131 Ecore_Ipc_Event_Server_Del *e2;
1132
1133 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Del));
1134 if (e2)
1135 {
1136 svr->event_count++;
1137 e2->server = svr;
1138 ecore_event_add(ECORE_IPC_EVENT_SERVER_DEL, e2,
1139 _ecore_ipc_event_server_del_free, NULL);
1140 }
1141 }
1142 }
1143 return ECORE_CALLBACK_CANCEL;
1144}
1145
1146#define CLSZ(_n) \
1147 md = ((head >> (4 * _n)) & 0xf); \
1148 if (md >= DLT_SET) s += 4; \
1149 else if (md >= DLT_ADD16) s += 2; \
1150 else if (md >= DLT_ADD8) s += 1;
1151
1152#define CLDEC(_n, _member) \
1153 md = ((head >> (4 * _n)) & 0xf); \
1154 if (md >= DLT_SET) \
1155 { \
1156 unsigned int v; \
1157 unsigned char *dv; \
1158 dv = (unsigned char *)&v; \
1159 dv[0] = *(cl->buf + offset + s + 0); \
1160 dv[1] = *(cl->buf + offset + s + 1); \
1161 dv[2] = *(cl->buf + offset + s + 2); \
1162 dv[3] = *(cl->buf + offset + s + 3); \
1163 d = (int)ntohl(v); \
1164 s += 4; \
1165 } \
1166 else if (md >= DLT_ADD16) \
1167 { \
1168 unsigned short v; \
1169 unsigned char *dv; \
1170 dv = (unsigned char *)&v; \
1171 dv[0] = *(cl->buf + offset + s + 0); \
1172 dv[1] = *(cl->buf + offset + s + 1); \
1173 d = (int)ntohs(v); \
1174 s += 2; \
1175 } \
1176 else if (md >= DLT_ADD8) \
1177 { \
1178 unsigned char v; \
1179 unsigned char *dv; \
1180 dv = (unsigned char *)&v; \
1181 dv[0] = *(cl->buf + offset + s + 0); \
1182 d = (int)v; \
1183 s += 1; \
1184 } \
1185 msg._member = _ecore_ipc_ddlt_int(d, cl->prev.i._member, md);
1186
1187static Eina_Bool
1188_ecore_ipc_event_client_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1189{
1190 Ecore_Con_Event_Client_Data *e;
1191
1192 e = ev;
1193 if (!eina_list_data_find(servers, ecore_con_server_data_get(ecore_con_client_server_get(e->client)))) return ECORE_CALLBACK_RENEW;
1194 /* handling code here */
1195 {
1196 Ecore_Ipc_Client *cl;
1197 Ecore_Ipc_Msg_Head msg;
1198 int offset = 0;
1199 unsigned char *buf;
1200
1201 cl = ecore_con_client_data_get(e->client);
1202
1203 if (!cl->buf)
1204 {
1205 cl->buf_size = e->size;
1206 cl->buf = e->data;
1207 e->data = NULL; /* take it out of the old event */
1208 }
1209 else
1210 {
1211 buf = realloc(cl->buf, cl->buf_size + e->size);
1212 if (!buf)
1213 {
1214 free(cl->buf);
1215 cl->buf = 0;
1216 cl->buf_size = 0;
1217 return ECORE_CALLBACK_CANCEL;
1218 }
1219 cl->buf = buf;
1220 memcpy(cl->buf + cl->buf_size, e->data, e->size);
1221 cl->buf_size += e->size;
1222 }
1223 /* examine header */
1224 redo:
1225 if ((cl->buf_size - offset) >= (int)sizeof(int))
1226 {
1227 int s, md, d = 0, head;
1228 unsigned char *dd;
1229
1230 dd = (unsigned char *)&head;
1231 dd[0] = *(cl->buf + offset + 0);
1232 dd[1] = *(cl->buf + offset + 1);
1233 dd[2] = *(cl->buf + offset + 2);
1234 dd[3] = *(cl->buf + offset + 3);
1235 head = ntohl(head);
1236 dd = (unsigned char *)&d;
1237 s = 4;
1238 CLSZ(0);
1239 CLSZ(1);
1240 CLSZ(2);
1241 CLSZ(3);
1242 CLSZ(4);
1243 CLSZ(5);
1244 if ((cl->buf_size - offset) < s)
1245 {
1246 if (offset > 0) goto scroll;
1247 return ECORE_CALLBACK_CANCEL;
1248 }
1249
1250 s = 4;
1251 CLDEC(0, major);
1252 CLDEC(1, minor);
1253 CLDEC(2, ref);
1254 CLDEC(3, ref_to);
1255 CLDEC(4, response);
1256 CLDEC(5, size);
1257 if (msg.size < 0) msg.size = 0;
1258 /* there is enough data in the buffer for a full message */
1259 if ((cl->buf_size - offset) >= (s + msg.size))
1260 {
1261 Ecore_Ipc_Event_Client_Data *e2;
1262 Ecore_Ipc_Server *svr;
1263 int max, max2;
1264
1265 buf = NULL;
1266 svr = ecore_con_server_data_get(ecore_con_client_server_get(cl->client));
1267 max = svr->max_buf_size;
1268 max2 = cl->max_buf_size;
1269 if ((max >= 0) && (max2 >= 0))
1270 {
1271 if (max2 < max) max = max2;
1272 }
1273 else
1274 {
1275 if (max < 0) max = max2;
1276 }
1277 if ((max < 0) || (msg.size <= max))
1278 {
1279 if (msg.size > 0)
1280 {
1281 buf = malloc(msg.size);
1282 if (!buf) return ECORE_CALLBACK_CANCEL;
1283 memcpy(buf, cl->buf + offset + s, msg.size);
1284 }
1285 if (!cl->delete_me)
1286 {
1287 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Client_Data));
1288 if (e2)
1289 {
1290 cl->event_count++;
1291 e2->client = cl;
1292 e2->major = msg.major;
1293 e2->minor = msg.minor;
1294 e2->ref = msg.ref;
1295 e2->ref_to = msg.ref_to;
1296 e2->response = msg.response;
1297 e2->size = msg.size;
1298 e2->data = buf;
1299 ecore_event_add(ECORE_IPC_EVENT_CLIENT_DATA, e2,
1300 _ecore_ipc_event_client_data_free,
1301 NULL);
1302 }
1303 }
1304 }
1305 cl->prev.i = msg;
1306 offset += (s + msg.size);
1307 if (cl->buf_size == offset)
1308 {
1309 free(cl->buf);
1310 cl->buf = NULL;
1311 cl->buf_size = 0;
1312 return ECORE_CALLBACK_CANCEL;
1313 }
1314 goto redo;
1315 }
1316 else goto scroll;
1317 }
1318 else
1319 {
1320 scroll:
1321 buf = malloc(cl->buf_size - offset);
1322 if (!buf)
1323 {
1324 free(cl->buf);
1325 cl->buf = NULL;
1326 cl->buf_size = 0;
1327 return ECORE_CALLBACK_CANCEL;
1328 }
1329 memcpy(buf, cl->buf + offset, cl->buf_size - offset);
1330 free(cl->buf);
1331 cl->buf = buf;
1332 cl->buf_size -= offset;
1333 }
1334 }
1335 return ECORE_CALLBACK_CANCEL;
1336}
1337
1338#define SVSZ(_n) \
1339 md = ((head >> (4 * _n)) & 0xf); \
1340 if (md >= DLT_SET) s += 4; \
1341 else if (md >= DLT_ADD16) s += 2; \
1342 else if (md >= DLT_ADD8) s += 1;
1343
1344#define SVDEC(_n, _member) \
1345 md = ((head >> (4 * _n)) & 0xf); \
1346 if (md >= DLT_SET) \
1347 { \
1348 unsigned int v; \
1349 unsigned char *dv; \
1350 dv = (unsigned char *)&v; \
1351 dv[0] = *(svr->buf + offset + s + 0); \
1352 dv[1] = *(svr->buf + offset + s + 1); \
1353 dv[2] = *(svr->buf + offset + s + 2); \
1354 dv[3] = *(svr->buf + offset + s + 3); \
1355 d = (int)ntohl(v); \
1356 s += 4; \
1357 } \
1358 else if (md >= DLT_ADD16) \
1359 { \
1360 unsigned short v; \
1361 unsigned char *dv; \
1362 dv = (unsigned char *)&v; \
1363 dv[0] = *(svr->buf + offset + s + 0); \
1364 dv[1] = *(svr->buf + offset + s + 1); \
1365 d = (int)ntohs(v); \
1366 s += 2; \
1367 } \
1368 else if (md >= DLT_ADD8) \
1369 { \
1370 unsigned char v; \
1371 unsigned char *dv; \
1372 dv = (unsigned char *)&v; \
1373 dv[0] = *(svr->buf + offset + s + 0); \
1374 d = (int)v; \
1375 s += 1; \
1376 } \
1377 msg._member = _ecore_ipc_ddlt_int(d, svr->prev.i._member, md);
1378
1379static Eina_Bool
1380_ecore_ipc_event_server_data(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
1381{
1382 Ecore_Con_Event_Server_Data *e;
1383
1384 e = ev;
1385 if (!eina_list_data_find(servers, ecore_con_server_data_get(e->server))) return ECORE_CALLBACK_RENEW;
1386 /* handling code here */
1387 {
1388 Ecore_Ipc_Server *svr;
1389 Ecore_Ipc_Msg_Head msg;
1390 int offset = 0;
1391 unsigned char *buf;
1392
1393 svr = ecore_con_server_data_get(e->server);
1394
1395 if (!svr->buf)
1396 {
1397 svr->buf_size = e->size;
1398 svr->buf = e->data;
1399 e->data = NULL; /* take it out of the old event */
1400 }
1401 else
1402 {
1403 buf = realloc(svr->buf, svr->buf_size + e->size);
1404 if (!buf)
1405 {
1406 free(svr->buf);
1407 svr->buf = 0;
1408 svr->buf_size = 0;
1409 return ECORE_CALLBACK_CANCEL;
1410 }
1411 svr->buf = buf;
1412 memcpy(svr->buf + svr->buf_size, e->data, e->size);
1413 svr->buf_size += e->size;
1414 }
1415 /* examine header */
1416 redo:
1417 if ((svr->buf_size - offset) >= (int)sizeof(int))
1418 {
1419 int s, md, d = 0, head;
1420 unsigned char *dd;
1421
1422 dd = (unsigned char *)&head;
1423 dd[0] = *(svr->buf + offset + 0);
1424 dd[1] = *(svr->buf + offset + 1);
1425 dd[2] = *(svr->buf + offset + 2);
1426 dd[3] = *(svr->buf + offset + 3);
1427 head = ntohl(head);
1428 dd = (unsigned char *)&d;
1429 s = 4;
1430 SVSZ(0);
1431 SVSZ(1);
1432 SVSZ(2);
1433 SVSZ(3);
1434 SVSZ(4);
1435 SVSZ(5);
1436 if ((svr->buf_size - offset) < s)
1437 {
1438 if (offset > 0) goto scroll;
1439 return ECORE_CALLBACK_CANCEL;
1440 }
1441
1442 s = 4;
1443 SVDEC(0, major);
1444 SVDEC(1, minor);
1445 SVDEC(2, ref);
1446 SVDEC(3, ref_to);
1447 SVDEC(4, response);
1448 SVDEC(5, size);
1449 if (msg.size < 0) msg.size = 0;
1450 /* there is enough data in the buffer for a full message */
1451 if ((svr->buf_size - offset) >= (s + msg.size))
1452 {
1453 Ecore_Ipc_Event_Server_Data *e2;
1454 int max;
1455
1456 buf = NULL;
1457 max = svr->max_buf_size;
1458 if ((max < 0) || (msg.size <= max))
1459 {
1460 if (msg.size > 0)
1461 {
1462 buf = malloc(msg.size);
1463 if (!buf) return ECORE_CALLBACK_CANCEL;
1464 memcpy(buf, svr->buf + offset + s, msg.size);
1465 }
1466 if (!svr->delete_me)
1467 {
1468 e2 = calloc(1, sizeof(Ecore_Ipc_Event_Server_Data));
1469 if (e2)
1470 {
1471 svr->event_count++;
1472 e2->server = svr;
1473 e2->major = msg.major;
1474 e2->minor = msg.minor;
1475 e2->ref = msg.ref;
1476 e2->ref_to = msg.ref_to;
1477 e2->response = msg.response;
1478 e2->size = msg.size;
1479 e2->data = buf;
1480 ecore_event_add(ECORE_IPC_EVENT_SERVER_DATA, e2,
1481 _ecore_ipc_event_server_data_free,
1482 NULL);
1483 }
1484 }
1485 }
1486 svr->prev.i = msg;
1487 offset += (s + msg.size);
1488 if (svr->buf_size == offset)
1489 {
1490 free(svr->buf);
1491 svr->buf = NULL;
1492 svr->buf_size = 0;
1493 return ECORE_CALLBACK_CANCEL;
1494 }
1495 goto redo;
1496 }
1497 else goto scroll;
1498 }
1499 else
1500 {
1501 scroll:
1502 buf = malloc(svr->buf_size - offset);
1503 if (!buf)
1504 {
1505 free(svr->buf);
1506 svr->buf = NULL;
1507 svr->buf_size = 0;
1508 return ECORE_CALLBACK_CANCEL;
1509 }
1510 memcpy(buf, svr->buf + offset, svr->buf_size - offset);
1511 free(svr->buf);
1512 svr->buf = buf;
1513 svr->buf_size -= offset;
1514 }
1515 }
1516 return ECORE_CALLBACK_CANCEL;
1517}
1518
1519static void
1520_ecore_ipc_event_client_add_free(void *data __UNUSED__, void *ev)
1521{
1522 Ecore_Ipc_Event_Client_Add *e;
1523
1524 e = ev;
1525 e->client->event_count--;
1526 if ((e->client->event_count == 0) && (e->client->delete_me))
1527 ecore_ipc_client_del(e->client);
1528 free(e);
1529}
1530
1531static void
1532_ecore_ipc_event_client_del_free(void *data __UNUSED__, void *ev)
1533{
1534 Ecore_Ipc_Event_Client_Del *e;
1535
1536 e = ev;
1537 e->client->event_count--;
1538 if ((e->client->event_count == 0) && (e->client->delete_me))
1539 ecore_ipc_client_del(e->client);
1540 free(e);
1541}
1542
1543static void
1544_ecore_ipc_event_client_data_free(void *data __UNUSED__, void *ev)
1545{
1546 Ecore_Ipc_Event_Client_Data *e;
1547
1548 e = ev;
1549 e->client->event_count--;
1550 if (e->data) free(e->data);
1551 if ((e->client->event_count == 0) && (e->client->delete_me))
1552 ecore_ipc_client_del(e->client);
1553 free(e);
1554}
1555
1556static void
1557_ecore_ipc_event_server_add_free(void *data __UNUSED__, void *ev)
1558{
1559 Ecore_Ipc_Event_Server_Add *e;
1560
1561 e = ev;
1562 e->server->event_count--;
1563 if ((e->server->event_count == 0) && (e->server->delete_me))
1564 ecore_ipc_server_del(e->server);
1565 free(e);
1566}
1567
1568static void
1569_ecore_ipc_event_server_del_free(void *data __UNUSED__, void *ev)
1570{
1571 Ecore_Ipc_Event_Server_Add *e;
1572
1573 e = ev;
1574 e->server->event_count--;
1575 if ((e->server->event_count == 0) && (e->server->delete_me))
1576 ecore_ipc_server_del(e->server);
1577 free(e);
1578}
1579
1580static void
1581_ecore_ipc_event_server_data_free(void *data __UNUSED__, void *ev)
1582{
1583 Ecore_Ipc_Event_Server_Data *e;
1584
1585 e = ev;
1586 if (e->data) free(e->data);
1587 e->server->event_count--;
1588 if ((e->server->event_count == 0) && (e->server->delete_me))
1589 ecore_ipc_server_del(e->server);
1590 free(e);
1591}
diff --git a/libraries/ecore/src/lib/ecore_ipc/ecore_ipc_private.h b/libraries/ecore/src/lib/ecore_ipc/ecore_ipc_private.h
new file mode 100644
index 0000000..57f7849
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_ipc/ecore_ipc_private.h
@@ -0,0 +1,104 @@
1#ifndef _ECORE_IPC_PRIVATE_H
2#define _ECORE_IPC_PRIVATE_H
3
4
5extern int _ecore_ipc_log_dom;
6
7#ifdef ECORE_IPC_DEFAULT_LOG_COLOR
8# undef ECORE_IPC_DEFAULT_LOG_COLOR
9#endif
10#define ECORE_IPC_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
11
12#ifdef ERR
13# undef ERR
14#endif
15#define ERR(...) EINA_LOG_DOM_ERR(_ecore_ipc_log_dom, __VA_ARGS__)
16
17#ifdef DBG
18# undef DBG
19#endif
20#define DBG(...) EINA_LOG_DOM_DBG(_ecore_ipc_log_dom, __VA_ARGS__)
21
22#ifdef INF
23# undef INF
24#endif
25#define INF(...) EINA_LOG_DOM_INFO(_ecore_ipc_log_dom, __VA_ARGS__)
26
27#ifdef WRN
28# undef WRN
29#endif
30#define WRN(...) EINA_LOG_DOM_WARN(_ecore_ipc_log_dom, __VA_ARGS__)
31
32#ifdef CRIT
33# undef CRIT
34#endif
35#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_ipc_log_dom, __VA_ARGS__)
36
37#define ECORE_MAGIC_IPC_SERVER 0x87786556
38#define ECORE_MAGIC_IPC_CLIENT 0x78875665
39
40typedef struct _Ecore_Ipc_Msg_Head Ecore_Ipc_Msg_Head;
41
42
43#if defined (_MSC_VER) || (defined (__SUNPRO_C) && __SUNPRO_C < 0x5100)
44# pragma pack(1)
45# define ECORE_IPC_STRUCT_PACKED
46#elif defined (__GNUC__) || (defined (__SUNPRO_C) && __SUNPRO_C >= 0x5100)
47# define ECORE_IPC_STRUCT_PACKED __attribute__((packed))
48#else
49# define ECORE_IPC_STRUCT_PACKED
50#endif
51
52#ifdef __sgi
53#pragma pack 4
54#endif
55struct _Ecore_Ipc_Msg_Head
56{
57 int major;
58 int minor;
59 int ref;
60 int ref_to;
61 int response;
62 int size;
63} ECORE_IPC_STRUCT_PACKED;
64#ifdef __sgi
65#pragma pack 0
66#endif
67
68struct _Ecore_Ipc_Client
69{
70 ECORE_MAGIC;
71 Ecore_Con_Client *client;
72 void *data;
73 unsigned char *buf;
74 int buf_size;
75 int max_buf_size;
76
77 struct {
78 Ecore_Ipc_Msg_Head i, o;
79 } prev;
80
81 int event_count;
82 char delete_me : 1;
83};
84
85struct _Ecore_Ipc_Server
86{
87 ECORE_MAGIC;
88 Ecore_Con_Server *server;
89 Eina_List *clients;
90 Eina_List *client_list;
91 void *data;
92 unsigned char *buf;
93 int buf_size;
94 int max_buf_size;
95
96 struct {
97 Ecore_Ipc_Msg_Head i, o;
98 } prev;
99
100 int event_count;
101 char delete_me : 1;
102};
103
104#endif
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght.h b/libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght.h
new file mode 100644
index 0000000..39331f7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght.h
@@ -0,0 +1,124 @@
1#ifndef _ECORE_PSL1GHT_H
2#define _ECORE_PSL1GHT_H
3
4#ifdef EAPI
5# undef EAPI
6#endif
7
8#ifdef __GNUC__
9# if __GNUC__ >= 4
10# define EAPI __attribute__ ((visibility("default")))
11# else
12# define EAPI
13# endif
14#else
15# define EAPI
16#endif
17
18/**
19 * @file
20 * @brief Ecore PSL1GHT system functions.
21 */
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
27EAPI extern int ECORE_PSL1GHT_EVENT_KEY_MODIFIERS;
28EAPI extern int ECORE_PSL1GHT_EVENT_GOT_FOCUS;
29EAPI extern int ECORE_PSL1GHT_EVENT_LOST_FOCUS;
30EAPI extern int ECORE_PSL1GHT_EVENT_EXPOSE;
31
32typedef struct _Ecore_Psl1ght_Event_Key_Modifiers Ecore_Psl1ght_Event_Key_Modifiers;
33struct _Ecore_Psl1ght_Event_Key_Modifiers /** PSL1GHT Key Modifier event */
34{
35 unsigned int timestamp;
36 unsigned int modifiers;
37 int shift_changed : 1;
38 int shift : 1;
39 int alt_changed : 1;
40 int alt : 1;
41 int ctrl_changed : 1;
42 int ctrl : 1;
43 int win_changed : 1;
44 int win : 1;
45 int num_lock_changed : 1;
46 int num_lock : 1;
47 int caps_lock_changed : 1;
48 int caps_lock : 1;
49 int scroll_lock_changed : 1;
50 int scroll_lock : 1;
51};
52
53typedef struct _Ecore_Psl1ght_Event_Key_Down Ecore_Psl1ght_Event_Key_Down;
54struct _Ecore_Psl1ght_Event_Key_Down /** PSL1GHT Key Down event */
55{
56 const char *keyname; /**< The name of the key that was pressed */
57 const char *keycompose; /**< The UTF-8 string conversion if any */
58 unsigned int time;
59};
60
61typedef struct _Ecore_Psl1ght_Event_Key_Up Ecore_Psl1ght_Event_Key_Up;
62struct _Ecore_Psl1ght_Event_Key_Up /** PSL1GHT Key Up event */
63{
64 const char *keyname; /**< The name of the key that was released */
65 const char *keycompose; /**< The UTF-8 string conversion if any */
66 unsigned int time;
67};
68
69typedef struct _Ecore_Psl1ght_Event_Mouse_Button_Down Ecore_Psl1ght_Event_Mouse_Button_Down;
70struct _Ecore_Psl1ght_Event_Mouse_Button_Down /** PSL1GHT Mouse Down event */
71{
72 int button; /**< Mouse button that was pressed (1 - 32) */
73 int x; /**< Mouse co-ordinates when mouse button was pressed */
74 int y; /**< Mouse co-ordinates when mouse button was pressed */
75 int double_click : 1; /**< Set if click was a double click */
76 int triple_click : 1; /**< Set if click was a triple click */
77 unsigned int time;
78};
79
80typedef struct _Ecore_Psl1ght_Event_Mouse_Button_Up Ecore_Psl1ght_Event_Mouse_Button_Up;
81struct _Ecore_Psl1ght_Event_Mouse_Button_Up /** PSL1GHT Mouse Up event */
82{
83 int button; /**< Mouse button that was released (1 - 32) */
84 int x; /**< Mouse co-ordinates when mouse button was raised */
85 int y; /**< Mouse co-ordinates when mouse button was raised */
86 int double_click : 1; /**< Set if click was a double click */
87 int triple_click : 1; /**< Set if click was a triple click */
88 unsigned int time;
89};
90
91typedef struct _Ecore_Psl1ght_Event_Mouse_Move Ecore_Psl1ght_Event_Mouse_Move;
92struct _Ecore_Psl1ght_Event_Mouse_Move /** PSL1GHT Mouse Move event */
93{
94 int x; /**< Mouse co-ordinates where the mouse cursor moved to */
95 int y; /**< Mouse co-ordinates where the mouse cursor moved to */
96 unsigned int time;
97};
98
99typedef struct _Ecore_Psl1ght_Event_Mouse_Wheel Ecore_Psl1ght_Event_Mouse_Wheel;
100struct _Ecore_Psl1ght_Event_Mouse_Wheel /** PSL1GHT Mouse Wheel event */
101{
102 int x, y;
103 int direction; /* 0 = vertical, 1 = horizontal */
104 int wheel; /* value 1 (left/up), -1 (right/down) */
105 unsigned int time;
106};
107
108EAPI int
109 ecore_psl1ght_init(const char *name);
110EAPI int
111 ecore_psl1ght_shutdown(void);
112EAPI void
113 ecore_psl1ght_resolution_set(int width, int height);
114EAPI void
115 ecore_psl1ght_poll_events(void);
116
117EAPI void ecore_psl1ght_screen_resolution_get(int *w, int *h);
118EAPI void ecore_psl1ght_optimal_screen_resolution_get(int *w, int *h);
119
120#ifdef __cplusplus
121}
122#endif
123
124#endif
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h b/libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h
new file mode 100644
index 0000000..e385af8
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/Ecore_Psl1ght_Keys.h
@@ -0,0 +1,78 @@
1#ifndef ECORE_PSL1GHT_KEYS_H__
2# define ECORE_PSL1GHT_KEYS_H__
3
4struct _ecore_psl1ght_keys_s
5{
6 int code;
7 const char *name;
8 const char *compose;
9};
10
11static const struct _ecore_psl1ght_keys_s keystable[] =
12{
13 { KB_RAWKEY_NO_EVENT, "0x00", "" },
14 { KB_RAWKEY_BS, "BackSpace", "\010" },
15 { KB_RAWKEY_TAB, "Tab", "\011" },
16 { KB_RAWKEY_ENTER, "Return", "\015" },
17 { KB_RAWKEY_PAUSE, "Pause", "Pause" },
18 { KB_RAWKEY_ESCAPE, "Escape", "\033" },
19 { KB_RAWKEY_SPACE, "space", " " },
20
21 /* Skip uppercase letters */
22 { KB_RAWKEY_LEFT_BRACKET_101, "bracketleft", "[" },
23 { KB_RAWKEY_BACKSLASH_101, "backslash", "\\" },
24 { KB_RAWKEY_RIGHT_BRACKET_101, "bracketright", "]" },
25 { KB_RAWKEY_ACCENT_CIRCONFLEX_106, "asciicircumm", "^" },
26 { KB_RAWKEY_DELETE, "Delete", "\177" },
27 /* End of ASCII mapped keysyms */
28
29 /* Numeric keypad */
30 { KB_RAWKEY_KPAD_0, "KP0", "0" },
31 { KB_RAWKEY_KPAD_1, "KP1", "1" },
32 { KB_RAWKEY_KPAD_2, "KP2", "2" },
33 { KB_RAWKEY_KPAD_3, "KP3", "3" },
34 { KB_RAWKEY_KPAD_4, "KP4", "4" },
35 { KB_RAWKEY_KPAD_5, "KP5", "5" },
36 { KB_RAWKEY_KPAD_6, "KP6", "6" },
37 { KB_RAWKEY_KPAD_7, "KP7", "7" },
38 { KB_RAWKEY_KPAD_8, "KP8", "8" },
39 { KB_RAWKEY_KPAD_9, "KP9", "9" },
40 { KB_RAWKEY_KPAD_PERIOD, "period", "." },
41 { KB_RAWKEY_KPAD_SLASH, "KP_Divide", "/" },
42 { KB_RAWKEY_KPAD_ASTERISK, "KP_Multiply", "*" },
43 { KB_RAWKEY_KPAD_MINUS, "KP_Minus", "-" },
44 { KB_RAWKEY_KPAD_PLUS, "KP_Plus", "+" },
45 { KB_RAWKEY_KPAD_ENTER, "KP_Enter", "\015" },
46
47 /* Arrows + Home/End pad */
48 { KB_RAWKEY_UP_ARROW, "Up", "Up" },
49 { KB_RAWKEY_DOWN_ARROW, "Down", "Down" },
50 { KB_RAWKEY_RIGHT_ARROW, "Right", "Right" },
51 { KB_RAWKEY_LEFT_ARROW, "Left", "Left" },
52 { KB_RAWKEY_INSERT, "Insert", "Insert" },
53 { KB_RAWKEY_HOME, "Home", "Home" },
54 { KB_RAWKEY_END, "End", "End" },
55 { KB_RAWKEY_PAGE_UP, "Page_Up", "Page_Up" },
56 { KB_RAWKEY_PAGE_DOWN, "Page_Down", "Page_Down" },
57
58 /* Function keys */
59 { KB_RAWKEY_F1, "F1", "F1" },
60 { KB_RAWKEY_F2, "F2", "F2" },
61 { KB_RAWKEY_F3, "F3", "F3" },
62 { KB_RAWKEY_F4, "F4", "F4" },
63 { KB_RAWKEY_F5, "F5", "F5" },
64 { KB_RAWKEY_F6, "F6", "F6" },
65 { KB_RAWKEY_F7, "F7", "F7" },
66 { KB_RAWKEY_F8, "F8", "F8" },
67 { KB_RAWKEY_F9, "F9", "F9" },
68 { KB_RAWKEY_F10, "F10", "F10" },
69 { KB_RAWKEY_F11, "F11", "F11" },
70 { KB_RAWKEY_F12, "F12", "F12" },
71
72 /* Key state modifier keys */
73 { KB_RAWKEY_KPAD_NUMLOCK, "Num_Lock", "Num_Lock" },
74 { KB_RAWKEY_CAPS_LOCK, "Caps_Lock", "Caps_Lock" },
75 { KB_RAWKEY_SCROLL_LOCK, "Scroll_Lock", "Scroll_Lock" },
76};
77
78#endif /* ECORE_PSL1GHT_KEYS_H__ */
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/Makefile.am b/libraries/ecore/src/lib/ecore_psl1ght/Makefile.am
new file mode 100644
index 0000000..8e7328a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/Makefile.am
@@ -0,0 +1,30 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_evas \
6-I$(top_srcdir)/src/lib/ecore_input \
7-I$(top_builddir)/src/lib/ecore \
8-I$(top_builddir)/src/lib/ecore_evas \
9-I$(top_builddir)/src/lib/ecore_input \
10@EFL_ECORE_PSL1GHT_BUILD@ \
11@EVAS_CFLAGS@ \
12@EINA_CFLAGS@
13
14lib_LTLIBRARIES = libecore_psl1ght.la
15includes_HEADERS = Ecore_Psl1ght.h
16includesdir = $(includedir)/ecore-@VMAJ@
17
18libecore_psl1ght_la_SOURCES = \
19ecore_psl1ght.c \
20moveutil.c \
21spursutil.c
22
23libecore_psl1ght_la_LIBADD = \
24$(top_builddir)/src/lib/ecore/libecore.la \
25$(top_builddir)/src/lib/ecore_input/libecore_input.la \
26@EINA_LIBS@
27
28libecore_psl1ght_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
29
30EXTRA_DIST = Ecore_Psl1ght_Keys.h ecore_psl1ght_private.h
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/Makefile.in b/libraries/ecore/src/lib/ecore_psl1ght/Makefile.in
new file mode 100644
index 0000000..9b75b74
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/Makefile.in
@@ -0,0 +1,826 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_psl1ght
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_psl1ght_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la \
91 $(top_builddir)/src/lib/ecore_input/libecore_input.la
92am_libecore_psl1ght_la_OBJECTS = ecore_psl1ght.lo moveutil.lo \
93 spursutil.lo
94libecore_psl1ght_la_OBJECTS = $(am_libecore_psl1ght_la_OBJECTS)
95AM_V_lt = $(am__v_lt_$(V))
96am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
97am__v_lt_0 = --silent
98libecore_psl1ght_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
99 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
100 $(AM_CFLAGS) $(CFLAGS) $(libecore_psl1ght_la_LDFLAGS) \
101 $(LDFLAGS) -o $@
102DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
103depcomp = $(SHELL) $(top_srcdir)/depcomp
104am__depfiles_maybe = depfiles
105am__mv = mv -f
106COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
107 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
108LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
109 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
110 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
111 $(AM_CFLAGS) $(CFLAGS)
112AM_V_CC = $(am__v_CC_$(V))
113am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
114am__v_CC_0 = @echo " CC " $@;
115AM_V_at = $(am__v_at_$(V))
116am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
117am__v_at_0 = @
118CCLD = $(CC)
119LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
120 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
121 $(AM_LDFLAGS) $(LDFLAGS) -o $@
122AM_V_CCLD = $(am__v_CCLD_$(V))
123am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
124am__v_CCLD_0 = @echo " CCLD " $@;
125AM_V_GEN = $(am__v_GEN_$(V))
126am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
127am__v_GEN_0 = @echo " GEN " $@;
128SOURCES = $(libecore_psl1ght_la_SOURCES)
129DIST_SOURCES = $(libecore_psl1ght_la_SOURCES)
130HEADERS = $(includes_HEADERS)
131ETAGS = etags
132CTAGS = ctags
133DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
134ACLOCAL = @ACLOCAL@
135ALLOCA = @ALLOCA@
136AMTAR = @AMTAR@
137AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
138AR = @AR@
139AS = @AS@
140AUTOCONF = @AUTOCONF@
141AUTOHEADER = @AUTOHEADER@
142AUTOMAKE = @AUTOMAKE@
143AWK = @AWK@
144CARES_CFLAGS = @CARES_CFLAGS@
145CARES_LIBS = @CARES_LIBS@
146CC = @CC@
147CCDEPMODE = @CCDEPMODE@
148CFLAGS = @CFLAGS@
149CHECK_CFLAGS = @CHECK_CFLAGS@
150CHECK_LIBS = @CHECK_LIBS@
151CPP = @CPP@
152CPPFLAGS = @CPPFLAGS@
153CURL_CFLAGS = @CURL_CFLAGS@
154CURL_LIBS = @CURL_LIBS@
155CXX = @CXX@
156CXXCPP = @CXXCPP@
157CXXDEPMODE = @CXXDEPMODE@
158CXXFLAGS = @CXXFLAGS@
159CYGPATH_W = @CYGPATH_W@
160DEFS = @DEFS@
161DEPDIR = @DEPDIR@
162DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
163DIRECTFB_LIBS = @DIRECTFB_LIBS@
164DLLTOOL = @DLLTOOL@
165DSYMUTIL = @DSYMUTIL@
166DUMPBIN = @DUMPBIN@
167ECHO_C = @ECHO_C@
168ECHO_N = @ECHO_N@
169ECHO_T = @ECHO_T@
170ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
171ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
172EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
173EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
174EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
175EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
176EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
177EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
178EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
179EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
180EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
181EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
182EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
183EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
184EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
185EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
186EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
187EGREP = @EGREP@
188EINA_CFLAGS = @EINA_CFLAGS@
189EINA_LIBS = @EINA_LIBS@
190ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
191ESCAPE_LIBS = @ESCAPE_LIBS@
192EVAS_CFLAGS = @EVAS_CFLAGS@
193EVAS_LIBS = @EVAS_LIBS@
194EVIL_CFLAGS = @EVIL_CFLAGS@
195EVIL_LIBS = @EVIL_LIBS@
196EXEEXT = @EXEEXT@
197FGREP = @FGREP@
198GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
199GLIB_CFLAGS = @GLIB_CFLAGS@
200GLIB_LIBS = @GLIB_LIBS@
201GMSGFMT = @GMSGFMT@
202GMSGFMT_015 = @GMSGFMT_015@
203GREP = @GREP@
204INSTALL = @INSTALL@
205INSTALL_DATA = @INSTALL_DATA@
206INSTALL_PROGRAM = @INSTALL_PROGRAM@
207INSTALL_SCRIPT = @INSTALL_SCRIPT@
208INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
209INTLLIBS = @INTLLIBS@
210INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
211KEYSYMDEFS = @KEYSYMDEFS@
212LD = @LD@
213LDFLAGS = @LDFLAGS@
214LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
215LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
216LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
217LIBICONV = @LIBICONV@
218LIBINTL = @LIBINTL@
219LIBOBJS = @LIBOBJS@
220LIBS = @LIBS@
221LIBTOOL = @LIBTOOL@
222LIPO = @LIPO@
223LN_S = @LN_S@
224LTLIBICONV = @LTLIBICONV@
225LTLIBINTL = @LTLIBINTL@
226LTLIBOBJS = @LTLIBOBJS@
227MAKEINFO = @MAKEINFO@
228MKDIR_P = @MKDIR_P@
229MSGFMT = @MSGFMT@
230MSGFMT_015 = @MSGFMT_015@
231MSGMERGE = @MSGMERGE@
232NM = @NM@
233NMEDIT = @NMEDIT@
234OBJC = @OBJC@
235OBJCDEPMODE = @OBJCDEPMODE@
236OBJCFLAGS = @OBJCFLAGS@
237OBJDUMP = @OBJDUMP@
238OBJEXT = @OBJEXT@
239OTOOL = @OTOOL@
240OTOOL64 = @OTOOL64@
241PACKAGE = @PACKAGE@
242PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
243PACKAGE_NAME = @PACKAGE_NAME@
244PACKAGE_STRING = @PACKAGE_STRING@
245PACKAGE_TARNAME = @PACKAGE_TARNAME@
246PACKAGE_URL = @PACKAGE_URL@
247PACKAGE_VERSION = @PACKAGE_VERSION@
248PATH_SEPARATOR = @PATH_SEPARATOR@
249PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
250PIXMAN_LIBS = @PIXMAN_LIBS@
251PKG_CONFIG = @PKG_CONFIG@
252PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
253PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
254POSUB = @POSUB@
255RANLIB = @RANLIB@
256SDL_CFLAGS = @SDL_CFLAGS@
257SDL_CONFIG = @SDL_CONFIG@
258SDL_LIBS = @SDL_LIBS@
259SED = @SED@
260SET_MAKE = @SET_MAKE@
261SHELL = @SHELL@
262SSL_CFLAGS = @SSL_CFLAGS@
263SSL_LIBS = @SSL_LIBS@
264STRIP = @STRIP@
265TLS2_CFLAGS = @TLS2_CFLAGS@
266TLS2_LIBS = @TLS2_LIBS@
267TLS_CFLAGS = @TLS_CFLAGS@
268TLS_LIBS = @TLS_LIBS@
269TSLIB_CFLAGS = @TSLIB_CFLAGS@
270TSLIB_LIBS = @TSLIB_LIBS@
271USE_NLS = @USE_NLS@
272VERSION = @VERSION@
273VMAJ = @VMAJ@
274WIN32_CFLAGS = @WIN32_CFLAGS@
275WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
276WIN32_LIBS = @WIN32_LIBS@
277XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
278XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
279XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
280XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
281XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
282XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
283XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
284XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
285XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
286XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
287XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
288XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
289XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
290XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
291XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
292XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
293XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
294XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
295XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
296XCB_X11_LIBS = @XCB_X11_LIBS@
297XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
298XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
299XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
300XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
301XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
302XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
303XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
304XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
305XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
306XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
307XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
308XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
309XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
310XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
311XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
312XDAMAGE_LIBS = @XDAMAGE_LIBS@
313XDPMS_CFLAGS = @XDPMS_CFLAGS@
314XDPMS_LIBS = @XDPMS_LIBS@
315XFIXES_CFLAGS = @XFIXES_CFLAGS@
316XFIXES_LIBS = @XFIXES_LIBS@
317XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
318XGESTURE_LIBS = @XGESTURE_LIBS@
319XGETTEXT = @XGETTEXT@
320XGETTEXT_015 = @XGETTEXT_015@
321XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
322XI2_CFLAGS = @XI2_CFLAGS@
323XI2_LIBS = @XI2_LIBS@
324XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
325XINERAMA_LIBS = @XINERAMA_LIBS@
326XKB_CFLAGS = @XKB_CFLAGS@
327XKB_LIBS = @XKB_LIBS@
328XMKMF = @XMKMF@
329XPRINT_CFLAGS = @XPRINT_CFLAGS@
330XPRINT_LIBS = @XPRINT_LIBS@
331XRANDR_CFLAGS = @XRANDR_CFLAGS@
332XRANDR_LIBS = @XRANDR_LIBS@
333XRENDER_CFLAGS = @XRENDER_CFLAGS@
334XRENDER_LIBS = @XRENDER_LIBS@
335XSS_CFLAGS = @XSS_CFLAGS@
336XSS_LIBS = @XSS_LIBS@
337XTEST_CFLAGS = @XTEST_CFLAGS@
338XTEST_LIBS = @XTEST_LIBS@
339X_CFLAGS = @X_CFLAGS@
340X_EXTRA_LIBS = @X_EXTRA_LIBS@
341X_LIBS = @X_LIBS@
342X_PRE_LIBS = @X_PRE_LIBS@
343Xcursor_cflags = @Xcursor_cflags@
344Xcursor_libs = @Xcursor_libs@
345abs_builddir = @abs_builddir@
346abs_srcdir = @abs_srcdir@
347abs_top_builddir = @abs_top_builddir@
348abs_top_srcdir = @abs_top_srcdir@
349ac_ct_CC = @ac_ct_CC@
350ac_ct_CXX = @ac_ct_CXX@
351ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
352ac_ct_OBJC = @ac_ct_OBJC@
353am__include = @am__include@
354am__leading_dot = @am__leading_dot@
355am__quote = @am__quote@
356am__tar = @am__tar@
357am__untar = @am__untar@
358bindir = @bindir@
359build = @build@
360build_alias = @build_alias@
361build_cpu = @build_cpu@
362build_os = @build_os@
363build_vendor = @build_vendor@
364builddir = @builddir@
365cocoa_ldflags = @cocoa_ldflags@
366datadir = @datadir@
367datarootdir = @datarootdir@
368dlopen_libs = @dlopen_libs@
369docdir = @docdir@
370dvidir = @dvidir@
371ecore_cocoa_cflags = @ecore_cocoa_cflags@
372ecore_cocoa_libs = @ecore_cocoa_libs@
373ecore_con_cflags = @ecore_con_cflags@
374ecore_con_libs = @ecore_con_libs@
375ecore_directfb_cflags = @ecore_directfb_cflags@
376ecore_directfb_libs = @ecore_directfb_libs@
377ecore_evas_cflags = @ecore_evas_cflags@
378ecore_evas_libs = @ecore_evas_libs@
379ecore_fb_cflags = @ecore_fb_cflags@
380ecore_fb_libs = @ecore_fb_libs@
381ecore_file_cflags = @ecore_file_cflags@
382ecore_file_libs = @ecore_file_libs@
383ecore_imf_cflags = @ecore_imf_cflags@
384ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
385ecore_imf_evas_libs = @ecore_imf_evas_libs@
386ecore_imf_libs = @ecore_imf_libs@
387ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
388ecore_imf_xim_libs = @ecore_imf_xim_libs@
389ecore_input_cflags = @ecore_input_cflags@
390ecore_input_evas_cflags = @ecore_input_evas_cflags@
391ecore_input_evas_libs = @ecore_input_evas_libs@
392ecore_input_libs = @ecore_input_libs@
393ecore_ipc_cflags = @ecore_ipc_cflags@
394ecore_ipc_libs = @ecore_ipc_libs@
395ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
396ecore_psl1ght_libs = @ecore_psl1ght_libs@
397ecore_sdl_cflags = @ecore_sdl_cflags@
398ecore_sdl_libs = @ecore_sdl_libs@
399ecore_win32_cflags = @ecore_win32_cflags@
400ecore_win32_libs = @ecore_win32_libs@
401ecore_wince_cflags = @ecore_wince_cflags@
402ecore_wince_libs = @ecore_wince_libs@
403ecore_x_cflags = @ecore_x_cflags@
404ecore_x_libs = @ecore_x_libs@
405ecore_x_libs_private = @ecore_x_libs_private@
406efl_doxygen = @efl_doxygen@
407efl_have_doxygen = @efl_have_doxygen@
408exec_prefix = @exec_prefix@
409have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
410host = @host@
411host_alias = @host_alias@
412host_cpu = @host_cpu@
413host_os = @host_os@
414host_vendor = @host_vendor@
415htmldir = @htmldir@
416includedir = @includedir@
417infodir = @infodir@
418install_sh = @install_sh@
419libdir = @libdir@
420libexecdir = @libexecdir@
421localedir = @localedir@
422localstatedir = @localstatedir@
423lt_ECHO = @lt_ECHO@
424lt_enable_auto_import = @lt_enable_auto_import@
425mandir = @mandir@
426mkdir_p = @mkdir_p@
427oldincludedir = @oldincludedir@
428pdfdir = @pdfdir@
429pkgconfig_requires_private = @pkgconfig_requires_private@
430prefix = @prefix@
431program_transform_name = @program_transform_name@
432psdir = @psdir@
433release_info = @release_info@
434requirements_ecore = @requirements_ecore@
435requirements_ecore_cocoa = @requirements_ecore_cocoa@
436requirements_ecore_con = @requirements_ecore_con@
437requirements_ecore_directfb = @requirements_ecore_directfb@
438requirements_ecore_evas = @requirements_ecore_evas@
439requirements_ecore_fb = @requirements_ecore_fb@
440requirements_ecore_file = @requirements_ecore_file@
441requirements_ecore_imf = @requirements_ecore_imf@
442requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
443requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
444requirements_ecore_input = @requirements_ecore_input@
445requirements_ecore_input_evas = @requirements_ecore_input_evas@
446requirements_ecore_ipc = @requirements_ecore_ipc@
447requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
448requirements_ecore_sdl = @requirements_ecore_sdl@
449requirements_ecore_win32 = @requirements_ecore_win32@
450requirements_ecore_wince = @requirements_ecore_wince@
451requirements_ecore_x = @requirements_ecore_x@
452rt_libs = @rt_libs@
453sbindir = @sbindir@
454sharedstatedir = @sharedstatedir@
455srcdir = @srcdir@
456sysconfdir = @sysconfdir@
457target_alias = @target_alias@
458top_build_prefix = @top_build_prefix@
459top_builddir = @top_builddir@
460top_srcdir = @top_srcdir@
461version_info = @version_info@
462x_cflags = @x_cflags@
463x_includes = @x_includes@
464x_libs = @x_libs@
465MAINTAINERCLEANFILES = Makefile.in
466AM_CPPFLAGS = \
467-I$(top_srcdir)/src/lib/ecore \
468-I$(top_srcdir)/src/lib/ecore_evas \
469-I$(top_srcdir)/src/lib/ecore_input \
470-I$(top_builddir)/src/lib/ecore \
471-I$(top_builddir)/src/lib/ecore_evas \
472-I$(top_builddir)/src/lib/ecore_input \
473@EFL_ECORE_PSL1GHT_BUILD@ \
474@EVAS_CFLAGS@ \
475@EINA_CFLAGS@
476
477lib_LTLIBRARIES = libecore_psl1ght.la
478includes_HEADERS = Ecore_Psl1ght.h
479includesdir = $(includedir)/ecore-@VMAJ@
480libecore_psl1ght_la_SOURCES = \
481ecore_psl1ght.c \
482moveutil.c \
483spursutil.c
484
485libecore_psl1ght_la_LIBADD = \
486$(top_builddir)/src/lib/ecore/libecore.la \
487$(top_builddir)/src/lib/ecore_input/libecore_input.la \
488@EINA_LIBS@
489
490libecore_psl1ght_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
491EXTRA_DIST = Ecore_Psl1ght_Keys.h ecore_psl1ght_private.h
492all: all-am
493
494.SUFFIXES:
495.SUFFIXES: .c .lo .o .obj
496$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
497 @for dep in $?; do \
498 case '$(am__configure_deps)' in \
499 *$$dep*) \
500 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
501 && { if test -f $@; then exit 0; else break; fi; }; \
502 exit 1;; \
503 esac; \
504 done; \
505 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_psl1ght/Makefile'; \
506 $(am__cd) $(top_srcdir) && \
507 $(AUTOMAKE) --gnu src/lib/ecore_psl1ght/Makefile
508.PRECIOUS: Makefile
509Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
510 @case '$?' in \
511 *config.status*) \
512 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
513 *) \
514 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
515 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
516 esac;
517
518$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
519 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
520
521$(top_srcdir)/configure: $(am__configure_deps)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523$(ACLOCAL_M4): $(am__aclocal_m4_deps)
524 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
525$(am__aclocal_m4_deps):
526install-libLTLIBRARIES: $(lib_LTLIBRARIES)
527 @$(NORMAL_INSTALL)
528 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
529 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
530 list2=; for p in $$list; do \
531 if test -f $$p; then \
532 list2="$$list2 $$p"; \
533 else :; fi; \
534 done; \
535 test -z "$$list2" || { \
536 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
537 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
538 }
539
540uninstall-libLTLIBRARIES:
541 @$(NORMAL_UNINSTALL)
542 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
543 for p in $$list; do \
544 $(am__strip_dir) \
545 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
546 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
547 done
548
549clean-libLTLIBRARIES:
550 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
551 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
552 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
553 test "$$dir" != "$$p" || dir=.; \
554 echo "rm -f \"$${dir}/so_locations\""; \
555 rm -f "$${dir}/so_locations"; \
556 done
557libecore_psl1ght.la: $(libecore_psl1ght_la_OBJECTS) $(libecore_psl1ght_la_DEPENDENCIES)
558 $(AM_V_CCLD)$(libecore_psl1ght_la_LINK) -rpath $(libdir) $(libecore_psl1ght_la_OBJECTS) $(libecore_psl1ght_la_LIBADD) $(LIBS)
559
560mostlyclean-compile:
561 -rm -f *.$(OBJEXT)
562
563distclean-compile:
564 -rm -f *.tab.c
565
566@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_psl1ght.Plo@am__quote@
567@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/moveutil.Plo@am__quote@
568@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spursutil.Plo@am__quote@
569
570.c.o:
571@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
572@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
573@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
574@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
575@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
576@am__fastdepCC_FALSE@ $(COMPILE) -c $<
577
578.c.obj:
579@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
580@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
581@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
582@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
583@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
584@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
585
586.c.lo:
587@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
588@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
589@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
590@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
591@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
592@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
593
594mostlyclean-libtool:
595 -rm -f *.lo
596
597clean-libtool:
598 -rm -rf .libs _libs
599install-includesHEADERS: $(includes_HEADERS)
600 @$(NORMAL_INSTALL)
601 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
602 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
603 for p in $$list; do \
604 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
605 echo "$$d$$p"; \
606 done | $(am__base_list) | \
607 while read files; do \
608 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
609 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
610 done
611
612uninstall-includesHEADERS:
613 @$(NORMAL_UNINSTALL)
614 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
615 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
616 test -n "$$files" || exit 0; \
617 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
618 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
619
620ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
621 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
622 unique=`for i in $$list; do \
623 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
624 done | \
625 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
626 END { if (nonempty) { for (i in files) print i; }; }'`; \
627 mkid -fID $$unique
628tags: TAGS
629
630TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
631 $(TAGS_FILES) $(LISP)
632 set x; \
633 here=`pwd`; \
634 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
635 unique=`for i in $$list; do \
636 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
637 done | \
638 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
639 END { if (nonempty) { for (i in files) print i; }; }'`; \
640 shift; \
641 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
642 test -n "$$unique" || unique=$$empty_fix; \
643 if test $$# -gt 0; then \
644 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
645 "$$@" $$unique; \
646 else \
647 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
648 $$unique; \
649 fi; \
650 fi
651ctags: CTAGS
652CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
653 $(TAGS_FILES) $(LISP)
654 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
655 unique=`for i in $$list; do \
656 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
657 done | \
658 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
659 END { if (nonempty) { for (i in files) print i; }; }'`; \
660 test -z "$(CTAGS_ARGS)$$unique" \
661 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
662 $$unique
663
664GTAGS:
665 here=`$(am__cd) $(top_builddir) && pwd` \
666 && $(am__cd) $(top_srcdir) \
667 && gtags -i $(GTAGS_ARGS) "$$here"
668
669distclean-tags:
670 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
671
672distdir: $(DISTFILES)
673 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
674 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
675 list='$(DISTFILES)'; \
676 dist_files=`for file in $$list; do echo $$file; done | \
677 sed -e "s|^$$srcdirstrip/||;t" \
678 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
679 case $$dist_files in \
680 */*) $(MKDIR_P) `echo "$$dist_files" | \
681 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
682 sort -u` ;; \
683 esac; \
684 for file in $$dist_files; do \
685 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
686 if test -d $$d/$$file; then \
687 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
688 if test -d "$(distdir)/$$file"; then \
689 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
690 fi; \
691 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
692 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
693 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
694 fi; \
695 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
696 else \
697 test -f "$(distdir)/$$file" \
698 || cp -p $$d/$$file "$(distdir)/$$file" \
699 || exit 1; \
700 fi; \
701 done
702check-am: all-am
703check: check-am
704all-am: Makefile $(LTLIBRARIES) $(HEADERS)
705installdirs:
706 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
707 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
708 done
709install: install-am
710install-exec: install-exec-am
711install-data: install-data-am
712uninstall: uninstall-am
713
714install-am: all-am
715 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
716
717installcheck: installcheck-am
718install-strip:
719 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
720 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
721 `test -z '$(STRIP)' || \
722 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
723mostlyclean-generic:
724
725clean-generic:
726
727distclean-generic:
728 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
729 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
730
731maintainer-clean-generic:
732 @echo "This command is intended for maintainers to use"
733 @echo "it deletes files that may require special tools to rebuild."
734 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
735clean: clean-am
736
737clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
738 mostlyclean-am
739
740distclean: distclean-am
741 -rm -rf ./$(DEPDIR)
742 -rm -f Makefile
743distclean-am: clean-am distclean-compile distclean-generic \
744 distclean-tags
745
746dvi: dvi-am
747
748dvi-am:
749
750html: html-am
751
752html-am:
753
754info: info-am
755
756info-am:
757
758install-data-am: install-includesHEADERS
759
760install-dvi: install-dvi-am
761
762install-dvi-am:
763
764install-exec-am: install-libLTLIBRARIES
765
766install-html: install-html-am
767
768install-html-am:
769
770install-info: install-info-am
771
772install-info-am:
773
774install-man:
775
776install-pdf: install-pdf-am
777
778install-pdf-am:
779
780install-ps: install-ps-am
781
782install-ps-am:
783
784installcheck-am:
785
786maintainer-clean: maintainer-clean-am
787 -rm -rf ./$(DEPDIR)
788 -rm -f Makefile
789maintainer-clean-am: distclean-am maintainer-clean-generic
790
791mostlyclean: mostlyclean-am
792
793mostlyclean-am: mostlyclean-compile mostlyclean-generic \
794 mostlyclean-libtool
795
796pdf: pdf-am
797
798pdf-am:
799
800ps: ps-am
801
802ps-am:
803
804uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
805
806.MAKE: install-am install-strip
807
808.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
809 clean-libLTLIBRARIES clean-libtool ctags distclean \
810 distclean-compile distclean-generic distclean-libtool \
811 distclean-tags distdir dvi dvi-am html html-am info info-am \
812 install install-am install-data install-data-am install-dvi \
813 install-dvi-am install-exec install-exec-am install-html \
814 install-html-am install-includesHEADERS install-info \
815 install-info-am install-libLTLIBRARIES install-man install-pdf \
816 install-pdf-am install-ps install-ps-am install-strip \
817 installcheck installcheck-am installdirs maintainer-clean \
818 maintainer-clean-generic mostlyclean mostlyclean-compile \
819 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
820 tags uninstall uninstall-am uninstall-includesHEADERS \
821 uninstall-libLTLIBRARIES
822
823
824# Tell versions [3.59,3.63) of GNU make to not export all variables.
825# Otherwise a system limit (for SysV at least) may be exceeded.
826.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght.c b/libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght.c
new file mode 100644
index 0000000..64cef9f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght.c
@@ -0,0 +1,804 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <sysutil/video.h>
6#include <sysutil/sysutil.h>
7#include <sysmodule/sysmodule.h>
8#include <io/pad.h>
9#include <io/mouse.h>
10#include <io/kb.h>
11#include <io/camera.h>
12#include <io/move.h>
13#include <sys/process.h>
14
15#include "moveutil.h"
16
17#include "Eina.h"
18#include "Ecore_Psl1ght.h"
19#include "Ecore_Input.h"
20#include "Ecore.h"
21#include "ecore_psl1ght_private.h"
22#include "ecore_private.h"
23#include "Ecore_Psl1ght_Keys.h"
24
25/* Allocate 1MB stack to avoid overflows */
26SYS_PROCESS_PARAM(1001, 0x100000);
27
28int _ecore_psl1ght_log_dom = -1;
29
30EAPI int ECORE_PSL1GHT_EVENT_KEY_MODIFIERS = 0;
31EAPI int ECORE_PSL1GHT_EVENT_GOT_FOCUS = 0;
32EAPI int ECORE_PSL1GHT_EVENT_LOST_FOCUS = 0;
33EAPI int ECORE_PSL1GHT_EVENT_EXPOSE = 0;
34
35static int _ecore_psl1ght_init_count = 0;
36static int window_width = 0;
37static int window_height = 0;
38/* Mouse support */
39static int mouse_connected = FALSE;
40static u8 mouse_buttons = 0;
41static int mouse_x = 0;
42static int mouse_y = 0;
43/* Keyboard support */
44static int keyboard_connected = FALSE;
45static KbLed keyboard_leds = {{0}};
46static KbMkey keyboard_mods = {{0}};
47static u16 keyboard_old_key = 0;
48/* Pad support */
49static padData pad_data;
50static int pad_old_x = 0;
51static int pad_old_o = 0;
52/* Move support */
53static int move_connected = FALSE;
54static moveContext *move_context = NULL;
55u16 move_buttons = 0;
56
57static void xmb_event_handler(u64 status, u64 param, void *user_data);
58
59/**
60 * @defgroup Ecore_Psl1ght_Library_Group PSL1GHT Library Functions
61 *
62 * Functions used to set up and shut down the Ecore_Psl1ght functions.
63 */
64
65/**
66 * Sets up the Ecore_Psl1ght library.
67 * @param name device target name
68 * @return @c 0 on failure. Otherwise, the number of times the library has
69 * been initialised without being shut down.
70 * @ingroup Ecore_PSL1GHT_Library_Group
71 */
72EAPI int
73ecore_psl1ght_init(const char *name __UNUSED__)
74{
75 videoState state;
76 videoResolution resolution;
77 int ret, camera_loaded, gem_loaded;
78
79 if (++_ecore_psl1ght_init_count != 1)
80 return _ecore_psl1ght_init_count;
81 _ecore_psl1ght_log_dom = eina_log_domain_register
82 ("ecore_psl1ght", ECORE_PSL1GHT_DEFAULT_LOG_COLOR);
83 if (_ecore_psl1ght_log_dom < 0)
84 {
85 EINA_LOG_ERR("Impossible to create a log domain for the Ecore PSL1GHT module.");
86 return --_ecore_psl1ght_init_count;
87 }
88 if (!ecore_event_init())
89 {
90 eina_log_domain_unregister(_ecore_psl1ght_log_dom);
91 _ecore_psl1ght_log_dom = -1;
92 return --_ecore_psl1ght_init_count;
93 }
94
95 if (videoGetState (0, 0, &state) == 0 &&
96 videoGetResolution (state.displayMode.resolution, &resolution) == 0)
97 {
98 ecore_psl1ght_resolution_set (resolution.width, resolution.height);
99 }
100 else
101 {
102 ecore_event_shutdown();
103 eina_log_domain_unregister(_ecore_psl1ght_log_dom);
104 _ecore_psl1ght_log_dom = -1;
105 return --_ecore_psl1ght_init_count;
106 }
107
108 /* Pad support */
109 ioPadInit (7);
110 /* Mouse support */
111 ioMouseInit(2);
112 mouse_buttons = 0;
113 mouse_x = 0;
114 mouse_y = 0;
115
116 /* Keyboard support */
117 ioKbInit(2);
118 keyboard_leds._KbLedU.leds = 0;
119 keyboard_mods._KbMkeyU.mkeys = 0;
120
121 /* Initialize Move */
122 move_context = NULL;
123 move_buttons = 0;
124
125 camera_loaded = !sysModuleIsLoaded (SYSMODULE_CAMERA);
126 if (!camera_loaded)
127 ret = sysModuleLoad (SYSMODULE_CAMERA);
128 else
129 ret = 0;
130 if (ret == 0)
131 {
132 gem_loaded = !sysModuleIsLoaded (SYSMODULE_GEM);
133 if (!gem_loaded)
134 ret = sysModuleLoad (SYSMODULE_GEM);
135 if (ret == 0)
136 {
137 move_context = initMove ();
138 }
139 else {
140 if (gem_loaded)
141 sysModuleUnload (SYSMODULE_CAMERA);
142 }
143 }
144
145 sysUtilRegisterCallback (SYSUTIL_EVENT_SLOT0, xmb_event_handler, NULL);
146
147 ECORE_PSL1GHT_EVENT_GOT_FOCUS = ecore_event_type_new();
148 ECORE_PSL1GHT_EVENT_LOST_FOCUS = ecore_event_type_new();
149 ECORE_PSL1GHT_EVENT_EXPOSE = ecore_event_type_new();
150 ECORE_PSL1GHT_EVENT_KEY_MODIFIERS = ecore_event_type_new();
151
152 mouse_x = 0;
153 mouse_y = 0;
154
155 return _ecore_psl1ght_init_count;
156}
157
158/**
159 * Shuts down the Ecore_Psl1ght library.
160 * @return @c The number of times the system has been initialised without
161 * being shut down.
162 * @ingroup Ecore_PSL1GHT_Library_Group
163 */
164EAPI int
165ecore_psl1ght_shutdown(void)
166{
167 if (--_ecore_psl1ght_init_count != 0)
168 return _ecore_psl1ght_init_count;
169
170 ecore_event_shutdown();
171 eina_log_domain_unregister(_ecore_psl1ght_log_dom);
172 _ecore_psl1ght_log_dom = -1;
173
174 ECORE_PSL1GHT_EVENT_GOT_FOCUS = 0;
175 ECORE_PSL1GHT_EVENT_LOST_FOCUS = 0;
176 ECORE_PSL1GHT_EVENT_EXPOSE = 0;
177 ECORE_PSL1GHT_EVENT_KEY_MODIFIERS = 0;
178
179 ioPadEnd();
180 ioMouseEnd();
181 ioKbEnd();
182
183 if (move_context)
184 {
185 endMove (move_context);
186 move_context = NULL;
187 sysModuleUnload (SYSMODULE_CAMERA);
188 sysModuleUnload (SYSMODULE_GEM);
189 }
190
191 sysUtilUnregisterCallback(SYSUTIL_EVENT_SLOT0);
192
193 return _ecore_psl1ght_init_count;
194}
195
196static unsigned int
197_ecore_psl1ght_get_time(void)
198{
199 return (unsigned int)((unsigned long long)
200 (ecore_time_get() * 1000.0) & 0xffffffff);
201}
202
203static unsigned int
204_ecore_psl1ght_get_modifiers(void)
205{
206 unsigned int modifiers = 0;
207
208 if (keyboard_mods._KbMkeyU._KbMkeyS.r_shift ||
209 keyboard_mods._KbMkeyU._KbMkeyS.l_shift)
210 modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
211 if (keyboard_mods._KbMkeyU._KbMkeyS.r_ctrl ||
212 keyboard_mods._KbMkeyU._KbMkeyS.l_ctrl)
213 modifiers |= ECORE_EVENT_MODIFIER_CTRL;
214 if (keyboard_mods._KbMkeyU._KbMkeyS.r_alt ||
215 keyboard_mods._KbMkeyU._KbMkeyS.l_alt)
216 modifiers |= ECORE_EVENT_MODIFIER_ALT;
217 if (keyboard_mods._KbMkeyU._KbMkeyS.r_win ||
218 keyboard_mods._KbMkeyU._KbMkeyS.l_win)
219 modifiers |= ECORE_EVENT_MODIFIER_WIN;
220
221 if (keyboard_leds._KbLedU._KbLedS.num_lock)
222 modifiers |= ECORE_EVENT_LOCK_NUM;
223 if (keyboard_leds._KbLedU._KbLedS.caps_lock)
224 modifiers |= ECORE_EVENT_LOCK_CAPS;
225 if (keyboard_leds._KbLedU._KbLedS.scroll_lock)
226 modifiers |= ECORE_EVENT_LOCK_SCROLL;
227
228 return modifiers;
229}
230
231static void
232_ecore_psl1ght_key_modifiers(KbMkey *mods, KbLed *leds)
233{
234 Ecore_Psl1ght_Event_Key_Modifiers *ev;
235 Eina_Bool emit = EINA_FALSE;
236
237 ev = malloc(sizeof(Ecore_Psl1ght_Event_Key_Modifiers));
238 if (!ev) return;
239
240 if (mods->_KbMkeyU._KbMkeyS.l_shift !=
241 keyboard_mods._KbMkeyU._KbMkeyS.l_shift ||
242 mods->_KbMkeyU._KbMkeyS.r_shift !=
243 keyboard_mods._KbMkeyU._KbMkeyS.r_shift)
244 {
245 emit = EINA_TRUE;
246 ev->shift_changed = EINA_TRUE;
247 ev->shift = mods->_KbMkeyU._KbMkeyS.r_shift |
248 mods->_KbMkeyU._KbMkeyS.l_shift;
249 }
250 if (mods->_KbMkeyU._KbMkeyS.l_ctrl !=
251 keyboard_mods._KbMkeyU._KbMkeyS.l_ctrl ||
252 mods->_KbMkeyU._KbMkeyS.r_ctrl !=
253 keyboard_mods._KbMkeyU._KbMkeyS.r_ctrl)
254 {
255 emit = EINA_TRUE;
256 ev->ctrl_changed = EINA_TRUE;
257 ev->ctrl = mods->_KbMkeyU._KbMkeyS.r_ctrl |
258 mods->_KbMkeyU._KbMkeyS.l_ctrl;
259 }
260 if (mods->_KbMkeyU._KbMkeyS.l_alt !=
261 keyboard_mods._KbMkeyU._KbMkeyS.l_alt ||
262 mods->_KbMkeyU._KbMkeyS.r_alt !=
263 keyboard_mods._KbMkeyU._KbMkeyS.r_alt)
264 {
265 emit = EINA_TRUE;
266 ev->alt_changed = EINA_TRUE;
267 ev->alt = mods->_KbMkeyU._KbMkeyS.r_alt |
268 mods->_KbMkeyU._KbMkeyS.l_alt;
269 }
270 if (mods->_KbMkeyU._KbMkeyS.l_win !=
271 keyboard_mods._KbMkeyU._KbMkeyS.l_win ||
272 mods->_KbMkeyU._KbMkeyS.r_win !=
273 keyboard_mods._KbMkeyU._KbMkeyS.r_win)
274 {
275 emit = EINA_TRUE;
276 ev->win_changed = EINA_TRUE;
277 ev->win = mods->_KbMkeyU._KbMkeyS.r_win |
278 mods->_KbMkeyU._KbMkeyS.l_win;
279 }
280 keyboard_mods = *mods;
281
282 if (leds->_KbLedU._KbLedS.num_lock !=
283 keyboard_leds._KbLedU._KbLedS.num_lock)
284 {
285 emit = EINA_TRUE;
286 ev->num_lock_changed = EINA_TRUE;
287 ev->num_lock = leds->_KbLedU._KbLedS.num_lock;
288 }
289 if (leds->_KbLedU._KbLedS.caps_lock !=
290 keyboard_leds._KbLedU._KbLedS.caps_lock)
291 {
292 emit = EINA_TRUE;
293 ev->caps_lock_changed = EINA_TRUE;
294 ev->caps_lock = leds->_KbLedU._KbLedS.caps_lock;
295 }
296 if (leds->_KbLedU._KbLedS.scroll_lock !=
297 keyboard_leds._KbLedU._KbLedS.scroll_lock)
298 {
299 emit = EINA_TRUE;
300 ev->scroll_lock_changed = EINA_TRUE;
301 ev->scroll_lock = leds->_KbLedU._KbLedS.scroll_lock;
302 }
303 keyboard_leds = *leds;
304
305 if (emit)
306 {
307 ev->timestamp = _ecore_psl1ght_get_time ();
308 ev->modifiers = _ecore_psl1ght_get_modifiers();
309 ecore_event_add(ECORE_PSL1GHT_EVENT_KEY_MODIFIERS, ev, NULL, NULL);
310 }
311 else
312 {
313 free(ev);
314 }
315}
316
317static void
318unicodeToUtf8(u16 w, char *utf8buf)
319{
320 unsigned char *utf8s = (unsigned char *)utf8buf;
321
322 if ( w < 0x0080 )
323 {
324 utf8s[0] = ( unsigned char )w;
325 utf8s[1] = 0;
326 }
327 else if ( w < 0x0800 )
328 {
329 utf8s[0] = 0xc0 | ((w) >> 6);
330 utf8s[1] = 0x80 | ((w) & 0x3f);
331 utf8s[2] = 0;
332 }
333 else {
334 utf8s[0] = 0xe0 | ((w) >> 12);
335 utf8s[1] = 0x80 | (((w) >> 6) & 0x3f);
336 utf8s[2] = 0x80 | ((w) & 0x3f);
337 utf8s[3] = 0;
338 }
339}
340
341static Ecore_Event_Key *
342_ecore_psl1ght_event_key(u16 key)
343{
344 Ecore_Event_Key *ev;
345 char utf8[4];
346 u16 utf16;
347 unsigned int i;
348
349 ev = malloc(sizeof(Ecore_Event_Key));
350 if (!ev) return NULL;
351
352 ev->timestamp = _ecore_psl1ght_get_time ();
353 ev->window = 0;
354 ev->event_window = 0;
355 ev->modifiers = _ecore_psl1ght_get_modifiers();
356
357 printf ("Key is %X\n", key);
358 key &= ~KB_KEYPAD;
359 for (i = 0; i < sizeof(keystable) / sizeof(struct _ecore_psl1ght_keys_s); ++i)
360 if (keystable[i].code == key)
361 {
362 ev->keyname = keystable[i].name;
363 ev->key = keystable[i].name;
364 ev->string = keystable[i].compose;
365 ev->compose = keystable[i].compose;
366
367 printf ("Found key '%s' in the table\n", ev->keyname);
368 return ev;
369 }
370
371 utf16 = ioKbCnvRawCode (KB_MAPPING_101, keyboard_mods, keyboard_leds, key);
372 unicodeToUtf8(utf16, utf8);
373 printf ("Converting to utf16 : %X - utf8 : %s\n", utf16, utf8);
374 ev->keyname = ev->key = ev->string = ev->compose = strdup (utf8);
375
376 return ev;
377}
378
379static void
380_ecore_psl1ght_mouse_move(s32 x_axis, s32 y_axis)
381{
382 Ecore_Event_Mouse_Move *ev;
383
384 ev = malloc(sizeof(Ecore_Event_Mouse_Move));
385 if (!ev) return;
386
387 mouse_x += x_axis;
388 mouse_y += y_axis;
389 if (mouse_x < 0) mouse_x = 0;
390 if (mouse_y < 0) mouse_y = 0;
391 if (mouse_x > window_width) mouse_x = window_width;
392 if (mouse_y > window_height) mouse_y = window_height;
393
394 ev->window = 0;
395 ev->root_window = 0;
396 ev->event_window = 0;
397 ev->same_screen = 0;
398 ev->timestamp = _ecore_psl1ght_get_time ();
399 ev->modifiers = _ecore_psl1ght_get_modifiers ();
400 ev->x = ev->root.x = mouse_x;
401 ev->y = ev->root.x = mouse_y;
402
403 ev->multi.device = 0;
404 ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
405 ev->multi.pressure = ev->multi.angle = 0;
406 ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
407
408 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
409}
410
411static void
412_ecore_psl1ght_mouse_button(int button, int pressed)
413{
414 Ecore_Event_Mouse_Button *ev;
415 static unsigned int previous_timestamp = 0;
416
417 ev = malloc(sizeof(Ecore_Event_Mouse_Button));
418 if (!ev) return;
419
420 ev->window = 0;
421 ev->root_window = 0;
422 ev->event_window = 0;
423 ev->same_screen = 0;
424 ev->timestamp = _ecore_psl1ght_get_time ();
425 ev->modifiers = _ecore_psl1ght_get_modifiers ();
426 ev->buttons = button;
427 if (ev->timestamp - previous_timestamp <= 500)
428 ev->double_click = 1;
429 ev->triple_click = 0;
430 previous_timestamp = ev->timestamp;
431
432 ev->x = ev->root.x = mouse_x;
433 ev->y = ev->root.y = mouse_y;
434 ev->multi.device = 0;
435 ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
436 ev->multi.pressure = ev->multi.angle = 0;
437 ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
438
439 if (pressed)
440 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
441 else
442 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
443}
444
445static void
446_ecore_psl1ght_mouse_wheel(s8 wheel, s8 tilt)
447{
448 Ecore_Event_Mouse_Wheel *ev;
449
450 ev = malloc(sizeof(Ecore_Event_Mouse_Wheel));
451 if (!ev) return;
452
453 ev->timestamp = _ecore_psl1ght_get_time ();
454 ev->window = 0;
455 ev->event_window = 0;
456 ev->modifiers = _ecore_psl1ght_get_modifiers ();
457 ev->direction = 0;
458 ev->z = wheel;
459
460 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
461}
462
463#define PAD_STICK_DEADZONE 0x20
464
465static void
466_ecore_psl1ght_poll_joypad(void)
467{
468 padInfo padinfo;
469 int i;
470
471 /**/
472 /* Check mouse events */
473 ioPadGetInfo (&padinfo);
474
475 for (i = 0; i < 4; i++) /* Ignore the move */
476 {
477 if (padinfo.status[i])
478 {
479 int analog_h, analog_v;
480
481 if (ioPadGetData (i, &pad_data) != 0)
482 continue;
483 analog_h = pad_data.ANA_L_H - 0x80;
484 analog_v = pad_data.ANA_L_V - 0x80;
485
486 if (analog_h > PAD_STICK_DEADZONE)
487 analog_h -= PAD_STICK_DEADZONE;
488 else if (analog_h < -PAD_STICK_DEADZONE)
489 analog_h += PAD_STICK_DEADZONE;
490 else
491 analog_h = 0;
492 analog_h /= 10;
493
494 if (analog_v > PAD_STICK_DEADZONE)
495 analog_v -= PAD_STICK_DEADZONE;
496 else if (analog_v < -PAD_STICK_DEADZONE)
497 analog_v += PAD_STICK_DEADZONE;
498 else
499 analog_v = 0;
500 analog_v /= 10;
501
502 if (analog_h != 0 || analog_v != 0)
503 _ecore_psl1ght_mouse_move (analog_h, analog_v);
504
505 if (pad_old_x != pad_data.BTN_CROSS)
506 _ecore_psl1ght_mouse_button (1, pad_data.BTN_CROSS);
507 if (pad_old_o != pad_data.BTN_CIRCLE)
508 _ecore_psl1ght_mouse_button (3, pad_data.BTN_CIRCLE);
509
510 pad_old_x = pad_data.BTN_CROSS;
511 pad_old_o = pad_data.BTN_CIRCLE;
512
513 //pad_buttons = paddata.buttons;
514 }
515 }
516}
517
518static void
519_ecore_psl1ght_poll_mouse(void)
520{
521 mouseInfo mouseinfo;
522 u32 i;
523
524 /**/
525 /* Check mouse events */
526 ioMouseGetInfo(&mouseinfo);
527
528 if (mouseinfo.status[0] == 1 && !mouse_connected) // Connected
529 {
530 mouse_connected = TRUE;
531 mouse_buttons = 0;
532
533 // Old events in the queue are discarded
534 ioMouseClearBuf(0);
535 }
536 else if (mouseinfo.status[0] != 1 && mouse_connected) // Disconnected
537 {
538 mouse_connected = FALSE;
539 mouse_buttons = 0;
540 }
541
542 if (mouse_connected)
543 {
544 mouseDataList datalist;
545
546 ioMouseGetDataList(0, &datalist);
547
548 for (i = 0; i < datalist.count; i++)
549 {
550 u8 old_left = mouse_buttons & 1;
551 u8 new_left = datalist.list[i].buttons & 1;
552 u8 old_right = mouse_buttons & 2;
553 u8 new_right = datalist.list[i].buttons & 2;
554 u8 old_middle = mouse_buttons & 4;
555 u8 new_middle = datalist.list[i].buttons & 4;
556
557 if (datalist.list[i].x_axis != 0 ||
558 datalist.list[i].y_axis != 0)
559 _ecore_psl1ght_mouse_move (datalist.list[i].x_axis,
560 datalist.list[i].y_axis);
561
562 if (old_left != new_left)
563 _ecore_psl1ght_mouse_button (1, new_left);
564 if (old_middle != new_middle)
565 _ecore_psl1ght_mouse_button (2, new_middle);
566 if (old_right != new_right)
567 _ecore_psl1ght_mouse_button (3, new_right);
568
569 if (datalist.list[i].wheel != 0)
570 _ecore_psl1ght_mouse_wheel (datalist.list[i].wheel,
571 datalist.list[i].tilt);
572
573 mouse_buttons = datalist.list[i].buttons;
574 }
575 }
576}
577
578static void
579_ecore_psl1ght_poll_move(void)
580{
581 int i;
582 u16 new_buttons;
583 static int t_pressed = 0;
584 static int calibrated = 0;
585 static float prev_x = 0;
586 static float prev_y = 0;
587 static int gyro = 0;
588 float x, y, z;
589
590 /* Check move events */
591 processMove (move_context);
592 new_buttons = move_context->state.paddata.buttons & (~move_buttons);
593 move_buttons = move_context->state.paddata.buttons;
594
595 moveGet3DPosition (move_context, &x, &y, &z);
596 //printf ("Move 3D position is : %f, %f, %f\n", x,y,z);
597
598 switch (new_buttons) {
599 case 1:
600 gyro = !gyro;
601 break;
602
603 case 4:
604 // Move button
605 printf ("Calibrating\n");
606 gemCalibrate (0);
607 calibrated = 1;
608 break;
609
610 case 8:
611 // start button
612 _ecore_psl1ght_mouse_move ((window_width / 2) - mouse_x, (window_height / 2) - mouse_y);
613 break;
614 }
615
616 if (calibrated)
617 {
618 float x_axis, y_axis;
619
620 if (gyro)
621 {
622 gemInertialState gem_inert;
623
624 gemGetInertialState (0, 0, 0, &gem_inert);
625 x_axis = -vec_array (gem_inert.gyro, 1) * 25;
626 y_axis = -vec_array (gem_inert.gyro, 0) * 25;
627 if (abs (x_axis) > 2 || abs (y_axis) > 2)
628 _ecore_psl1ght_mouse_move (x_axis, y_axis);
629 }
630 else {
631 x_axis = (x - prev_x) * 2.5;
632 y_axis = -(y - prev_y) * 2.5;
633 prev_x = x;
634 prev_y = y;
635 _ecore_psl1ght_mouse_move (x_axis, y_axis);
636 }
637
638 if (!t_pressed && (move_buttons & 0x2))
639 _ecore_psl1ght_mouse_button (1, 1);
640 else if (t_pressed && (move_buttons & 0x2) == 0)
641 _ecore_psl1ght_mouse_button (1, 0);
642 t_pressed = move_buttons & 0x2;
643 }
644}
645
646static void
647_ecore_psl1ght_poll_keyboard(void)
648{
649 KbInfo kbInfo;
650 int i;
651
652 /* Check keyboard events */
653 ioKbGetInfo(&kbInfo);
654
655 if (kbInfo.status[0] == 1 && !keyboard_connected)
656 {
657 /* Connected */
658 keyboard_connected = true;
659
660 // Old events in the queue are discarded
661 ioKbClearBuf(0);
662 keyboard_leds._KbLedU.leds = 0;
663 keyboard_mods._KbMkeyU.mkeys = 0;
664 keyboard_old_key = 0;
665
666 // Set raw keyboard code types to get scan codes
667 ioKbSetCodeType(0, KB_CODETYPE_RAW);
668 ioKbSetReadMode(0, KB_RMODE_INPUTCHAR);
669 }
670 else if (kbInfo.status[0] != 1 && keyboard_connected)
671 {
672 /* Disconnected keyboard */
673 keyboard_connected = FALSE;
674 }
675
676 if (keyboard_connected)
677 {
678 KbData Keys;
679
680 // Read data from the keyboard buffer
681 if (ioKbRead(0, &Keys) == 0 && Keys.nb_keycode > 0)
682 {
683 Ecore_Event_Key *ev = NULL;
684
685 _ecore_psl1ght_key_modifiers (&Keys.mkey, &Keys.led);
686
687 if (Keys.nb_keycode == 0 && keyboard_old_key != 0)
688 {
689 ev = _ecore_psl1ght_event_key (keyboard_old_key);
690 if (ev) ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
691 }
692 for (i = 0; i < Keys.nb_keycode; i++)
693 {
694 if (Keys.keycode[i] != keyboard_old_key)
695 {
696 if (Keys.keycode[i] != 0)
697 {
698 ev = _ecore_psl1ght_event_key (Keys.keycode[i]);
699 if (ev)
700 ecore_event_add(ECORE_EVENT_KEY_DOWN, ev,
701 NULL, NULL);
702 }
703 else
704 {
705 ev = _ecore_psl1ght_event_key (keyboard_old_key);
706 if (ev)
707 ecore_event_add(ECORE_EVENT_KEY_UP, ev,
708 NULL, NULL);
709 }
710 keyboard_old_key = Keys.keycode[0];
711 }
712 }
713 }
714 }
715}
716
717static void
718xmb_event_handler(u64 status, u64 param, void *user_data)
719{
720 printf ("Received event %lX\n", status);
721 if (status == SYSUTIL_EXIT_GAME)
722 {
723 ecore_main_loop_quit();
724 }
725 else if (status == SYSUTIL_MENU_OPEN)
726 {
727 }
728 else if (status == SYSUTIL_MENU_CLOSE)
729 {
730 }
731 else if (status == SYSUTIL_DRAW_BEGIN)
732 {
733 }
734 else if (status == SYSUTIL_DRAW_END)
735 {
736 }
737}
738
739EAPI void
740ecore_psl1ght_poll_events(void)
741{
742 _ecore_psl1ght_poll_joypad ();
743 _ecore_psl1ght_poll_mouse ();
744 if (move_context)
745 _ecore_psl1ght_poll_move ();
746 _ecore_psl1ght_poll_keyboard ();
747
748 sysUtilCheckCallback ();
749}
750
751EAPI void
752ecore_psl1ght_resolution_set(int width, int height)
753{
754 window_width = width;
755 window_height = height;
756 if (mouse_x > window_width) mouse_x = window_width;
757 if (mouse_y > window_height) mouse_y = window_height;
758}
759
760EAPI void
761ecore_psl1ght_screen_resolution_get(int *w, int *h)
762{
763 videoState state;
764 videoResolution resolution;
765
766 /* Get the state of the display */
767 if (videoGetState (0, 0, &state) == 0 &&
768 videoGetResolution (state.displayMode.resolution, &resolution) == 0)
769 {
770 if (w) *w = resolution.width;
771 if (h) *h = resolution.height;
772 }
773 else {
774 if (w) *w = 0;
775 if (h) *h = 0;
776 }
777}
778
779EAPI void
780ecore_psl1ght_optimal_screen_resolution_get(int *w, int *h)
781{
782 videoDeviceInfo info;
783 videoResolution res;
784 int area = 720 * 480;
785 int mode_area;
786 int i;
787
788 if (w) *w = 720;
789 if (h) *h = 480;
790
791 videoGetDeviceInfo(0, 0, &info);
792
793 for (i = 0; i < info.availableModeCount; i++) {
794 videoGetResolution (info.availableModes[i].resolution, &res);
795 mode_area = res.width * res.height;
796 if (mode_area > area)
797 {
798 area = mode_area;
799 if (w) *w = res.width;
800 if (h) *h = res.height;
801 }
802 }
803}
804
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght_private.h b/libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght_private.h
new file mode 100644
index 0000000..bd5a86e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/ecore_psl1ght_private.h
@@ -0,0 +1,36 @@
1#ifndef _ECORE_PSL1GHT_PRIVATE_H
2# define _ECORE_PSL1GHT_PRIVATE_H
3
4extern int _ecore_psl1ght_log_dom;
5
6# ifdef ECORE_PSL1GHT_DEFAULT_LOG_COLOR
7# undef ECORE_PSL1GHT_DEFAULT_LOG_COLOR
8# endif
9# define ECORE_PSL1GHT_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
10
11# ifdef ERR
12# undef ERR
13# endif
14# define ERR(...) EINA_LOG_DOM_ERR(_ecore_psl1ght_log_dom, __VA_ARGS__)
15
16# ifdef DBG
17# undef DBG
18# endif
19# define DBG(...) EINA_LOG_DOM_DBG(_ecore_psl1ght_log_dom, __VA_ARGS__)
20
21# ifdef INF
22# undef INF
23# endif
24# define INF(...) EINA_LOG_DOM_INFO(_ecore_psl1ght_log_dom, __VA_ARGS__)
25
26# ifdef WRN
27# undef WRN
28# endif
29# define WRN(...) EINA_LOG_DOM_WARN(_ecore_psl1ght_log_dom, __VA_ARGS__)
30
31# ifdef CRIT
32# undef CRIT
33# endif
34# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_psl1ght_log_dom, __VA_ARGS__)
35
36#endif
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/moveutil.c b/libraries/ecore/src/lib/ecore_psl1ght/moveutil.c
new file mode 100644
index 0000000..1dadfbc
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/moveutil.c
@@ -0,0 +1,245 @@
1#include <stdio.h>
2#include <io/move.h>
3#include <sys/memory.h>
4#include <ppu-types.h>
5#include <io/camera.h>
6#include <ppu-types.h>
7#include <spurs/spurs.h>
8#include <sys/thread.h>
9#include <sys/systime.h>
10
11#include "spursutil.h"
12#include "moveutil.h"
13
14u16 oldGemPad = 0;
15u16 newGemPad = 0;
16u16 newGemAnalogT = 0;
17
18static void
19endCamera(moveContext *context)
20{
21 cameraStop (0);
22
23 cameraClose (0);
24 cameraEnd ();
25
26 sysMemContainerDestroy (context->camInfo.container);
27}
28
29static int
30initCamera(moveContext *context)
31{
32 int ret;
33
34 context->camInfo.container = NULL;
35
36 ret = cameraInit ();
37 printf ("cameraInit() returned %d\n", ret);
38 if (ret == 0)
39 {
40 cameraType type = CAM_TYPE_UNKNOWN;
41
42 ret = cameraGetType (0, &type);
43 if (ret == 0 && type == CAM_TYPE_PLAYSTATION_EYE)
44 {
45 context->camInfo.format = CAM_FORM_RAW8;
46 context->camInfo.framerate = 60;
47 context->camInfo.resolution = CAM_RESO_VGA;
48 context->camInfo.info_ver = 0x0101;
49 ret = sysMemContainerCreate (&context->camInfo.container, 0x200000);
50 printf ("sysMemContainerCreate() for camera container returned %d\n", ret);
51
52 ret = cameraOpenEx (0, &context->camInfo);
53 switch (ret) {
54 case 0:
55 printf ("Found me an eye, arrr!\n");
56 printf ("cameraOpenEx returned %08X\n", ret);
57 printf ("Video dimensions: %dx%d\n", context->camInfo.width, context->camInfo.height);
58 printf ("Buffer at %08X\n", context->camInfo.buffer);
59 printf ("pbuf0 Buffer at %08X\n", context->camInfo.pbuf[0]);
60 printf ("pbuf0 Buffer at %08X\n", context->camInfo.pbuf[1]);
61 printf ("context->camInfo.info_ver %X\n", context->camInfo.info_ver);
62
63 context->camRead.buffer = context->camInfo.buffer;
64 context->camRead.version = 0x0100;
65 printf ("Setting CameraReadEx %08X buffer to cameraInfoex buffer \n",
66 context->camRead.buffer);
67 break;
68
69 default:
70 printf ("Error %X detected opening PlayStation Eye\n", ret);
71 goto error;
72 }
73 }
74 else {
75 printf ("Device detected is not a PlayStation Eye and this sample need it\n");
76 goto error;
77 }
78 }
79 else {
80 goto error;
81 }
82 return ret;
83
84error:
85 if (context->camInfo.container)
86 sysMemContainerDestroy (context->camInfo.container);
87 return ret;
88}
89
90static int
91readCamera(moveContext *context)
92{
93 int ret;
94
95 ret = cameraReadEx (0, &context->camRead);
96 switch (ret) {
97 case CAMERA_ERRO_NEED_START:
98 cameraReset (0);
99 ret = gemPrepareCamera (128, 0.5);
100 printf ("GemPrepareCamera return %d exposure set to 128 and quality to 0.5 before cameraStart\n",
101 ret);
102 printf ("lets go!! It's time to look your face in Sony Bravia :P\n");
103 ret = cameraStart (0);
104 printf ("cameraStart return %d \n", ret);
105 printf ("*******************************************\n");
106 printf ("* Now make sure you have a Move connected\n");
107 printf ("* and point it towards the camera and press\n");
108 printf ("* the action button to calibrate\n");
109 printf ("*******************************************\n");
110 break;
111
112 case 0:
113 break;
114
115 default:
116 printf ("error %08X ", ret);
117 ret = 1;
118 break;
119 }
120 // printf("despues de start return %d \n",ret);
121 if (ret == 0 && context->camRead.readcount != 0)
122 {
123 return context->camRead.readcount;
124 }
125 else {
126 return 0;
127 }
128}
129
130moveContext *
131initMove()
132{
133 moveContext *context = NULL;
134 Spurs *spurs;
135 gemAttribute gem_attr;
136 int ret;
137 int i;
138
139 spurs = initSpurs ("gem_spurs");
140
141 if (spurs == NULL)
142 goto error;
143
144 printf ("preparing GemAttribute structure with spurs\n");
145
146 gem_attr.version = 2;
147 gem_attr.max = 1;
148 gem_attr.spurs = spurs;
149 gem_attr.memory = NULL;
150 gem_attr.spu_priorities[0] = 1;
151 for (i = 1; i < 8; ++i)
152 gem_attr.spu_priorities[i] = 0;
153
154 printf ("calling GemInit with GemAttribute structure version=%d max_connect=%d spurs=%X\n",
155 gem_attr.version, gem_attr.max, gem_attr.spurs);
156 ret = gemInit (&gem_attr);
157 printf ("return from GemInit %X \n", ret);
158 if (ret)
159 goto error;
160
161 ret = gemPrepareCamera (128, 0.5);
162 printf ("GemPrepareCamera return %d exposure set to 128 and quality to 0.5\n",
163 ret);
164 if (ret)
165 goto error;
166 ret = gemReset (0);
167 printf ("GemReset return %X \n", ret);
168 if (ret)
169 goto error;
170
171 context = (moveContext *)malloc (sizeof (moveContext));
172 context->spurs = spurs;
173 ret = initCamera (context);
174
175 if (ret == 0)
176 return context;
177
178error:
179 if (spurs)
180 endSpurs (spurs);
181 if (context)
182 free (context);
183 return NULL;
184}
185
186void
187endMove(moveContext *context)
188{
189 /* Stop Move */
190 gemEnd ();
191 /* Stop Camera */
192 endCamera (context);
193 /* Stop Spurs */
194 endSpurs (context->spurs);
195
196 free (context);
197}
198
199int
200processMove(moveContext *context)
201{
202 const unsigned int hues[] = { 4 << 24, 4 << 24, 4 << 24, 4 << 24 };
203 int ret = -1;
204
205 if (readCamera (context) > 0)
206 {
207 ret = gemUpdateStart (context->camRead.buffer, context->camRead.timestamp);
208 //printf ("Return from gemUpdateStart %X\n", ret);
209 if (ret == 0)
210 {
211 ret = gemUpdateFinish ();
212 //printf ("Return from gemUpdateFinish %X\n", ret);
213 if (ret == 0)
214 {
215 ret = gemGetState (0, STATE_LATEST_IMAGE_TIME, 0, &context->state);
216 switch (ret) {
217 case 2:
218 gemForceRGB (0, 0.5, 0.5, 0.5);
219 break;
220
221 case 5:
222 gemTrackHues (hues, NULL);
223 break;
224
225 default:
226 break;
227 }
228 }
229 }
230 }
231
232 return ret;
233}
234
235void
236moveGet3DPosition(moveContext *context, float *x, float *y, float *z)
237{
238 if (x)
239 *x = vec_array (context->state.pos, 0);
240 if (y)
241 *y = vec_array (context->state.pos, 1);
242 if (z)
243 *z = vec_array (context->state.pos, 2);
244}
245
diff --git a/libraries/ecore/src/lib/ecore_psl1ght/spursutil.c b/libraries/ecore/src/lib/ecore_psl1ght/spursutil.c
new file mode 100644
index 0000000..27b5c1d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_psl1ght/spursutil.c
@@ -0,0 +1,62 @@
1#include "spursutil.h"
2#include <sys/spu.h>
3
4#define SPURS_DEFAULT_PREFIX_NAME "spursutil"
5
6Spurs *
7initSpurs(const char *prefix_name)
8{
9 Spurs *spurs = NULL;
10 SpursAttribute attributeSpurs;
11 int ret;
12 int i;
13
14 ret = sysSpuInitialize (6, 0);
15 printf ("sysSpuInitialize return %d\n", ret);
16
17 /* initialize spurs */
18 printf ("Initializing spurs\n");
19 spurs = (void *)memalign (SPURS_ALIGN, sizeof (Spurs));
20 printf ("Initializing spurs attribute\n");
21
22 ret = spursAttributeInitialize (&attributeSpurs, 5, 250, 1000, true);
23 if (ret)
24 {
25 printf ("error : spursAttributeInitialize failed %x\n", ret);
26 goto error;
27 }
28
29 printf ("Setting name prefix\n");
30 if (!prefix_name)
31 prefix_name = SPURS_DEFAULT_PREFIX_NAME;
32 ret = spursAttributeSetNamePrefix (&attributeSpurs,
33 prefix_name, strlen (prefix_name));
34 if (ret)
35 {
36 printf ("error : spursAttributeInitialize failed %x\n", ret);
37 goto error;
38 }
39
40 printf ("Initializing with attribute\n");
41 ret = spursInitializeWithAttribute (spurs, &attributeSpurs);
42 if (ret)
43 {
44 printf ("error: spursInitializeWithAttribute failed %x\n", ret);
45 goto error;
46 }
47
48 return spurs;
49
50error:
51 if (spurs)
52 free (spurs);
53 return NULL;
54}
55
56void
57endSpurs(Spurs *spurs)
58{
59 spursFinalize (spurs);
60 free (spurs);
61}
62
diff --git a/libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl.h b/libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl.h
new file mode 100644
index 0000000..359e974
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl.h
@@ -0,0 +1,114 @@
1#ifndef _ECORE_SDL_H
2#define _ECORE_SDL_H
3
4#ifdef EAPI
5# undef EAPI
6#endif
7
8#ifdef _WIN32
9# ifdef EFL_ECORE_SDL_BUILD
10# ifdef DLL_EXPORT
11# define EAPI __declspec(dllexport)
12# else
13# define EAPI
14# endif /* ! DLL_EXPORT */
15# else
16# define EAPI __declspec(dllimport)
17# endif /* ! EFL_ECORE_SDL_BUILD */
18#else
19# ifdef __GNUC__
20# if __GNUC__ >= 4
21# define EAPI __attribute__ ((visibility("default")))
22# else
23# define EAPI
24# endif
25# else
26# define EAPI
27# endif
28#endif /* ! _WIN32 */
29
30/**
31 * @file
32 * @brief Ecore SDL system functions.
33 */
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39EAPI extern int ECORE_SDL_EVENT_GOT_FOCUS;
40EAPI extern int ECORE_SDL_EVENT_LOST_FOCUS;
41EAPI extern int ECORE_SDL_EVENT_RESIZE;
42EAPI extern int ECORE_SDL_EVENT_EXPOSE;
43
44typedef struct _Ecore_Sdl_Event_Key_Down Ecore_Sdl_Event_Key_Down;
45struct _Ecore_Sdl_Event_Key_Down /** SDL Key Down event */
46{
47 const char *keyname; /**< The name of the key that was pressed */
48 const char *keycompose; /**< The UTF-8 string conversion if any */
49 unsigned int time;
50};
51
52typedef struct _Ecore_Sdl_Event_Key_Up Ecore_Sdl_Event_Key_Up;
53struct _Ecore_Sdl_Event_Key_Up /** SDL Key Up event */
54{
55 const char *keyname; /**< The name of the key that was released */
56 const char *keycompose; /**< The UTF-8 string conversion if any */
57 unsigned int time;
58};
59
60typedef struct _Ecore_Sdl_Event_Mouse_Button_Down Ecore_Sdl_Event_Mouse_Button_Down;
61struct _Ecore_Sdl_Event_Mouse_Button_Down /** SDL Mouse Down event */
62{
63 int button; /**< Mouse button that was pressed (1 - 32) */
64 int x; /**< Mouse co-ordinates when mouse button was pressed */
65 int y; /**< Mouse co-ordinates when mouse button was pressed */
66 int double_click : 1; /**< Set if click was a double click */
67 int triple_click : 1; /**< Set if click was a triple click */
68 unsigned int time;
69};
70
71typedef struct _Ecore_Sdl_Event_Mouse_Button_Up Ecore_Sdl_Event_Mouse_Button_Up;
72struct _Ecore_Sdl_Event_Mouse_Button_Up /** SDL Mouse Up event */
73{
74 int button; /**< Mouse button that was released (1 - 32) */
75 int x; /**< Mouse co-ordinates when mouse button was raised */
76 int y; /**< Mouse co-ordinates when mouse button was raised */
77 int double_click : 1; /**< Set if click was a double click */
78 int triple_click : 1; /**< Set if click was a triple click */
79 unsigned int time;
80};
81
82typedef struct _Ecore_Sdl_Event_Mouse_Move Ecore_Sdl_Event_Mouse_Move;
83struct _Ecore_Sdl_Event_Mouse_Move /** SDL Mouse Move event */
84{
85 int x; /**< Mouse co-ordinates where the mouse cursor moved to */
86 int y; /**< Mouse co-ordinates where the mouse cursor moved to */
87 unsigned int time;
88};
89
90typedef struct _Ecore_Sdl_Event_Mouse_Wheel Ecore_Sdl_Event_Mouse_Wheel;
91struct _Ecore_Sdl_Event_Mouse_Wheel /** SDL Mouse Wheel event */
92{
93 int x,y;
94 int direction; /* 0 = vertical, 1 = horizontal */
95 int wheel; /* value 1 (left/up), -1 (right/down) */
96 unsigned int time;
97};
98
99typedef struct _Ecore_Sdl_Event_Video_Resize Ecore_Sdl_Event_Video_Resize;
100struct _Ecore_Sdl_Event_Video_Resize
101{
102 int w;
103 int h;
104};
105
106EAPI int ecore_sdl_init(const char *name);
107EAPI int ecore_sdl_shutdown(void);
108EAPI void ecore_sdl_feed_events(void);
109
110#ifdef __cplusplus
111}
112#endif
113
114#endif
diff --git a/libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl_Keys.h b/libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl_Keys.h
new file mode 100644
index 0000000..4d0b60b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_sdl/Ecore_Sdl_Keys.h
@@ -0,0 +1,266 @@
1#ifndef ECORE_SDL_KEYS_H__
2# define ECORE_SDL_KEYS_H__
3
4struct _ecore_sdl_keys_s
5{
6 int code;
7 const char* name;
8 const char* compose;
9};
10
11static const struct _ecore_sdl_keys_s keystable[] =
12{
13 { SDLK_UNKNOWN, "0x00", "" },
14#ifndef BUILD_ECORE_EVAS_SDL_130
15 { SDLK_FIRST, "First", "First" },
16#endif
17 { SDLK_BACKSPACE, "BackSpace", "\010" },
18 { SDLK_TAB, "Tab", "\011" },
19 { SDLK_CLEAR, "Clear", "Clear" },
20 { SDLK_RETURN, "Return", "\015" },
21 { SDLK_PAUSE, "Pause", "Pause" },
22 { SDLK_ESCAPE, "Escape", "\033" },
23 { SDLK_SPACE, "space", " " },
24 { SDLK_EXCLAIM, "exclam", "!" },
25 { SDLK_QUOTEDBL, "quotedbl", "\"" },
26 { SDLK_HASH, "numbersign", "#" },
27 { SDLK_DOLLAR, "dollar", "$" },
28 { SDLK_AMPERSAND, "ampersand", "&" },
29 { SDLK_QUOTE, "apostrophe", "'" },
30 { SDLK_LEFTPAREN, "parenleft", "(" },
31 { SDLK_RIGHTPAREN, "parenright", ")" },
32 { SDLK_ASTERISK, "asterisk", "*" },
33 { SDLK_PLUS, "plus", "+" },
34 { SDLK_COMMA, "comma", "," },
35 { SDLK_MINUS, "minus", "-" },
36 { SDLK_PERIOD, "period", "." },
37 { SDLK_SLASH, "slash", "/" },
38 { SDLK_0, "0", "0" },
39 { SDLK_1, "1", "1" },
40 { SDLK_2, "2", "2" },
41 { SDLK_3, "3", "3" },
42 { SDLK_4, "4", "4" },
43 { SDLK_5, "5", "5" },
44 { SDLK_6, "6", "6" },
45 { SDLK_7, "7", "7" },
46 { SDLK_8, "8", "8" },
47 { SDLK_9, "9", "9" },
48 { SDLK_COLON, "colon", ":" },
49 { SDLK_SEMICOLON, "semicolon", ";" },
50 { SDLK_LESS, "less", "<" },
51 { SDLK_EQUALS, "equal", "=" },
52 { SDLK_GREATER, "greater", ">" },
53 { SDLK_QUESTION, "question", "?" },
54 { SDLK_AT, "at", "@" },
55
56 /* Skip uppercase letters */
57 { SDLK_LEFTBRACKET, "bracketleft", "[" },
58 { SDLK_BACKSLASH, "backslash", "\\" },
59 { SDLK_RIGHTBRACKET, "bracketright", "]" },
60 { SDLK_CARET, "asciicircumm", "^" },
61 { SDLK_UNDERSCORE, "underscore", "_" },
62 { SDLK_BACKQUOTE, "asciitilde", "`" },
63 { SDLK_a, "a", "a" },
64 { SDLK_b, "b", "b" },
65 { SDLK_c, "c", "c" },
66 { SDLK_d, "d", "d" },
67 { SDLK_e, "e", "e" },
68 { SDLK_f, "f", "f" },
69 { SDLK_g, "g", "g" },
70 { SDLK_h, "h", "h" },
71 { SDLK_i, "i", "i" },
72 { SDLK_j, "j", "j" },
73 { SDLK_k, "k", "k" },
74 { SDLK_l, "l", "l" },
75 { SDLK_m, "m", "m" },
76 { SDLK_n, "n", "n" },
77 { SDLK_o, "o", "o" },
78 { SDLK_p, "p", "p" },
79 { SDLK_q, "q", "q" },
80 { SDLK_r, "r", "r" },
81 { SDLK_s, "s", "s" },
82 { SDLK_t, "t", "t" },
83 { SDLK_u, "u", "u" },
84 { SDLK_v, "v", "v" },
85 { SDLK_w, "w", "w" },
86 { SDLK_x, "x", "x" },
87 { SDLK_y, "y", "y" },
88 { SDLK_z, "z", "z" },
89 { SDLK_DELETE, "Delete", "\177" },
90 /* End of ASCII mapped keysyms */
91
92#ifndef BUILD_ECORE_EVAS_SDL_130
93 /* International keyboard syms */
94 { SDLK_WORLD_0, "w0", "" }, /* 0xA0 */
95 { SDLK_WORLD_1, "w1", "" },
96 { SDLK_WORLD_2, "w2", "" },
97 { SDLK_WORLD_3, "w3", "" },
98 { SDLK_WORLD_4, "w4", "" },
99 { SDLK_WORLD_5, "w5", "" },
100 { SDLK_WORLD_6, "w6", "" },
101 { SDLK_WORLD_7, "w7", "" },
102 { SDLK_WORLD_8, "w8", "" },
103 { SDLK_WORLD_9, "w9", "" },
104 { SDLK_WORLD_10, "w10", "" },
105 { SDLK_WORLD_11, "w11", "" },
106 { SDLK_WORLD_12, "w12", "" },
107 { SDLK_WORLD_13, "w13", "" },
108 { SDLK_WORLD_14, "w14", "" },
109 { SDLK_WORLD_15, "w15", "" },
110 { SDLK_WORLD_16, "w16", "" },
111 { SDLK_WORLD_17, "w17", "" },
112 { SDLK_WORLD_18, "w18", "" },
113 { SDLK_WORLD_19, "w19", "" },
114 { SDLK_WORLD_20, "w20", "" },
115 { SDLK_WORLD_21, "w21", "" },
116 { SDLK_WORLD_22, "w22", "" },
117 { SDLK_WORLD_23, "w23", "" },
118 { SDLK_WORLD_24, "w24", "" },
119 { SDLK_WORLD_25, "w25", "" },
120 { SDLK_WORLD_26, "w26", "" },
121 { SDLK_WORLD_27, "w27", "" },
122 { SDLK_WORLD_28, "w28", "" },
123 { SDLK_WORLD_29, "w29", "" },
124 { SDLK_WORLD_30, "w30", "" },
125 { SDLK_WORLD_31, "w31", "" },
126 { SDLK_WORLD_32, "w32", "" },
127 { SDLK_WORLD_33, "w33", "" },
128 { SDLK_WORLD_34, "w34", "" },
129 { SDLK_WORLD_35, "w35", "" },
130 { SDLK_WORLD_36, "w36", "" },
131 { SDLK_WORLD_37, "w37", "" },
132 { SDLK_WORLD_38, "w38", "" },
133 { SDLK_WORLD_39, "w39", "" },
134 { SDLK_WORLD_40, "w40", "" },
135 { SDLK_WORLD_41, "w41", "" },
136 { SDLK_WORLD_42, "w42", "" },
137 { SDLK_WORLD_43, "w43", "" },
138 { SDLK_WORLD_44, "w44", "" },
139 { SDLK_WORLD_45, "w45", "" },
140 { SDLK_WORLD_46, "w46", "" },
141 { SDLK_WORLD_47, "w47", "" },
142 { SDLK_WORLD_48, "w48", "" },
143 { SDLK_WORLD_49, "w49", "" },
144 { SDLK_WORLD_50, "w50", "" },
145 { SDLK_WORLD_51, "w51", "" },
146 { SDLK_WORLD_52, "w52", "" },
147 { SDLK_WORLD_53, "w53", "" },
148 { SDLK_WORLD_54, "w54", "" },
149 { SDLK_WORLD_55, "w55", "" },
150 { SDLK_WORLD_56, "w56", "" },
151 { SDLK_WORLD_57, "w57", "" },
152 { SDLK_WORLD_58, "w58", "" },
153 { SDLK_WORLD_59, "w59", "" },
154 { SDLK_WORLD_60, "w60", "" },
155 { SDLK_WORLD_61, "w61", "" },
156 { SDLK_WORLD_62, "w62", "" },
157 { SDLK_WORLD_63, "w63", "" },
158 { SDLK_WORLD_64, "w64", "" },
159 { SDLK_WORLD_65, "w65", "" },
160 { SDLK_WORLD_66, "w66", "" },
161 { SDLK_WORLD_67, "w67", "" },
162 { SDLK_WORLD_68, "w68", "" },
163 { SDLK_WORLD_69, "w69", "" },
164 { SDLK_WORLD_70, "w70", "" },
165 { SDLK_WORLD_71, "w71", "" },
166 { SDLK_WORLD_72, "w72", "" },
167 { SDLK_WORLD_73, "w73", "" },
168 { SDLK_WORLD_74, "w74", "" },
169 { SDLK_WORLD_75, "w75", "" },
170 { SDLK_WORLD_76, "w76", "" },
171 { SDLK_WORLD_77, "w77", "" },
172 { SDLK_WORLD_78, "w78", "" },
173 { SDLK_WORLD_79, "w79", "" },
174 { SDLK_WORLD_80, "w80", "" },
175 { SDLK_WORLD_81, "w81", "" },
176 { SDLK_WORLD_82, "w82", "" },
177 { SDLK_WORLD_83, "w83", "" },
178 { SDLK_WORLD_84, "w84", "" },
179 { SDLK_WORLD_85, "w85", "" },
180 { SDLK_WORLD_86, "w86", "" },
181 { SDLK_WORLD_87, "w87", "" },
182 { SDLK_WORLD_88, "w88", "" },
183 { SDLK_WORLD_89, "w89", "" },
184 { SDLK_WORLD_90, "w90", "" },
185 { SDLK_WORLD_91, "w91", "" },
186 { SDLK_WORLD_92, "w92", "" },
187 { SDLK_WORLD_93, "w93", "" },
188 { SDLK_WORLD_94, "w94", "" },
189 { SDLK_WORLD_95, "w95", "" },
190#endif
191 /* Numeric keypad */
192 { SDLK_KP0, "KP0", "0" },
193 { SDLK_KP1, "KP1", "1" },
194 { SDLK_KP2, "KP2", "2" },
195 { SDLK_KP3, "KP3", "3" },
196 { SDLK_KP4, "KP4", "4" },
197 { SDLK_KP5, "KP5", "5" },
198 { SDLK_KP6, "KP6", "6" },
199 { SDLK_KP7, "KP7", "7" },
200 { SDLK_KP8, "KP8", "8" },
201 { SDLK_KP9, "KP9", "9" },
202 { SDLK_KP_PERIOD, "period", "." },
203 { SDLK_KP_DIVIDE, "KP_Divide", "/" },
204 { SDLK_KP_MULTIPLY, "KP_Multiply", "*" },
205 { SDLK_KP_MINUS, "KP_Minus", "-" },
206 { SDLK_KP_PLUS, "KP_Plus", "+" },
207 { SDLK_KP_ENTER, "KP_Enter", "\015" },
208 { SDLK_KP_EQUALS, "KP_Equals", "=" },
209
210 /* Arrows + Home/End pad */
211 { SDLK_UP, "Up", "Up" },
212 { SDLK_DOWN, "Down", "Down" },
213 { SDLK_RIGHT, "Right", "Right" },
214 { SDLK_LEFT, "Left", "Left" },
215 { SDLK_INSERT, "Insert", "Insert" },
216 { SDLK_HOME, "Home", "Home" },
217 { SDLK_END, "End", "End" },
218 { SDLK_PAGEUP, "Page_Up", "Page_Up" },
219 { SDLK_PAGEDOWN, "Page_Down", "Page_Down" },
220
221 /* Function keys */
222 { SDLK_F1, "F1", "F1" },
223 { SDLK_F2, "F2", "F2" },
224 { SDLK_F3, "F3", "F3" },
225 { SDLK_F4, "F4", "F4" },
226 { SDLK_F5, "F5", "F5" },
227 { SDLK_F6, "F6", "F6" },
228 { SDLK_F7, "F7", "F7" },
229 { SDLK_F8, "F8", "F8" },
230 { SDLK_F9, "F9", "F9" },
231 { SDLK_F10, "F10", "F10" },
232 { SDLK_F11, "F11", "F11" },
233 { SDLK_F12, "F12", "F12" },
234 { SDLK_F13, "F13", "F13" },
235 { SDLK_F14, "F14", "F14" },
236 { SDLK_F15, "F15", "F15" },
237
238 /* Key state modifier keys */
239 { SDLK_NUMLOCK, "Num_Lock", "Num_Lock" },
240 { SDLK_CAPSLOCK, "Caps_Lock", "Caps_Lock" },
241 { SDLK_SCROLLOCK, "Scroll_Lock", "Scroll_Lock" },
242 { SDLK_RSHIFT, "Shift_R", "Shift_R" },
243 { SDLK_LSHIFT, "Shift_L", "Shift_L" },
244 { SDLK_RCTRL, "Control_R", "Control_R" },
245 { SDLK_LCTRL, "Control_L", "Control_L" },
246 { SDLK_RALT, "Alt_R", "Alt_R" },
247 { SDLK_LALT, "Alt_L", "Alt_L" },
248 { SDLK_RMETA, "Meta_R", "Meta_R" },
249 { SDLK_LMETA, "Meta_L", "Meta_L" },
250 { SDLK_LSUPER, "Super_L", "Super_L" }, /* Left "Windows" key */
251 { SDLK_RSUPER, "Super_R", "Super_R" }, /* Right "Windows" key */
252 { SDLK_MODE, "Mode", "Mode" }, /* "Alt Gr" key */
253 { SDLK_COMPOSE, "Compose", "Compose" }, /* Multi-key compose key */
254
255 /* Miscellaneous function keys */
256 { SDLK_HELP, "Help", "Help" },
257 { SDLK_PRINT, "Print", "Print" },
258 { SDLK_SYSREQ, "SysReq", "SysReq" },
259 { SDLK_BREAK, "Break", "Break" },
260 { SDLK_MENU, "Menu", "Menu" },
261 { SDLK_POWER, "Power", "Power" }, /* Power Macintosh power key */
262 { SDLK_EURO, "Euro", "\200" }, /* Some european keyboards */
263 { SDLK_UNDO, "Undo", "Undo" } /* Atari keyboard has Undo */
264};
265
266#endif /* ECORE_SDL_KEYS_H__ */
diff --git a/libraries/ecore/src/lib/ecore_sdl/Makefile.am b/libraries/ecore/src/lib/ecore_sdl/Makefile.am
new file mode 100644
index 0000000..27210bb
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_sdl/Makefile.am
@@ -0,0 +1,29 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_evas \
6-I$(top_srcdir)/src/lib/ecore_input \
7-I$(top_builddir)/src/lib/ecore \
8-I$(top_builddir)/src/lib/ecore_evas \
9-I$(top_builddir)/src/lib/ecore_input \
10@EFL_ECORE_SDL_BUILD@ \
11@SDL_CFLAGS@ \
12@EVAS_CFLAGS@ \
13@EINA_CFLAGS@
14
15lib_LTLIBRARIES = libecore_sdl.la
16includes_HEADERS = Ecore_Sdl.h
17includesdir = $(includedir)/ecore-@VMAJ@
18
19libecore_sdl_la_SOURCES = \
20ecore_sdl.c
21
22libecore_sdl_la_LIBADD = \
23$(top_builddir)/src/lib/ecore/libecore.la \
24$(top_builddir)/src/lib/ecore_input/libecore_input.la \
25@SDL_LIBS@ @EVIL_LIBS@ @EINA_LIBS@
26
27libecore_sdl_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
28
29EXTRA_DIST = Ecore_Sdl_Keys.h ecore_sdl_private.h
diff --git a/libraries/ecore/src/lib/ecore_sdl/Makefile.in b/libraries/ecore/src/lib/ecore_sdl/Makefile.in
new file mode 100644
index 0000000..0141ebe
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_sdl/Makefile.in
@@ -0,0 +1,822 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_sdl
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_sdl_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la \
91 $(top_builddir)/src/lib/ecore_input/libecore_input.la
92am_libecore_sdl_la_OBJECTS = ecore_sdl.lo
93libecore_sdl_la_OBJECTS = $(am_libecore_sdl_la_OBJECTS)
94AM_V_lt = $(am__v_lt_$(V))
95am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
96am__v_lt_0 = --silent
97libecore_sdl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
98 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
99 $(AM_CFLAGS) $(CFLAGS) $(libecore_sdl_la_LDFLAGS) $(LDFLAGS) \
100 -o $@
101DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
102depcomp = $(SHELL) $(top_srcdir)/depcomp
103am__depfiles_maybe = depfiles
104am__mv = mv -f
105COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
106 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
107LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
108 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
109 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
110 $(AM_CFLAGS) $(CFLAGS)
111AM_V_CC = $(am__v_CC_$(V))
112am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
113am__v_CC_0 = @echo " CC " $@;
114AM_V_at = $(am__v_at_$(V))
115am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
116am__v_at_0 = @
117CCLD = $(CC)
118LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
119 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
120 $(AM_LDFLAGS) $(LDFLAGS) -o $@
121AM_V_CCLD = $(am__v_CCLD_$(V))
122am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
123am__v_CCLD_0 = @echo " CCLD " $@;
124AM_V_GEN = $(am__v_GEN_$(V))
125am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
126am__v_GEN_0 = @echo " GEN " $@;
127SOURCES = $(libecore_sdl_la_SOURCES)
128DIST_SOURCES = $(libecore_sdl_la_SOURCES)
129HEADERS = $(includes_HEADERS)
130ETAGS = etags
131CTAGS = ctags
132DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
133ACLOCAL = @ACLOCAL@
134ALLOCA = @ALLOCA@
135AMTAR = @AMTAR@
136AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
137AR = @AR@
138AS = @AS@
139AUTOCONF = @AUTOCONF@
140AUTOHEADER = @AUTOHEADER@
141AUTOMAKE = @AUTOMAKE@
142AWK = @AWK@
143CARES_CFLAGS = @CARES_CFLAGS@
144CARES_LIBS = @CARES_LIBS@
145CC = @CC@
146CCDEPMODE = @CCDEPMODE@
147CFLAGS = @CFLAGS@
148CHECK_CFLAGS = @CHECK_CFLAGS@
149CHECK_LIBS = @CHECK_LIBS@
150CPP = @CPP@
151CPPFLAGS = @CPPFLAGS@
152CURL_CFLAGS = @CURL_CFLAGS@
153CURL_LIBS = @CURL_LIBS@
154CXX = @CXX@
155CXXCPP = @CXXCPP@
156CXXDEPMODE = @CXXDEPMODE@
157CXXFLAGS = @CXXFLAGS@
158CYGPATH_W = @CYGPATH_W@
159DEFS = @DEFS@
160DEPDIR = @DEPDIR@
161DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
162DIRECTFB_LIBS = @DIRECTFB_LIBS@
163DLLTOOL = @DLLTOOL@
164DSYMUTIL = @DSYMUTIL@
165DUMPBIN = @DUMPBIN@
166ECHO_C = @ECHO_C@
167ECHO_N = @ECHO_N@
168ECHO_T = @ECHO_T@
169ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
170ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
171EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
172EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
173EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
174EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
175EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
176EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
177EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
178EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
179EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
180EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
181EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
182EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
183EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
184EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
185EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
186EGREP = @EGREP@
187EINA_CFLAGS = @EINA_CFLAGS@
188EINA_LIBS = @EINA_LIBS@
189ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
190ESCAPE_LIBS = @ESCAPE_LIBS@
191EVAS_CFLAGS = @EVAS_CFLAGS@
192EVAS_LIBS = @EVAS_LIBS@
193EVIL_CFLAGS = @EVIL_CFLAGS@
194EVIL_LIBS = @EVIL_LIBS@
195EXEEXT = @EXEEXT@
196FGREP = @FGREP@
197GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
198GLIB_CFLAGS = @GLIB_CFLAGS@
199GLIB_LIBS = @GLIB_LIBS@
200GMSGFMT = @GMSGFMT@
201GMSGFMT_015 = @GMSGFMT_015@
202GREP = @GREP@
203INSTALL = @INSTALL@
204INSTALL_DATA = @INSTALL_DATA@
205INSTALL_PROGRAM = @INSTALL_PROGRAM@
206INSTALL_SCRIPT = @INSTALL_SCRIPT@
207INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
208INTLLIBS = @INTLLIBS@
209INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
210KEYSYMDEFS = @KEYSYMDEFS@
211LD = @LD@
212LDFLAGS = @LDFLAGS@
213LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
214LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
215LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
216LIBICONV = @LIBICONV@
217LIBINTL = @LIBINTL@
218LIBOBJS = @LIBOBJS@
219LIBS = @LIBS@
220LIBTOOL = @LIBTOOL@
221LIPO = @LIPO@
222LN_S = @LN_S@
223LTLIBICONV = @LTLIBICONV@
224LTLIBINTL = @LTLIBINTL@
225LTLIBOBJS = @LTLIBOBJS@
226MAKEINFO = @MAKEINFO@
227MKDIR_P = @MKDIR_P@
228MSGFMT = @MSGFMT@
229MSGFMT_015 = @MSGFMT_015@
230MSGMERGE = @MSGMERGE@
231NM = @NM@
232NMEDIT = @NMEDIT@
233OBJC = @OBJC@
234OBJCDEPMODE = @OBJCDEPMODE@
235OBJCFLAGS = @OBJCFLAGS@
236OBJDUMP = @OBJDUMP@
237OBJEXT = @OBJEXT@
238OTOOL = @OTOOL@
239OTOOL64 = @OTOOL64@
240PACKAGE = @PACKAGE@
241PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
242PACKAGE_NAME = @PACKAGE_NAME@
243PACKAGE_STRING = @PACKAGE_STRING@
244PACKAGE_TARNAME = @PACKAGE_TARNAME@
245PACKAGE_URL = @PACKAGE_URL@
246PACKAGE_VERSION = @PACKAGE_VERSION@
247PATH_SEPARATOR = @PATH_SEPARATOR@
248PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
249PIXMAN_LIBS = @PIXMAN_LIBS@
250PKG_CONFIG = @PKG_CONFIG@
251PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
252PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
253POSUB = @POSUB@
254RANLIB = @RANLIB@
255SDL_CFLAGS = @SDL_CFLAGS@
256SDL_CONFIG = @SDL_CONFIG@
257SDL_LIBS = @SDL_LIBS@
258SED = @SED@
259SET_MAKE = @SET_MAKE@
260SHELL = @SHELL@
261SSL_CFLAGS = @SSL_CFLAGS@
262SSL_LIBS = @SSL_LIBS@
263STRIP = @STRIP@
264TLS2_CFLAGS = @TLS2_CFLAGS@
265TLS2_LIBS = @TLS2_LIBS@
266TLS_CFLAGS = @TLS_CFLAGS@
267TLS_LIBS = @TLS_LIBS@
268TSLIB_CFLAGS = @TSLIB_CFLAGS@
269TSLIB_LIBS = @TSLIB_LIBS@
270USE_NLS = @USE_NLS@
271VERSION = @VERSION@
272VMAJ = @VMAJ@
273WIN32_CFLAGS = @WIN32_CFLAGS@
274WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
275WIN32_LIBS = @WIN32_LIBS@
276XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
277XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
278XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
279XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
280XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
281XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
282XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
283XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
284XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
285XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
286XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
287XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
288XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
289XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
290XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
291XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
292XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
293XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
294XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
295XCB_X11_LIBS = @XCB_X11_LIBS@
296XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
297XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
298XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
299XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
300XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
301XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
302XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
303XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
304XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
305XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
306XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
307XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
308XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
309XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
310XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
311XDAMAGE_LIBS = @XDAMAGE_LIBS@
312XDPMS_CFLAGS = @XDPMS_CFLAGS@
313XDPMS_LIBS = @XDPMS_LIBS@
314XFIXES_CFLAGS = @XFIXES_CFLAGS@
315XFIXES_LIBS = @XFIXES_LIBS@
316XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
317XGESTURE_LIBS = @XGESTURE_LIBS@
318XGETTEXT = @XGETTEXT@
319XGETTEXT_015 = @XGETTEXT_015@
320XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
321XI2_CFLAGS = @XI2_CFLAGS@
322XI2_LIBS = @XI2_LIBS@
323XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
324XINERAMA_LIBS = @XINERAMA_LIBS@
325XKB_CFLAGS = @XKB_CFLAGS@
326XKB_LIBS = @XKB_LIBS@
327XMKMF = @XMKMF@
328XPRINT_CFLAGS = @XPRINT_CFLAGS@
329XPRINT_LIBS = @XPRINT_LIBS@
330XRANDR_CFLAGS = @XRANDR_CFLAGS@
331XRANDR_LIBS = @XRANDR_LIBS@
332XRENDER_CFLAGS = @XRENDER_CFLAGS@
333XRENDER_LIBS = @XRENDER_LIBS@
334XSS_CFLAGS = @XSS_CFLAGS@
335XSS_LIBS = @XSS_LIBS@
336XTEST_CFLAGS = @XTEST_CFLAGS@
337XTEST_LIBS = @XTEST_LIBS@
338X_CFLAGS = @X_CFLAGS@
339X_EXTRA_LIBS = @X_EXTRA_LIBS@
340X_LIBS = @X_LIBS@
341X_PRE_LIBS = @X_PRE_LIBS@
342Xcursor_cflags = @Xcursor_cflags@
343Xcursor_libs = @Xcursor_libs@
344abs_builddir = @abs_builddir@
345abs_srcdir = @abs_srcdir@
346abs_top_builddir = @abs_top_builddir@
347abs_top_srcdir = @abs_top_srcdir@
348ac_ct_CC = @ac_ct_CC@
349ac_ct_CXX = @ac_ct_CXX@
350ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
351ac_ct_OBJC = @ac_ct_OBJC@
352am__include = @am__include@
353am__leading_dot = @am__leading_dot@
354am__quote = @am__quote@
355am__tar = @am__tar@
356am__untar = @am__untar@
357bindir = @bindir@
358build = @build@
359build_alias = @build_alias@
360build_cpu = @build_cpu@
361build_os = @build_os@
362build_vendor = @build_vendor@
363builddir = @builddir@
364cocoa_ldflags = @cocoa_ldflags@
365datadir = @datadir@
366datarootdir = @datarootdir@
367dlopen_libs = @dlopen_libs@
368docdir = @docdir@
369dvidir = @dvidir@
370ecore_cocoa_cflags = @ecore_cocoa_cflags@
371ecore_cocoa_libs = @ecore_cocoa_libs@
372ecore_con_cflags = @ecore_con_cflags@
373ecore_con_libs = @ecore_con_libs@
374ecore_directfb_cflags = @ecore_directfb_cflags@
375ecore_directfb_libs = @ecore_directfb_libs@
376ecore_evas_cflags = @ecore_evas_cflags@
377ecore_evas_libs = @ecore_evas_libs@
378ecore_fb_cflags = @ecore_fb_cflags@
379ecore_fb_libs = @ecore_fb_libs@
380ecore_file_cflags = @ecore_file_cflags@
381ecore_file_libs = @ecore_file_libs@
382ecore_imf_cflags = @ecore_imf_cflags@
383ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
384ecore_imf_evas_libs = @ecore_imf_evas_libs@
385ecore_imf_libs = @ecore_imf_libs@
386ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
387ecore_imf_xim_libs = @ecore_imf_xim_libs@
388ecore_input_cflags = @ecore_input_cflags@
389ecore_input_evas_cflags = @ecore_input_evas_cflags@
390ecore_input_evas_libs = @ecore_input_evas_libs@
391ecore_input_libs = @ecore_input_libs@
392ecore_ipc_cflags = @ecore_ipc_cflags@
393ecore_ipc_libs = @ecore_ipc_libs@
394ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
395ecore_psl1ght_libs = @ecore_psl1ght_libs@
396ecore_sdl_cflags = @ecore_sdl_cflags@
397ecore_sdl_libs = @ecore_sdl_libs@
398ecore_win32_cflags = @ecore_win32_cflags@
399ecore_win32_libs = @ecore_win32_libs@
400ecore_wince_cflags = @ecore_wince_cflags@
401ecore_wince_libs = @ecore_wince_libs@
402ecore_x_cflags = @ecore_x_cflags@
403ecore_x_libs = @ecore_x_libs@
404ecore_x_libs_private = @ecore_x_libs_private@
405efl_doxygen = @efl_doxygen@
406efl_have_doxygen = @efl_have_doxygen@
407exec_prefix = @exec_prefix@
408have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
409host = @host@
410host_alias = @host_alias@
411host_cpu = @host_cpu@
412host_os = @host_os@
413host_vendor = @host_vendor@
414htmldir = @htmldir@
415includedir = @includedir@
416infodir = @infodir@
417install_sh = @install_sh@
418libdir = @libdir@
419libexecdir = @libexecdir@
420localedir = @localedir@
421localstatedir = @localstatedir@
422lt_ECHO = @lt_ECHO@
423lt_enable_auto_import = @lt_enable_auto_import@
424mandir = @mandir@
425mkdir_p = @mkdir_p@
426oldincludedir = @oldincludedir@
427pdfdir = @pdfdir@
428pkgconfig_requires_private = @pkgconfig_requires_private@
429prefix = @prefix@
430program_transform_name = @program_transform_name@
431psdir = @psdir@
432release_info = @release_info@
433requirements_ecore = @requirements_ecore@
434requirements_ecore_cocoa = @requirements_ecore_cocoa@
435requirements_ecore_con = @requirements_ecore_con@
436requirements_ecore_directfb = @requirements_ecore_directfb@
437requirements_ecore_evas = @requirements_ecore_evas@
438requirements_ecore_fb = @requirements_ecore_fb@
439requirements_ecore_file = @requirements_ecore_file@
440requirements_ecore_imf = @requirements_ecore_imf@
441requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
442requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
443requirements_ecore_input = @requirements_ecore_input@
444requirements_ecore_input_evas = @requirements_ecore_input_evas@
445requirements_ecore_ipc = @requirements_ecore_ipc@
446requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
447requirements_ecore_sdl = @requirements_ecore_sdl@
448requirements_ecore_win32 = @requirements_ecore_win32@
449requirements_ecore_wince = @requirements_ecore_wince@
450requirements_ecore_x = @requirements_ecore_x@
451rt_libs = @rt_libs@
452sbindir = @sbindir@
453sharedstatedir = @sharedstatedir@
454srcdir = @srcdir@
455sysconfdir = @sysconfdir@
456target_alias = @target_alias@
457top_build_prefix = @top_build_prefix@
458top_builddir = @top_builddir@
459top_srcdir = @top_srcdir@
460version_info = @version_info@
461x_cflags = @x_cflags@
462x_includes = @x_includes@
463x_libs = @x_libs@
464MAINTAINERCLEANFILES = Makefile.in
465AM_CPPFLAGS = \
466-I$(top_srcdir)/src/lib/ecore \
467-I$(top_srcdir)/src/lib/ecore_evas \
468-I$(top_srcdir)/src/lib/ecore_input \
469-I$(top_builddir)/src/lib/ecore \
470-I$(top_builddir)/src/lib/ecore_evas \
471-I$(top_builddir)/src/lib/ecore_input \
472@EFL_ECORE_SDL_BUILD@ \
473@SDL_CFLAGS@ \
474@EVAS_CFLAGS@ \
475@EINA_CFLAGS@
476
477lib_LTLIBRARIES = libecore_sdl.la
478includes_HEADERS = Ecore_Sdl.h
479includesdir = $(includedir)/ecore-@VMAJ@
480libecore_sdl_la_SOURCES = \
481ecore_sdl.c
482
483libecore_sdl_la_LIBADD = \
484$(top_builddir)/src/lib/ecore/libecore.la \
485$(top_builddir)/src/lib/ecore_input/libecore_input.la \
486@SDL_LIBS@ @EVIL_LIBS@ @EINA_LIBS@
487
488libecore_sdl_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
489EXTRA_DIST = Ecore_Sdl_Keys.h ecore_sdl_private.h
490all: all-am
491
492.SUFFIXES:
493.SUFFIXES: .c .lo .o .obj
494$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
495 @for dep in $?; do \
496 case '$(am__configure_deps)' in \
497 *$$dep*) \
498 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
499 && { if test -f $@; then exit 0; else break; fi; }; \
500 exit 1;; \
501 esac; \
502 done; \
503 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_sdl/Makefile'; \
504 $(am__cd) $(top_srcdir) && \
505 $(AUTOMAKE) --gnu src/lib/ecore_sdl/Makefile
506.PRECIOUS: Makefile
507Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
508 @case '$?' in \
509 *config.status*) \
510 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
511 *) \
512 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
513 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
514 esac;
515
516$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
517 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
518
519$(top_srcdir)/configure: $(am__configure_deps)
520 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
521$(ACLOCAL_M4): $(am__aclocal_m4_deps)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523$(am__aclocal_m4_deps):
524install-libLTLIBRARIES: $(lib_LTLIBRARIES)
525 @$(NORMAL_INSTALL)
526 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
527 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
528 list2=; for p in $$list; do \
529 if test -f $$p; then \
530 list2="$$list2 $$p"; \
531 else :; fi; \
532 done; \
533 test -z "$$list2" || { \
534 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
535 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
536 }
537
538uninstall-libLTLIBRARIES:
539 @$(NORMAL_UNINSTALL)
540 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
541 for p in $$list; do \
542 $(am__strip_dir) \
543 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
544 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
545 done
546
547clean-libLTLIBRARIES:
548 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
549 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
550 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
551 test "$$dir" != "$$p" || dir=.; \
552 echo "rm -f \"$${dir}/so_locations\""; \
553 rm -f "$${dir}/so_locations"; \
554 done
555libecore_sdl.la: $(libecore_sdl_la_OBJECTS) $(libecore_sdl_la_DEPENDENCIES)
556 $(AM_V_CCLD)$(libecore_sdl_la_LINK) -rpath $(libdir) $(libecore_sdl_la_OBJECTS) $(libecore_sdl_la_LIBADD) $(LIBS)
557
558mostlyclean-compile:
559 -rm -f *.$(OBJEXT)
560
561distclean-compile:
562 -rm -f *.tab.c
563
564@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_sdl.Plo@am__quote@
565
566.c.o:
567@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
568@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
569@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
570@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
571@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
572@am__fastdepCC_FALSE@ $(COMPILE) -c $<
573
574.c.obj:
575@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
576@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
577@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
578@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
579@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
580@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
581
582.c.lo:
583@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
584@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
585@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
587@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
588@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
589
590mostlyclean-libtool:
591 -rm -f *.lo
592
593clean-libtool:
594 -rm -rf .libs _libs
595install-includesHEADERS: $(includes_HEADERS)
596 @$(NORMAL_INSTALL)
597 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
598 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
599 for p in $$list; do \
600 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
601 echo "$$d$$p"; \
602 done | $(am__base_list) | \
603 while read files; do \
604 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
605 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
606 done
607
608uninstall-includesHEADERS:
609 @$(NORMAL_UNINSTALL)
610 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
611 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
612 test -n "$$files" || exit 0; \
613 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
614 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
615
616ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
617 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
618 unique=`for i in $$list; do \
619 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
620 done | \
621 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
622 END { if (nonempty) { for (i in files) print i; }; }'`; \
623 mkid -fID $$unique
624tags: TAGS
625
626TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
627 $(TAGS_FILES) $(LISP)
628 set x; \
629 here=`pwd`; \
630 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
631 unique=`for i in $$list; do \
632 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
633 done | \
634 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
635 END { if (nonempty) { for (i in files) print i; }; }'`; \
636 shift; \
637 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
638 test -n "$$unique" || unique=$$empty_fix; \
639 if test $$# -gt 0; then \
640 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
641 "$$@" $$unique; \
642 else \
643 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
644 $$unique; \
645 fi; \
646 fi
647ctags: CTAGS
648CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
649 $(TAGS_FILES) $(LISP)
650 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
651 unique=`for i in $$list; do \
652 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
653 done | \
654 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
655 END { if (nonempty) { for (i in files) print i; }; }'`; \
656 test -z "$(CTAGS_ARGS)$$unique" \
657 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
658 $$unique
659
660GTAGS:
661 here=`$(am__cd) $(top_builddir) && pwd` \
662 && $(am__cd) $(top_srcdir) \
663 && gtags -i $(GTAGS_ARGS) "$$here"
664
665distclean-tags:
666 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
667
668distdir: $(DISTFILES)
669 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
670 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
671 list='$(DISTFILES)'; \
672 dist_files=`for file in $$list; do echo $$file; done | \
673 sed -e "s|^$$srcdirstrip/||;t" \
674 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
675 case $$dist_files in \
676 */*) $(MKDIR_P) `echo "$$dist_files" | \
677 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
678 sort -u` ;; \
679 esac; \
680 for file in $$dist_files; do \
681 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
682 if test -d $$d/$$file; then \
683 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
684 if test -d "$(distdir)/$$file"; then \
685 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
686 fi; \
687 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
688 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
689 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
690 fi; \
691 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
692 else \
693 test -f "$(distdir)/$$file" \
694 || cp -p $$d/$$file "$(distdir)/$$file" \
695 || exit 1; \
696 fi; \
697 done
698check-am: all-am
699check: check-am
700all-am: Makefile $(LTLIBRARIES) $(HEADERS)
701installdirs:
702 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
703 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
704 done
705install: install-am
706install-exec: install-exec-am
707install-data: install-data-am
708uninstall: uninstall-am
709
710install-am: all-am
711 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
712
713installcheck: installcheck-am
714install-strip:
715 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
716 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
717 `test -z '$(STRIP)' || \
718 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
719mostlyclean-generic:
720
721clean-generic:
722
723distclean-generic:
724 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
725 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
726
727maintainer-clean-generic:
728 @echo "This command is intended for maintainers to use"
729 @echo "it deletes files that may require special tools to rebuild."
730 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
731clean: clean-am
732
733clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
734 mostlyclean-am
735
736distclean: distclean-am
737 -rm -rf ./$(DEPDIR)
738 -rm -f Makefile
739distclean-am: clean-am distclean-compile distclean-generic \
740 distclean-tags
741
742dvi: dvi-am
743
744dvi-am:
745
746html: html-am
747
748html-am:
749
750info: info-am
751
752info-am:
753
754install-data-am: install-includesHEADERS
755
756install-dvi: install-dvi-am
757
758install-dvi-am:
759
760install-exec-am: install-libLTLIBRARIES
761
762install-html: install-html-am
763
764install-html-am:
765
766install-info: install-info-am
767
768install-info-am:
769
770install-man:
771
772install-pdf: install-pdf-am
773
774install-pdf-am:
775
776install-ps: install-ps-am
777
778install-ps-am:
779
780installcheck-am:
781
782maintainer-clean: maintainer-clean-am
783 -rm -rf ./$(DEPDIR)
784 -rm -f Makefile
785maintainer-clean-am: distclean-am maintainer-clean-generic
786
787mostlyclean: mostlyclean-am
788
789mostlyclean-am: mostlyclean-compile mostlyclean-generic \
790 mostlyclean-libtool
791
792pdf: pdf-am
793
794pdf-am:
795
796ps: ps-am
797
798ps-am:
799
800uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
801
802.MAKE: install-am install-strip
803
804.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
805 clean-libLTLIBRARIES clean-libtool ctags distclean \
806 distclean-compile distclean-generic distclean-libtool \
807 distclean-tags distdir dvi dvi-am html html-am info info-am \
808 install install-am install-data install-data-am install-dvi \
809 install-dvi-am install-exec install-exec-am install-html \
810 install-html-am install-includesHEADERS install-info \
811 install-info-am install-libLTLIBRARIES install-man install-pdf \
812 install-pdf-am install-ps install-ps-am install-strip \
813 installcheck installcheck-am installdirs maintainer-clean \
814 maintainer-clean-generic mostlyclean mostlyclean-compile \
815 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
816 tags uninstall uninstall-am uninstall-includesHEADERS \
817 uninstall-libLTLIBRARIES
818
819
820# Tell versions [3.59,3.63) of GNU make to not export all variables.
821# Otherwise a system limit (for SysV at least) may be exceeded.
822.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_sdl/ecore_sdl.c b/libraries/ecore/src/lib/ecore_sdl/ecore_sdl.c
new file mode 100644
index 0000000..3f28216
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_sdl/ecore_sdl.c
@@ -0,0 +1,335 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <SDL/SDL.h>
6
7#include "Eina.h"
8#include "Ecore_Sdl.h"
9#include "Ecore_Input.h"
10#include "Ecore.h"
11#include "ecore_sdl_private.h"
12#include "ecore_private.h"
13#include "Ecore_Sdl_Keys.h"
14
15#include <eina_rbtree.h>
16
17int _ecore_sdl_log_dom = -1;
18
19typedef struct _Ecore_SDL_Pressed Ecore_SDL_Pressed;
20struct _Ecore_SDL_Pressed
21{
22 EINA_RBTREE;
23
24 SDLKey key;
25};
26
27EAPI int ECORE_SDL_EVENT_GOT_FOCUS = 0;
28EAPI int ECORE_SDL_EVENT_LOST_FOCUS = 0;
29EAPI int ECORE_SDL_EVENT_RESIZE = 0;
30EAPI int ECORE_SDL_EVENT_EXPOSE = 0;
31
32static int _ecore_sdl_init_count = 0;
33static Eina_Rbtree *repeat = NULL;
34
35static Eina_Rbtree_Direction
36_ecore_sdl_pressed_key(const Ecore_SDL_Pressed *left,
37 const Ecore_SDL_Pressed *right,
38 __UNUSED__ void *data)
39{
40 return left->key < right->key ? EINA_RBTREE_LEFT : EINA_RBTREE_RIGHT;
41}
42
43static int
44_ecore_sdl_pressed_node(const Ecore_SDL_Pressed *node,
45 const SDLKey *key,
46 __UNUSED__ int length,
47 __UNUSED__ void *data)
48{
49 return node->key - *key;
50}
51
52/**
53 * @defgroup Ecore_Sdl_Library_Group SDL Library Functions
54 *
55 * Functions used to set up and shut down the Ecore_Sdl functions.
56 */
57
58/**
59 * Sets up the Ecore_Sdl library.
60 * @param name device target name
61 * @return @c 0 on failure. Otherwise, the number of times the library has
62 * been initialised without being shut down.
63 * @ingroup Ecore_SDL_Library_Group
64 */
65EAPI int
66ecore_sdl_init(const char *name __UNUSED__)
67{
68 if(++_ecore_sdl_init_count != 1)
69 return _ecore_sdl_init_count;
70 _ecore_sdl_log_dom = eina_log_domain_register
71 ("ecore_sdl", ECORE_SDL_DEFAULT_LOG_COLOR);
72 if(_ecore_sdl_log_dom < 0)
73 {
74 EINA_LOG_ERR("Impossible to create a log domain for the Ecore SDL module.");
75 return --_ecore_sdl_init_count;
76 }
77 if (!ecore_event_init())
78 return --_ecore_sdl_init_count;
79
80 ECORE_SDL_EVENT_GOT_FOCUS = ecore_event_type_new();
81 ECORE_SDL_EVENT_LOST_FOCUS = ecore_event_type_new();
82 ECORE_SDL_EVENT_RESIZE = ecore_event_type_new();
83 ECORE_SDL_EVENT_EXPOSE = ecore_event_type_new();
84
85 SDL_EnableKeyRepeat(200, 100);
86
87 return _ecore_sdl_init_count;
88}
89
90/**
91 * Shuts down the Ecore_Sdl library.
92 * @return @c The number of times the system has been initialised without
93 * being shut down.
94 * @ingroup Ecore_SDL_Library_Group
95 */
96EAPI int
97ecore_sdl_shutdown(void)
98{
99 if (--_ecore_sdl_init_count != 0)
100 return _ecore_sdl_init_count;
101
102 ecore_event_shutdown();
103 eina_log_domain_unregister(_ecore_sdl_log_dom);
104 _ecore_sdl_log_dom = -1;
105 return _ecore_sdl_init_count;
106}
107
108static unsigned int
109_ecore_sdl_event_modifiers(int mod)
110{
111 unsigned int modifiers = 0;
112
113 if(mod & KMOD_LSHIFT) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
114 if(mod & KMOD_RSHIFT) modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
115 if(mod & KMOD_LCTRL) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
116 if(mod & KMOD_RCTRL) modifiers |= ECORE_EVENT_MODIFIER_CTRL;
117 if(mod & KMOD_LALT) modifiers |= ECORE_EVENT_MODIFIER_ALT;
118 if(mod & KMOD_RALT) modifiers |= ECORE_EVENT_MODIFIER_ALT;
119 if(mod & KMOD_NUM) modifiers |= ECORE_EVENT_LOCK_NUM;
120 if(mod & KMOD_CAPS) modifiers |= ECORE_EVENT_LOCK_CAPS;
121
122 return modifiers;
123}
124
125static Ecore_Event_Key*
126_ecore_sdl_event_key(SDL_Event *event, double time)
127{
128 Ecore_Event_Key *ev;
129 unsigned int i;
130
131 ev = malloc(sizeof(Ecore_Event_Key));
132 if (!ev) return NULL;
133
134 ev->timestamp = time;
135 ev->window = 0;
136 ev->event_window = 0;
137 ev->modifiers = _ecore_sdl_event_modifiers(SDL_GetModState());
138 ev->key = NULL;
139 ev->compose = NULL;
140
141 for (i = 0; i < sizeof(keystable) / sizeof(struct _ecore_sdl_keys_s); ++i)
142 if (keystable[i].code == event->key.keysym.sym)
143 {
144 ev->keyname = keystable[i].name;
145 ev->string = keystable[i].compose;
146
147 return ev;
148 }
149
150 free(ev);
151 return NULL;
152}
153
154EAPI void
155ecore_sdl_feed_events(void)
156{
157 SDL_Event event;
158 unsigned int time;
159
160 while(SDL_PollEvent(&event))
161 {
162 time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
163 switch(event.type)
164 {
165 case SDL_MOUSEMOTION:
166 {
167 Ecore_Event_Mouse_Move *ev;
168
169 ev = malloc(sizeof(Ecore_Event_Mouse_Move));
170 if (!ev) return ;
171
172 ev->timestamp = time;
173 ev->window = 0;
174 ev->event_window = 0;
175 ev->modifiers = 0; /* FIXME: keep modifier around. */
176 ev->x = event.motion.x;
177 ev->y = event.motion.y;
178 ev->root.x = ev->x;
179 ev->root.y = ev->y;
180
181 /* Must set multi touch device to 0 or it will get ignored */
182 ev->multi.device = 0;
183 ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
184 ev->multi.pressure = ev->multi.angle = 0;
185 ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
186
187 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
188 break;
189 }
190 case SDL_MOUSEBUTTONDOWN:
191 {
192 if (event.button.button == SDL_BUTTON_WHEELUP ||
193 event.button.button == SDL_BUTTON_WHEELDOWN)
194 {
195 Ecore_Event_Mouse_Wheel *ev;
196
197 ev = malloc(sizeof(Ecore_Event_Mouse_Wheel));
198 if (!ev) return ;
199
200 ev->timestamp = time;
201 ev->window = 0;
202 ev->event_window = 0;
203 ev->modifiers = 0; /* FIXME: keep modifier around. */
204 ev->direction = 0;
205 ev->z = event.button.button == SDL_BUTTON_WHEELDOWN ? -1 : 1;
206
207 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, ev, NULL, NULL);
208 }
209 else
210 {
211 Ecore_Event_Mouse_Button *ev;
212
213 ev = malloc(sizeof(Ecore_Event_Mouse_Button));
214 if (!ev) return ;
215
216 ev->timestamp = time;
217 ev->window = 0;
218 ev->event_window = 0;
219 ev->modifiers = 0; /* FIXME: keep modifier around. */
220 ev->buttons = event.button.button;
221 ev->double_click = 0;
222 ev->triple_click = 0;
223
224 /* Must set multi touch device to 0 or it will get ignored */
225 ev->multi.device = 0;
226 ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
227 ev->multi.pressure = ev->multi.angle = 0;
228 ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
229
230 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
231 }
232 break;
233 }
234 case SDL_MOUSEBUTTONUP:
235 {
236 Ecore_Event_Mouse_Button *ev;
237
238 ev = malloc(sizeof(Ecore_Event_Mouse_Button));
239 if (!ev) return ;
240 ev->timestamp = time;
241 ev->window = 0;
242 ev->event_window = 0;
243 ev->modifiers = 0; /* FIXME: keep modifier around. */
244 ev->buttons = event.button.button;
245 ev->double_click = 0;
246 ev->triple_click = 0;
247
248 /* Must set multi touch device to 0 or it will get ignored */
249 ev->multi.device = 0;
250 ev->multi.radius = ev->multi.radius_x = ev->multi.radius_y = 0;
251 ev->multi.pressure = ev->multi.angle = 0;
252 ev->multi.x = ev->multi.y = ev->multi.root.x = ev->multi.root.y = 0;
253
254 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
255 break;
256 }
257 case SDL_VIDEORESIZE:
258 {
259 Ecore_Sdl_Event_Video_Resize *ev;
260
261 ev = malloc(sizeof (Ecore_Sdl_Event_Video_Resize));
262 ev->w = event.resize.w;
263 ev->h = event.resize.h;
264
265 ecore_event_add(ECORE_SDL_EVENT_RESIZE, ev, NULL, NULL);
266 break;
267 }
268 case SDL_VIDEOEXPOSE:
269 ecore_event_add(ECORE_SDL_EVENT_EXPOSE, NULL, NULL, NULL);
270 break;
271 case SDL_QUIT:
272 ecore_main_loop_quit();
273 break;
274
275 case SDL_KEYDOWN:
276 {
277 Ecore_SDL_Pressed *entry;
278 Ecore_Event_Key *ev;
279
280 entry = (Ecore_SDL_Pressed*) eina_rbtree_inline_lookup(repeat, &event.key.keysym.sym, sizeof (event.key.keysym.sym),
281 EINA_RBTREE_CMP_KEY_CB(_ecore_sdl_pressed_node), NULL);
282 if (entry)
283 {
284 ev = _ecore_sdl_event_key(&event, time);
285 if (ev) ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
286 }
287
288 ev = _ecore_sdl_event_key(&event, time);
289 if (ev) ecore_event_add(ECORE_EVENT_KEY_DOWN, ev, NULL, NULL);
290
291 if (!entry)
292 {
293 entry = malloc(sizeof (Ecore_SDL_Pressed));
294 if (!entry) break;
295
296 entry->key = event.key.keysym.sym;
297
298 repeat = eina_rbtree_inline_insert(repeat, EINA_RBTREE_GET(entry),
299 EINA_RBTREE_CMP_NODE_CB(_ecore_sdl_pressed_key), NULL);
300 }
301 break;
302 }
303 case SDL_KEYUP:
304 {
305 Ecore_Event_Key *ev;
306 Ecore_SDL_Pressed *entry;
307
308 entry = (Ecore_SDL_Pressed*) eina_rbtree_inline_lookup(repeat, &event.key.keysym.sym, sizeof (event.key.keysym.sym),
309 EINA_RBTREE_CMP_KEY_CB(_ecore_sdl_pressed_node), NULL);
310 if (entry)
311 {
312 repeat = eina_rbtree_inline_remove(repeat, EINA_RBTREE_GET(entry),
313 EINA_RBTREE_CMP_NODE_CB(_ecore_sdl_pressed_key), NULL);
314 free(entry);
315 }
316
317 ev = _ecore_sdl_event_key(&event, time);
318 if (ev) ecore_event_add(ECORE_EVENT_KEY_UP, ev, NULL, NULL);
319 break;
320 }
321 case SDL_ACTIVEEVENT:
322 /* FIXME: Focus gain. */
323 break;
324 case SDL_SYSWMEVENT:
325 case SDL_USEREVENT:
326 case SDL_JOYAXISMOTION:
327 case SDL_JOYBALLMOTION:
328 case SDL_JOYHATMOTION:
329 case SDL_JOYBUTTONDOWN:
330 case SDL_JOYBUTTONUP:
331 default:
332 break;
333 }
334 }
335}
diff --git a/libraries/ecore/src/lib/ecore_sdl/ecore_sdl_private.h b/libraries/ecore/src/lib/ecore_sdl/ecore_sdl_private.h
new file mode 100644
index 0000000..37e9570
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_sdl/ecore_sdl_private.h
@@ -0,0 +1,36 @@
1#ifndef _ECORE_SDL_PRIVATE_H
2# define _ECORE_SDL_PRIVATE_H
3
4extern int _ecore_sdl_log_dom;
5
6# ifdef ECORE_SDL_DEFAULT_LOG_COLOR
7# undef ECORE_SDL_DEFAULT_LOG_COLOR
8# endif
9# define ECORE_SDL_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
10
11# ifdef ERR
12# undef ERR
13# endif
14# define ERR(...) EINA_LOG_DOM_ERR(_ecore_sdl_log_dom, __VA_ARGS__)
15
16# ifdef DBG
17# undef DBG
18# endif
19# define DBG(...) EINA_LOG_DOM_DBG(_ecore_sdl_log_dom, __VA_ARGS__)
20
21# ifdef INF
22# undef INF
23# endif
24# define INF(...) EINA_LOG_DOM_INFO(_ecore_sdl_log_dom, __VA_ARGS__)
25
26# ifdef WRN
27# undef WRN
28# endif
29# define WRN(...) EINA_LOG_DOM_WARN(_ecore_sdl_log_dom, __VA_ARGS__)
30
31# ifdef CRIT
32# undef CRIT
33# endif
34# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_sdl_log_dom, __VA_ARGS__)
35
36#endif
diff --git a/libraries/ecore/src/lib/ecore_win32/Ecore_Win32.h b/libraries/ecore/src/lib/ecore_win32/Ecore_Win32.h
new file mode 100644
index 0000000..bdfb1c8
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/Ecore_Win32.h
@@ -0,0 +1,529 @@
1#ifndef __ECORE_WIN32_H__
2#define __ECORE_WIN32_H__
3
4/*
5 * DO NOT USE THIS HEADER. IT IS WORK IN PROGRESS. IT IS NOT FINAL AND
6 * THE API MAY CHANGE.
7 */
8
9#ifndef ECORE_WIN32_WIP_POZEFLKSD
10# ifdef _MSC_VER
11# pragma message ("You are using a work in progress API. This API is not stable")
12# pragma message ("and is subject to change. You use this at your own risk.")
13# else
14# warning "You are using a work in progress API. This API is not stable"
15# warning "and is subject to change. You use this at your own risk."
16# endif
17#endif
18
19#include <Eina.h>
20
21#ifdef EAPI
22# undef EAPI
23#endif
24
25#ifdef _WIN32
26# ifdef EFL_ECORE_WIN32_BUILD
27# ifdef DLL_EXPORT
28# define EAPI __declspec(dllexport)
29# else
30# define EAPI
31# endif /* ! DLL_EXPORT */
32# else
33# define EAPI __declspec(dllimport)
34# endif /* ! EFL_ECORE_WIN32_BUILD */
35#else
36# ifdef __GNUC__
37# if __GNUC__ >= 4
38# define EAPI __attribute__ ((visibility("default")))
39# else
40# define EAPI
41# endif
42# else
43# define EAPI
44# endif
45#endif /* ! _WIN32 */
46
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52/**
53 * @defgroup Ecore_Win32_Group Ecore_Win32 library
54 *
55 * @{
56 */
57
58/**
59 * @typedef Ecore_Win32_Window_State
60 * State of a window.
61 */
62typedef enum
63{
64 ECORE_WIN32_WINDOW_STATE_ICONIFIED, /**< iconified window */
65 ECORE_WIN32_WINDOW_STATE_MODAL, /**< modal dialog box */
66 ECORE_WIN32_WINDOW_STATE_STICKY, /**< sticky window */
67 ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT, /**< maximum vertical sized window */
68 ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ, /**< maximum horizontal sized window */
69 ECORE_WIN32_WINDOW_STATE_MAXIMIZED, /**< maximum sized window */
70 ECORE_WIN32_WINDOW_STATE_SHADED, /**< shaded window */
71 ECORE_WIN32_WINDOW_STATE_HIDDEN, /**< hidden (minimized or iconified) window */
72 ECORE_WIN32_WINDOW_STATE_FULLSCREEN, /**< fullscreen window */
73 ECORE_WIN32_WINDOW_STATE_ABOVE, /**< above window */
74 ECORE_WIN32_WINDOW_STATE_BELOW, /**< below window */
75 ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION, /**< To document */
76 ECORE_WIN32_WINDOW_STATE_UNKNOWN /**< Unknown state */
77} Ecore_Win32_Window_State;
78
79/**
80 * @typedef Ecore_Win32_Window_Type
81 * Type of a window.
82 */
83typedef enum
84{
85 ECORE_WIN32_WINDOW_TYPE_DESKTOP, /**< Desktop feature */
86 ECORE_WIN32_WINDOW_TYPE_DOCK, /**< Dock window (should be on top of other windows) */
87 ECORE_WIN32_WINDOW_TYPE_TOOLBAR, /**< Toolbar window */
88 ECORE_WIN32_WINDOW_TYPE_MENU, /**< Menu window */
89 ECORE_WIN32_WINDOW_TYPE_UTILITY, /**< Small persistent utility window, such as a palette or toolbox */
90 ECORE_WIN32_WINDOW_TYPE_SPLASH, /**< Splash screen window displayed as an application is starting up */
91 ECORE_WIN32_WINDOW_TYPE_DIALOG, /**< Dialog window */
92 ECORE_WIN32_WINDOW_TYPE_NORMAL, /**< Normal top-level window */
93 ECORE_WIN32_WINDOW_TYPE_UNKNOWN /**< Unknown type */
94} Ecore_Win32_Window_Type;
95
96/**
97 * @typedef Ecore_Win32_Cursor_Shape
98 * Shape of a cursor.
99 */
100typedef enum
101{
102 ECORE_WIN32_CURSOR_SHAPE_APP_STARTING, /**< Standard arrow and small hourglass */
103 ECORE_WIN32_CURSOR_SHAPE_ARROW, /**< Standard arrow */
104 ECORE_WIN32_CURSOR_SHAPE_CROSS, /**< Crosshair */
105 ECORE_WIN32_CURSOR_SHAPE_HAND, /**< Hand */
106 ECORE_WIN32_CURSOR_SHAPE_HELP, /**< Arrow and question mark */
107 ECORE_WIN32_CURSOR_SHAPE_I_BEAM, /**< I-beam */
108 ECORE_WIN32_CURSOR_SHAPE_NO, /**< Slashed circle */
109 ECORE_WIN32_CURSOR_SHAPE_SIZE_ALL, /**< Four-pointed arrow pointing north, south, east, and west */
110 ECORE_WIN32_CURSOR_SHAPE_SIZE_NESW, /**< Double-pointed arrow pointing northeast and southwest */
111 ECORE_WIN32_CURSOR_SHAPE_SIZE_NS, /**< Double-pointed arrow pointing north and south */
112 ECORE_WIN32_CURSOR_SHAPE_SIZE_NWSE, /**< Double-pointed arrow pointing northwest and southeast */
113 ECORE_WIN32_CURSOR_SHAPE_SIZE_WE, /**< Double-pointed arrow pointing west and east */
114 ECORE_WIN32_CURSOR_SHAPE_UP_ARROW, /**< Vertical arrow */
115 ECORE_WIN32_CURSOR_SHAPE_WAIT /**< Hourglass */
116} Ecore_Win32_Cursor_Shape;
117
118/**
119 * @typedef Ecore_Win32_DnD_State
120 * State of a DnD operation.
121 */
122typedef enum
123{
124 ECORE_WIN32_DND_EVENT_DRAG_ENTER = 1, /**< Drag enter */
125 ECORE_WIN32_DND_EVENT_DRAG_OVER = 2, /**< Drag over */
126 ECORE_WIN32_DND_EVENT_DRAG_LEAVE = 3, /**< Drag leave */
127 ECORE_WIN32_DND_EVENT_DROP = 4 /**< Drop */
128} Ecore_Win32_DnD_State;
129
130/**
131 * @typedef Ecore_Win32_Window
132 * Abstract type for a window.
133 */
134typedef struct _Ecore_Win32_Window Ecore_Win32_Window;
135
136/**
137 * @typedef Ecore_Win32_Cursor
138 * Abstract type for a cursor.
139 */
140typedef void Ecore_Win32_Cursor;
141
142
143/**
144 * @typedef Ecore_Win32_Event_Mouse_In
145 * Event sent when the mouse enters the window.
146 */
147typedef struct _Ecore_Win32_Event_Mouse_In Ecore_Win32_Event_Mouse_In;
148
149/**
150 * @typedef Ecore_Win32_Event_Mouse_Out
151 * Event sent when the mouse leaves the window.
152 */
153typedef struct _Ecore_Win32_Event_Mouse_Out Ecore_Win32_Event_Mouse_Out;
154
155/**
156 * @typedef Ecore_Win32_Event_Window_Focus_In
157 * Event sent when the window gets the focus.
158 */
159typedef struct _Ecore_Win32_Event_Window_Focus_In Ecore_Win32_Event_Window_Focus_In;
160
161/**
162 * @typedef Ecore_Win32_Event_Window_Focus_Out
163 * Event sent when the window looses the focus.
164 */
165typedef struct _Ecore_Win32_Event_Window_Focus_Out Ecore_Win32_Event_Window_Focus_Out;
166
167/**
168 * @typedef Ecore_Win32_Event_Window_Damage
169 * Event sent when the window is damaged.
170 */
171typedef struct _Ecore_Win32_Event_Window_Damage Ecore_Win32_Event_Window_Damage;
172
173/**
174 * @typedef Ecore_Win32_Event_Window_Create
175 * Event sent when the window is created.
176 */
177typedef struct _Ecore_Win32_Event_Window_Create Ecore_Win32_Event_Window_Create;
178
179/**
180 * @typedef Ecore_Win32_Event_Window_Destroy
181 * Event sent when the window is destroyed.
182 */
183typedef struct _Ecore_Win32_Event_Window_Destroy Ecore_Win32_Event_Window_Destroy;
184
185/**
186 * @typedef Ecore_Win32_Event_Window_Hide
187 * Event sent when the window is hidden.
188 */
189typedef struct _Ecore_Win32_Event_Window_Hide Ecore_Win32_Event_Window_Hide;
190
191/**
192 * @typedef Ecore_Win32_Event_Window_Show
193 * Event sent when the window is shown.
194 */
195typedef struct _Ecore_Win32_Event_Window_Show Ecore_Win32_Event_Window_Show;
196
197/**
198 * @typedef Ecore_Win32_Event_Window_Configure
199 * Event sent when the window is configured.
200 */
201typedef struct _Ecore_Win32_Event_Window_Configure Ecore_Win32_Event_Window_Configure;
202
203/**
204 * @typedef Ecore_Win32_Event_Window_Resize
205 * Event sent when the window is resized.
206 */
207typedef struct _Ecore_Win32_Event_Window_Resize Ecore_Win32_Event_Window_Resize;
208
209/**
210 * @typedef Ecore_Win32_Event_Window_Delete_Request
211 * Event sent when the window is deleted.
212 */
213typedef struct _Ecore_Win32_Event_Window_Delete_Request Ecore_Win32_Event_Window_Delete_Request;
214
215/**
216 * @struct _Ecore_Win32_Event_Mouse_In
217 * Event sent when the mouse enters the window.
218 */
219struct _Ecore_Win32_Event_Mouse_In
220{
221 Ecore_Win32_Window *window; /**< The window that received the event */
222 int x; /**< The x coordinate where the mouse leaved */
223 int y; /**< The y coordinate where the mouse entered */
224 long time; /**< The time the event occurred */
225};
226
227/**
228 * @struct _Ecore_Win32_Event_Mouse_Out
229 * Event sent when the mouse leaves the window.
230 */
231struct _Ecore_Win32_Event_Mouse_Out
232{
233 Ecore_Win32_Window *window; /**< The window that received the event */
234 int x; /**< The x coordinate where the mouse leaved */
235 int y; /**< The y coordinate where the mouse leaved */
236 long time; /**< The time the event occurred */
237};
238
239/**
240 * @struct _Ecore_Win32_Event_Window_Focus_In
241 * Event sent when the window gets the focus.
242 */
243struct _Ecore_Win32_Event_Window_Focus_In
244{
245 Ecore_Win32_Window *window; /**< The window that received the event */
246 long long time; /**< The time the event occurred */
247};
248
249/**
250 * @struct _Ecore_Win32_Event_Window_Focus_Out
251 * Event sent when the window looses the focus.
252 */
253struct _Ecore_Win32_Event_Window_Focus_Out
254{
255 Ecore_Win32_Window *window; /**< The window that received the event */
256 long time; /**< The time the event occurred */
257};
258
259/**
260 * @struct _Ecore_Win32_Event_Window_Damage
261 * Event sent when the window is damaged.
262 */
263struct _Ecore_Win32_Event_Window_Damage
264{
265 Ecore_Win32_Window *window; /**< The window that received the event */
266 int x; /**< The x coordinate of the top left corner of the damaged region */
267 int y; /**< The y coordinate of the top left corner of the damaged region */
268 int width; /**< The width of the damaged region */
269 int height; /**< The time the event occurred */
270 long time; /**< The time the event occurred */
271};
272
273/**
274 * @struct _Ecore_Win32_Event_Window_Create
275 * Event sent when the window is created.
276 */
277struct _Ecore_Win32_Event_Window_Create
278{
279 Ecore_Win32_Window *window; /**< The window that received the event */
280 long time; /**< The time the event occurred */
281};
282
283/**
284 * @struct _Ecore_Win32_Event_Window_Destroy
285 * Event sent when the window is destroyed.
286 */
287struct _Ecore_Win32_Event_Window_Destroy
288{
289 Ecore_Win32_Window *window; /**< The window that received the event */
290 long time; /**< The time the event occurred */
291};
292
293/**
294 * @struct _Ecore_Win32_Event_Window_Hide
295 * Event sent when the window is hidden.
296 */
297struct _Ecore_Win32_Event_Window_Hide
298{
299 Ecore_Win32_Window *window; /**< The window that received the event */
300 long time; /**< The time the event occurred */
301};
302
303/**
304 * @struct _Ecore_Win32_Event_Window_Show
305 * Event sent when the window is shown.
306 */
307struct _Ecore_Win32_Event_Window_Show
308{
309 Ecore_Win32_Window *window; /**< The window that received the event */
310 long time; /**< The time the event occurred */
311};
312
313/**
314 * @struct _Ecore_Win32_Event_Window_Configure
315 * Event sent when the window is configured.
316 */
317struct _Ecore_Win32_Event_Window_Configure
318{
319 Ecore_Win32_Window *window; /**< The window that received the event */
320 Ecore_Win32_Window *abovewin;
321 int x; /**< The new x coordinate of the top left corner */
322 int y; /**< The new y coordinate of the top left corner */
323 int width; /**< The new width */
324 int height; /**< The new height */
325 long time; /**< The time the event occurred */
326};
327
328/**
329 * @struct _Ecore_Win32_Event_Window_Resize
330 * Event sent when the window is resized.
331 */
332struct _Ecore_Win32_Event_Window_Resize
333{
334 Ecore_Win32_Window *window; /**< The window that received the event */
335 int width; /**< The new width */
336 int height; /**< The new height */
337 long time; /**< The time the event occurred */
338};
339
340/**
341 * @struct _Ecore_Win32_Event_Window_Delete_Request
342 * Event sent when the window is deleted.
343 */
344struct _Ecore_Win32_Event_Window_Delete_Request
345{
346 Ecore_Win32_Window *window; /**< The window that received the event */
347 long time; /**< The time the event occurred */
348};
349
350/**
351 * @typedef Ecore_Win32_Dnd_DropTarget_Callback
352 * Callback type for Drop operations. See ecore_win32_dnd_register_drop_target().
353 */
354typedef int (*Ecore_Win32_Dnd_DropTarget_Callback)(void *window, int event, int pt_x, int pt_y, void *data, int size);
355
356EAPI extern int ECORE_WIN32_EVENT_MOUSE_IN; /**< Ecore_Event for the #Ecore_Win32_Event_Mouse_In event */
357EAPI extern int ECORE_WIN32_EVENT_MOUSE_OUT; /**< Ecore_Event for the #Ecore_Win32_Event_Mouse_Out event */
358EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN; /**< Ecore_Event for the #Ecore_Win32_Event_Window_Focus_In event */
359EAPI extern int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT; /**< Ecore_Event for the #Ecore_Win32_Event_Window_Focus_Out event */
360EAPI extern int ECORE_WIN32_EVENT_WINDOW_DAMAGE; /**< Ecore_Event for the #Ecore_Win32_Event_Damage event */
361EAPI extern int ECORE_WIN32_EVENT_WINDOW_CREATE; /**< Ecore_Event for the #Ecore_Win32_Event_Create event */
362EAPI extern int ECORE_WIN32_EVENT_WINDOW_DESTROY; /**< Ecore_Event for the #Ecore_Win32_Event_Destroy event */
363EAPI extern int ECORE_WIN32_EVENT_WINDOW_HIDE; /**< Ecore_Event for the #Ecore_Win32_Event_Hide event */
364EAPI extern int ECORE_WIN32_EVENT_WINDOW_SHOW; /**< Ecore_Event for the #Ecore_Win32_Event_Show event */
365EAPI extern int ECORE_WIN32_EVENT_WINDOW_CONFIGURE; /**< Ecore_Event for the #Ecore_Win32_Event_Configure event */
366EAPI extern int ECORE_WIN32_EVENT_WINDOW_RESIZE; /**< Ecore_Event for the #Ecore_Win32_Event_Resize event */
367EAPI extern int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST; /**< Ecore_Event for the #Ecore_Win32_Event_Window_Delete_Request event */
368
369
370/* Core */
371
372EAPI int ecore_win32_init();
373EAPI int ecore_win32_shutdown();
374EAPI int ecore_win32_screen_depth_get();
375EAPI void ecore_win32_double_click_time_set(double t);
376EAPI double ecore_win32_double_click_time_get(void);
377EAPI long ecore_win32_current_time_get(void);
378
379/* Window */
380
381EAPI Ecore_Win32_Window *ecore_win32_window_new(Ecore_Win32_Window *parent,
382 int x,
383 int y,
384 int width,
385 int height);
386EAPI Ecore_Win32_Window *ecore_win32_window_override_new(Ecore_Win32_Window *parent,
387 int x,
388 int y,
389 int width,
390 int height);
391
392EAPI void ecore_win32_window_free(Ecore_Win32_Window *window);
393
394EAPI void *ecore_win32_window_hwnd_get(Ecore_Win32_Window *window);
395
396EAPI void ecore_win32_window_move(Ecore_Win32_Window *window,
397 int x,
398 int y);
399
400EAPI void ecore_win32_window_resize(Ecore_Win32_Window *window,
401 int width,
402 int height);
403
404EAPI void ecore_win32_window_move_resize(Ecore_Win32_Window *window,
405 int x,
406 int y,
407 int width,
408 int height);
409
410EAPI void ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
411 int *x,
412 int *y,
413 int *width,
414 int *height);
415
416EAPI void ecore_win32_window_size_get(Ecore_Win32_Window *window,
417 int *width,
418 int *height);
419
420EAPI void ecore_win32_window_size_min_set(Ecore_Win32_Window *window,
421 unsigned int min_width,
422 unsigned int min_height);
423
424EAPI void ecore_win32_window_size_min_get(Ecore_Win32_Window *window,
425 unsigned int *min_width,
426 unsigned int *min_height);
427
428EAPI void ecore_win32_window_size_max_set(Ecore_Win32_Window *window,
429 unsigned int max_width,
430 unsigned int max_height);
431
432EAPI void ecore_win32_window_size_max_get(Ecore_Win32_Window *window,
433 unsigned int *max_width,
434 unsigned int *max_height);
435
436EAPI void ecore_win32_window_size_base_set(Ecore_Win32_Window *window,
437 unsigned int base_width,
438 unsigned int base_height);
439
440EAPI void ecore_win32_window_size_base_get(Ecore_Win32_Window *window,
441 unsigned int *base_width,
442 unsigned int *base_height);
443
444EAPI void ecore_win32_window_size_step_set(Ecore_Win32_Window *window,
445 unsigned int step_width,
446 unsigned int step_height);
447
448EAPI void ecore_win32_window_size_step_get(Ecore_Win32_Window *window,
449 unsigned int *step_width,
450 unsigned int *step_height);
451
452EAPI void ecore_win32_window_show(Ecore_Win32_Window *window);
453
454EAPI void ecore_win32_window_hide(Ecore_Win32_Window *window);
455
456EAPI void ecore_win32_window_raise(Ecore_Win32_Window *window);
457
458EAPI void ecore_win32_window_lower(Ecore_Win32_Window *window);
459
460EAPI void ecore_win32_window_title_set(Ecore_Win32_Window *window,
461 const char *title);
462
463EAPI void ecore_win32_window_focus_set(Ecore_Win32_Window *window);
464
465EAPI void ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
466 Eina_Bool on);
467
468EAPI void ecore_win32_window_borderless_set(Ecore_Win32_Window *window,
469 Eina_Bool on);
470
471EAPI void ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window,
472 Eina_Bool on);
473
474EINA_DEPRECATED EAPI void ecore_win32_window_shape_set(Ecore_Win32_Window *window,
475 unsigned short width,
476 unsigned short height,
477 unsigned char *mask);
478
479EAPI void ecore_win32_window_cursor_set(Ecore_Win32_Window *window,
480 Ecore_Win32_Cursor *cursor);
481
482EAPI void ecore_win32_window_state_set(Ecore_Win32_Window *window,
483 Ecore_Win32_Window_State *state,
484 unsigned int num);
485
486EAPI void ecore_win32_window_state_request_send(Ecore_Win32_Window *window,
487 Ecore_Win32_Window_State state,
488 unsigned int set);
489
490EAPI void ecore_win32_window_type_set(Ecore_Win32_Window *window,
491 Ecore_Win32_Window_Type type);
492
493/* Cursor */
494
495EAPI Ecore_Win32_Cursor *ecore_win32_cursor_new(const void *pixels_and,
496 const void *pixels_xor,
497 int width,
498 int height,
499 int hot_x,
500 int hot_y);
501
502EAPI void ecore_win32_cursor_free(Ecore_Win32_Cursor *cursor);
503
504EAPI Ecore_Win32_Cursor *ecore_win32_cursor_shaped_new(Ecore_Win32_Cursor_Shape shape);
505
506EAPI void ecore_win32_cursor_size_get(int *width, int *height);
507
508
509
510/* Drag and drop */
511EAPI int ecore_win32_dnd_init();
512EAPI int ecore_win32_dnd_shutdown();
513EAPI Eina_Bool ecore_win32_dnd_begin(const char *data,
514 int size);
515EAPI Eina_Bool ecore_win32_dnd_register_drop_target(Ecore_Win32_Window *window,
516 Ecore_Win32_Dnd_DropTarget_Callback callback);
517EAPI void ecore_win32_dnd_unregister_drop_target(Ecore_Win32_Window *window);
518
519/**
520 * @}
521 */
522
523
524#ifdef __cplusplus
525}
526#endif
527
528
529#endif /* __ECORE_WIN32_H__ */
diff --git a/libraries/ecore/src/lib/ecore_win32/Makefile.am b/libraries/ecore/src/lib/ecore_win32/Makefile.am
new file mode 100644
index 0000000..ce317c7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/Makefile.am
@@ -0,0 +1,42 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_input \
6-I$(top_builddir)/src/lib/ecore \
7-I$(top_builddir)/src/lib/ecore_input \
8@EFL_ECORE_WIN32_BUILD@ \
9@EINA_CFLAGS@ \
10@WIN32_CPPFLAGS@
11
12lib_LTLIBRARIES = libecore_win32.la
13
14includes_HEADERS = Ecore_Win32.h
15includesdir = $(includedir)/ecore-@VMAJ@
16
17libecore_win32_la_SOURCES = \
18ecore_win32.c \
19ecore_win32_cursor.c \
20ecore_win32_dnd.c \
21ecore_win32_dnd_enumformatetc.cpp \
22ecore_win32_dnd_data_object.cpp \
23ecore_win32_dnd_drop_source.cpp \
24ecore_win32_dnd_drop_target.cpp \
25ecore_win32_event.c \
26ecore_win32_window.c
27
28libecore_win32_la_LIBADD = \
29@ecore_win32_libs@ \
30@WIN32_LIBS@ \
31$(top_builddir)/src/lib/ecore/libecore.la \
32$(top_builddir)/src/lib/ecore_input/libecore_input.la \
33@EINA_LIBS@
34
35libecore_win32_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
36
37EXTRA_DIST = \
38ecore_win32_private.h \
39ecore_win32_dnd_enumformatetc.h \
40ecore_win32_dnd_data_object.h \
41ecore_win32_dnd_drop_source.h \
42ecore_win32_dnd_drop_target.h
diff --git a/libraries/ecore/src/lib/ecore_win32/Makefile.in b/libraries/ecore/src/lib/ecore_win32/Makefile.in
new file mode 100644
index 0000000..4e4f363
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/Makefile.in
@@ -0,0 +1,887 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_win32
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_win32_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore/libecore.la \
91 $(top_builddir)/src/lib/ecore_input/libecore_input.la
92am_libecore_win32_la_OBJECTS = ecore_win32.lo ecore_win32_cursor.lo \
93 ecore_win32_dnd.lo ecore_win32_dnd_enumformatetc.lo \
94 ecore_win32_dnd_data_object.lo ecore_win32_dnd_drop_source.lo \
95 ecore_win32_dnd_drop_target.lo ecore_win32_event.lo \
96 ecore_win32_window.lo
97libecore_win32_la_OBJECTS = $(am_libecore_win32_la_OBJECTS)
98AM_V_lt = $(am__v_lt_$(V))
99am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
100am__v_lt_0 = --silent
101libecore_win32_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
102 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
103 $(AM_CXXFLAGS) $(CXXFLAGS) $(libecore_win32_la_LDFLAGS) \
104 $(LDFLAGS) -o $@
105DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
106depcomp = $(SHELL) $(top_srcdir)/depcomp
107am__depfiles_maybe = depfiles
108am__mv = mv -f
109COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
110 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
111LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
112 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
113 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
114 $(AM_CFLAGS) $(CFLAGS)
115AM_V_CC = $(am__v_CC_$(V))
116am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
117am__v_CC_0 = @echo " CC " $@;
118AM_V_at = $(am__v_at_$(V))
119am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
120am__v_at_0 = @
121CCLD = $(CC)
122LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
123 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
124 $(AM_LDFLAGS) $(LDFLAGS) -o $@
125AM_V_CCLD = $(am__v_CCLD_$(V))
126am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
127am__v_CCLD_0 = @echo " CCLD " $@;
128CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
129 $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
130LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
131 $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
132 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
133 $(AM_CXXFLAGS) $(CXXFLAGS)
134AM_V_CXX = $(am__v_CXX_$(V))
135am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY))
136am__v_CXX_0 = @echo " CXX " $@;
137CXXLD = $(CXX)
138CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
139 $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
140 $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
141AM_V_CXXLD = $(am__v_CXXLD_$(V))
142am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY))
143am__v_CXXLD_0 = @echo " CXXLD " $@;
144AM_V_GEN = $(am__v_GEN_$(V))
145am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
146am__v_GEN_0 = @echo " GEN " $@;
147SOURCES = $(libecore_win32_la_SOURCES)
148DIST_SOURCES = $(libecore_win32_la_SOURCES)
149HEADERS = $(includes_HEADERS)
150ETAGS = etags
151CTAGS = ctags
152DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
153ACLOCAL = @ACLOCAL@
154ALLOCA = @ALLOCA@
155AMTAR = @AMTAR@
156AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
157AR = @AR@
158AS = @AS@
159AUTOCONF = @AUTOCONF@
160AUTOHEADER = @AUTOHEADER@
161AUTOMAKE = @AUTOMAKE@
162AWK = @AWK@
163CARES_CFLAGS = @CARES_CFLAGS@
164CARES_LIBS = @CARES_LIBS@
165CC = @CC@
166CCDEPMODE = @CCDEPMODE@
167CFLAGS = @CFLAGS@
168CHECK_CFLAGS = @CHECK_CFLAGS@
169CHECK_LIBS = @CHECK_LIBS@
170CPP = @CPP@
171CPPFLAGS = @CPPFLAGS@
172CURL_CFLAGS = @CURL_CFLAGS@
173CURL_LIBS = @CURL_LIBS@
174CXX = @CXX@
175CXXCPP = @CXXCPP@
176CXXDEPMODE = @CXXDEPMODE@
177CXXFLAGS = @CXXFLAGS@
178CYGPATH_W = @CYGPATH_W@
179DEFS = @DEFS@
180DEPDIR = @DEPDIR@
181DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
182DIRECTFB_LIBS = @DIRECTFB_LIBS@
183DLLTOOL = @DLLTOOL@
184DSYMUTIL = @DSYMUTIL@
185DUMPBIN = @DUMPBIN@
186ECHO_C = @ECHO_C@
187ECHO_N = @ECHO_N@
188ECHO_T = @ECHO_T@
189ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
190ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
191EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
192EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
193EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
194EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
195EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
196EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
197EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
198EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
199EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
200EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
201EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
202EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
203EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
204EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
205EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
206EGREP = @EGREP@
207EINA_CFLAGS = @EINA_CFLAGS@
208EINA_LIBS = @EINA_LIBS@
209ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
210ESCAPE_LIBS = @ESCAPE_LIBS@
211EVAS_CFLAGS = @EVAS_CFLAGS@
212EVAS_LIBS = @EVAS_LIBS@
213EVIL_CFLAGS = @EVIL_CFLAGS@
214EVIL_LIBS = @EVIL_LIBS@
215EXEEXT = @EXEEXT@
216FGREP = @FGREP@
217GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
218GLIB_CFLAGS = @GLIB_CFLAGS@
219GLIB_LIBS = @GLIB_LIBS@
220GMSGFMT = @GMSGFMT@
221GMSGFMT_015 = @GMSGFMT_015@
222GREP = @GREP@
223INSTALL = @INSTALL@
224INSTALL_DATA = @INSTALL_DATA@
225INSTALL_PROGRAM = @INSTALL_PROGRAM@
226INSTALL_SCRIPT = @INSTALL_SCRIPT@
227INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
228INTLLIBS = @INTLLIBS@
229INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
230KEYSYMDEFS = @KEYSYMDEFS@
231LD = @LD@
232LDFLAGS = @LDFLAGS@
233LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
234LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
235LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
236LIBICONV = @LIBICONV@
237LIBINTL = @LIBINTL@
238LIBOBJS = @LIBOBJS@
239LIBS = @LIBS@
240LIBTOOL = @LIBTOOL@
241LIPO = @LIPO@
242LN_S = @LN_S@
243LTLIBICONV = @LTLIBICONV@
244LTLIBINTL = @LTLIBINTL@
245LTLIBOBJS = @LTLIBOBJS@
246MAKEINFO = @MAKEINFO@
247MKDIR_P = @MKDIR_P@
248MSGFMT = @MSGFMT@
249MSGFMT_015 = @MSGFMT_015@
250MSGMERGE = @MSGMERGE@
251NM = @NM@
252NMEDIT = @NMEDIT@
253OBJC = @OBJC@
254OBJCDEPMODE = @OBJCDEPMODE@
255OBJCFLAGS = @OBJCFLAGS@
256OBJDUMP = @OBJDUMP@
257OBJEXT = @OBJEXT@
258OTOOL = @OTOOL@
259OTOOL64 = @OTOOL64@
260PACKAGE = @PACKAGE@
261PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
262PACKAGE_NAME = @PACKAGE_NAME@
263PACKAGE_STRING = @PACKAGE_STRING@
264PACKAGE_TARNAME = @PACKAGE_TARNAME@
265PACKAGE_URL = @PACKAGE_URL@
266PACKAGE_VERSION = @PACKAGE_VERSION@
267PATH_SEPARATOR = @PATH_SEPARATOR@
268PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
269PIXMAN_LIBS = @PIXMAN_LIBS@
270PKG_CONFIG = @PKG_CONFIG@
271PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
272PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
273POSUB = @POSUB@
274RANLIB = @RANLIB@
275SDL_CFLAGS = @SDL_CFLAGS@
276SDL_CONFIG = @SDL_CONFIG@
277SDL_LIBS = @SDL_LIBS@
278SED = @SED@
279SET_MAKE = @SET_MAKE@
280SHELL = @SHELL@
281SSL_CFLAGS = @SSL_CFLAGS@
282SSL_LIBS = @SSL_LIBS@
283STRIP = @STRIP@
284TLS2_CFLAGS = @TLS2_CFLAGS@
285TLS2_LIBS = @TLS2_LIBS@
286TLS_CFLAGS = @TLS_CFLAGS@
287TLS_LIBS = @TLS_LIBS@
288TSLIB_CFLAGS = @TSLIB_CFLAGS@
289TSLIB_LIBS = @TSLIB_LIBS@
290USE_NLS = @USE_NLS@
291VERSION = @VERSION@
292VMAJ = @VMAJ@
293WIN32_CFLAGS = @WIN32_CFLAGS@
294WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
295WIN32_LIBS = @WIN32_LIBS@
296XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
297XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
298XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
299XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
300XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
301XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
302XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
303XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
304XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
305XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
306XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
307XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
308XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
309XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
310XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
311XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
312XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
313XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
314XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
315XCB_X11_LIBS = @XCB_X11_LIBS@
316XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
317XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
318XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
319XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
320XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
321XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
322XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
323XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
324XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
325XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
326XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
327XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
328XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
329XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
330XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
331XDAMAGE_LIBS = @XDAMAGE_LIBS@
332XDPMS_CFLAGS = @XDPMS_CFLAGS@
333XDPMS_LIBS = @XDPMS_LIBS@
334XFIXES_CFLAGS = @XFIXES_CFLAGS@
335XFIXES_LIBS = @XFIXES_LIBS@
336XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
337XGESTURE_LIBS = @XGESTURE_LIBS@
338XGETTEXT = @XGETTEXT@
339XGETTEXT_015 = @XGETTEXT_015@
340XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
341XI2_CFLAGS = @XI2_CFLAGS@
342XI2_LIBS = @XI2_LIBS@
343XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
344XINERAMA_LIBS = @XINERAMA_LIBS@
345XKB_CFLAGS = @XKB_CFLAGS@
346XKB_LIBS = @XKB_LIBS@
347XMKMF = @XMKMF@
348XPRINT_CFLAGS = @XPRINT_CFLAGS@
349XPRINT_LIBS = @XPRINT_LIBS@
350XRANDR_CFLAGS = @XRANDR_CFLAGS@
351XRANDR_LIBS = @XRANDR_LIBS@
352XRENDER_CFLAGS = @XRENDER_CFLAGS@
353XRENDER_LIBS = @XRENDER_LIBS@
354XSS_CFLAGS = @XSS_CFLAGS@
355XSS_LIBS = @XSS_LIBS@
356XTEST_CFLAGS = @XTEST_CFLAGS@
357XTEST_LIBS = @XTEST_LIBS@
358X_CFLAGS = @X_CFLAGS@
359X_EXTRA_LIBS = @X_EXTRA_LIBS@
360X_LIBS = @X_LIBS@
361X_PRE_LIBS = @X_PRE_LIBS@
362Xcursor_cflags = @Xcursor_cflags@
363Xcursor_libs = @Xcursor_libs@
364abs_builddir = @abs_builddir@
365abs_srcdir = @abs_srcdir@
366abs_top_builddir = @abs_top_builddir@
367abs_top_srcdir = @abs_top_srcdir@
368ac_ct_CC = @ac_ct_CC@
369ac_ct_CXX = @ac_ct_CXX@
370ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
371ac_ct_OBJC = @ac_ct_OBJC@
372am__include = @am__include@
373am__leading_dot = @am__leading_dot@
374am__quote = @am__quote@
375am__tar = @am__tar@
376am__untar = @am__untar@
377bindir = @bindir@
378build = @build@
379build_alias = @build_alias@
380build_cpu = @build_cpu@
381build_os = @build_os@
382build_vendor = @build_vendor@
383builddir = @builddir@
384cocoa_ldflags = @cocoa_ldflags@
385datadir = @datadir@
386datarootdir = @datarootdir@
387dlopen_libs = @dlopen_libs@
388docdir = @docdir@
389dvidir = @dvidir@
390ecore_cocoa_cflags = @ecore_cocoa_cflags@
391ecore_cocoa_libs = @ecore_cocoa_libs@
392ecore_con_cflags = @ecore_con_cflags@
393ecore_con_libs = @ecore_con_libs@
394ecore_directfb_cflags = @ecore_directfb_cflags@
395ecore_directfb_libs = @ecore_directfb_libs@
396ecore_evas_cflags = @ecore_evas_cflags@
397ecore_evas_libs = @ecore_evas_libs@
398ecore_fb_cflags = @ecore_fb_cflags@
399ecore_fb_libs = @ecore_fb_libs@
400ecore_file_cflags = @ecore_file_cflags@
401ecore_file_libs = @ecore_file_libs@
402ecore_imf_cflags = @ecore_imf_cflags@
403ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
404ecore_imf_evas_libs = @ecore_imf_evas_libs@
405ecore_imf_libs = @ecore_imf_libs@
406ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
407ecore_imf_xim_libs = @ecore_imf_xim_libs@
408ecore_input_cflags = @ecore_input_cflags@
409ecore_input_evas_cflags = @ecore_input_evas_cflags@
410ecore_input_evas_libs = @ecore_input_evas_libs@
411ecore_input_libs = @ecore_input_libs@
412ecore_ipc_cflags = @ecore_ipc_cflags@
413ecore_ipc_libs = @ecore_ipc_libs@
414ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
415ecore_psl1ght_libs = @ecore_psl1ght_libs@
416ecore_sdl_cflags = @ecore_sdl_cflags@
417ecore_sdl_libs = @ecore_sdl_libs@
418ecore_win32_cflags = @ecore_win32_cflags@
419ecore_win32_libs = @ecore_win32_libs@
420ecore_wince_cflags = @ecore_wince_cflags@
421ecore_wince_libs = @ecore_wince_libs@
422ecore_x_cflags = @ecore_x_cflags@
423ecore_x_libs = @ecore_x_libs@
424ecore_x_libs_private = @ecore_x_libs_private@
425efl_doxygen = @efl_doxygen@
426efl_have_doxygen = @efl_have_doxygen@
427exec_prefix = @exec_prefix@
428have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
429host = @host@
430host_alias = @host_alias@
431host_cpu = @host_cpu@
432host_os = @host_os@
433host_vendor = @host_vendor@
434htmldir = @htmldir@
435includedir = @includedir@
436infodir = @infodir@
437install_sh = @install_sh@
438libdir = @libdir@
439libexecdir = @libexecdir@
440localedir = @localedir@
441localstatedir = @localstatedir@
442lt_ECHO = @lt_ECHO@
443lt_enable_auto_import = @lt_enable_auto_import@
444mandir = @mandir@
445mkdir_p = @mkdir_p@
446oldincludedir = @oldincludedir@
447pdfdir = @pdfdir@
448pkgconfig_requires_private = @pkgconfig_requires_private@
449prefix = @prefix@
450program_transform_name = @program_transform_name@
451psdir = @psdir@
452release_info = @release_info@
453requirements_ecore = @requirements_ecore@
454requirements_ecore_cocoa = @requirements_ecore_cocoa@
455requirements_ecore_con = @requirements_ecore_con@
456requirements_ecore_directfb = @requirements_ecore_directfb@
457requirements_ecore_evas = @requirements_ecore_evas@
458requirements_ecore_fb = @requirements_ecore_fb@
459requirements_ecore_file = @requirements_ecore_file@
460requirements_ecore_imf = @requirements_ecore_imf@
461requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
462requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
463requirements_ecore_input = @requirements_ecore_input@
464requirements_ecore_input_evas = @requirements_ecore_input_evas@
465requirements_ecore_ipc = @requirements_ecore_ipc@
466requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
467requirements_ecore_sdl = @requirements_ecore_sdl@
468requirements_ecore_win32 = @requirements_ecore_win32@
469requirements_ecore_wince = @requirements_ecore_wince@
470requirements_ecore_x = @requirements_ecore_x@
471rt_libs = @rt_libs@
472sbindir = @sbindir@
473sharedstatedir = @sharedstatedir@
474srcdir = @srcdir@
475sysconfdir = @sysconfdir@
476target_alias = @target_alias@
477top_build_prefix = @top_build_prefix@
478top_builddir = @top_builddir@
479top_srcdir = @top_srcdir@
480version_info = @version_info@
481x_cflags = @x_cflags@
482x_includes = @x_includes@
483x_libs = @x_libs@
484MAINTAINERCLEANFILES = Makefile.in
485AM_CPPFLAGS = \
486-I$(top_srcdir)/src/lib/ecore \
487-I$(top_srcdir)/src/lib/ecore_input \
488-I$(top_builddir)/src/lib/ecore \
489-I$(top_builddir)/src/lib/ecore_input \
490@EFL_ECORE_WIN32_BUILD@ \
491@EINA_CFLAGS@ \
492@WIN32_CPPFLAGS@
493
494lib_LTLIBRARIES = libecore_win32.la
495includes_HEADERS = Ecore_Win32.h
496includesdir = $(includedir)/ecore-@VMAJ@
497libecore_win32_la_SOURCES = \
498ecore_win32.c \
499ecore_win32_cursor.c \
500ecore_win32_dnd.c \
501ecore_win32_dnd_enumformatetc.cpp \
502ecore_win32_dnd_data_object.cpp \
503ecore_win32_dnd_drop_source.cpp \
504ecore_win32_dnd_drop_target.cpp \
505ecore_win32_event.c \
506ecore_win32_window.c
507
508libecore_win32_la_LIBADD = \
509@ecore_win32_libs@ \
510@WIN32_LIBS@ \
511$(top_builddir)/src/lib/ecore/libecore.la \
512$(top_builddir)/src/lib/ecore_input/libecore_input.la \
513@EINA_LIBS@
514
515libecore_win32_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
516EXTRA_DIST = \
517ecore_win32_private.h \
518ecore_win32_dnd_enumformatetc.h \
519ecore_win32_dnd_data_object.h \
520ecore_win32_dnd_drop_source.h \
521ecore_win32_dnd_drop_target.h
522
523all: all-am
524
525.SUFFIXES:
526.SUFFIXES: .c .cpp .lo .o .obj
527$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
528 @for dep in $?; do \
529 case '$(am__configure_deps)' in \
530 *$$dep*) \
531 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
532 && { if test -f $@; then exit 0; else break; fi; }; \
533 exit 1;; \
534 esac; \
535 done; \
536 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_win32/Makefile'; \
537 $(am__cd) $(top_srcdir) && \
538 $(AUTOMAKE) --gnu src/lib/ecore_win32/Makefile
539.PRECIOUS: Makefile
540Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
541 @case '$?' in \
542 *config.status*) \
543 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
544 *) \
545 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
546 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
547 esac;
548
549$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
550 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
551
552$(top_srcdir)/configure: $(am__configure_deps)
553 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
554$(ACLOCAL_M4): $(am__aclocal_m4_deps)
555 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
556$(am__aclocal_m4_deps):
557install-libLTLIBRARIES: $(lib_LTLIBRARIES)
558 @$(NORMAL_INSTALL)
559 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
560 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
561 list2=; for p in $$list; do \
562 if test -f $$p; then \
563 list2="$$list2 $$p"; \
564 else :; fi; \
565 done; \
566 test -z "$$list2" || { \
567 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
568 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
569 }
570
571uninstall-libLTLIBRARIES:
572 @$(NORMAL_UNINSTALL)
573 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
574 for p in $$list; do \
575 $(am__strip_dir) \
576 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
577 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
578 done
579
580clean-libLTLIBRARIES:
581 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
582 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
583 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
584 test "$$dir" != "$$p" || dir=.; \
585 echo "rm -f \"$${dir}/so_locations\""; \
586 rm -f "$${dir}/so_locations"; \
587 done
588libecore_win32.la: $(libecore_win32_la_OBJECTS) $(libecore_win32_la_DEPENDENCIES)
589 $(AM_V_CXXLD)$(libecore_win32_la_LINK) -rpath $(libdir) $(libecore_win32_la_OBJECTS) $(libecore_win32_la_LIBADD) $(LIBS)
590
591mostlyclean-compile:
592 -rm -f *.$(OBJEXT)
593
594distclean-compile:
595 -rm -f *.tab.c
596
597@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32.Plo@am__quote@
598@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_cursor.Plo@am__quote@
599@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_dnd.Plo@am__quote@
600@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_dnd_data_object.Plo@am__quote@
601@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_dnd_drop_source.Plo@am__quote@
602@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_dnd_drop_target.Plo@am__quote@
603@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_dnd_enumformatetc.Plo@am__quote@
604@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_event.Plo@am__quote@
605@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_win32_window.Plo@am__quote@
606
607.c.o:
608@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
609@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
610@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
611@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
612@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
613@am__fastdepCC_FALSE@ $(COMPILE) -c $<
614
615.c.obj:
616@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
617@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
618@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
619@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
620@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
621@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
622
623.c.lo:
624@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
625@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
626@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
627@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
628@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
629@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
630
631.cpp.o:
632@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
633@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
634@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
635@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
636@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
637@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
638
639.cpp.obj:
640@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
641@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
642@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
643@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
644@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
645@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
646
647.cpp.lo:
648@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
649@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
650@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
651@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
652@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
653@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
654
655mostlyclean-libtool:
656 -rm -f *.lo
657
658clean-libtool:
659 -rm -rf .libs _libs
660install-includesHEADERS: $(includes_HEADERS)
661 @$(NORMAL_INSTALL)
662 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
663 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
664 for p in $$list; do \
665 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
666 echo "$$d$$p"; \
667 done | $(am__base_list) | \
668 while read files; do \
669 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
670 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
671 done
672
673uninstall-includesHEADERS:
674 @$(NORMAL_UNINSTALL)
675 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
676 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
677 test -n "$$files" || exit 0; \
678 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
679 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
680
681ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
682 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
683 unique=`for i in $$list; do \
684 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
685 done | \
686 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
687 END { if (nonempty) { for (i in files) print i; }; }'`; \
688 mkid -fID $$unique
689tags: TAGS
690
691TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
692 $(TAGS_FILES) $(LISP)
693 set x; \
694 here=`pwd`; \
695 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
696 unique=`for i in $$list; do \
697 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
698 done | \
699 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
700 END { if (nonempty) { for (i in files) print i; }; }'`; \
701 shift; \
702 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
703 test -n "$$unique" || unique=$$empty_fix; \
704 if test $$# -gt 0; then \
705 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
706 "$$@" $$unique; \
707 else \
708 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
709 $$unique; \
710 fi; \
711 fi
712ctags: CTAGS
713CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
714 $(TAGS_FILES) $(LISP)
715 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
716 unique=`for i in $$list; do \
717 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
718 done | \
719 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
720 END { if (nonempty) { for (i in files) print i; }; }'`; \
721 test -z "$(CTAGS_ARGS)$$unique" \
722 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
723 $$unique
724
725GTAGS:
726 here=`$(am__cd) $(top_builddir) && pwd` \
727 && $(am__cd) $(top_srcdir) \
728 && gtags -i $(GTAGS_ARGS) "$$here"
729
730distclean-tags:
731 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
732
733distdir: $(DISTFILES)
734 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
735 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
736 list='$(DISTFILES)'; \
737 dist_files=`for file in $$list; do echo $$file; done | \
738 sed -e "s|^$$srcdirstrip/||;t" \
739 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
740 case $$dist_files in \
741 */*) $(MKDIR_P) `echo "$$dist_files" | \
742 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
743 sort -u` ;; \
744 esac; \
745 for file in $$dist_files; do \
746 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
747 if test -d $$d/$$file; then \
748 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
749 if test -d "$(distdir)/$$file"; then \
750 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
751 fi; \
752 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
753 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
754 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
755 fi; \
756 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
757 else \
758 test -f "$(distdir)/$$file" \
759 || cp -p $$d/$$file "$(distdir)/$$file" \
760 || exit 1; \
761 fi; \
762 done
763check-am: all-am
764check: check-am
765all-am: Makefile $(LTLIBRARIES) $(HEADERS)
766installdirs:
767 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
768 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
769 done
770install: install-am
771install-exec: install-exec-am
772install-data: install-data-am
773uninstall: uninstall-am
774
775install-am: all-am
776 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
777
778installcheck: installcheck-am
779install-strip:
780 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
781 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
782 `test -z '$(STRIP)' || \
783 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
784mostlyclean-generic:
785
786clean-generic:
787
788distclean-generic:
789 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
790 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
791
792maintainer-clean-generic:
793 @echo "This command is intended for maintainers to use"
794 @echo "it deletes files that may require special tools to rebuild."
795 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
796clean: clean-am
797
798clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
799 mostlyclean-am
800
801distclean: distclean-am
802 -rm -rf ./$(DEPDIR)
803 -rm -f Makefile
804distclean-am: clean-am distclean-compile distclean-generic \
805 distclean-tags
806
807dvi: dvi-am
808
809dvi-am:
810
811html: html-am
812
813html-am:
814
815info: info-am
816
817info-am:
818
819install-data-am: install-includesHEADERS
820
821install-dvi: install-dvi-am
822
823install-dvi-am:
824
825install-exec-am: install-libLTLIBRARIES
826
827install-html: install-html-am
828
829install-html-am:
830
831install-info: install-info-am
832
833install-info-am:
834
835install-man:
836
837install-pdf: install-pdf-am
838
839install-pdf-am:
840
841install-ps: install-ps-am
842
843install-ps-am:
844
845installcheck-am:
846
847maintainer-clean: maintainer-clean-am
848 -rm -rf ./$(DEPDIR)
849 -rm -f Makefile
850maintainer-clean-am: distclean-am maintainer-clean-generic
851
852mostlyclean: mostlyclean-am
853
854mostlyclean-am: mostlyclean-compile mostlyclean-generic \
855 mostlyclean-libtool
856
857pdf: pdf-am
858
859pdf-am:
860
861ps: ps-am
862
863ps-am:
864
865uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
866
867.MAKE: install-am install-strip
868
869.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
870 clean-libLTLIBRARIES clean-libtool ctags distclean \
871 distclean-compile distclean-generic distclean-libtool \
872 distclean-tags distdir dvi dvi-am html html-am info info-am \
873 install install-am install-data install-data-am install-dvi \
874 install-dvi-am install-exec install-exec-am install-html \
875 install-html-am install-includesHEADERS install-info \
876 install-info-am install-libLTLIBRARIES install-man install-pdf \
877 install-pdf-am install-ps install-ps-am install-strip \
878 installcheck installcheck-am installdirs maintainer-clean \
879 maintainer-clean-generic mostlyclean mostlyclean-compile \
880 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
881 tags uninstall uninstall-am uninstall-includesHEADERS \
882 uninstall-libLTLIBRARIES
883
884
885# Tell versions [3.59,3.63) of GNU make to not export all variables.
886# Otherwise a system limit (for SysV at least) may be exceeded.
887.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32.c b/libraries/ecore/src/lib/ecore_win32/ecore_win32.c
new file mode 100644
index 0000000..19ca3ed
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32.c
@@ -0,0 +1,788 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#define WIN32_LEAN_AND_MEAN
8#include <windows.h>
9#undef WIN32_LEAN_AND_MEAN
10#include <windowsx.h>
11
12#include <Eina.h>
13#include <Ecore.h>
14#include <Ecore_Input.h>
15
16#include "Ecore_Win32.h"
17#include "ecore_win32_private.h"
18
19/*============================================================================*
20 * Local *
21 *============================================================================*/
22
23/**
24 * @cond LOCAL
25 */
26
27/* OLE IID for Drag'n Drop */
28
29# define INITGUID
30# include <basetyps.h>
31DEFINE_OLEGUID(IID_IEnumFORMATETC, 0x00000103L, 0, 0);
32DEFINE_OLEGUID(IID_IDataObject, 0x0000010EL, 0, 0);
33DEFINE_OLEGUID(IID_IDropSource, 0x00000121L, 0, 0);
34DEFINE_OLEGUID(IID_IDropTarget, 0x00000122L, 0, 0);
35DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
36
37#define IDI_ICON 101
38
39static int _ecore_win32_init_count = 0;
40
41static void
42_ecore_win32_size_check(Ecore_Win32_Window *win, int w, int h, int *dx, int *dy)
43{
44 int minimal_width;
45 int minimal_height;
46
47 minimal_width = GetSystemMetrics(SM_CXMIN);
48 minimal_height = GetSystemMetrics(SM_CYMIN);
49 if ((w) < MAX(minimal_width, (int)win->min_width))
50 *dx = 0;
51 if ((w) > (int)win->max_width)
52 *dx = 0;
53 if ((h) < MAX(minimal_height, (int)win->min_height))
54 *dy = 0;
55 if ((h) > (int)win->max_height)
56 *dy = 0;
57}
58
59LRESULT CALLBACK
60_ecore_win32_window_procedure(HWND window,
61 UINT message,
62 WPARAM window_param,
63 LPARAM data_param)
64{
65 Ecore_Win32_Callback_Data *data;
66 POINTS point;
67 DWORD coord;
68
69 data = (Ecore_Win32_Callback_Data *)malloc(sizeof(Ecore_Win32_Callback_Data));
70 if (!data) return DefWindowProc(window, message, window_param, data_param);
71
72 data->window = window;
73 data->message = message;
74 data->window_param = window_param;
75 data->data_param = data_param;
76 data->time = GetMessageTime();
77 coord = GetMessagePos();
78 point = MAKEPOINTS(coord);
79 data->x = point.x;
80 data->y = point.y;
81
82 switch (data->message)
83 {
84 /* Keyboard input notifications */
85 case WM_KEYDOWN:
86 case WM_SYSKEYDOWN:
87 INF("keydown message");
88 _ecore_win32_event_handle_key_press(data, 1);
89 return 0;
90 case WM_CHAR:
91 case WM_SYSCHAR:
92 INF("char message");
93 _ecore_win32_event_handle_key_press(data, 0);
94 return 0;
95 case WM_KEYUP:
96 case WM_SYSKEYUP:
97 INF("keyup message");
98 _ecore_win32_event_handle_key_release(data);
99 return 0;
100 case WM_SETFOCUS:
101 INF("setfocus message");
102 _ecore_win32_event_handle_focus_in(data);
103 return 0;
104 case WM_KILLFOCUS:
105 INF("kill focus message");
106 _ecore_win32_event_handle_focus_out(data);
107 return 0;
108 /* Mouse input notifications */
109 case WM_LBUTTONDOWN:
110 INF("left button down message");
111 SetCapture(window);
112 _ecore_win32_event_handle_button_press(data, 1);
113 return 0;
114 case WM_MBUTTONDOWN:
115 INF("middle button down message");
116 _ecore_win32_event_handle_button_press(data, 2);
117 return 0;
118 case WM_RBUTTONDOWN:
119 INF("right button down message");
120 _ecore_win32_event_handle_button_press(data, 3);
121 return 0;
122 case WM_LBUTTONUP:
123 {
124 Ecore_Win32_Window *w = NULL;
125
126 INF("left button up message");
127
128 ReleaseCapture();
129 w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
130 if (w->drag.dragging)
131 {
132 w->drag.dragging = 0;
133 return 0;
134 }
135
136 _ecore_win32_event_handle_button_release(data, 1);
137 return 0;
138 }
139 case WM_MBUTTONUP:
140 INF("middle button up message");
141 _ecore_win32_event_handle_button_release(data, 2);
142 return 0;
143 case WM_RBUTTONUP:
144 INF("right button up message");
145 _ecore_win32_event_handle_button_release(data, 3);
146 return 0;
147 case WM_MOUSEMOVE:
148 {
149 RECT rect;
150 Ecore_Win32_Window *w = NULL;
151
152 INF("moue move message");
153
154 w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
155
156 if (w->drag.dragging)
157 {
158 POINT pt;
159
160 pt.x = GET_X_LPARAM(data_param);
161 pt.y = GET_Y_LPARAM(data_param);
162 if (ClientToScreen(window, &pt))
163 {
164 if (w->drag.type == HTCAPTION)
165 {
166 int dx;
167 int dy;
168
169 dx = pt.x - w->drag.px;
170 dy = pt.y - w->drag.py;
171 ecore_win32_window_move(w, w->drag.x + dx, w->drag.y + dy);
172 w->drag.x += dx;
173 w->drag.y += dy;
174 w->drag.px = pt.x;
175 w->drag.py = pt.y;
176 return 0;
177 }
178 if (w->drag.type == HTLEFT)
179 {
180 int dw;
181
182 dw = pt.x - w->drag.px;
183 ecore_win32_window_move_resize(w, w->drag.x + dw, w->drag.y, w->drag.w - dw, w->drag.h);
184 w->drag.x += dw;
185 w->drag.w -= dw;
186 w->drag.px = pt.x;
187 w->drag.py = pt.y;
188 return 0;
189 }
190 if (w->drag.type == HTRIGHT)
191 {
192 int dw;
193
194 dw = pt.x - w->drag.px;
195 ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h);
196 w->drag.w += dw;
197 w->drag.px = pt.x;
198 w->drag.py = pt.y;
199 return 0;
200 }
201 if (w->drag.type == HTTOP)
202 {
203 int dh;
204
205 dh = pt.y - w->drag.py;
206 ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dh, w->drag.w, w->drag.h - dh);
207 w->drag.y += dh;
208 w->drag.h -= dh;
209 w->drag.px = pt.x;
210 w->drag.py = pt.y;
211 return 0;
212 }
213 if (w->drag.type == HTBOTTOM)
214 {
215 int dh;
216
217 dh = pt.y - w->drag.py;
218 ecore_win32_window_resize(w, w->drag.w, w->drag.h + dh);
219 w->drag.h += dh;
220 w->drag.px = pt.x;
221 w->drag.py = pt.y;
222 return 0;
223 }
224 if (w->drag.type == HTTOPLEFT)
225 {
226 int dx;
227 int dy;
228 int dh;
229 int dw;
230
231 dw = pt.x - w->drag.px;
232 dh = pt.y - w->drag.py;
233 dx = dw;
234 dy = dh;
235 _ecore_win32_size_check(w,
236 w->drag.w - dw, w->drag.h - dh,
237 &dx, &dy);
238
239 ecore_win32_window_move_resize(w, w->drag.x + dx, w->drag.y + dy, w->drag.w - dw, w->drag.h - dh);
240 w->drag.x += dx;
241 w->drag.y += dy;
242 w->drag.w -= dw;
243 w->drag.h -= dh;
244 w->drag.px = pt.x;
245 w->drag.py = pt.y;
246 return 0;
247 }
248 if (w->drag.type == HTTOPRIGHT)
249 {
250 int dx;
251 int dy;
252 int dh;
253 int dw;
254
255 dw = pt.x - w->drag.px;
256 dh = pt.y - w->drag.py;
257 dx = dw;
258 dy = dh;
259 _ecore_win32_size_check(w,
260 w->drag.w, w->drag.h - dh,
261 &dx, &dy);
262 ecore_win32_window_move_resize(w, w->drag.x, w->drag.y + dy, w->drag.w, w->drag.h - dh);
263 w->drag.y += dy;
264 w->drag.w += dw;
265 w->drag.h -= dh;
266 w->drag.px = pt.x;
267 w->drag.py = pt.y;
268 return 0;
269 }
270 if (w->drag.type == HTBOTTOMLEFT)
271 {
272 int dx;
273 int dy;
274 int dh;
275 int dw;
276
277 dw = pt.x - w->drag.px;
278 dh = pt.y - w->drag.py;
279 dx = dw;
280 dy = dh;
281 _ecore_win32_size_check(w,
282 w->drag.w - dw, w->drag.h + dh,
283 &dx, &dy);
284 ecore_win32_window_move_resize(w, w->drag.x + dx, w->drag.y, w->drag.w - dw, w->drag.h + dh);
285 w->drag.x += dx;
286 w->drag.w -= dw;
287 w->drag.h += dh;
288 w->drag.px = pt.x;
289 w->drag.py = pt.y;
290 return 0;
291 }
292 if (w->drag.type == HTBOTTOMRIGHT)
293 {
294 int dh;
295 int dw;
296
297 dw = pt.x - w->drag.px;
298 dh = pt.y - w->drag.py;
299 ecore_win32_window_resize(w, w->drag.w + dw, w->drag.h + dh);
300 w->drag.w += dw;
301 w->drag.h += dh;
302 w->drag.px = pt.x;
303 w->drag.py = pt.y;
304 return 0;
305 }
306 }
307 }
308
309 if (GetClientRect(window, &rect))
310 {
311 POINT pt;
312
313 INF("mouse in window");
314
315 pt.x = GET_X_LPARAM(data_param);
316 pt.y = GET_Y_LPARAM(data_param);
317 if (!PtInRect(&rect, pt))
318 {
319 if (w->pointer_is_in)
320 {
321 w->pointer_is_in = 0;
322 _ecore_win32_event_handle_leave_notify(data);
323 }
324 }
325 else
326 {
327 if (!w->pointer_is_in)
328 {
329 w->pointer_is_in = 1;
330 _ecore_win32_event_handle_enter_notify(data);
331 }
332 }
333 }
334 else
335 {
336 ERR("GetClientRect() failed");
337 }
338 _ecore_win32_event_handle_motion_notify(data);
339
340 return 0;
341 }
342 case WM_MOUSEWHEEL:
343 INF("mouse wheel message");
344 _ecore_win32_event_handle_button_press(data, 4);
345 return 0;
346 /* Window notifications */
347 case WM_CREATE:
348 INF("create window message");
349 _ecore_win32_event_handle_create_notify(data);
350 return 0;
351 case WM_DESTROY:
352 INF("destroy window message");
353 _ecore_win32_event_handle_destroy_notify(data);
354 return 0;
355 case WM_SHOWWINDOW:
356 INF("show window message");
357 if ((data->data_param == SW_OTHERUNZOOM) ||
358 (data->data_param == SW_OTHERZOOM))
359 return 0;
360
361 if (data->window_param)
362 _ecore_win32_event_handle_map_notify(data);
363 else
364 _ecore_win32_event_handle_unmap_notify(data);
365
366 return 0;
367 case WM_CLOSE:
368 INF("close window message");
369 _ecore_win32_event_handle_delete_request(data);
370 return 0;
371 case WM_GETMINMAXINFO:
372 INF("get min max info window message");
373 return TRUE;
374 case WM_MOVING:
375 INF("moving window message");
376 _ecore_win32_event_handle_configure_notify(data);
377 return TRUE;
378 case WM_MOVE:
379 INF("move window message");
380 return 0;
381 case WM_SIZING:
382 INF("sizing window message");
383 _ecore_win32_event_handle_resize(data);
384 _ecore_win32_event_handle_configure_notify(data);
385 return TRUE;
386 case WM_SIZE:
387 INF("size window message");
388 return 0;
389/* case WM_WINDOWPOSCHANGING: */
390/* { */
391/* RECT rect; */
392/* GetClientRect(window, &rect); */
393/* printf (" *** ecore message : WINDOWPOSCHANGING %ld %ld\n", */
394/* rect.right - rect.left, rect.bottom - rect.top); */
395/* } */
396/* _ecore_win32_event_handle_configure_notify(data); */
397/* return 0; */
398 case WM_WINDOWPOSCHANGED:
399 INF("position changed window message");
400 _ecore_win32_event_handle_configure_notify(data);
401 _ecore_win32_event_handle_expose(data);
402 return 0;
403 case WM_ENTERSIZEMOVE:
404 INF("enter size move window message");
405 return 0;
406 case WM_EXITSIZEMOVE:
407 INF("exit size move window message");
408 return 0;
409 case WM_NCLBUTTONDOWN:
410 INF("non client left button down window message");
411
412 if (((DWORD)window_param == HTCAPTION) ||
413 ((DWORD)window_param == HTBOTTOM) ||
414 ((DWORD)window_param == HTBOTTOMLEFT) ||
415 ((DWORD)window_param == HTBOTTOMRIGHT) ||
416 ((DWORD)window_param == HTLEFT) ||
417 ((DWORD)window_param == HTRIGHT) ||
418 ((DWORD)window_param == HTTOP) ||
419 ((DWORD)window_param == HTTOPLEFT) ||
420 ((DWORD)window_param == HTTOPRIGHT))
421 {
422 Ecore_Win32_Window *w;
423
424 w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
425 ecore_win32_window_geometry_get(w,
426 NULL, NULL,
427 &w->drag.w, &w->drag.h);
428 SetCapture(window);
429 w->drag.type = (DWORD)window_param;
430 w->drag.px = GET_X_LPARAM(data_param);
431 w->drag.py = GET_Y_LPARAM(data_param);
432 w->drag.dragging = 1;
433 return 0;
434 }
435 return DefWindowProc(window, message, window_param, data_param);
436 case WM_SYSCOMMAND:
437 INF("sys command window message %d", (int)window_param);
438
439 if ((((DWORD)window_param & 0xfff0) == SC_MOVE) ||
440 (((DWORD)window_param & 0xfff0) == SC_SIZE))
441 {
442 Ecore_Win32_Window *w;
443
444 INF("sys command MOVE or SIZE window message : %dx%d", GET_X_LPARAM(data_param), GET_Y_LPARAM(data_param));
445
446 w = (Ecore_Win32_Window *)GetWindowLongPtr(window, GWLP_USERDATA);
447 w->drag.dragging = 1;
448 return 0;
449 }
450 return DefWindowProc(window, message, window_param, data_param);
451 /* GDI notifications */
452 case WM_ERASEBKGND:
453 return 1;
454 case WM_PAINT:
455 {
456 RECT rect;
457
458 INF("paint message");
459
460 if (GetUpdateRect(window, &rect, FALSE))
461 {
462 PAINTSTRUCT ps;
463 HDC hdc;
464
465 hdc = BeginPaint(window, &ps);
466 data->update = rect;
467 _ecore_win32_event_handle_expose(data);
468 EndPaint(window, &ps);
469 }
470 return 0;
471 }
472 case WM_SETREDRAW:
473 INF("set redraw message");
474 return 0;
475 case WM_SYNCPAINT:
476 INF("sync paint message");
477 return 0;
478 default:
479 return DefWindowProc(window, message, window_param, data_param);
480 }
481}
482
483/**
484 * @endcond
485 */
486
487
488/*============================================================================*
489 * Global *
490 *============================================================================*/
491
492
493HINSTANCE _ecore_win32_instance = NULL;
494double _ecore_win32_double_click_time = 0.25;
495long _ecore_win32_event_last_time = 0;
496Ecore_Win32_Window *_ecore_win32_event_last_window = NULL;
497int _ecore_win32_log_dom_global = -1;
498
499int ECORE_WIN32_EVENT_MOUSE_IN = 0;
500int ECORE_WIN32_EVENT_MOUSE_OUT = 0;
501int ECORE_WIN32_EVENT_WINDOW_FOCUS_IN = 0;
502int ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT = 0;
503int ECORE_WIN32_EVENT_WINDOW_DAMAGE = 0;
504int ECORE_WIN32_EVENT_WINDOW_CREATE = 0;
505int ECORE_WIN32_EVENT_WINDOW_DESTROY = 0;
506int ECORE_WIN32_EVENT_WINDOW_SHOW = 0;
507int ECORE_WIN32_EVENT_WINDOW_HIDE = 0;
508int ECORE_WIN32_EVENT_WINDOW_CONFIGURE = 0;
509int ECORE_WIN32_EVENT_WINDOW_RESIZE = 0;
510int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = 0;
511
512/*============================================================================*
513 * API *
514 *============================================================================*/
515
516/**
517 * @addtogroup Ecore_Win32_Group Ecore_Win32 library
518 *
519 * Ecore_Win32 is a library that wraps Windows graphic functions
520 * and integrate them nicely into the Ecore main loop.
521 *
522 * @section Ecore_Win32_Sec_Init Initialisation / Shutdown
523 *
524 * To fill...
525 *
526 * @section Ecore_Win32_Sec_Icons How to set icons to an application
527 *
528 * It is possible to also sets the icon of the application easily:
529 *
530 * @li Create an icon with your favorite image creator. The Gimp is a
531 * good choice. Create several images of size 16, 32 and 48. You can
532 * also create images of size 24, 64, 128 and 256. Paste all of them
533 * in the image of size 16 as a layer. Save the image of size 16 with
534 * the name my_icon.ico. Put it where the source code of the
535 * application is located.
536 * @li Create my_icon_rc.rc file with your code editor and add in it:
537 * @code
538 * 101 ICON DISCARDABLE "my_icon.ico"
539 * @endcode
540 * @li With Visual Studio, put that file in the 'Resource file' part
541 * of the project.
542 * @li With MinGW, you have to compile it with windres:
543 * @code
544 * windres my_icon_rc.rc my_icon_rc.o
545 * @endcode
546 * and add my_icon_rc.o to the object files of the application.
547 *
548 * @note The value 101 must not be changed, it's the ID used
549 * internally by Ecore_Win32 to get the icons.
550 *
551 * @{
552 */
553
554/**
555 * @brief Initialize the Ecore_Win32 library.
556 *
557 * @return 1 or greater on success, 0 on error.
558 *
559 * This function sets up the Windows graphic system. It returns 0 on
560 * failure, otherwise it returns the number of times it has already been
561 * called.
562 *
563 * When Ecore_Win32 is not used anymore, call ecore_win32_shutdown()
564 * to shut down the Ecore_Win32 library.
565 */
566EAPI int
567ecore_win32_init()
568{
569 WNDCLASSEX wc;
570 HICON icon;
571 HICON icon_sm;
572
573 if (++_ecore_win32_init_count != 1)
574 return _ecore_win32_init_count;
575
576 if (!eina_init())
577 return --_ecore_win32_init_count;
578
579 _ecore_win32_log_dom_global = eina_log_domain_register
580 ("ecore_win32", ECORE_WIN32_DEFAULT_LOG_COLOR);
581 if (_ecore_win32_log_dom_global < 0)
582 {
583 EINA_LOG_ERR("Ecore_Win32: Could not register log domain");
584 goto shutdown_eina;
585 }
586
587 if (!ecore_event_init())
588 {
589 ERR("Ecore_Win32: Could not init ecore_event");
590 goto unregister_log_domain;
591 }
592
593 _ecore_win32_instance = GetModuleHandle(NULL);
594 if (!_ecore_win32_instance)
595 {
596 ERR("GetModuleHandle() failed");
597 goto shutdown_ecore_event;
598 }
599
600 icon = LoadImage(_ecore_win32_instance,
601 MAKEINTRESOURCE(IDI_ICON),
602 IMAGE_ICON,
603 GetSystemMetrics(SM_CXICON),
604 GetSystemMetrics(SM_CYICON),
605 LR_DEFAULTCOLOR);
606 icon_sm = LoadImage(_ecore_win32_instance,
607 MAKEINTRESOURCE(IDI_ICON),
608 IMAGE_ICON,
609 GetSystemMetrics(SM_CXSMICON),
610 GetSystemMetrics(SM_CYSMICON),
611 LR_DEFAULTCOLOR);
612 if (!icon)
613 icon = LoadIcon (NULL, IDI_APPLICATION);
614 if (!icon_sm)
615 icon_sm = LoadIcon (NULL, IDI_APPLICATION);
616
617 memset (&wc, 0, sizeof (WNDCLASSEX));
618 wc.cbSize = sizeof (WNDCLASSEX);
619 wc.style = CS_HREDRAW | CS_VREDRAW;
620 wc.lpfnWndProc = _ecore_win32_window_procedure;
621 wc.cbClsExtra = 0;
622 wc.cbWndExtra = 0;
623 wc.hInstance = _ecore_win32_instance;
624 wc.hIcon = icon;
625 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
626 wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
627 wc.lpszMenuName = NULL;
628 wc.lpszClassName = ECORE_WIN32_WINDOW_CLASS;
629 wc.hIconSm = icon_sm;
630
631 if(!RegisterClassEx(&wc))
632 {
633 ERR("RegisterClass() failed");
634 goto free_library;
635 }
636
637 if (!ecore_win32_dnd_init())
638 {
639 ERR("ecore_win32_dnd_init() failed");
640 goto unregister_class;
641 }
642
643 if (!ECORE_WIN32_EVENT_MOUSE_IN)
644 {
645 ECORE_WIN32_EVENT_MOUSE_IN = ecore_event_type_new();
646 ECORE_WIN32_EVENT_MOUSE_OUT = ecore_event_type_new();
647 ECORE_WIN32_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
648 ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
649 ECORE_WIN32_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
650 ECORE_WIN32_EVENT_WINDOW_CREATE = ecore_event_type_new();
651 ECORE_WIN32_EVENT_WINDOW_DESTROY = ecore_event_type_new();
652 ECORE_WIN32_EVENT_WINDOW_SHOW = ecore_event_type_new();
653 ECORE_WIN32_EVENT_WINDOW_HIDE = ecore_event_type_new();
654 ECORE_WIN32_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
655 ECORE_WIN32_EVENT_WINDOW_RESIZE = ecore_event_type_new();
656 ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
657 }
658
659 return _ecore_win32_init_count;
660
661 unregister_class:
662 UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance);
663 free_library:
664 FreeLibrary(_ecore_win32_instance);
665 shutdown_ecore_event:
666 ecore_event_shutdown();
667 unregister_log_domain:
668 eina_log_domain_unregister(_ecore_win32_log_dom_global);
669 shutdown_eina:
670 eina_shutdown();
671
672 return --_ecore_win32_init_count;
673}
674
675/**
676 * @brief Shut down the Ecore_Win32 library.
677 *
678 * @return 0 when the library is completely shut down, 1 or
679 * greater otherwise.
680 *
681 * This function shuts down the Ecore_Win32 library. It returns 0 when it has
682 * been called the same number of times than ecore_win32_init(). In that case
683 * it shuts down all the Windows graphic system.
684 */
685EAPI int
686ecore_win32_shutdown()
687{
688 if (--_ecore_win32_init_count != 0)
689 return _ecore_win32_init_count;
690
691 ecore_win32_dnd_shutdown();
692
693 if (!UnregisterClass(ECORE_WIN32_WINDOW_CLASS, _ecore_win32_instance))
694 INF("UnregisterClass() failed");
695
696 if (!FreeLibrary(_ecore_win32_instance))
697 INF("FreeLibrary() failed");
698
699 _ecore_win32_instance = NULL;
700
701 ecore_event_shutdown();
702 eina_log_domain_unregister(_ecore_win32_log_dom_global);
703 _ecore_win32_log_dom_global = -1;
704 eina_shutdown();
705
706 return _ecore_win32_init_count;
707}
708
709/**
710 * @brief Retrieve the depth of the screen.
711 *
712 * @return The depth of the screen.
713 *
714 * This function returns the depth of the screen. If an error occurs,
715 * it returns 0.
716 */
717EAPI int
718ecore_win32_screen_depth_get()
719{
720 HDC dc;
721 int depth;
722
723 INF("getting screen depth");
724
725 dc = GetDC(NULL);
726 if (!dc)
727 {
728 ERR("GetDC() failed");
729 return 0;
730 }
731
732 depth = GetDeviceCaps(dc, BITSPIXEL);
733 if (!ReleaseDC(NULL, dc))
734 {
735 ERR("ReleaseDC() failed (device context not released)");
736 }
737
738 return depth;
739}
740
741/**
742 * @brief Sets the timeout for a double and triple clicks to be flagged.
743 *
744 * @param t The time in seconds.
745 *
746 * This function sets the time @p t between clicks before the
747 * double_click flag is set in a button down event. If 3 clicks occur
748 * within double this time, the triple_click flag is also set.
749 */
750EAPI void
751ecore_win32_double_click_time_set(double t)
752{
753 if (t < 0.0) t = 0.0;
754 _ecore_win32_double_click_time = t;
755}
756
757/**
758 * @brief Retrieve the double and triple click flag timeout.
759 *
760 * @return The timeout for double clicks in seconds.
761 *
762 * This function returns the double clicks in seconds. If
763 * ecore_win32_double_click_time_set() has not been called, the
764 * default value is returned. See ecore_win32_double_click_time_set()
765 * for more informations.
766 */
767EAPI double
768ecore_win32_double_click_time_get(void)
769{
770 return _ecore_win32_double_click_time;
771}
772
773/**
774 * @brief Return the last event time.
775 *
776 * @return The last envent time.
777 *
778 * This function returns the last event time.
779 */
780EAPI long
781ecore_win32_current_time_get(void)
782{
783 return _ecore_win32_event_last_time;
784}
785
786/**
787 * @}
788 */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_cursor.c b/libraries/ecore/src/lib/ecore_win32/ecore_win32_cursor.c
new file mode 100644
index 0000000..9a5a7eb
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_cursor.c
@@ -0,0 +1,306 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#define WIN32_LEAN_AND_MEAN
6#include <windows.h>
7#undef WIN32_LEAN_AND_MEAN
8
9#include <Eina.h>
10
11#include "Ecore_Win32.h"
12#include "ecore_win32_private.h"
13
14/*============================================================================*
15 * Local *
16 *============================================================================*/
17
18
19/*============================================================================*
20 * Global *
21 *============================================================================*/
22
23
24/*============================================================================*
25 * API *
26 *============================================================================*/
27
28/**
29 * @addtogroup Ecore_Win32_Group Ecore_Win32 library
30 *
31 * @{
32 */
33
34/**
35 * @brief Create a new cursor.
36 *
37 * @param pixels_and The array of bytes containing the bit values for
38 * the AND mask of the cursor.
39 * @param pixels_xor The array of bytes containing the bit values for
40 * the XOR mask of the cursor.
41 * @param width The width of the cursor.
42 * @param height The height of the cursor.
43 * @param hot_x The horizontal position of the cursor's hot spot.
44 * @param hot_y The vertical position of the cursor's hot spot.
45 * @return A newly user-defined cursor.
46 *
47 * This function creates a new cursor of size @p width and @p
48 * height. They must be valid size. To determine the valid size of a
49 * cursor, useecore_win32_cursor_size_get(). @p pixels_and is an array
50 * of bytes (unsigned char) containing the bits of the cursor that
51 * will be visible. @p pixels_xor is similar but will allow the cursor
52 * to have a shape. Here is the truth table for the masks:
53 *
54 * <table border=1>
55 * <tr><td>AND mask</td><td>XOR mask</td><td>Display</td></tr>
56 * <tr><td>0</td> <td>0</td> <td>Black</td></tr>
57 * <tr><td>0</td> <td>1</td> <td>White</td></tr>
58 * <tr><td>1</td> <td>0</td> <td>Screen</td></tr>
59 * <tr><td>1</td> <td>1</td> <td>Reverse screen</td></tr>
60 * </table>
61 *
62 * @p hot_x and @p hot_y are the position of the hot spot of the
63 * cursor. If @p pixels_and or @p pixels_xor are @c NULL, the function
64 * returns NULL. If @p width or @p height does not match the valid
65 * size of a cursor, the function returns @c NULL. On success, the
66 * function creates a user-defined cursor, otherwise it returns
67 * @c NULL.
68 *
69 * Once the cursor is not used anymore, use ecore_win32_cursor_free()
70 * to free the ressources.
71 *
72 * Example of use:
73 *
74 * @code
75 * unsigned char pixels_and[] ={
76 * 0xFF, 0xFC, 0x3F, 0xFF, // line 1
77 * 0xFF, 0xC0, 0x1F, 0xFF, // line 2
78 * 0xFF, 0x00, 0x3F, 0xFF, // line 3
79 * 0xFE, 0x00, 0xFF, 0xFF, // line 4
80 *
81 * 0xF7, 0x01, 0xFF, 0xFF, // line 5
82 * 0xF0, 0x03, 0xFF, 0xFF, // line 6
83 * 0xF0, 0x03, 0xFF, 0xFF, // line 7
84 * 0xE0, 0x07, 0xFF, 0xFF, // line 8
85 *
86 * 0xC0, 0x07, 0xFF, 0xFF, // line 9
87 * 0xC0, 0x0F, 0xFF, 0xFF, // line 10
88 * 0x80, 0x0F, 0xFF, 0xFF, // line 11
89 * 0x80, 0x0F, 0xFF, 0xFF, // line 12
90 *
91 * 0x80, 0x07, 0xFF, 0xFF, // line 13
92 * 0x00, 0x07, 0xFF, 0xFF, // line 14
93 * 0x00, 0x03, 0xFF, 0xFF, // line 15
94 * 0x00, 0x00, 0xFF, 0xFF, // line 16
95 *
96 * 0x00, 0x00, 0x7F, 0xFF, // line 17
97 * 0x00, 0x00, 0x1F, 0xFF, // line 18
98 * 0x00, 0x00, 0x0F, 0xFF, // line 19
99 * 0x80, 0x00, 0x0F, 0xFF, // line 20
100 *
101 * 0x80, 0x00, 0x07, 0xFF, // line 21
102 * 0x80, 0x00, 0x07, 0xFF, // line 22
103 * 0xC0, 0x00, 0x07, 0xFF, // line 23
104 * 0xC0, 0x00, 0x0F, 0xFF, // line 24
105 *
106 * 0xE0, 0x00, 0x0F, 0xFF, // line 25
107 * 0xF0, 0x00, 0x1F, 0xFF, // line 26
108 * 0xF0, 0x00, 0x1F, 0xFF, // line 27
109 * 0xF8, 0x00, 0x3F, 0xFF, // line 28
110 *
111 * 0xFE, 0x00, 0x7F, 0xFF, // line 29
112 * 0xFF, 0x00, 0xFF, 0xFF, // line 30
113 * 0xFF, 0xC3, 0xFF, 0xFF, // line 31
114 * 0xFF, 0xFF, 0xFF, 0xFF // line 32
115 * };
116 *
117 * unsigned char pixels_xor[] =
118 * {
119 * 0x00, 0x00, 0x00, 0x00, // line 1
120 * 0x00, 0x03, 0xC0, 0x00, // line 2
121 * 0x00, 0x3F, 0x00, 0x00, // line 3
122 * 0x00, 0xFE, 0x00, 0x00, // line 4
123 *
124 * 0x0E, 0xFC, 0x00, 0x00, // line 5
125 * 0x07, 0xF8, 0x00, 0x00, // line 6
126 * 0x07, 0xF8, 0x00, 0x00, // line 7
127 * 0x0F, 0xF0, 0x00, 0x00, // line 8
128 *
129 * 0x1F, 0xF0, 0x00, 0x00, // line 9
130 * 0x1F, 0xE0, 0x00, 0x00, // line 10
131 * 0x3F, 0xE0, 0x00, 0x00, // line 11
132 * 0x3F, 0xE0, 0x00, 0x00, // line 12
133 *
134 * 0x3F, 0xF0, 0x00, 0x00, // line 13
135 * 0x7F, 0xF0, 0x00, 0x00, // line 14
136 * 0x7F, 0xF8, 0x00, 0x00, // line 15
137 * 0x7F, 0xFC, 0x00, 0x00, // line 16
138 *
139 * 0x7F, 0xFF, 0x00, 0x00, // line 17
140 * 0x7F, 0xFF, 0x80, 0x00, // line 18
141 * 0x7F, 0xFF, 0xE0, 0x00, // line 19
142 * 0x3F, 0xFF, 0xE0, 0x00, // line 20
143 *
144 * 0x3F, 0xC7, 0xF0, 0x00, // line 21
145 * 0x3F, 0x83, 0xF0, 0x00, // line 22
146 * 0x1F, 0x83, 0xF0, 0x00, // line 23
147 * 0x1F, 0x83, 0xE0, 0x00, // line 24
148 *
149 * 0x0F, 0xC7, 0xE0, 0x00, // line 25
150 * 0x07, 0xFF, 0xC0, 0x00, // line 26
151 * 0x07, 0xFF, 0xC0, 0x00, // line 27
152 * 0x01, 0xFF, 0x80, 0x00, // line 28
153 *
154 * 0x00, 0xFF, 0x00, 0x00, // line 29
155 * 0x00, 0x3C, 0x00, 0x00, // line 30
156 * 0x00, 0x00, 0x00, 0x00, // line 31
157 * 0x00, 0x00, 0x00, 0x00 // line 32
158 * };
159 *
160 * Ecore_Win32_Cursor cursor = ecore_win32_cursor_new(pixels_and, pixels_xor, 32, 32, 19, 2);
161 * @endcode
162 */
163EAPI Ecore_Win32_Cursor *
164ecore_win32_cursor_new(const void *pixels_and,
165 const void *pixels_xor,
166 int width,
167 int height,
168 int hot_x,
169 int hot_y)
170{
171 Ecore_Win32_Cursor *cursor = NULL;
172 int cursor_width;
173 int cursor_height;
174
175 INF("creating cursor");
176
177 if (!pixels_and || !pixels_xor)
178 return NULL;
179
180 cursor_width = GetSystemMetrics(SM_CXCURSOR);
181 cursor_height = GetSystemMetrics(SM_CYCURSOR);
182
183 if ((cursor_width != width) ||
184 (cursor_height != height))
185 return NULL;
186
187 if (!(cursor = CreateCursor(_ecore_win32_instance,
188 hot_x, hot_y,
189 width, height,
190 pixels_and,
191 pixels_xor)))
192 return NULL;
193
194 return cursor;
195}
196
197/**
198 * @brief Free the given cursor.
199 *
200 * @param cursor The cursor to free.
201 *
202 * This function free @p cursor. @p cursor must have been obtained
203 * with ecore_win32_cursor_new().
204 */
205EAPI void
206ecore_win32_cursor_free(Ecore_Win32_Cursor *cursor)
207{
208 INF("destroying cursor");
209
210 DestroyCursor(cursor);
211}
212
213/**
214 * @brief Create a cursor from a Windows ressource.
215 *
216 * @param shape The pre-defined shape of the cursor.
217 * @return The new cursor.
218 *
219 * This function returns a pre-defined cursor with a specified
220 * @p shape. This cursor does not need to be freed, as it is loaded
221 * from an existing resource.
222 */
223EAPI Ecore_Win32_Cursor *
224ecore_win32_cursor_shaped_new(Ecore_Win32_Cursor_Shape shape)
225{
226 Ecore_Win32_Cursor *cursor = NULL;
227 const char *cursor_name;
228
229 INF("geting shape cursor");
230
231 switch (shape)
232 {
233 case ECORE_WIN32_CURSOR_SHAPE_APP_STARTING:
234 cursor_name = IDC_APPSTARTING;
235 break;
236 case ECORE_WIN32_CURSOR_SHAPE_ARROW:
237 cursor_name = IDC_ARROW;
238 break;
239 case ECORE_WIN32_CURSOR_SHAPE_CROSS:
240 cursor_name = IDC_CROSS;
241 break;
242 case ECORE_WIN32_CURSOR_SHAPE_HAND:
243 cursor_name = IDC_HAND;
244 break;
245 case ECORE_WIN32_CURSOR_SHAPE_HELP:
246 cursor_name = IDC_HELP;
247 break;
248 case ECORE_WIN32_CURSOR_SHAPE_I_BEAM:
249 cursor_name = IDC_IBEAM;
250 break;
251 case ECORE_WIN32_CURSOR_SHAPE_NO:
252 cursor_name = IDC_NO;
253 break;
254 case ECORE_WIN32_CURSOR_SHAPE_SIZE_ALL:
255 cursor_name = IDC_SIZEALL;
256 break;
257 case ECORE_WIN32_CURSOR_SHAPE_SIZE_NESW:
258 cursor_name = IDC_SIZENESW;
259 break;
260 case ECORE_WIN32_CURSOR_SHAPE_SIZE_NS:
261 cursor_name = IDC_SIZENS;
262 break;
263 case ECORE_WIN32_CURSOR_SHAPE_SIZE_NWSE:
264 cursor_name = IDC_SIZENWSE;
265 break;
266 case ECORE_WIN32_CURSOR_SHAPE_SIZE_WE:
267 cursor_name = IDC_SIZEWE;
268 break;
269 case ECORE_WIN32_CURSOR_SHAPE_UP_ARROW:
270 cursor_name = IDC_UPARROW;
271 break;
272 case ECORE_WIN32_CURSOR_SHAPE_WAIT:
273 cursor_name = IDC_WAIT;
274 break;
275 default:
276 return NULL;
277 }
278
279 if (!(cursor = LoadCursor(NULL, cursor_name)))
280 return NULL;
281
282 return cursor;
283}
284
285/**
286 * @brief Retrieve the size of a valid cursor.
287 *
288 * @param width The width of a valid cursor.
289 * @param height The height of a valid cursor.
290 *
291 * This function returns the size of a cursor that must be passed to
292 * ecore_win32_cursor_new(). @p width and @p height are buffers that
293 * will be filled with the correct size. They can be @c NULL.
294 */
295EAPI void
296ecore_win32_cursor_size_get(int *width, int *height)
297{
298 INF("geting size cursor");
299
300 if (*width) *width = GetSystemMetrics(SM_CXCURSOR);
301 if (*height) *height = GetSystemMetrics(SM_CYCURSOR);
302}
303
304/**
305 * @}
306 */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd.c b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd.c
new file mode 100755
index 0000000..a629c8b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd.c
@@ -0,0 +1,221 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <windows.h>
6
7#include "Ecore_Win32.h"
8#include "ecore_win32_private.h"
9
10/*============================================================================*
11 * Local *
12 *============================================================================*/
13
14/**
15 * @cond LOCAL
16 */
17
18
19static int _ecore_win32_dnd_init_count = 0;
20
21static HANDLE DataToHandle(const char *data, int size)
22{
23 char *ptr;
24 ptr = (char *)GlobalAlloc(GMEM_FIXED, size);
25 memcpy(ptr, data, size);
26 return ptr;
27}
28
29/**
30 * @endcond
31 */
32
33
34/*============================================================================*
35 * Global *
36 *============================================================================*/
37
38
39/*============================================================================*
40 * API *
41 *============================================================================*/
42
43/**
44 * @addtogroup Ecore_Win32_Group Ecore_Win32 library
45 *
46 * @{
47 */
48
49/**
50 * @brief Initialize the Ecore_Win32 Drag and Drop module.
51 *
52 * @return 1 or greater on success, 0 on error.
53 *
54 * This function initialize the Drag and Drop module. It returns 0 on
55 * failure, otherwise it returns the number of times it has already
56 * been called.
57 *
58 * When the Drag and Drop module is not used anymore, call
59 * ecore_win32_dnd_shutdown() to shut down the module.
60 */
61EAPI int
62ecore_win32_dnd_init()
63{
64 if (_ecore_win32_dnd_init_count > 0)
65 {
66 _ecore_win32_dnd_init_count++;
67 return _ecore_win32_dnd_init_count;
68 }
69
70 if (OleInitialize(NULL) != S_OK)
71 return 0;
72
73 _ecore_win32_dnd_init_count++;
74
75 return _ecore_win32_dnd_init_count;
76}
77
78/**
79 * @brief Shut down the Ecore_Win32 Drag and Drop module.
80 *
81 * @return 0 when the module is completely shut down, 1 or
82 * greater otherwise.
83 *
84 * This function shuts down the Drag and Drop module. It returns 0 when it has
85 * been called the same number of times than ecore_win32_dnd_init(). In that case
86 * it shut down the module.
87 */
88EAPI int
89ecore_win32_dnd_shutdown()
90{
91 _ecore_win32_dnd_init_count--;
92 if (_ecore_win32_dnd_init_count > 0) return _ecore_win32_dnd_init_count;
93
94 OleUninitialize();
95
96 if (_ecore_win32_dnd_init_count < 0) _ecore_win32_dnd_init_count = 0;
97
98 return _ecore_win32_dnd_init_count;
99}
100
101/**
102 * @brief Begin a DnD operation.
103 *
104 * @param data The name pf the Drag operation.
105 * @param size The size of the name.
106 * @return EINA_TRUE on success, EINA_FALSE otherwise.
107 *
108 * This function start a Drag operation with the name @p data. If
109 * @p data is @c NULL, EINA_FALSE is returned. if @p size is less than
110 * 0, it is set to the length (as strlen()) of @p data. On success the
111 * function returns EINA_TRUE, otherwise it returns EINA_FALSE.
112 */
113EAPI Eina_Bool
114ecore_win32_dnd_begin(const char *data,
115 int size)
116{
117 IDataObject *pDataObject = NULL;
118 IDropSource *pDropSource = NULL;
119 FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
120 STGMEDIUM stgmed = { TYMED_HGLOBAL, { 0 }, 0 };
121 Eina_Bool res = EINA_FALSE;
122
123 if (!data)
124 return EINA_FALSE;
125
126 if (size < 0)
127 size = strlen(data) + 1;
128
129 stgmed.hGlobal = DataToHandle(data, size);
130
131 // create the data object
132 pDataObject = (IDataObject *)_ecore_win32_dnd_data_object_new((void *)&fmtetc,
133 (void *)&stgmed,
134 1);
135 pDropSource = (IDropSource *)_ecore_win32_dnd_drop_source_new();
136
137 if (pDataObject && pDropSource)
138 {
139 DWORD dwResult;
140 DWORD dwEffect = DROPEFFECT_COPY;
141
142 // do the drag-drop!
143 dwResult = DoDragDrop(pDataObject, pDropSource, DROPEFFECT_COPY, &dwEffect);
144
145 // finished. Check the return values to see if we need to do anything else
146 if (dwResult == DRAGDROP_S_DROP)
147 {
148 //printf(">>> \"%s\" Dropped <<<\n", str);
149 if(dwEffect == DROPEFFECT_MOVE)
150 {
151 // remove the data we just dropped from active document
152 }
153 }
154 //else if (dwResult == DRAGDROP_S_CANCEL)
155 // printf("DND cancelled\n");
156 //else
157 // printf("DND error\n");
158
159 res = EINA_TRUE;
160 }
161
162 _ecore_win32_dnd_data_object_free(pDataObject);
163 _ecore_win32_dnd_drop_source_free(pDropSource);
164
165 // cleanup
166 ReleaseStgMedium(&stgmed);
167
168 return res;
169}
170
171/**
172 * @brief Register a Drop operation.
173 *
174 * @param window The destination of the Drop operation.
175 * @param callback The callback called when the Drop operation
176 * finishes.
177 * @return EINA_TRUE on success, EINA_FALSE otherwise.
178 *
179 * This function register a Drop operation on @p window. Once the Drop
180 * operation finishes, @p callback is called. If @p window is @c NULL,
181 * the function returns EINA_FALSE. On success, it returns EINA_TRUE,
182 * otherwise it returns EINA_FALSE.
183 */
184EAPI Eina_Bool
185ecore_win32_dnd_register_drop_target(Ecore_Win32_Window *window,
186 Ecore_Win32_Dnd_DropTarget_Callback callback)
187{
188 Ecore_Win32_Window *wnd = (Ecore_Win32_Window *)window;
189
190 if (!window)
191 return EINA_FALSE;
192
193 wnd->dnd_drop_target = _ecore_win32_dnd_register_drop_window(wnd->window,
194 callback,
195 (void *)wnd);
196 return wnd->dnd_drop_target ? EINA_TRUE : EINA_FALSE;
197}
198
199/**
200 * @brief Unregister a Drop operation.
201 *
202 * @param window The destination of the Drop operation.
203 *
204 * This function unregister a Drop operation on @p window. If
205 * @p window is @c NULL, the function does nothing.
206 */
207EAPI void
208ecore_win32_dnd_unregister_drop_target(Ecore_Win32_Window *window)
209{
210 Ecore_Win32_Window *wnd = (Ecore_Win32_Window *)window;
211
212 if (!window)
213 return;
214
215 if (wnd->dnd_drop_target)
216 _ecore_win32_dnd_unregister_drop_window(wnd->window, wnd->dnd_drop_target);
217}
218
219/**
220 * @}
221 */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp
new file mode 100644
index 0000000..75e26f5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.cpp
@@ -0,0 +1,209 @@
1/*
2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8
9#include <assert.h>
10
11#define WIN32_LEAN_AND_MEAN
12#include <windows.h>
13#undef WIN32_LEAN_AND_MEAN
14#include <ole2.h>
15
16#include "Ecore_Win32.h"
17#include "ecore_win32_private.h"
18
19#include "ecore_win32_dnd_enumformatetc.h"
20#include "ecore_win32_dnd_data_object.h"
21
22
23static HGLOBAL DupGlobalMem(HGLOBAL hMem)
24{
25 DWORD len = (DWORD)GlobalSize(hMem);
26 PVOID source = GlobalLock(hMem);
27 PVOID dest = GlobalAlloc(GMEM_FIXED, len);
28 memcpy(dest, source, len);
29 GlobalUnlock(hMem);
30 return dest;
31}
32
33// structors
34
35DataObject::DataObject(FORMATETC *fmtetc, STGMEDIUM *stgmed, int count)
36{
37 assert(fmtetc != NULL);
38 assert(stgmed != NULL);
39 assert(count > 0);
40
41 // reference count must ALWAYS start at 1
42 ref_count_ = 1;
43 formats_num_ = count;
44
45 format_etc_ = new FORMATETC[count];
46 stg_medium_ = new STGMEDIUM[count];
47
48 for(int i = 0; i < count; i++)
49 {
50 format_etc_[i] = fmtetc[i];
51 stg_medium_[i] = stgmed[i];
52 }
53}
54
55DataObject::~DataObject()
56{
57 delete[] format_etc_;
58 delete[] stg_medium_;
59}
60
61
62// IUnknown
63
64HRESULT DataObject::QueryInterface(REFIID iid, void **ppvObject)
65{
66 // check to see what interface has been requested
67 if ((iid == IID_IDataObject) || (iid == IID_IUnknown))
68 {
69 AddRef();
70 *ppvObject = this;
71 return S_OK;
72 }
73 *ppvObject = 0;
74 return E_NOINTERFACE;
75}
76
77ULONG DataObject::AddRef()
78{
79 return InterlockedIncrement(&ref_count_);
80}
81
82ULONG DataObject::Release()
83{
84 LONG count = InterlockedDecrement(&ref_count_);
85 if(count == 0)
86 {
87 delete this;
88 return 0;
89 }
90 return count;
91}
92
93// IDataObject
94
95HRESULT DataObject::GetData(FORMATETC *pFormatEtc, STGMEDIUM *pMedium)
96{
97 assert(pMedium != NULL);
98 int idx;
99
100 // try to match the specified FORMATETC with one of our supported formats
101 if((idx = lookup_format_etc(pFormatEtc)) == -1)
102 return DV_E_FORMATETC;
103
104 // found a match - transfer data into supplied storage medium
105 pMedium->tymed = format_etc_[idx].tymed;
106 pMedium->pUnkForRelease = 0;
107
108 // copy the data into the caller's storage medium
109 switch(format_etc_[idx].tymed)
110 {
111 case TYMED_HGLOBAL:
112 pMedium->hGlobal = DupGlobalMem(stg_medium_[idx].hGlobal);
113 break;
114
115 default:
116 return DV_E_FORMATETC;
117 }
118
119 return S_OK;
120}
121
122HRESULT DataObject::GetDataHere(FORMATETC *pFormatEtc __UNUSED__, STGMEDIUM *pmedium __UNUSED__)
123{
124 return DATA_E_FORMATETC;
125}
126
127HRESULT DataObject::QueryGetData(FORMATETC *pFormatEtc)
128{
129 return (lookup_format_etc(pFormatEtc) == -1) ? DV_E_FORMATETC : S_OK;
130}
131
132HRESULT DataObject::GetCanonicalFormatEtc(FORMATETC *pFormatEct __UNUSED__, FORMATETC *pFormatEtcOut)
133{
134 // Apparently we have to set this field to NULL even though we don't do anything else
135 pFormatEtcOut->ptd = NULL;
136 return E_NOTIMPL;
137}
138
139HRESULT DataObject::SetData(FORMATETC *pFormatEtc __UNUSED__, STGMEDIUM *pMedium __UNUSED__, BOOL fRelease __UNUSED__)
140{
141 return E_NOTIMPL;
142}
143
144HRESULT DataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc)
145{
146 // only the get direction is supported for OLE
147 if(dwDirection == DATADIR_GET)
148 {
149 // for Win2k+ you can use the SHCreateStdEnumFmtEtc API call, however
150 // to support all Windows platforms we need to implement IEnumFormatEtc ourselves.
151 return CreateEnumFormatEtc(formats_num_, format_etc_, ppEnumFormatEtc);
152 }
153 else
154 {
155 // the direction specified is not supported for drag+drop
156 return E_NOTIMPL;
157 }
158}
159
160HRESULT DataObject::DAdvise(FORMATETC *pFormatEtc __UNUSED__, DWORD advf __UNUSED__, IAdviseSink *, DWORD *)
161{
162 return OLE_E_ADVISENOTSUPPORTED;
163}
164
165HRESULT DataObject::DUnadvise(DWORD dwConnection __UNUSED__)
166{
167 return OLE_E_ADVISENOTSUPPORTED;
168}
169
170HRESULT DataObject::EnumDAdvise(IEnumSTATDATA **ppEnumAdvise __UNUSED__)
171{
172 return OLE_E_ADVISENOTSUPPORTED;
173}
174
175// internal helper function
176
177int DataObject::lookup_format_etc(FORMATETC *pFormatEtc)
178{
179 // check each of our formats in turn to see if one matches
180 for(int i = 0; i < formats_num_; i++)
181 {
182 if((format_etc_[i].tymed & pFormatEtc->tymed) &&
183 (format_etc_[i].cfFormat == pFormatEtc->cfFormat) &&
184 (format_etc_[i].dwAspect == pFormatEtc->dwAspect))
185 {
186 // return index of stored format
187 return i;
188 }
189 }
190
191 // error, format not found
192 return -1;
193}
194
195void *_ecore_win32_dnd_data_object_new(void *fmtetc, void *stgmeds, int count)
196{
197 IDataObject *object = new DataObject((FORMATETC *)fmtetc, (STGMEDIUM *)stgmeds, (UINT)count);
198 assert(object != NULL);
199 return object;
200}
201
202void _ecore_win32_dnd_data_object_free(void *data_object)
203{
204 if (!data_object)
205 return;
206
207 IDataObject *object = (IDataObject *)data_object;
208 object->Release();
209}
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.h b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.h
new file mode 100644
index 0000000..3d289cf
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_data_object.h
@@ -0,0 +1,49 @@
1#ifndef __ECORE_WIN32_DND_DATA_OBJECT_H__
2#define __ECORE_WIN32_DND_DATA_OBJECT_H__
3
4
5#define WIN32_LEAN_AND_MEAN
6#include <windows.h>
7#undef WIN32_LEAN_AND_MEAN
8#include <objbase.h>
9
10
11class DataObject : public IDataObject
12{
13 private:
14
15 LONG ref_count_;
16 int formats_num_;
17 FORMATETC *format_etc_;
18 STGMEDIUM *stg_medium_;
19
20 private: // internal helper function
21
22 int lookup_format_etc(FORMATETC *format_etc);
23
24 public: // structors
25
26 DataObject(FORMATETC *fmtetc, STGMEDIUM *stgmed, int count);
27 ~DataObject();
28
29 public: // IUnknown
30
31 HRESULT __stdcall QueryInterface(REFIID iid, void **ppvObject);
32 ULONG __stdcall AddRef();
33 ULONG __stdcall Release();
34
35 public: // IDataObject
36
37 HRESULT __stdcall GetData(FORMATETC *pFormatEtc, STGMEDIUM *pmedium);
38 HRESULT __stdcall GetDataHere(FORMATETC *pFormatEtc, STGMEDIUM *pmedium);
39 HRESULT __stdcall QueryGetData(FORMATETC *pFormatEtc);
40 HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC *pFormatEct, FORMATETC *pFormatEtcOut);
41 HRESULT __stdcall SetData(FORMATETC *pFormatEtc, STGMEDIUM *pMedium, BOOL fRelease);
42 HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc);
43 HRESULT __stdcall DAdvise(FORMATETC *pFormatEtc, DWORD advf, IAdviseSink *, DWORD *);
44 HRESULT __stdcall DUnadvise(DWORD dwConnection);
45 HRESULT __stdcall EnumDAdvise(IEnumSTATDATA **ppEnumAdvise);
46};
47
48
49#endif /* __ECORE_WIN32_DND_DATA_OBJECT_H__ */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp
new file mode 100644
index 0000000..bea7736
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.cpp
@@ -0,0 +1,92 @@
1/*
2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8
9#include <assert.h>
10
11#include "ecore_win32_dnd_drop_source.h"
12
13#include "ecore_win32_private.h"
14
15// structors
16
17// reference count must ALWAYS start at 1
18DropSource::DropSource() : ref_count_(1)
19{ }
20
21
22// IUnknown
23
24HRESULT DropSource::QueryInterface(REFIID iid, void **ppvObject)
25{
26 // check to see what interface has been requested
27 if (iid == IID_IDropSource || iid == IID_IUnknown)
28 {
29 AddRef();
30 *ppvObject = this;
31 return S_OK;
32 }
33 *ppvObject = 0;
34 return E_NOINTERFACE;
35}
36
37ULONG DropSource::AddRef()
38{
39 return InterlockedIncrement(&ref_count_);
40}
41
42ULONG DropSource::Release()
43{
44 LONG count = InterlockedDecrement(&ref_count_);
45 if(count == 0)
46 {
47 delete this;
48 return 0;
49 }
50 return count;
51}
52
53
54// IDropSource
55
56HRESULT DropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
57{
58 // if the Escape key has been pressed since the last call, cancel the drop
59 if(fEscapePressed == TRUE)
60 return DRAGDROP_S_CANCEL;
61
62 // if the LeftMouse button has been released, then do the drop!
63 if((grfKeyState & MK_LBUTTON) == 0)
64 return DRAGDROP_S_DROP;
65
66 // continue with the drag-drop
67 return S_OK;
68}
69
70HRESULT DropSource::GiveFeedback(DWORD dwEffect __UNUSED__)
71{
72 return DRAGDROP_S_USEDEFAULTCURSORS;
73}
74
75
76// ecore_win32 private functions
77
78void *_ecore_win32_dnd_drop_source_new()
79{
80 IDropSource *object = new DropSource();
81 assert(object != NULL);
82 return object;
83}
84
85void _ecore_win32_dnd_drop_source_free(void *drop_source)
86{
87 if (!drop_source)
88 return;
89
90 IDropSource *object = (IDropSource *)drop_source;
91 object->Release();
92}
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.h b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.h
new file mode 100644
index 0000000..9081f46
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_source.h
@@ -0,0 +1,36 @@
1#ifndef __ECORE_WIN32_DND_DROP_SOURCE_H__
2#define __ECORE_WIN32_DND_DROP_SOURCE_H__
3
4
5#define WIN32_LEAN_AND_MEAN
6#include <windows.h>
7#undef WIN32_LEAN_AND_MEAN
8#include <ole2.h>
9
10#include "Ecore_Win32.h"
11
12
13class DropSource : public IDropSource
14{
15 private:
16
17 LONG ref_count_;
18
19 public: // structors
20
21 DropSource();
22
23 public: // IUnknown
24
25 HRESULT __stdcall QueryInterface(REFIID iid, void ** ppvObject);
26 ULONG __stdcall AddRef();
27 ULONG __stdcall Release();
28
29 public: // IDropSource
30
31 HRESULT __stdcall QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);
32 HRESULT __stdcall GiveFeedback(DWORD dwEffect);
33};
34
35
36#endif /* __ECORE_WIN32_DND_DROP_SOURCE_H__ */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp
new file mode 100644
index 0000000..e19fb5d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.cpp
@@ -0,0 +1,232 @@
1/*
2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8
9#include "ecore_win32_dnd_drop_target.h"
10
11#include "ecore_win32_private.h"
12
13
14// structors
15
16DropTarget::DropTarget(HWND window, Ecore_Win32_Dnd_DropTarget_Callback callback, void *window_obj_ptr)
17 : ref_count_(1)
18 , window_(window)
19 , allow_drop_(false)
20 , drop_callback_(callback)
21 ,drop_callback_ptr_(window_obj_ptr)
22{ }
23
24
25// IUnknown
26
27HRESULT DropTarget::QueryInterface(REFIID iid, void **ppvObject)
28{
29 // check to see what interface has been requested
30 if (iid == IID_IDropTarget || iid == IID_IUnknown)
31 {
32 AddRef();
33 *ppvObject = this;
34 return S_OK;
35 }
36 *ppvObject = 0;
37
38 return E_NOINTERFACE;
39}
40
41ULONG DropTarget::AddRef()
42{
43 return InterlockedIncrement(&ref_count_);
44}
45
46ULONG DropTarget::Release()
47{
48 LONG count = InterlockedDecrement(&ref_count_);
49 if (count == 0)
50 {
51 delete this;
52 return 0;
53 }
54
55 return count;
56}
57
58
59// IDropTarget
60
61HRESULT DropTarget::DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
62{
63 // does the dataobject contain data we want?
64 allow_drop_ = QueryDataObject(pDataObject) &&
65 (drop_callback_ == NULL ||
66 (drop_callback_(drop_callback_ptr_, ECORE_WIN32_DND_EVENT_DRAG_ENTER, pt.x, pt.y, NULL, 0) != 0));
67
68 if (allow_drop_)
69 {
70 // get the dropeffect based on keyboard state
71 *pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);
72 SetFocus(window_);
73 //PositionCursor(_hwnd, pt);
74 }
75 else
76 *pdwEffect = DROPEFFECT_NONE;
77 return S_OK;
78}
79
80HRESULT DropTarget::DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
81{
82 allow_drop_ =
83 (drop_callback_ == NULL) ||
84 (drop_callback_(drop_callback_ptr_, ECORE_WIN32_DND_EVENT_DRAG_OVER, pt.x, pt.y, NULL, 0) != 0);
85
86 if (allow_drop_)
87 {
88 *pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);
89 //PositionCursor(m_hWnd, pt);
90 }
91 else
92 {
93 *pdwEffect = DROPEFFECT_NONE;
94 }
95
96 return S_OK;
97}
98
99HRESULT DropTarget::DragLeave()
100{
101 POINT pt;
102
103 GetCursorPos(&pt);
104 if (drop_callback_ != NULL)
105 drop_callback_(drop_callback_ptr_, ECORE_WIN32_DND_EVENT_DRAG_LEAVE, pt.x, pt.y, NULL, 0);
106
107 return S_OK;
108}
109
110HRESULT DropTarget::Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
111{
112 if (allow_drop_)
113 {
114 // construct a FORMATETC object
115 FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
116 STGMEDIUM stgmed;
117
118 // See if the dataobject contains any TEXT stored as a HGLOBAL
119 if (pDataObject->QueryGetData(&fmtetc) == S_OK)
120 {
121 // Yippie! the data is there, so go get it!
122 if (pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
123 {
124 // we asked for the data as a HGLOBAL, so access it appropriately
125 PVOID data = GlobalLock(stgmed.hGlobal);
126 UINT size = GlobalSize(stgmed.hGlobal);
127
128 if (drop_callback_ != NULL)
129 {
130 drop_callback_(drop_callback_ptr_,
131 ECORE_WIN32_DND_EVENT_DROP,
132 pt.x, pt.y,
133 data, size);
134 }
135
136 GlobalUnlock(stgmed.hGlobal);
137
138 // release the data using the COM API
139 ReleaseStgMedium(&stgmed);
140 }
141 }
142 *pdwEffect = DropEffect(grfKeyState, pt, *pdwEffect);
143 }
144 else
145 {
146 *pdwEffect = DROPEFFECT_NONE;
147 }
148
149 return S_OK;
150}
151
152
153// internal helper function
154
155DWORD DropTarget::DropEffect(DWORD grfKeyState, POINTL pt __UNUSED__, DWORD dwAllowed)
156{
157 DWORD dwEffect = 0;
158
159 // 1. check "pt" -> do we allow a drop at the specified coordinates?
160
161 // 2. work out that the drop-effect should be based on grfKeyState
162 if (grfKeyState & MK_CONTROL)
163 {
164 dwEffect = dwAllowed & DROPEFFECT_COPY;
165 }
166 else if (grfKeyState & MK_SHIFT)
167 {
168 dwEffect = dwAllowed & DROPEFFECT_MOVE;
169 }
170
171 // 3. no key-modifiers were specified (or drop effect not allowed), so
172 // base the effect on those allowed by the dropsource
173 if (dwEffect == 0)
174 {
175 if (dwAllowed & DROPEFFECT_COPY) dwEffect = DROPEFFECT_COPY;
176 if (dwAllowed & DROPEFFECT_MOVE) dwEffect = DROPEFFECT_MOVE;
177 }
178
179 return dwEffect;
180}
181
182bool DropTarget::QueryDataObject(IDataObject *pDataObject)
183{
184 FORMATETC fmtetc = { CF_TEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
185
186 // does the data object support CF_TEXT using a HGLOBAL?
187 return pDataObject->QueryGetData(&fmtetc) == S_OK;
188}
189
190
191// ecore_win32 private functions
192
193void *_ecore_win32_dnd_register_drop_window(HWND hwnd, Ecore_Win32_Dnd_DropTarget_Callback callback, void *ptr)
194{
195 DropTarget *pDropTarget = new DropTarget(hwnd, callback, ptr);
196
197 if (pDropTarget == NULL)
198 return NULL;
199
200 // acquire a strong lock
201 if (FAILED(CoLockObjectExternal(pDropTarget, TRUE, FALSE)))
202 {
203 delete pDropTarget;
204 return NULL;
205 }
206
207 // tell OLE that the window is a drop target
208 if (FAILED(RegisterDragDrop(hwnd, pDropTarget)))
209 {
210 delete pDropTarget;
211 return NULL;
212 }
213
214 return pDropTarget;
215}
216
217void _ecore_win32_dnd_unregister_drop_window(HWND hwnd, void *drop_target)
218{
219 IDropTarget *pDropTarget = (IDropTarget *)drop_target;
220
221 if (drop_target == NULL)
222 return;
223
224 // remove drag+drop
225 RevokeDragDrop(hwnd);
226
227 // remove the strong lock
228 CoLockObjectExternal(pDropTarget, FALSE, TRUE);
229
230 // release our own reference
231 pDropTarget->Release();
232}
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.h b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.h
new file mode 100644
index 0000000..24c3de3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_drop_target.h
@@ -0,0 +1,47 @@
1#ifndef __ECORE_WIN32_DND_DROP_TARGET_H__
2#define __ECORE_WIN32_DND_DROP_TARGET_H__
3
4
5#define WIN32_LEAN_AND_MEAN
6#include <windows.h>
7#undef WIN32_LEAN_AND_MEAN
8#include <ole2.h>
9
10#include "Ecore_Win32.h"
11
12
13class DropTarget : public IDropTarget
14{
15 private:
16
17 LONG ref_count_;
18 HWND window_;
19 bool allow_drop_;
20 Ecore_Win32_Dnd_DropTarget_Callback drop_callback_;
21 void *drop_callback_ptr_;
22
23 private: // internal helper function
24
25 DWORD DropEffect(DWORD grfKeyState, POINTL pt, DWORD dwAllowed);
26 bool QueryDataObject(IDataObject *pDataObject);
27
28 public: // structors
29
30 DropTarget(HWND hwnd, Ecore_Win32_Dnd_DropTarget_Callback callback, void *window_obj_ptr);
31
32public: // IUnknown
33
34 HRESULT __stdcall QueryInterface(REFIID iid, void ** ppvObject);
35 ULONG __stdcall AddRef();
36 ULONG __stdcall Release();
37
38 public: // IDropTarget
39
40 HRESULT __stdcall DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
41 HRESULT __stdcall DragOver(DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
42 HRESULT __stdcall DragLeave();
43 HRESULT __stdcall Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect);
44};
45
46
47#endif /* __ECORE_WIN32_DND_DROP_TARGET_H__ */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp
new file mode 100644
index 0000000..a3858bc
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.cpp
@@ -0,0 +1,157 @@
1
2#include <ole2.h>
3
4#include "ecore_win32_dnd_enumformatetc.h"
5
6
7// structors
8
9CEnumFormatEtc::CEnumFormatEtc(FORMATETC *format_etc, int formats_num)
10 : ref_count_(1)
11 , index_(0)
12 , formats_num_(formats_num)
13 , format_etc_(new FORMATETC[formats_num])
14{
15 // make a new copy of each FORMATETC structure
16 for (unsigned int i = 0; i < formats_num_; i++)
17 {
18 DeepCopyFormatEtc(&format_etc_[i], &format_etc[i]);
19 }
20}
21
22CEnumFormatEtc::~CEnumFormatEtc()
23{
24 if (format_etc_)
25 {
26 // first free any DVTARGETDEVICE structures
27 for (ULONG i = 0; i < formats_num_; i++)
28 {
29 if (format_etc_[i].ptd)
30 CoTaskMemFree(format_etc_[i].ptd);
31 }
32
33 // now free the main array
34 delete[] format_etc_;
35 }
36}
37
38// IUnknown
39
40ULONG __stdcall CEnumFormatEtc::AddRef(void)
41{
42 // increment object reference count
43 return InterlockedIncrement(&ref_count_);
44}
45
46ULONG __stdcall CEnumFormatEtc::Release(void)
47{
48 // decrement object reference count
49 LONG count = InterlockedDecrement(&ref_count_);
50
51 if (count == 0)
52 {
53 delete this;
54 return 0;
55 }
56 else
57 {
58 return count;
59 }
60}
61
62HRESULT __stdcall CEnumFormatEtc::QueryInterface(REFIID iid, void **ppvObject)
63{
64 // check to see what interface has been requested
65 if ((iid == IID_IEnumFORMATETC) || (iid == IID_IUnknown))
66 {
67 AddRef();
68 *ppvObject = this;
69 return S_OK;
70 }
71 else
72 {
73 *ppvObject = 0;
74 return E_NOINTERFACE;
75 }
76}
77
78// IEnumFormatEtc
79
80HRESULT CEnumFormatEtc::Reset(void)
81{
82 index_ = 0;
83 return S_OK;
84}
85
86HRESULT CEnumFormatEtc::Skip(ULONG celt)
87{
88 index_ += celt;
89 return (index_ <= formats_num_) ? S_OK : S_FALSE;
90}
91
92HRESULT CEnumFormatEtc::Clone(IEnumFORMATETC **ppEnumFormatEtc)
93{
94 HRESULT hResult;
95
96 // make a duplicate enumerator
97 hResult = CreateEnumFormatEtc(formats_num_, format_etc_, ppEnumFormatEtc);
98
99 if (hResult == S_OK)
100 {
101 // manually set the index state
102 ((CEnumFormatEtc *)*ppEnumFormatEtc)->index_ = index_;
103 }
104
105 return hResult;
106}
107
108HRESULT CEnumFormatEtc::Next(ULONG celt, FORMATETC *pFormatEtc, ULONG *pceltFetched)
109{
110 ULONG copied = 0;
111
112 // validate arguments
113 if ((celt == 0) || (pFormatEtc == 0))
114 return E_INVALIDARG;
115
116 // copy the FORMATETC structures into the caller's buffer
117 while (index_ < formats_num_ && copied < celt)
118 {
119 DeepCopyFormatEtc(&pFormatEtc[copied], &format_etc_[index_]);
120 copied++;
121 index_++;
122 }
123
124 // store result
125 if (pceltFetched != 0)
126 *pceltFetched = copied;
127
128 // did we copy all that was requested?
129 return (copied == celt) ? S_OK : S_FALSE;
130}
131
132// external functions
133
134void DeepCopyFormatEtc(FORMATETC *dest, FORMATETC *source)
135{
136 // copy the source FORMATETC into dest
137 *dest = *source;
138
139 if (source->ptd)
140 {
141 // allocate memory for the DVTARGETDEVICE if necessary
142 dest->ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));
143
144 // copy the contents of the source DVTARGETDEVICE into dest->ptd
145 *(dest->ptd) = *(source->ptd);
146 }
147}
148
149HRESULT CreateEnumFormatEtc(UINT cfmt, FORMATETC *afmt, IEnumFORMATETC **ppEnumFormatEtc)
150{
151 if((cfmt == 0) || (afmt == 0) || (ppEnumFormatEtc == 0))
152 return E_INVALIDARG;
153
154 *ppEnumFormatEtc = new CEnumFormatEtc(afmt, cfmt);
155
156 return (*ppEnumFormatEtc) ? S_OK : E_OUTOFMEMORY;
157}
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h
new file mode 100644
index 0000000..9f17f56
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_dnd_enumformatetc.h
@@ -0,0 +1,50 @@
1#ifndef __ECORE_WIN32_DND_ENUMFORMATETC_H__
2#define __ECORE_WIN32_DND_ENUMFORMATETC_H__
3
4
5#define WIN32_LEAN_AND_MEAN
6#include <windows.h>
7#undef WIN32_LEAN_AND_MEAN
8#include <objbase.h>
9
10
11class CEnumFormatEtc : public IEnumFORMATETC
12{
13 private:
14
15 LONG ref_count_; // Reference count for this COM interface
16 ULONG index_; // current enumerator index
17 ULONG formats_num_; // number of FORMATETC members
18 FORMATETC *format_etc_; // array of FORMATETC objects
19
20 public: // structors
21
22 CEnumFormatEtc(FORMATETC *pFormatEtc, int nNumFormats);
23
24 ~CEnumFormatEtc();
25
26 public: // IUnknown
27
28 HRESULT __stdcall QueryInterface (REFIID iid, void ** ppvObject);
29
30 ULONG __stdcall AddRef (void);
31
32 ULONG __stdcall Release (void);
33
34 public: // IEnumFormatEtc
35
36 HRESULT __stdcall Next (ULONG celt, FORMATETC * rgelt, ULONG * pceltFetched);
37
38 HRESULT __stdcall Skip (ULONG celt);
39
40 HRESULT __stdcall Reset (void);
41
42 HRESULT __stdcall Clone (IEnumFORMATETC ** ppEnumFormatEtc);
43};
44
45void DeepCopyFormatEtc(FORMATETC *dest, FORMATETC *source);
46
47HRESULT CreateEnumFormatEtc(UINT cfmt, FORMATETC *afmt, IEnumFORMATETC **ppEnumFormatEtc);
48
49
50#endif /* __ECORE_WIN32_DND_ENUMFORMATETC_H__ */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_event.c b/libraries/ecore/src/lib/ecore_win32/ecore_win32_event.c
new file mode 100644
index 0000000..63356d3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_event.c
@@ -0,0 +1,1231 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h> /* for printf */
7
8#define WIN32_LEAN_AND_MEAN
9#include <windows.h>
10#undef WIN32_LEAN_AND_MEAN
11#include <windowsx.h>
12
13#include <Eina.h>
14#include <Ecore.h>
15#include <Ecore_Input.h>
16
17#include "Ecore_Win32.h"
18#include "ecore_win32_private.h"
19
20
21typedef enum
22{
23 ECORE_WIN32_KEY_MASK_LSHIFT = 1 << 0,
24 ECORE_WIN32_KEY_MASK_RSHIFT = 1 << 1,
25 ECORE_WIN32_KEY_MASK_LCONTROL = 1 << 2,
26 ECORE_WIN32_KEY_MASK_RCONTROL = 1 << 3,
27 ECORE_WIN32_KEY_MASK_LMENU = 1 << 4,
28 ECORE_WIN32_KEY_MASK_RMENU = 1 << 5
29} Ecore_Win32_Key_Mask;
30
31/***** Private declarations *****/
32
33
34static Ecore_Win32_Window *_ecore_win32_mouse_down_last_window = NULL;
35static Ecore_Win32_Window *_ecore_win32_mouse_down_last_last_window = NULL;
36static long _ecore_win32_mouse_down_last_time = 0 ;
37static long _ecore_win32_mouse_down_last_last_time = 0 ;
38static int _ecore_win32_mouse_down_did_triple = 0;
39static int _ecore_win32_mouse_up_count = 0;
40static Ecore_Win32_Key_Mask _ecore_win32_key_mask = 0;
41
42static void _ecore_win32_event_free_key_down(void *data,
43 void *ev);
44
45static void _ecore_win32_event_free_key_up(void *data,
46 void *ev);
47
48static int _ecore_win32_event_keystroke_get(int key,
49 int is_extended,
50 Eina_Bool is_down,
51 char **keyname,
52 char **keysymbol,
53 char **keycompose,
54 unsigned int *modifiers);
55
56static int _ecore_win32_event_char_get(int key,
57 char **keyname,
58 char **keysymbol,
59 char **keycompose);
60
61
62/***** Global functions definitions *****/
63
64void
65_ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg,
66 int is_keystroke)
67{
68 Ecore_Event_Key *e;
69
70 INF("key pressed");
71
72 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
73 if (!e) return;
74
75 if (is_keystroke)
76 {
77 if (!_ecore_win32_event_keystroke_get(msg->window_param,
78 msg->data_param & 0x01000000,
79 EINA_TRUE,
80 (char **)&e->keyname,
81 (char **)&e->key,
82 (char **)&e->string,
83 &e->modifiers))
84 {
85 free(e);
86 return;
87 }
88 }
89 else
90 {
91 if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
92 (char **)&e->keyname,
93 (char **)&e->key,
94 (char **)&e->string))
95 {
96 free(e);
97 return;
98 }
99 }
100
101 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
102 if (!e->window)
103 {
104 free(e);
105 return;
106 }
107 e->event_window = e->window;
108 e->timestamp = msg->time;
109
110 _ecore_win32_event_last_time = e->timestamp;
111
112 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_win32_event_free_key_down, NULL);
113}
114
115void
116_ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg)
117{
118 Ecore_Event_Key *e;
119
120 INF("key released");
121
122 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
123 if (!e) return;
124
125 if (!_ecore_win32_event_keystroke_get(LOWORD(msg->window_param),
126 msg->data_param & 0x01000000,
127 EINA_FALSE,
128 (char **)&e->keyname,
129 (char **)&e->key,
130 (char **)&e->string,
131 &e->modifiers))
132 {
133 if (!_ecore_win32_event_char_get(LOWORD(msg->window_param),
134 (char **)&e->keyname,
135 (char **)&e->key,
136 (char **)&e->string))
137 {
138 free(e);
139 return;
140 }
141 }
142
143 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
144 if (!e->window)
145 {
146 free(e);
147 return;
148 }
149 e->event_window = e->window;
150 e->timestamp = msg->time;
151
152 _ecore_win32_event_last_time = e->timestamp;
153
154 ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_win32_event_free_key_up, NULL);
155}
156
157void
158_ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg,
159 int button)
160{
161 Ecore_Win32_Window *window;
162
163 INF("mouse button pressed");
164
165 window = (Ecore_Win32_Window *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
166
167 if (button > 3)
168 {
169 Ecore_Event_Mouse_Wheel *e;
170
171 e = (Ecore_Event_Mouse_Wheel *)calloc(1, sizeof(Ecore_Event_Mouse_Wheel));
172 if (!e) return;
173
174 e->window = (Ecore_Window)window;
175 e->event_window = e->window;
176 e->direction = 0;
177 /* wheel delta is positive or negative, never 0 */
178 e->z = GET_WHEEL_DELTA_WPARAM(msg->window_param) > 0 ? -1 : 1;
179 e->x = GET_X_LPARAM(msg->data_param);
180 e->y = GET_Y_LPARAM(msg->data_param);
181 e->timestamp = msg->time;
182
183 _ecore_win32_event_last_time = e->timestamp;
184 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
185
186 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
187 }
188 else
189 {
190 {
191 Ecore_Event_Mouse_Move *e;
192
193 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
194 if (!e) return;
195
196 e->window = (Ecore_Window)window;
197 e->event_window = e->window;
198 e->x = GET_X_LPARAM(msg->data_param);
199 e->y = GET_Y_LPARAM(msg->data_param);
200 e->timestamp = msg->time;
201
202 _ecore_win32_event_last_time = e->timestamp;
203 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
204
205 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
206 }
207
208 {
209 Ecore_Event_Mouse_Button *e;
210
211 if (_ecore_win32_mouse_down_did_triple)
212 {
213 _ecore_win32_mouse_down_last_window = NULL;
214 _ecore_win32_mouse_down_last_last_window = NULL;
215 _ecore_win32_mouse_down_last_time = 0;
216 _ecore_win32_mouse_down_last_last_time = 0;
217 }
218
219 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
220 if (!e) return;
221
222 e->window = (Ecore_Window)window;
223 e->event_window = e->window;
224 e->buttons = button;
225 e->x = GET_X_LPARAM(msg->data_param);
226 e->y = GET_Y_LPARAM(msg->data_param);
227 e->timestamp = msg->time;
228
229 if (((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
230 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
231 e->double_click = 1;
232
233 if (((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
234 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
235 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
236 {
237 e->triple_click = 1;
238 _ecore_win32_mouse_down_did_triple = 1;
239 }
240 else
241 _ecore_win32_mouse_down_did_triple = 0;
242
243 if (!e->double_click && !e->triple_click)
244 _ecore_win32_mouse_up_count = 0;
245
246 _ecore_win32_event_last_time = e->timestamp;
247 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
248
249 if (!_ecore_win32_mouse_down_did_triple)
250 {
251 _ecore_win32_mouse_down_last_last_window = _ecore_win32_mouse_down_last_window;
252 _ecore_win32_mouse_down_last_window = (Ecore_Win32_Window *)e->window;
253 _ecore_win32_mouse_down_last_last_time = _ecore_win32_mouse_down_last_time;
254 _ecore_win32_mouse_down_last_time = e->timestamp;
255 }
256
257 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
258 }
259 }
260}
261
262void
263_ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg,
264 int button)
265{
266 Ecore_Win32_Window *window;
267
268 INF("mouse button released");
269
270 window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
271
272 {
273 Ecore_Event_Mouse_Move *e;
274
275 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
276 if (!e) return;
277
278 e->window = (Ecore_Window)window;
279 e->event_window = e->window;
280 e->x = GET_X_LPARAM(msg->data_param);
281 e->y = GET_Y_LPARAM(msg->data_param);
282 e->timestamp = msg->time;
283
284 _ecore_win32_event_last_time = e->timestamp;
285 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
286
287 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
288 }
289
290 {
291 Ecore_Event_Mouse_Button *e;
292
293 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
294 if (!e) return;
295
296 e->window = (Ecore_Window)window;
297 e->event_window = e->window;
298 e->buttons = button;
299 e->x = GET_X_LPARAM(msg->data_param);
300 e->y = GET_Y_LPARAM(msg->data_param);
301 e->timestamp = msg->time;
302
303 _ecore_win32_mouse_up_count++;
304
305 if ((_ecore_win32_mouse_up_count >= 2) &&
306 ((e->timestamp - _ecore_win32_mouse_down_last_time) <= (unsigned long)(1000 * _ecore_win32_double_click_time)) &&
307 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window))
308 e->double_click = 1;
309
310 if ((_ecore_win32_mouse_up_count >= 3) &&
311 ((e->timestamp - _ecore_win32_mouse_down_last_last_time) <= (unsigned long)(2 * 1000 * _ecore_win32_double_click_time)) &&
312 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_window) &&
313 (e->window == (Ecore_Window)_ecore_win32_mouse_down_last_last_window))
314 e->triple_click = 1;
315
316 _ecore_win32_event_last_time = e->timestamp;
317 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
318
319 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
320 }
321}
322
323void
324_ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg)
325{
326 Ecore_Event_Mouse_Move *e;
327
328 INF("mouse moved");
329
330 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
331 if (!e) return;
332
333 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
334 e->event_window = e->window;
335 e->x = GET_X_LPARAM(msg->data_param);
336 e->y = GET_Y_LPARAM(msg->data_param);
337 e->timestamp = msg->time;
338
339 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
340}
341
342void
343_ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg)
344{
345 {
346 Ecore_Event_Mouse_Move *e;
347
348 INF("mouse in");
349
350 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
351 if (!e) return;
352
353 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
354 e->event_window = e->window;
355 e->x = msg->x;
356 e->y = msg->y;
357 e->timestamp = msg->time;
358
359 _ecore_win32_event_last_time = e->timestamp;
360 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
361
362 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
363 }
364
365 {
366 Ecore_Win32_Event_Mouse_In *e;
367
368 e = (Ecore_Win32_Event_Mouse_In *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_In));
369 if (!e) return;
370
371 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
372 e->x = msg->x;
373 e->y = msg->y;
374 e->time = msg->time ;
375
376 _ecore_win32_event_last_time = e->time;
377
378 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_IN, e, NULL, NULL);
379 }
380}
381
382void
383_ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg)
384{
385 {
386 Ecore_Event_Mouse_Move *e;
387
388 INF("mouse out");
389
390 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
391 if (!e) return;
392
393 e->window = (Ecore_Window)GetWindowLongPtr(msg->window, GWLP_USERDATA);
394 e->event_window = e->window;
395 e->x = msg->x;
396 e->y = msg->y;
397 e->timestamp = msg->time;
398
399 _ecore_win32_event_last_time = e->timestamp;
400 _ecore_win32_event_last_window = (Ecore_Win32_Window *)e->window;
401
402 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
403 }
404
405 {
406 Ecore_Win32_Event_Mouse_Out *e;
407
408 e = (Ecore_Win32_Event_Mouse_Out *)calloc(1, sizeof(Ecore_Win32_Event_Mouse_Out));
409 if (!e) return;
410
411 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
412 e->x = msg->x;
413 e->y = msg->y;
414 e->time = msg->time;
415
416 _ecore_win32_event_last_time = e->time;
417
418 ecore_event_add(ECORE_WIN32_EVENT_MOUSE_OUT, e, NULL, NULL);
419 }
420}
421
422void
423_ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg)
424{
425 Ecore_Win32_Event_Window_Focus_In *e;
426
427 INF("focus in");
428
429 e = (Ecore_Win32_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_In));
430 if (!e) return;
431
432 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
433
434 e->time = _ecore_win32_event_last_time;
435 _ecore_win32_event_last_time = e->time;
436
437 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
438}
439
440void
441_ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg)
442{
443 Ecore_Win32_Event_Window_Focus_Out *e;
444
445 INF("focus out");
446
447 e = (Ecore_Win32_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_Win32_Event_Window_Focus_Out));
448 if (!e) return;
449
450 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
451
452 e->time = _ecore_win32_event_last_time;
453 _ecore_win32_event_last_time = e->time;
454
455 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
456}
457
458void
459_ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg)
460{
461 Ecore_Win32_Event_Window_Damage *e;
462
463 INF("window expose");
464
465 e = (Ecore_Win32_Event_Window_Damage *)calloc(1, sizeof(Ecore_Win32_Event_Window_Damage));
466 if (!e) return;
467
468 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
469
470 e->x = msg->update.left;
471 e->y = msg->update.top;
472 e->width = msg->update.right - msg->update.left;
473 e->height = msg->update.bottom - msg->update.top;
474
475 e->time = _ecore_win32_event_last_time;
476
477 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
478}
479
480void
481_ecore_win32_event_handle_create_notify(Ecore_Win32_Callback_Data *msg)
482{
483 Ecore_Win32_Event_Window_Create *e;
484
485 INF("window create notify");
486
487 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Create));
488 if (!e) return;
489
490 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
491
492 e->time = _ecore_win32_event_last_time;
493
494 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CREATE, e, NULL, NULL);
495}
496
497void
498_ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg)
499{
500 Ecore_Win32_Event_Window_Destroy *e;
501
502 INF("window destroy notify");
503
504 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Destroy));
505 if (!e) return;
506
507 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
508
509 e->time = _ecore_win32_event_last_time;
510 if (e->window == _ecore_win32_event_last_window) _ecore_win32_event_last_window = NULL;
511
512 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, e, NULL, NULL);
513}
514
515void
516_ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg)
517{
518 Ecore_Win32_Event_Window_Show *e;
519
520 INF("window map notify");
521
522 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Show));
523 if (!e) return;
524
525 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
526
527 e->time = _ecore_win32_event_last_time;
528
529 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_SHOW, e, NULL, NULL);
530}
531
532void
533_ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg)
534{
535 Ecore_Win32_Event_Window_Hide *e;
536
537 INF("window unmap notify");
538
539 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Hide));
540 if (!e) return;
541
542 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
543
544 e->time = _ecore_win32_event_last_time;
545
546 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_HIDE, e, NULL, NULL);
547}
548
549void
550_ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg)
551{
552 WINDOWINFO wi;
553 Ecore_Win32_Event_Window_Configure *e;
554 WINDOWPOS *window_pos;
555
556 INF("window configure notify");
557
558 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Configure));
559 if (!e) return;
560
561 window_pos = (WINDOWPOS *)msg->data_param;
562 wi.cbSize = sizeof(WINDOWINFO);
563 if (!GetWindowInfo(window_pos->hwnd, &wi))
564 {
565 free(e);
566 return;
567 }
568
569 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
570 e->abovewin = (void *)GetWindowLongPtr(window_pos->hwndInsertAfter, GWLP_USERDATA);
571 e->x = wi.rcClient.left;
572 e->y = wi.rcClient.top;
573 e->width = wi.rcClient.right - wi.rcClient.left;
574 e->height = wi.rcClient.bottom - wi.rcClient.top;
575 e->time = _ecore_win32_event_last_time;
576
577 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
578}
579
580void
581_ecore_win32_event_handle_resize(Ecore_Win32_Callback_Data *msg)
582{
583 RECT rect;
584 Ecore_Win32_Event_Window_Resize *e;
585
586 INF("window resize");
587
588 if (!GetClientRect(msg->window, &rect))
589 return;
590
591 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Resize));
592 if (!e) return;
593
594 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
595 e->width = rect.right - rect.left;
596 e->height = rect.bottom - rect.top;
597 e->time = _ecore_win32_event_last_time;
598
599 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_RESIZE, e, NULL, NULL);
600}
601
602void
603_ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg)
604{
605 Ecore_Win32_Event_Window_Delete_Request *e;
606
607 INF("window delete request");
608
609 e = calloc(1, sizeof(Ecore_Win32_Event_Window_Delete_Request));
610 if (!e) return;
611
612 e->window = (void *)GetWindowLongPtr(msg->window, GWLP_USERDATA);
613 e->time = _ecore_win32_event_last_time;
614
615 ecore_event_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
616}
617
618
619/***** Private functions definitions *****/
620
621static void
622_ecore_win32_event_free_key_down(void *data __UNUSED__,
623 void *ev)
624{
625 Ecore_Event_Key *e;
626
627 e = ev;
628 if (e->keyname) free((char *)e->keyname);
629 if (e->key) free((char *)e->key);
630 if (e->string) free((char *)e->string);
631 free(e);
632}
633
634static void
635_ecore_win32_event_free_key_up(void *data __UNUSED__,
636 void *ev)
637{
638 Ecore_Event_Key *e;
639
640 e = ev;
641 if (e->keyname) free((char *)e->keyname);
642 if (e->key) free((char *)e->key);
643 if (e->string) free((char *)e->string);
644 free(e);
645}
646
647static int
648_ecore_win32_event_keystroke_get(int key,
649 int is_extended,
650 Eina_Bool is_down,
651 char **keyname,
652 char **keysymbol,
653 char **keycompose,
654 unsigned int *modifiers)
655{
656 char *kn = NULL;
657 char *ks = NULL;
658 char *kc = NULL;
659
660 *keyname = NULL;
661 *keysymbol = NULL;
662 *keycompose = NULL;
663
664
665 printf("vk key 0x%x\n", key);
666 switch (key)
667 {
668 /* Keystroke */
669 case VK_PRIOR:
670 if (is_extended)
671 {
672 kn = "Prior";
673 ks = "Prior";
674 kc = NULL;
675 }
676 else
677 {
678 kn = "KP_Prior";
679 ks = "KP_9";
680 kc = "KP_Prior";
681 }
682 break;
683 case VK_NEXT:
684 if (is_extended)
685 {
686 kn = "Next";
687 ks = "Next";
688 kc = NULL;
689 }
690 else
691 {
692 kn = "KP_Next";
693 ks = "KP_3";
694 kc = "KP_Next";
695 }
696 break;
697 case VK_END:
698 if (is_extended)
699 {
700 kn = "End";
701 ks = "End";
702 kc = NULL;
703 }
704 else
705 {
706 kn = "KP_End";
707 ks = "KP_1";
708 kc = "KP_End";
709 }
710 break;
711 case VK_HOME:
712 if (is_extended)
713 {
714 kn = "Home";
715 ks = "Home";
716 kc = NULL;
717 }
718 else
719 {
720 kn = "KP_Home";
721 ks = "KP_7";
722 kc = "KP_Home";
723 }
724 break;
725 case VK_LEFT:
726 if (is_extended)
727 {
728 kn = "Left";
729 ks = "Left";
730 kc = NULL;
731 }
732 else
733 {
734 kn = "KP_Left";
735 ks = "KP_4";
736 kc = "KP_Left";
737 }
738 break;
739 case VK_UP:
740 if (is_extended)
741 {
742 kn = "Up";
743 ks = "Up";
744 kc = NULL;
745 }
746 else
747 {
748 kn = "KP_Up";
749 ks = "KP_8";
750 kc = "KP_Up";
751 }
752 break;
753 case VK_RIGHT:
754 printf("vk val 0x%x (right)\n", VK_RIGHT);
755 if (is_extended)
756 {
757 kn = "Right";
758 ks = "Right";
759 kc = NULL;
760 }
761 else
762 {
763 kn = "KP_Right";
764 ks = "KP_6";
765 kc = "KP_Right";
766 }
767 break;
768 case VK_DOWN:
769 if (is_extended)
770 {
771 kn = "Down";
772 ks = "Down";
773 kc = NULL;
774 }
775 else
776 {
777 kn = "KP_Down";
778 ks = "KP_2";
779 kc = "KP_Down";
780 }
781 break;
782 case VK_INSERT:
783 if (is_extended)
784 {
785 kn = "Insert";
786 ks = "Insert";
787 kc = NULL;
788 }
789 else
790 {
791 kn = "KP_Insert";
792 ks = "KP_0";
793 kc = "KP_Insert";
794 }
795 break;
796 case VK_DELETE:
797 if (is_extended)
798 {
799 kn = "Delete";
800 ks = "Delete";
801 /* FIXME: kc is wrong, here */
802 kc = "Delete";
803 }
804 else
805 {
806 kn = "KP_Delete";
807 ks = "KP_Decimal";
808 kc = "KP_Delete";
809 }
810 break;
811 case VK_SHIFT:
812 {
813 SHORT res;
814
815 if (is_down)
816 {
817 res = GetKeyState(VK_LSHIFT);
818 if (res & 0x8000)
819 {
820 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LSHIFT;
821 kn = "Shift_L";
822 ks = "Shift_L";
823 kc = "";
824 }
825 res = GetKeyState(VK_RSHIFT);
826 if (res & 0x8000)
827 {
828 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RSHIFT;
829 kn = "Shift_R";
830 ks = "Shift_R";
831 kc = "";
832 }
833 *modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
834 }
835 else /* is_up */
836 {
837 res = GetKeyState(VK_LSHIFT);
838 if (!(res & 0x8000) &&
839 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LSHIFT))
840 {
841 kn = "Shift_L";
842 ks = "Shift_L";
843 kc = "";
844 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LSHIFT;
845 }
846 res = GetKeyState(VK_RSHIFT);
847 if (!(res & 0x8000) &&
848 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RSHIFT))
849 {
850 kn = "Shift_R";
851 ks = "Shift_R";
852 kc = "";
853 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RSHIFT;
854 }
855 *modifiers &= ~ECORE_EVENT_MODIFIER_SHIFT;
856 }
857 break;
858 }
859 case VK_CONTROL:
860 {
861 SHORT res;
862
863 if (is_down)
864 {
865 res = GetKeyState(VK_LCONTROL);
866 if (res & 0x8000)
867 {
868 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LCONTROL;
869 kn = "Control_L";
870 ks = "Control_L";
871 kc = "";
872 break;
873 }
874 res = GetKeyState(VK_RCONTROL);
875 if (res & 0x8000)
876 {
877 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RCONTROL;
878 kn = "Control_R";
879 ks = "Control_R";
880 kc = "";
881 break;
882 }
883 *modifiers |= ECORE_EVENT_MODIFIER_CTRL;
884 }
885 else /* is_up */
886 {
887 res = GetKeyState(VK_LCONTROL);
888 if (!(res & 0x8000) &&
889 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LCONTROL))
890 {
891 kn = "Control_L";
892 ks = "Control_L";
893 kc = "";
894 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LCONTROL;
895 break;
896 }
897 res = GetKeyState(VK_RCONTROL);
898 if (!(res & 0x8000) &&
899 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RCONTROL))
900 {
901 kn = "Control_R";
902 ks = "Control_R";
903 kc = "";
904 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RCONTROL;
905 break;
906 }
907 *modifiers &= ~ECORE_EVENT_MODIFIER_CTRL;
908 }
909 break;
910 }
911 case VK_MENU:
912 {
913 SHORT res;
914
915 if (is_down)
916 {
917 res = GetKeyState(VK_LMENU);
918 if (res & 0x8000)
919 {
920 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_LMENU;
921 kn = "Alt_L";
922 ks = "Alt_L";
923 kc = "";
924 }
925 res = GetKeyState(VK_RMENU);
926 if (res & 0x8000)
927 {
928 _ecore_win32_key_mask |= ECORE_WIN32_KEY_MASK_RMENU;
929 kn = "Alt_R";
930 ks = "Alt_R";
931 kc = "";
932 }
933 *modifiers |= ECORE_EVENT_MODIFIER_ALT;
934 }
935 else /* is_up */
936 {
937 res = GetKeyState(VK_LMENU);
938 if (!(res & 0x8000) &&
939 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_LMENU))
940 {
941 kn = "Alt_L";
942 ks = "Alt_L";
943 kc = "";
944 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_LMENU;
945 }
946 res = GetKeyState(VK_RMENU);
947 if (!(res & 0x8000) &&
948 (_ecore_win32_key_mask & ECORE_WIN32_KEY_MASK_RMENU))
949 {
950 kn = "Alt_R";
951 ks = "Alt_R";
952 kc = "";
953 _ecore_win32_key_mask &= ~ECORE_WIN32_KEY_MASK_RMENU;
954 }
955 *modifiers &= ~ECORE_EVENT_MODIFIER_ALT;
956 }
957 break;
958 }
959 case VK_LWIN:
960 {
961 if (is_down)
962 {
963 kn = "Super_L";
964 ks = "Super_L";
965 kc = "";
966 *modifiers |= ECORE_EVENT_MODIFIER_WIN;
967 }
968 else /* is_up */
969 {
970 kn = "Super_L";
971 ks = "Super_L";
972 kc = "";
973 *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
974 }
975 break;
976 }
977 case VK_RWIN:
978 {
979 if (is_down)
980 {
981 kn = "Super_R";
982 ks = "Super_R";
983 kc = "";
984 *modifiers |= ECORE_EVENT_MODIFIER_WIN;
985 }
986 else /* is_up */
987 {
988 kn = "Super_R";
989 ks = "Super_R";
990 kc = "";
991 *modifiers &= ~ECORE_EVENT_MODIFIER_WIN;
992 }
993 break;
994 }
995 case VK_F1:
996 kn = "F1";
997 ks = "F1";
998 kc = "";
999 break;
1000 case VK_F2:
1001 kn = "F2";
1002 ks = "F2";
1003 kc = "";
1004 break;
1005 case VK_F3:
1006 kn = "F3";
1007 ks = "F3";
1008 kc = "";
1009 break;
1010 case VK_F4:
1011 kn = "F4";
1012 ks = "F4";
1013 kc = "";
1014 break;
1015 case VK_F5:
1016 kn = "F5";
1017 ks = "F5";
1018 kc = "";
1019 break;
1020 case VK_F6:
1021 kn = "F6";
1022 ks = "F6";
1023 kc = "";
1024 break;
1025 case VK_F7:
1026 kn = "F7";
1027 ks = "F7";
1028 kc = "";
1029 break;
1030 case VK_F8:
1031 kn = "F8";
1032 ks = "F8";
1033 kc = "";
1034 break;
1035 case VK_F9:
1036 kn = "F9";
1037 ks = "F9";
1038 kc = "";
1039 break;
1040 case VK_F10:
1041 kn = "F10";
1042 ks = "F10";
1043 kc = "";
1044 break;
1045 case VK_F11:
1046 kn = "F11";
1047 ks = "F11";
1048 kc = "";
1049 break;
1050 case VK_F12:
1051 kn = "F12";
1052 ks = "F12";
1053 kc = "";
1054 break;
1055 case VK_F13:
1056 kn = "F13";
1057 ks = "F13";
1058 kc = "";
1059 break;
1060 case VK_F14:
1061 kn = "F14";
1062 ks = "F14";
1063 kc = "";
1064 break;
1065 case VK_F15:
1066 kn = "F15";
1067 ks = "F15";
1068 kc = "";
1069 break;
1070 case VK_F16:
1071 kn = "F16";
1072 ks = "F16";
1073 kc = "";
1074 break;
1075 case VK_F17:
1076 kn = "F17";
1077 ks = "F17";
1078 kc = "";
1079 break;
1080 case VK_F18:
1081 kn = "F18";
1082 ks = "F18";
1083 kc = "";
1084 break;
1085 case VK_F19:
1086 kn = "F19";
1087 ks = "F19";
1088 kc = "";
1089 break;
1090 case VK_F20:
1091 kn = "F20";
1092 ks = "F20";
1093 kc = "";
1094 break;
1095 case VK_F21:
1096 kn = "F21";
1097 ks = "F21";
1098 kc = "";
1099 break;
1100 case VK_F22:
1101 kn = "F22";
1102 ks = "F22";
1103 kc = "";
1104 break;
1105 case VK_F23:
1106 kn = "F23";
1107 ks = "F23";
1108 kc = "";
1109 break;
1110 case VK_F24:
1111 kn = "F24";
1112 ks = "F24";
1113 kc = "";
1114 break;
1115 default:
1116 /* other non keystroke characters */
1117 return 0;
1118 }
1119
1120 printf("sortie...\n");
1121 *keyname = strdup(kn);
1122 if (!*keyname) return 0;
1123 *keysymbol = strdup(ks);
1124 if (!*keysymbol)
1125 {
1126 free(*keyname);
1127 *keyname = NULL;
1128 return 0;
1129 }
1130 if (!kc)
1131 *keycompose = NULL;
1132 else
1133 {
1134 *keycompose = strdup(kc);
1135 if (!*keycompose)
1136 {
1137 free(*keyname);
1138 free(*keysymbol);
1139 *keyname = NULL;
1140 *keysymbol = NULL;
1141 return 0;
1142 }
1143 }
1144 printf("sortie 2 ...\n");
1145
1146 return 1;
1147}
1148
1149static int
1150_ecore_win32_event_char_get(int key,
1151 char **keyname,
1152 char **keysymbol,
1153 char **keycompose)
1154{
1155 char *kn = NULL;
1156 char *ks = NULL;
1157 char *kc = NULL;
1158 char buf[2];
1159
1160 *keyname = NULL;
1161 *keysymbol = NULL;
1162 *keycompose = NULL;
1163
1164 printf("char key 0x%x\n", key);
1165
1166 switch (key)
1167 {
1168 case VK_PROCESSKEY:
1169 break;
1170 case VK_BACK:
1171 kn = "BackSpace";
1172 ks = "BackSpace";
1173 kc = "\b";
1174 break;
1175 case VK_TAB:
1176 kn = "Tab";
1177 ks = "Tab";
1178 kc = "\t";
1179 break;
1180 case 0x0a:
1181 /* Line feed (Shift + Enter) */
1182 kn = "LineFeed";
1183 ks = "LineFeed";
1184 kc = "LineFeed";
1185 break;
1186 case VK_RETURN:
1187 kn = "Return";
1188 ks = "Return";
1189 kc = "\n";
1190 break;
1191 case VK_ESCAPE:
1192 kn = "Escape";
1193 ks = "Escape";
1194 kc = "\e";
1195 break;
1196 case VK_SPACE:
1197 kn = "space";
1198 ks = "space";
1199 kc = " ";
1200 break;
1201 default:
1202 /* displayable characters */
1203 printf (" * key : %d\n", key);
1204 buf[0] = key;
1205 buf[1] = '\0';
1206 kn = buf;
1207 ks = buf;
1208 kc = buf;
1209 break;
1210 }
1211 *keyname = strdup(kn);
1212 if (!*keyname) return 0;
1213 *keysymbol = strdup(ks);
1214 if (!*keysymbol)
1215 {
1216 free(*keyname);
1217 *keyname = NULL;
1218 return 0;
1219 }
1220 *keycompose = strdup(kc);
1221 if (!*keycompose)
1222 {
1223 free(*keyname);
1224 free(*keysymbol);
1225 *keyname = NULL;
1226 *keysymbol = NULL;
1227 return 0;
1228 }
1229
1230 return 1;
1231}
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_private.h b/libraries/ecore/src/lib/ecore_win32/ecore_win32_private.h
new file mode 100644
index 0000000..4533169
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_private.h
@@ -0,0 +1,169 @@
1#ifndef __ECORE_WIN32_PRIVATE_H__
2#define __ECORE_WIN32_PRIVATE_H__
3
4
5#ifdef __cplusplus
6extern "C" {
7#endif
8
9#ifdef MIN
10# undef MIN
11#endif
12#define MIN(a,b) (((a) < (b)) ? (a) : (b))
13
14#ifdef MAX
15# undef MAX
16#endif
17#define MAX(a,b) (((a) < (b)) ? (b) : (a))
18
19/* logging messages macros */
20extern int _ecore_win32_log_dom_global;
21
22#ifdef ECORE_WIN32_DEFAULT_LOG_COLOR
23# undef ECORE_WIN32_DEFAULT_LOG_COLOR
24#endif
25#define ECORE_WIN32_DEFAULT_LOG_COLOR EINA_COLOR_LIGHTBLUE
26
27#ifdef ERR
28# undef ERR
29#endif
30#define ERR(...) EINA_LOG_DOM_ERR(_ecore_win32_log_dom_global , __VA_ARGS__)
31#ifdef DBG
32#undef DBG
33#endif
34#define DBG(...) EINA_LOG_DOM_DBG(_ecore_win32_log_dom_global , __VA_ARGS__)
35
36#ifdef INF
37#undef INF
38#endif
39#define INF(...) EINA_LOG_DOM_INFO(_ecore_win32_log_dom_global , __VA_ARGS__)
40
41#ifdef WRN
42# undef WRN
43#endif
44#define WRN(...) EINA_LOG_DOM_WARN(_ecore_win32_log_dom_global, __VA_ARGS__)
45
46#define ECORE_WIN32_WINDOW_CLASS "Ecore_Win32_Window_Class"
47
48typedef struct _Ecore_Win32_Callback_Data Ecore_Win32_Callback_Data;
49
50struct _Ecore_Win32_Callback_Data
51{
52 RECT update;
53 HWND window;
54 unsigned int message;
55 WPARAM window_param;
56 LPARAM data_param;
57 long time;
58 int x;
59 int y;
60};
61
62struct _Ecore_Win32_Window
63{
64 HWND window;
65
66 DWORD style; /* used to go fullscreen to normal */
67 RECT rect; /* used to go fullscreen to normal */
68
69 unsigned int min_width;
70 unsigned int min_height;
71 unsigned int max_width;
72 unsigned int max_height;
73 unsigned int base_width;
74 unsigned int base_height;
75 unsigned int step_width;
76 unsigned int step_height;
77
78 struct {
79 unsigned int iconified : 1;
80 unsigned int modal : 1;
81 unsigned int sticky : 1;
82 unsigned int maximized_vert : 1;
83 unsigned int maximized_horz : 1;
84 unsigned int shaded : 1;
85 unsigned int hidden : 1;
86 unsigned int fullscreen : 1;
87 unsigned int above : 1;
88 unsigned int below : 1;
89 unsigned int demands_attention : 1;
90 } state;
91
92 struct {
93 unsigned int desktop : 1;
94 unsigned int dock : 1;
95 unsigned int toolbar : 1;
96 unsigned int menu : 1;
97 unsigned int utility : 1;
98 unsigned int splash : 1;
99 unsigned int dialog : 1;
100 unsigned int normal : 1;
101 } type;
102
103 unsigned int pointer_is_in : 1;
104 unsigned int borderless : 1;
105 unsigned int iconified : 1;
106 unsigned int fullscreen : 1;
107
108 struct {
109 unsigned short width;
110 unsigned short height;
111 unsigned char *mask;
112 unsigned int enabled : 1;
113 unsigned int layered : 1;
114 } shape;
115
116 struct {
117 DWORD type;
118 int x;
119 int y;
120 int w;
121 int h;
122 int px;
123 int py;
124 unsigned int dragging : 1;
125 } drag;
126
127 void *dnd_drop_target;
128};
129
130
131extern HINSTANCE _ecore_win32_instance;
132extern double _ecore_win32_double_click_time;
133extern long _ecore_win32_event_last_time;
134extern Ecore_Win32_Window *_ecore_win32_event_last_window;
135
136
137void _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, int is_keystroke);
138void _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg);
139void _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, int button);
140void _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, int button);
141void _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg);
142void _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg);
143void _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg);
144void _ecore_win32_event_handle_focus_in(Ecore_Win32_Callback_Data *msg);
145void _ecore_win32_event_handle_focus_out(Ecore_Win32_Callback_Data *msg);
146void _ecore_win32_event_handle_expose(Ecore_Win32_Callback_Data *msg);
147void _ecore_win32_event_handle_create_notify(Ecore_Win32_Callback_Data *msg);
148void _ecore_win32_event_handle_destroy_notify(Ecore_Win32_Callback_Data *msg);
149void _ecore_win32_event_handle_map_notify(Ecore_Win32_Callback_Data *msg);
150void _ecore_win32_event_handle_unmap_notify(Ecore_Win32_Callback_Data *msg);
151void _ecore_win32_event_handle_configure_notify(Ecore_Win32_Callback_Data *msg);
152void _ecore_win32_event_handle_resize(Ecore_Win32_Callback_Data *msg);
153void _ecore_win32_event_handle_delete_request(Ecore_Win32_Callback_Data *msg);
154
155void *_ecore_win32_dnd_data_object_new(void *fmtetc, void *stgmeds, int count);
156void _ecore_win32_dnd_data_object_free(void *data_object);
157void *_ecore_win32_dnd_drop_source_new();
158void _ecore_win32_dnd_drop_source_free(void *drop_source);
159void *_ecore_win32_dnd_register_drop_window(HWND hwnd,
160 Ecore_Win32_Dnd_DropTarget_Callback callback, void *ptr);
161void _ecore_win32_dnd_unregister_drop_window(HWND hwnd, void *drop_target);
162
163
164#ifdef __cplusplus
165}
166#endif
167
168
169#endif /* __ECORE_WIN32_PRIVATE_H__ */
diff --git a/libraries/ecore/src/lib/ecore_win32/ecore_win32_window.c b/libraries/ecore/src/lib/ecore_win32/ecore_win32_window.c
new file mode 100644
index 0000000..459f051
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_win32/ecore_win32_window.c
@@ -0,0 +1,1519 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h> /* for printf */
7
8#define WIN32_LEAN_AND_MEAN
9#include <windows.h>
10#undef WIN32_LEAN_AND_MEAN
11
12#include <Eina.h>
13
14#include "Ecore_Win32.h"
15#include "ecore_win32_private.h"
16
17/*============================================================================*
18 * Local *
19 *============================================================================*/
20
21/**
22 * @cond LOCAL
23 */
24
25
26typedef enum _Ecore_Win32_Window_Z_Order Ecore_Win32_Window_Z_Order;
27enum _Ecore_Win32_Window_Z_Order
28{
29 ECORE_WIN32_WINDOW_Z_ORDER_BOTTOM,
30 ECORE_WIN32_WINDOW_Z_ORDER_NOTOPMOST,
31 ECORE_WIN32_WINDOW_Z_ORDER_TOP,
32 ECORE_WIN32_WINDOW_Z_ORDER_TOPMOST
33};
34
35static Ecore_Win32_Window *
36ecore_win32_window_internal_new(Ecore_Win32_Window *parent,
37 int x,
38 int y,
39 int width,
40 int height,
41 DWORD style)
42{
43 RECT rect;
44 Ecore_Win32_Window *w;
45 int minimal_width;
46 int minimal_height;
47
48 w = (Ecore_Win32_Window *)calloc(1, sizeof(Ecore_Win32_Window));
49 if (!w)
50 {
51 ERR("malloc() failed");
52 return NULL;
53 }
54
55 rect.left = 0;
56 rect.top = 0;
57 rect.right = width;
58 rect.bottom = height;
59 if (!AdjustWindowRectEx(&rect, style, FALSE, 0))
60 {
61 ERR("AdjustWindowRect() failed");
62 free(w);
63 return NULL;
64 }
65
66 minimal_width = GetSystemMetrics(SM_CXMIN);
67 minimal_height = GetSystemMetrics(SM_CYMIN);
68/* if (((rect.right - rect.left) < minimal_width) || */
69/* ((rect.bottom - rect.top) < minimal_height)) */
70/* { */
71/* fprintf (stderr, "[Ecore] [Win32] ERROR !!\n"); */
72/* fprintf (stderr, " Wrong size %ld\n", rect.right - rect.left); */
73/* free(w); */
74/* return NULL; */
75/* } */
76 if ((rect.right - rect.left) < minimal_width)
77 {
78 rect.right = rect.left + minimal_width;
79 }
80
81 w->window = CreateWindowEx(0,
82 ECORE_WIN32_WINDOW_CLASS, "",
83 style,
84 x, y,
85 rect.right - rect.left,
86 rect.bottom - rect.top,
87 parent ? parent->window : NULL,
88 NULL, _ecore_win32_instance, NULL);
89 if (!w->window)
90 {
91 ERR("CreateWindowEx() failed");
92 free(w);
93 return NULL;
94 }
95
96 SetLastError(0);
97 if (!SetWindowLongPtr(w->window, GWLP_USERDATA, (LONG_PTR)w) &&
98 (GetLastError() != 0))
99 {
100 ERR("SetWindowLongPtr() failed");
101 DestroyWindow(w->window);
102 free(w);
103 return NULL;
104 }
105
106 w->min_width = 0;
107 w->min_height = 0;
108 w->max_width = 32767;
109 w->max_height = 32767;
110 w->base_width = 0;
111 w->base_height = 0;
112 w->step_width = 1;
113 w->step_height = 1;
114
115 w->state.iconified = 0;
116 w->state.modal = 0;
117 w->state.sticky = 0;
118 w->state.maximized_vert = 0;
119 w->state.maximized_horz = 0;
120 w->state.shaded = 0;
121 w->state.hidden = 0;
122 w->state.fullscreen = 0;
123 w->state.above = 0;
124 w->state.below = 0;
125 w->state.demands_attention = 0;
126
127 w->type.desktop = 0;
128 w->type.dock = 0;
129 w->type.toolbar = 0;
130 w->type.menu = 0;
131 w->type.utility = 0;
132 w->type.splash = 0;
133 w->type.dialog = 0;
134 w->type.normal = 0;
135
136 w->pointer_is_in = 0;
137 w->borderless = 0;
138 w->iconified = 0;
139 w->fullscreen = 0;
140
141 return w;
142}
143
144/**
145 * @endcond
146 */
147
148
149/*============================================================================*
150 * Global *
151 *============================================================================*/
152
153/*============================================================================*
154 * API *
155 *============================================================================*/
156
157/**
158 * @addtogroup Ecore_Win32_Group Ecore_Win32 library
159 *
160 * @{
161 */
162
163/**
164 * @brief Creates a new window.
165 *
166 * @param parent The parent window.
167 * @param x The x coordinate of the top-left corner of the window.
168 * @param y The y coordinate of the top-left corner of the window.
169 * @param width The width of the window.
170 * @param height The height of hte window.
171 * @return A newly allocated window.
172 *
173 * This function creates a new window which parent is @p parent. @p width and
174 * @p height are the size of the window content (the client part),
175 * without the border and title bar. @p x and @p y are the system
176 * coordinates of the top left cerner of the window (that is, of the
177 * title bar). This function returns a newly created window on
178 * success, and @c NULL on failure.
179 */
180EAPI Ecore_Win32_Window *
181ecore_win32_window_new(Ecore_Win32_Window *parent,
182 int x,
183 int y,
184 int width,
185 int height)
186{
187 INF("creating window with border");
188
189 return ecore_win32_window_internal_new(parent,
190 x, y,
191 width, height,
192 WS_OVERLAPPEDWINDOW | WS_SIZEBOX);
193}
194
195/**
196 * @brief Creates a new borderless window.
197 *
198 * @param parent The parent window.
199 * @param x The x coordinate of the top-left corner of the window.
200 * @param y The y coordinate of the top-left corner of the window.
201 * @param width The width of the window.
202 * @param height The height of hte window.
203 * @return A newly allocated window.
204 *
205 * This function is the same than ecore_win32_window_override_new()
206 * but the returned window is borderless.
207 */
208EAPI Ecore_Win32_Window *
209ecore_win32_window_override_new(Ecore_Win32_Window *parent,
210 int x,
211 int y,
212 int width,
213 int height)
214{
215 INF("creating window without border");
216
217 return ecore_win32_window_internal_new(parent,
218 x, y,
219 width, height,
220 WS_POPUP);
221}
222
223/**
224 * @brief Free the given window.
225 *
226 * @param window The window to free.
227 *
228 * This function frees @p window. If @p window is @c NULL, this
229 * function does nothing.
230 */
231EAPI void
232ecore_win32_window_free(Ecore_Win32_Window *window)
233{
234 if (!window) return;
235
236 INF("destroying window");
237
238 if (window->shape.mask)
239 free(window->shape.mask);
240
241 DestroyWindow(window->window);
242 free(window);
243}
244
245/**
246 * @brief Return the window HANDLE associated to the given window.
247 *
248 * @param window The window to retrieve the HANDLE from.
249 *
250 * This function returns the window HANDLE associated to @p window. If
251 * @p window is @c NULL, this function returns @c NULL.
252 */
253EAPI void *
254ecore_win32_window_hwnd_get(Ecore_Win32_Window *window)
255{
256 if (!window) return NULL;
257
258 return window->window;
259}
260
261/*
262void
263ecore_win32_window_configure(Ecore_Win32_Window *window,
264 Ecore_Win32_Window_Z_Order order,
265 int x,
266 int y,
267 int width,
268 int height)
269{
270 HWND w;
271
272 switch (order)
273 {
274 case ECORE_WIN32_WINDOW_Z_ORDER_BOTTOM:
275 w = HWND_BOTTOM;
276 break;
277 case ECORE_WIN32_WINDOW_Z_ORDER_NOTOPMOST:
278 w = HWND_NOTOPMOST;
279 break;
280 case ECORE_WIN32_WINDOW_Z_ORDER_TOP:
281 w = HWND_TOP;
282 break;
283 case ECORE_WIN32_WINDOW_Z_ORDER_TOPMOST:
284 w = HWND_TOPMOST;
285 break;
286 default:
287 return;
288 }
289 SetWindowPos((Ecore_Win32_Window *)window->window, w, x, y, width, height, ???);
290}
291*/
292
293/**
294 * @brief Move the given window to a given position.
295 *
296 * @param window The window to move.
297 * @param x The x coordinate of the destination position.
298 * @param y The y coordinate of the destination position.
299 *
300 * This function move @p window to the new position of coordinates @p x
301 * and @p y. If @p window is @c NULL, or if it is fullscreen, or on
302 * error, this function does nothing.
303 */
304EAPI void
305ecore_win32_window_move(Ecore_Win32_Window *window,
306 int x,
307 int y)
308{
309 RECT rect;
310
311 /* FIXME: on fullscreen, should not move it */
312 if (!window) return;
313
314 INF("moving window (%dx%d)", x, y);
315
316 if (!GetWindowRect(window->window, &rect))
317 {
318 ERR("GetWindowRect() failed");
319 return;
320 }
321
322 if (!MoveWindow(window->window, x, y,
323 rect.right - rect.left,
324 rect.bottom - rect.top,
325 TRUE))
326 {
327 ERR("MoveWindow() failed");
328 }
329}
330
331/**
332 * @brief Resize the given window to a given size.
333 *
334 * @param window The window to resize.
335 * @param width The new width.
336 * @param height The new height.
337 *
338 * This function resize @p window to the new @p width and @p height.
339 * If @p window is @c NULL, or if it is fullscreen, or on error, this
340 * function does nothing.
341 */
342EAPI void
343ecore_win32_window_resize(Ecore_Win32_Window *window,
344 int width,
345 int height)
346{
347 RECT rect;
348 DWORD style;
349 int x;
350 int y;
351 int minimal_width;
352 int minimal_height;
353
354 /* FIXME: on fullscreen, should not resize it */
355 if (!window) return;
356
357 INF("resizing window (%dx%d)", width, height);
358
359 minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)window->min_width);
360 minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)window->min_height);
361
362 if (!GetWindowRect(window->window, &rect))
363 {
364 ERR("GetWindowRect() failed");
365 return;
366 }
367
368 x = rect.left;
369 y = rect.top;
370 rect.left = 0;
371 rect.top = 0;
372 if (width < minimal_width) width = minimal_width;
373 if (width > (int)window->max_width) width = window->max_width;
374 if (height < minimal_height) height = minimal_height;
375 if (height > (int)window->max_height) height = window->max_height;
376 rect.right = width;
377 rect.bottom = height;
378 if (!(style = GetWindowLong(window->window, GWL_STYLE)))
379 {
380 ERR("GetWindowLong() failed");
381 return;
382 }
383 if (!AdjustWindowRect(&rect, style, FALSE))
384 {
385 ERR("AdjustWindowRect() failed");
386 return;
387 }
388
389 if (!MoveWindow(window->window, x, y,
390 rect.right - rect.left,
391 rect.bottom - rect.top,
392 TRUE))
393 {
394 ERR("MoveWindow() failed");
395 }
396}
397
398/**
399 * @brief Move and resize the given window to a given position and size.
400 *
401 * @param window The window to move and resize.
402 * @param x The x coordinate of the destination position.
403 * @param y The x coordinate of the destination position.
404 * @param width The new width.
405 * @param height The new height.
406 *
407 * This function resize @p window to the new position of coordinates @p x
408 * and @p y and the new @p width and @p height. If @p window is @c NULL,
409 * or if it is fullscreen, or on error, this function does nothing.
410 */
411EAPI void
412ecore_win32_window_move_resize(Ecore_Win32_Window *window,
413 int x,
414 int y,
415 int width,
416 int height)
417{
418 RECT rect;
419 DWORD style;
420 int minimal_width;
421 int minimal_height;
422
423 /* FIXME: on fullscreen, should not move/resize it */
424 if (!window) return;
425
426 INF("moving and resizing window (%dx%d %dx%d)", x, y, width, height);
427
428 minimal_width = MAX(GetSystemMetrics(SM_CXMIN), (int)window->min_width);
429 minimal_height = MAX(GetSystemMetrics(SM_CYMIN), (int)window->min_height);
430
431 rect.left = 0;
432 rect.top = 0;
433 if (width < minimal_width) width = minimal_width;
434 if (width > (int)window->max_width) width = window->max_width;
435 if (height < minimal_height) height = minimal_height;
436 if (height > (int)window->max_height) height = window->max_height;
437 rect.right = width;
438 rect.bottom = height;
439 if (!(style = GetWindowLong(window->window, GWL_STYLE)))
440 {
441 ERR("GetWindowLong() failed");
442 return;
443 }
444 if (!AdjustWindowRect(&rect, style, FALSE))
445 {
446 ERR("AdjustWindowRect() failed");
447 return;
448 }
449
450 if (!MoveWindow(window->window, x, y,
451 rect.right - rect.left,
452 rect.bottom - rect.top,
453 TRUE))
454 {
455 ERR("MoveWindow() failed");
456 }
457}
458
459/**
460 * @brief Get the geometry of the given window.
461 *
462 * @param window The window to retrieve the geometry from.
463 * @param x The x coordinate of the position.
464 * @param y The x coordinate of the position.
465 * @param width The width.
466 * @param height The height.
467 *
468 * This function retrieves the position and size of @p window. @p x,
469 * @p y, @p width and @p height can be buffers that will be filled with
470 * the corresponding values. If one of them is @c NULL, nothing will
471 * be done for that parameter. If @p window is @c NULL, and if the
472 * buffers are not @c NULL, they will be filled with respectively 0,
473 * 0, the size of the screen and the height of the screen.
474 */
475EAPI void
476ecore_win32_window_geometry_get(Ecore_Win32_Window *window,
477 int *x,
478 int *y,
479 int *width,
480 int *height)
481{
482 RECT rect;
483 int w;
484 int h;
485
486 INF("getting window geometry");
487
488 if (!window)
489 {
490 if (x) *x = 0;
491 if (y) *y = 0;
492 if (width) *width = GetSystemMetrics(SM_CXSCREEN);
493 if (height) *height = GetSystemMetrics(SM_CYSCREEN);
494
495 return;
496 }
497
498 if (!GetClientRect(window->window, &rect))
499 {
500 ERR("GetClientRect() failed");
501
502 if (x) *x = 0;
503 if (y) *y = 0;
504 if (width) *width = 0;
505 if (height) *height = 0;
506
507 return;
508 }
509
510 w = rect.right - rect.left;
511 h = rect.bottom - rect.top;
512
513 if (!GetWindowRect(window->window, &rect))
514 {
515 ERR("GetWindowRect() failed");
516
517 if (x) *x = 0;
518 if (y) *y = 0;
519 if (width) *width = 0;
520 if (height) *height = 0;
521
522 return;
523 }
524
525 if (x) *x = rect.left;
526 if (y) *y = rect.top;
527 if (width) *width = w;
528 if (height) *height = h;
529}
530
531/**
532 * @brief Get the size of the given window.
533 *
534 * @param window The window to retrieve the size from.
535 * @param width The width.
536 * @param height The height.
537 *
538 * This function retrieves the size of @p window. @p width and
539 * @p height can be buffers that will be filled with the corresponding
540 * values. If one of them is @c NULL, nothing will be done for that
541 * parameter. If @p window is @c NULL, and if the buffers are not
542 * @c NULL, they will be filled with respectively the size of the screen
543 * and the height of the screen.
544 */
545EAPI void
546ecore_win32_window_size_get(Ecore_Win32_Window *window,
547 int *width,
548 int *height)
549{
550 RECT rect;
551
552 INF("getting window size");
553
554 if (!window)
555 {
556 if (width) *width = GetSystemMetrics(SM_CXSCREEN);
557 if (height) *height = GetSystemMetrics(SM_CYSCREEN);
558
559 return;
560 }
561
562 if (!GetClientRect(window->window, &rect))
563 {
564 ERR("GetClientRect() failed");
565
566 if (width) *width = 0;
567 if (height) *height = 0;
568 }
569
570 if (width) *width = rect.right - rect.left;
571 if (height) *height = rect.bottom - rect.top;
572}
573
574/**
575 * @brief Set the minimum size of the given window.
576 *
577 * @param window The window.
578 * @param min_width The minimal width.
579 * @param min_height The minimal height.
580 *
581 * This function sets the minimum size of @p window to @p min_width
582 * and *p min_height. If @p window is @c NULL, this functions does
583 * nothing.
584 */
585EAPI void
586ecore_win32_window_size_min_set(Ecore_Win32_Window *window,
587 unsigned int min_width,
588 unsigned int min_height)
589{
590 if (!window) return;
591
592 printf ("ecore_win32_window_size_min_set : %p %d %d\n", window, min_width, min_height);
593 window->min_width = min_width;
594 window->min_height = min_height;
595}
596
597/**
598 * @brief Get the minimum size of the given window.
599 *
600 * @param window The window.
601 * @param min_width The minimal width.
602 * @param min_height The minimal height.
603 *
604 * This function fills the minimum size of @p window in the buffers
605 * @p min_width and *p min_height. They both can be @c NULL. If
606 * @p window is @c NULL, this functions does nothing.
607 */
608EAPI void
609ecore_win32_window_size_min_get(Ecore_Win32_Window *window,
610 unsigned int *min_width,
611 unsigned int *min_height)
612{
613 if (!window) return;
614
615 printf ("ecore_win32_window_size_min_get : %p %d %d\n", window, window->min_width, window->min_height);
616 if (min_width) *min_width = window->min_width;
617 if (min_height) *min_height = window->min_height;
618}
619
620/**
621 * @brief Set the maximum size of the given window.
622 *
623 * @param window The window.
624 * @param max_width The maximal width.
625 * @param max_height The maximal height.
626 *
627 * This function sets the maximum size of @p window to @p max_width
628 * and *p max_height. If @p window is @c NULL, this functions does
629 * nothing.
630 */
631EAPI void
632ecore_win32_window_size_max_set(Ecore_Win32_Window *window,
633 unsigned int max_width,
634 unsigned int max_height)
635{
636 if (!window) return;
637
638 printf ("ecore_win32_window_size_max_set : %p %d %d\n", window, max_width, max_height);
639 window->max_width = max_width;
640 window->max_height = max_height;
641}
642
643/**
644 * @brief Get the maximum size of the given window.
645 *
646 * @param window The window.
647 * @param max_width The maximal width.
648 * @param max_height The maximal height.
649 *
650 * This function fills the maximum size of @p window in the buffers
651 * @p max_width and *p max_height. They both can be @c NULL. If
652 * @p window is @c NULL, this functions does nothing.
653 */
654EAPI void
655ecore_win32_window_size_max_get(Ecore_Win32_Window *window,
656 unsigned int *max_width,
657 unsigned int *max_height)
658{
659 if (!window) return;
660
661 printf ("ecore_win32_window_size_max_get : %p %d %d\n", window, window->max_width, window->max_height);
662 if (max_width) *max_width = window->max_width;
663 if (max_height) *max_height = window->max_height;
664}
665
666/**
667 * @brief Set the base size of the given window.
668 *
669 * @param window The window.
670 * @param base_width The base width.
671 * @param base_height The base height.
672 *
673 * This function sets the base size of @p window to @p base_width
674 * and *p base_height. If @p window is @c NULL, this functions does
675 * nothing.
676 */
677EAPI void
678ecore_win32_window_size_base_set(Ecore_Win32_Window *window,
679 unsigned int base_width,
680 unsigned int base_height)
681{
682 printf ("ecore_win32_window_size_base_set : %p %d %d\n", window, base_width, base_height);
683 if (!window) return;
684
685 window->base_width = base_width;
686 window->base_height = base_height;
687}
688
689/**
690 * @brief Get the base size of the given window.
691 *
692 * @param window The window.
693 * @param base_width The base width.
694 * @param base_height The bas height.
695 *
696 * This function fills the base size of @p window in the buffers
697 * @p base_width and *p base_height. They both can be @c NULL. If
698 * @p window is @c NULL, this functions does nothing.
699 */
700EAPI void
701ecore_win32_window_size_base_get(Ecore_Win32_Window *window,
702 unsigned int *base_width,
703 unsigned int *base_height)
704{
705 if (!window) return;
706
707 printf ("ecore_win32_window_size_base_get : %p %d %d\n", window, window->base_width, window->base_height);
708 if (base_width) *base_width = window->base_width;
709 if (base_height) *base_height = window->base_height;
710}
711
712/**
713 * @brief Set the step size of the given window.
714 *
715 * @param window The window.
716 * @param step_width The step width.
717 * @param step_height The step height.
718 *
719 * This function sets the step size of @p window to @p step_width
720 * and *p step_height. If @p window is @c NULL, this functions does
721 * nothing.
722 */
723EAPI void
724ecore_win32_window_size_step_set(Ecore_Win32_Window *window,
725 unsigned int step_width,
726 unsigned int step_height)
727{
728 printf ("ecore_win32_window_size_step_set : %p %d %d\n", window, step_width, step_height);
729 if (!window) return;
730
731 window->step_width = step_width;
732 window->step_height = step_height;
733}
734
735/**
736 * @brief Get the step size of the given window.
737 *
738 * @param window The window.
739 * @param step_width The step width.
740 * @param step_height The bas height.
741 *
742 * This function fills the step size of @p window in the buffers
743 * @p step_width and *p step_height. They both can be @c NULL. If
744 * @p window is @c NULL, this functions does nothing.
745 */
746EAPI void
747ecore_win32_window_size_step_get(Ecore_Win32_Window *window,
748 unsigned int *step_width,
749 unsigned int *step_height)
750{
751 if (!window) return;
752
753 printf ("ecore_win32_window_size_step_get : %p %d %d\n", window, window->step_width, window->step_height);
754 if (step_width) *step_width = window->step_width;
755 if (step_height) *step_height = window->step_height;
756}
757
758EAPI void
759ecore_win32_window_shape_set(Ecore_Win32_Window *window,
760 unsigned short width,
761 unsigned short height,
762 unsigned char *mask)
763{
764 HRGN rgn;
765 int x;
766 int y;
767 OSVERSIONINFO version_info;
768
769 if (!window)
770 return;
771
772 if (!mask)
773 {
774 window->shape.enabled = 0;
775 if (window->shape.layered != 0)
776 {
777 window->shape.layered = 0;
778#if defined(WS_EX_LAYERED)
779 SetLastError(0);
780 if (!SetWindowLongPtr(window->window, GWL_EXSTYLE,
781 GetWindowLong(window->window, GWL_EXSTYLE) & (~WS_EX_LAYERED)) &&
782 (GetLastError() != 0))
783 {
784 ERR("SetWindowLongPtr() failed");
785 return;
786 }
787 if (!RedrawWindow(window->window, NULL, NULL,
788 RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN))
789 {
790 ERR("RedrawWindow() failed");
791 return;
792 }
793#endif
794 }
795 else
796 if (!SetWindowRgn(window->window, NULL, TRUE))
797 {
798 ERR("SetWindowRgn() failed");
799 }
800 return;
801 }
802
803 if (width == 0 || height == 0)
804 return;
805
806 window->shape.enabled = 1;
807
808 if (width != window->shape.width || height != window->shape.height)
809 {
810 window->shape.width = width;
811 window->shape.height = height;
812 if (window->shape.mask)
813 {
814 free(window->shape.mask);
815 window->shape.mask = NULL;
816 }
817 window->shape.mask = malloc(width * height);
818 }
819 memcpy(window->shape.mask, mask, width * height);
820
821 window->shape.layered = 0;
822
823#if defined(WS_EX_LAYERED)
824 version_info.dwOSVersionInfoSize = sizeof(version_info);
825 if (GetVersionEx(&version_info) == TRUE && version_info.dwMajorVersion == 5)
826 {
827 SetLastError(0);
828 if (!SetWindowLongPtr(window->window, GWL_EXSTYLE,
829 GetWindowLong(window->window, GWL_EXSTYLE) | WS_EX_LAYERED) &&
830 (GetLastError() != 0))
831 {
832 ERR("SetWindowLongPtr() failed");
833 return;
834 }
835 window->shape.layered = 1;
836 return;
837 }
838#endif
839
840 if (!(rgn = CreateRectRgn(0, 0, 0, 0)))
841 {
842 ERR("CreateRectRgn() failed");
843 return;
844 }
845 for (y = 0; y < height; y++)
846 {
847 HRGN rgnLine;
848
849 if (!(rgnLine = CreateRectRgn(0, 0, 0, 0)))
850 {
851 ERR("CreateRectRgn() failed");
852 return;
853 }
854 for (x = 0; x < width; x++)
855 {
856 if (mask[y * width + x] > 0)
857 {
858 HRGN rgnDot;
859
860 if (!(rgnDot = CreateRectRgn(x, y, x + 1, y + 1)))
861 {
862 ERR("CreateRectRgn() failed");
863 return;
864 }
865 if (CombineRgn(rgnLine, rgnLine, rgnDot, RGN_OR) == ERROR)
866 {
867 ERR("CombineRgn() has not created a new region");
868 }
869 if (!DeleteObject(rgnDot))
870 {
871 ERR("DeleteObject() failed");
872 return;
873 }
874 }
875 }
876 if (CombineRgn(rgn, rgn, rgnLine, RGN_OR) == ERROR)
877 {
878 ERR("CombineRgn() has not created a new region");
879 }
880 if (!DeleteObject(rgnLine))
881 {
882 ERR("DeleteObject() failed");
883 return;
884 }
885 }
886 if (!SetWindowRgn(window->window, rgn, TRUE))
887 {
888 ERR("SetWindowRgn() failed");
889 }
890}
891
892/**
893 * @brief Show the given window.
894 *
895 * @param window The window to show.
896 *
897 * This function shows @p window. If @p window is @c NULL, or on
898 * error, this function does nothing.
899 */
900EAPI void
901ecore_win32_window_show(Ecore_Win32_Window *window)
902{
903 if (!window) return;
904
905 INF("showing window");
906
907 ShowWindow(window->window, SW_SHOWNORMAL);
908 if (!UpdateWindow(window->window))
909 {
910 ERR("UpdateWindow() failed");
911 }
912}
913
914/* FIXME: seems to block the taskbar */
915/**
916 * @brief Hide the given window.
917 *
918 * @param window The window to show.
919 *
920 * This function hides @p window. If @p window is @c NULL, or on
921 * error, this function does nothing.
922 */
923EAPI void
924ecore_win32_window_hide(Ecore_Win32_Window *window)
925{
926 if (!window) return;
927
928 INF("hiding window");
929
930 ShowWindow(window->window, SW_HIDE);
931}
932
933/**
934 * @brief Place the given window at the top of the Z order.
935 *
936 * @param window The window to place at the top.
937 *
938 * This function places @p window at the top of the Z order. If
939 * @p window is @c NULL, this function does nothing.
940 */
941EAPI void
942ecore_win32_window_raise(Ecore_Win32_Window *window)
943{
944 if (!window) return;
945
946 INF("raising window");
947
948 if (!SetWindowPos(window->window,
949 HWND_TOP, 0, 0, 0, 0,
950 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
951 {
952 ERR("SetWindowPos() failed");
953 }
954}
955
956/**
957 * @brief Place the given window at the bottom of the Z order.
958 *
959 * @param window The window to place at the bottom.
960 *
961 * This function places @p window at the bottom of the Z order. If
962 * @p window is @c NULL, this function does nothing.
963 */
964EAPI void
965ecore_win32_window_lower(Ecore_Win32_Window *window)
966{
967 if (!window) return;
968
969 INF("lowering window");
970
971 if (!SetWindowPos(window->window,
972 HWND_BOTTOM, 0, 0, 0, 0,
973 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
974 {
975 ERR("SetWindowPos() failed");
976 }
977}
978
979/**
980 * @brief Set the title of the given window.
981 *
982 * @param window The window to set the title.
983 * @param title The new title.
984 *
985 * This function sets the title of @p window to @p title. If @p window
986 * is @c NULL, or if @p title is @c NULL or empty, or on error, this
987 * function does nothing.
988 */
989EAPI void
990ecore_win32_window_title_set(Ecore_Win32_Window *window,
991 const char *title)
992{
993 if (!window) return;
994
995 if (!title || !title[0]) return;
996
997 INF("setting window title");
998
999 if (!SetWindowText(window->window, title))
1000 {
1001 ERR("SetWindowText() failed");
1002 }
1003}
1004
1005/**
1006 * @brief Set the focus to the given window.
1007 *
1008 * @param window The window to give focus to.
1009 *
1010 * This function gives the focus to @p window. If @p window is
1011 * @c NULL, this function does nothing.
1012 */
1013EAPI void
1014ecore_win32_window_focus_set(Ecore_Win32_Window *window)
1015{
1016 if (!window) return;
1017
1018 INF("focusing window");
1019
1020 if (!SetFocus(window->window))
1021 {
1022 ERR("SetFocus() failed");
1023 }
1024}
1025
1026/**
1027 * @brief Iconify or restore the given window.
1028 *
1029 * @param window The window.
1030 * @param on EINA_TRUE to iconify the window, EINA_FALSE to restore it.
1031 *
1032 * This function iconify or restore @p window. If @p on
1033 * is set to EINA_TRUE, the window will be iconified, if it is set to
1034 * EINA_FALSE, it will be restored. If @p window is @c NULL or if the
1035 * state does not change (like iconifying the window while it is
1036 * already iconified), this function does nothing.
1037 */
1038EAPI void
1039ecore_win32_window_iconified_set(Ecore_Win32_Window *window,
1040 Eina_Bool on)
1041{
1042 if (!window) return;
1043
1044 if (((window->iconified) && (on)) ||
1045 ((!window->iconified) && (!on)))
1046 return;
1047
1048 INF("iconifying window: %s", on ? "yes" : "no");
1049
1050 ShowWindow(window->window, on ? SW_MINIMIZE : SW_RESTORE);
1051 window->iconified = on;
1052}
1053
1054/**
1055 * @brief Remove or restore the border of the given window.
1056 *
1057 * @param window The window.
1058 * @param on EINA_TRUE to remove the border, EINA_FALSE to restore it.
1059 *
1060 * This function remove or restore the border of @p window. If @p on
1061 * is set to EINA_TRUE, the window will have no border, if it is set to
1062 * EINA_FALSE, it will have a border. If @p window is @c NULL or if the
1063 * state does not change (like setting to borderless while the window
1064 * has no border), this function does nothing.
1065 */
1066EAPI void
1067ecore_win32_window_borderless_set(Ecore_Win32_Window *window,
1068 Eina_Bool on)
1069{
1070 RECT rect;
1071 DWORD style;
1072
1073 if (!window) return;
1074
1075 if (((window->borderless) && (on)) ||
1076 ((!window->borderless) && (!on)))
1077 return;
1078
1079 INF("setting window without border: %s", on ? "yes" : "no");
1080
1081 style = GetWindowLong(window->window, GWL_STYLE);
1082 if (on)
1083 {
1084 if (!GetClientRect(window->window, &rect))
1085 {
1086 ERR("GetClientRect() failed");
1087 return;
1088 }
1089 SetLastError(0);
1090 if (!SetWindowLongPtr(window->window, GWL_STYLE, style & ~(WS_CAPTION | WS_THICKFRAME)) &&
1091 (GetLastError() != 0))
1092 {
1093 ERR("SetWindowLongPtr() failed");
1094 return;
1095 }
1096 }
1097 else
1098 {
1099 if (!GetWindowRect(window->window, &rect))
1100 {
1101 ERR("GetWindowRect() failed");
1102 return;
1103 }
1104 style |= WS_CAPTION | WS_THICKFRAME;
1105 if (!AdjustWindowRect (&rect, style, FALSE))
1106 {
1107 ERR("AdjustWindowRect() failed");
1108 return;
1109 }
1110 SetLastError(0);
1111 if (!SetWindowLongPtr(window->window, GWL_STYLE, style) &&
1112 (GetLastError() != 0))
1113 {
1114 ERR("SetWindowLongPtr() failed");
1115 return;
1116 }
1117 }
1118 if (!SetWindowPos(window->window, HWND_TOPMOST,
1119 rect.left, rect.top,
1120 rect.right - rect.left, rect.bottom - rect.top,
1121 SWP_NOMOVE | SWP_FRAMECHANGED))
1122 {
1123 ERR("SetWindowPos() failed");
1124 return;
1125 }
1126
1127 window->borderless = on;
1128}
1129
1130/**
1131 * @brief Set the given window to fullscreen.
1132 *
1133 * @param window The window.
1134 * @param on EINA_TRUE for fullscreen mode, EINA_FALSE for windowed mode.
1135 *
1136 * This function set @p window to fullscreen or windowed mode. If @p on
1137 * is set to EINA_TRUE, the window will be fullscreen, if it is set to
1138 * EINA_FALSE, it will be windowed. If @p window is @c NULL or if the
1139 * state does not change (like setting to fullscreen while the window
1140 * is already fullscreen), this function does nothing.
1141 */
1142EAPI void
1143ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window,
1144 Eina_Bool on)
1145{
1146 if (!window) return;
1147
1148 if (((window->fullscreen) && (on)) ||
1149 ((!window->fullscreen) && (!on)))
1150 return;
1151
1152 INF("setting fullscreen: %s", on ? "yes" : "no");
1153
1154 window->fullscreen = !!on;
1155
1156 if (on)
1157 {
1158 DWORD style;
1159
1160 if (!GetWindowRect(window->window, &window->rect))
1161 {
1162 ERR("GetWindowRect() failed");
1163 return;
1164 }
1165 if (!(window->style = GetWindowLong(window->window, GWL_STYLE)))
1166 {
1167 ERR("GetWindowLong() failed");
1168 return;
1169 }
1170 style = window->style & ~WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX;
1171 style |= WS_VISIBLE | WS_POPUP;
1172 SetLastError(0);
1173 if (!SetWindowLongPtr(window->window, GWL_STYLE, style) &&
1174 (GetLastError() != 0))
1175 {
1176 ERR("SetWindowLongPtr() failed");
1177 return;
1178 }
1179 SetLastError(0);
1180 if (!SetWindowLongPtr(window->window, GWL_EXSTYLE, WS_EX_TOPMOST) &&
1181 (GetLastError() != 0))
1182 {
1183 ERR("SetWindowLongPtr() failed");
1184 return;
1185 }
1186 if (!SetWindowPos(window->window, HWND_TOPMOST, 0, 0,
1187 GetSystemMetrics (SM_CXSCREEN),
1188 GetSystemMetrics (SM_CYSCREEN),
1189 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
1190 {
1191 ERR("SetWindowPos() failed");
1192 return;
1193 }
1194 }
1195 else
1196 {
1197 SetLastError(0);
1198 if (!SetWindowLongPtr(window->window, GWL_STYLE, window->style) &&
1199 (GetLastError() != 0))
1200 {
1201 ERR("SetWindowLongPtr() failed");
1202 return;
1203 }
1204 SetLastError(0);
1205 if (!SetWindowLongPtr(window->window, GWL_EXSTYLE, 0) &&
1206 (GetLastError() != 0))
1207 {
1208 ERR("SetWindowLongPtr() failed");
1209 return;
1210 }
1211 if (!SetWindowPos(window->window, HWND_NOTOPMOST,
1212 window->rect.left,
1213 window->rect.top,
1214 window->rect.right - window->rect.left,
1215 window->rect.bottom - window->rect.top,
1216 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
1217 {
1218 ERR("SetWindowPos() failed");
1219 return;
1220 }
1221 }
1222}
1223
1224/**
1225 * @brief Set the given cursor to the given window.
1226 *
1227 * @param window The window to modify the cursor.
1228 * @param cursor The new cursor.
1229 *
1230 * This function sets @p cursor to @p window. @p cursor must have been
1231 * obtained by ecore_win32_cursor_new() or
1232 * ecore_win32_cursor_shaped_new(). If @p window or @p cursor is
1233 * @c NULL, the function does nothing.
1234 */
1235EAPI void
1236ecore_win32_window_cursor_set(Ecore_Win32_Window *window,
1237 Ecore_Win32_Cursor *cursor)
1238{
1239 INF("setting cursor");
1240
1241 if (!window || !cursor)
1242 return;
1243
1244 if (!SetClassLongPtr(window->window,
1245 GCLP_HCURSOR, (LONG_PTR)cursor))
1246 {
1247 ERR("SetClassLong() failed");
1248 }
1249}
1250
1251/**
1252 * @brief Set the state of the given window.
1253 *
1254 * @param window The window to modify the state.
1255 * @param state An array of the new states.
1256 * @param num The number of states in the array.
1257 *
1258 * This function set the state of @p window. @p state is an array of
1259 * states of size @p num. If @p window or @p state are @c NULL, or if
1260 * @p num is less or equal than 0, the function does nothing.
1261 */
1262EAPI void
1263ecore_win32_window_state_set(Ecore_Win32_Window *window,
1264 Ecore_Win32_Window_State *state,
1265 unsigned int num)
1266{
1267 unsigned int i;
1268
1269 if (!window || !state || (num <= 0))
1270 return;
1271
1272 INF("setting cursor state");
1273
1274 for (i = 0; i < num; i++)
1275 {
1276 switch (state[i])
1277 {
1278 case ECORE_WIN32_WINDOW_STATE_ICONIFIED:
1279 window->state.iconified = 1;
1280 break;
1281 case ECORE_WIN32_WINDOW_STATE_MODAL:
1282 window->state.modal = 1;
1283 break;
1284 case ECORE_WIN32_WINDOW_STATE_STICKY:
1285 window->state.sticky = 1;
1286 break;
1287 case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT:
1288 window->state.maximized_vert = 1;
1289 break;
1290 case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ:
1291 window->state.maximized_horz = 1;
1292 break;
1293 case ECORE_WIN32_WINDOW_STATE_MAXIMIZED:
1294 window->state.maximized_horz = 1;
1295 window->state.maximized_vert = 1;
1296 break;
1297 case ECORE_WIN32_WINDOW_STATE_SHADED:
1298 window->state.shaded = 1;
1299 break;
1300 case ECORE_WIN32_WINDOW_STATE_HIDDEN:
1301 window->state.hidden = 1;
1302 break;
1303 case ECORE_WIN32_WINDOW_STATE_FULLSCREEN:
1304 window->state.fullscreen = 1;
1305 break;
1306 case ECORE_WIN32_WINDOW_STATE_ABOVE:
1307 window->state.above = 1;
1308 break;
1309 case ECORE_WIN32_WINDOW_STATE_BELOW:
1310 window->state.below = 1;
1311 break;
1312 case ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION:
1313 window->state.demands_attention = 1;
1314 break;
1315 case ECORE_WIN32_WINDOW_STATE_UNKNOWN:
1316 /* nothing to be done */
1317 break;
1318 }
1319 }
1320}
1321
1322/**
1323 * @brief Apply the modification of the state to the given window.
1324 *
1325 * @param window The window.
1326 * @param state The state to apply changes.
1327 * @param set The value of the state change.
1328 *
1329 * This function applies the modification of the state @p state of
1330 * @p window. @p set is used only for
1331 * #ECORE_WIN32_WINDOW_STATE_ICONIFIED and
1332 * #ECORE_WIN32_WINDOW_STATE_FULLSCREEN. If @p window is @c NULL, the
1333 * function does nothing.
1334 */
1335EAPI void
1336ecore_win32_window_state_request_send(Ecore_Win32_Window *window,
1337 Ecore_Win32_Window_State state,
1338 unsigned int set)
1339{
1340 if (!window) return;
1341
1342 INF("sending cursor state");
1343
1344 switch (state)
1345 {
1346 case ECORE_WIN32_WINDOW_STATE_ICONIFIED:
1347 if (window->state.iconified)
1348 ecore_win32_window_iconified_set(window, set);
1349 break;
1350 case ECORE_WIN32_WINDOW_STATE_MODAL:
1351 window->state.modal = 1;
1352 break;
1353 case ECORE_WIN32_WINDOW_STATE_STICKY:
1354 window->state.sticky = 1;
1355 break;
1356 case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT:
1357 if (window->state.maximized_vert)
1358 {
1359 RECT rect;
1360 int y;
1361 int height;
1362
1363 if (!SystemParametersInfo(SPI_GETWORKAREA, 0,
1364 &rect, 0))
1365 {
1366 ERR("SystemParametersInfo() failed");
1367 break;
1368 }
1369 y = rect.top;
1370 height = rect.bottom - rect.top;
1371
1372 if (!GetClientRect(window->window, &rect))
1373 {
1374 ERR("GetClientRect() failed");
1375 break;
1376 }
1377
1378 if (!MoveWindow(window->window, rect.left, y,
1379 rect.right - rect.left,
1380 height,
1381 TRUE))
1382 {
1383 ERR("MoveWindow() failed");
1384 }
1385 }
1386 break;
1387 case ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ:
1388 if (window->state.maximized_horz)
1389 {
1390 RECT rect;
1391
1392 if (!GetClientRect(window->window, &rect))
1393 {
1394 ERR("GetClientRect() failed");
1395 break;
1396 }
1397
1398 if (!MoveWindow(window->window, 0, rect.top,
1399 GetSystemMetrics(SM_CXSCREEN),
1400 rect.bottom - rect.top,
1401 TRUE))
1402 {
1403 ERR("MoveWindow() failed");
1404 }
1405 }
1406 break;
1407 case ECORE_WIN32_WINDOW_STATE_MAXIMIZED:
1408 if (window->state.maximized_vert && window->state.maximized_horz)
1409 {
1410 RECT rect;
1411
1412 if (!SystemParametersInfo(SPI_GETWORKAREA, 0,
1413 &rect, 0))
1414 {
1415 ERR("SystemParametersInfo() failed");
1416 break;
1417 }
1418
1419 if (!MoveWindow(window->window, 0, 0,
1420 GetSystemMetrics(SM_CXSCREEN),
1421 rect.bottom - rect.top,
1422 TRUE))
1423 {
1424 ERR("MoveWindow() failed");
1425 }
1426 }
1427 break;
1428 case ECORE_WIN32_WINDOW_STATE_SHADED:
1429 window->state.shaded = 1;
1430 break;
1431 case ECORE_WIN32_WINDOW_STATE_HIDDEN:
1432 window->state.hidden = 1;
1433 break;
1434 case ECORE_WIN32_WINDOW_STATE_FULLSCREEN:
1435 if (window->state.fullscreen)
1436 ecore_win32_window_fullscreen_set(window, set);
1437 break;
1438 case ECORE_WIN32_WINDOW_STATE_ABOVE:
1439 if (window->state.above)
1440 if (!SetWindowPos(window->window, HWND_TOP,
1441 0, 0,
1442 0, 0,
1443 SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW))
1444 {
1445 ERR("SetWindowPos() failed");
1446 }
1447 break;
1448 case ECORE_WIN32_WINDOW_STATE_BELOW:
1449 if (window->state.below)
1450 if (!SetWindowPos(window->window, HWND_BOTTOM,
1451 0, 0,
1452 0, 0,
1453 SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW))
1454 {
1455 ERR("SetWindowPos() failed");
1456 }
1457 break;
1458 case ECORE_WIN32_WINDOW_STATE_DEMANDS_ATTENTION:
1459 window->state.demands_attention = 1;
1460 break;
1461 case ECORE_WIN32_WINDOW_STATE_UNKNOWN:
1462 /* nothing to be done */
1463 break;
1464 }
1465}
1466
1467/**
1468 * @brief Set the type of the given window.
1469 *
1470 * @param window The window to modify the type.
1471 * @param type The nwindow types.
1472 *
1473 * This function set the type of @p window to @p type. If
1474 * @p window is @c NULL, the function does nothing.
1475 */
1476EAPI void
1477ecore_win32_window_type_set(Ecore_Win32_Window *window,
1478 Ecore_Win32_Window_Type type)
1479{
1480 if (!window)
1481 return;
1482
1483 INF("setting window type");
1484
1485 switch (type)
1486 {
1487 case ECORE_WIN32_WINDOW_TYPE_DESKTOP:
1488 window->type.desktop = 1;
1489 break;
1490 case ECORE_WIN32_WINDOW_TYPE_DOCK:
1491 window->type.dock = 1;
1492 break;
1493 case ECORE_WIN32_WINDOW_TYPE_TOOLBAR:
1494 window->type.toolbar = 1;
1495 break;
1496 case ECORE_WIN32_WINDOW_TYPE_MENU:
1497 window->type.menu = 1;
1498 break;
1499 case ECORE_WIN32_WINDOW_TYPE_UTILITY:
1500 window->type.utility = 1;
1501 break;
1502 case ECORE_WIN32_WINDOW_TYPE_SPLASH:
1503 window->type.splash = 1;
1504 break;
1505 case ECORE_WIN32_WINDOW_TYPE_DIALOG:
1506 window->type.dialog = 1;
1507 break;
1508 case ECORE_WIN32_WINDOW_TYPE_NORMAL:
1509 window->type.normal = 1;
1510 break;
1511 case ECORE_WIN32_WINDOW_TYPE_UNKNOWN:
1512 window->type.normal = 1;
1513 break;
1514 }
1515}
1516
1517/**
1518 * @}
1519 */
diff --git a/libraries/ecore/src/lib/ecore_wince/Ecore_WinCE.h b/libraries/ecore/src/lib/ecore_wince/Ecore_WinCE.h
new file mode 100644
index 0000000..681b334
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/Ecore_WinCE.h
@@ -0,0 +1,310 @@
1#ifndef __ECORE_WINCE_H__
2#define __ECORE_WINCE_H__
3
4/*
5 * DO NOT USE THIS HEADER. IT IS WORK IN PROGRESS. IT IS NOT FINAL AND
6 * THE API MAY CHANGE.
7 */
8
9#ifndef ECORE_WINCE_WIP_OSXCKQSD
10# warning "You are using a work in progress API. This API is not stable"
11# warning "and is subject to change. You use this at your own risk."
12#endif
13
14#include <Eina.h>
15
16#ifdef EAPI
17# undef EAPI
18#endif
19
20#ifdef _WIN32
21# ifdef EFL_ECORE_WINCE_BUILD
22# ifdef DLL_EXPORT
23# define EAPI __declspec(dllexport)
24# else
25# define EAPI
26# endif /* ! DLL_EXPORT */
27# else
28# define EAPI __declspec(dllimport)
29# endif /* ! EFL_ECORE_WINCE_BUILD */
30#else
31# ifdef __GNUC__
32# if __GNUC__ >= 4
33# define EAPI __attribute__ ((visibility("default")))
34# else
35# define EAPI
36# endif
37# else
38# define EAPI
39# endif
40#endif /* ! _WINCE */
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46/**
47 * @defgroup Ecore_WinCE_Group Ecore_WinCE library
48 *
49 * @{
50 */
51
52
53/**
54 * @typedef Ecore_WinCE_Window
55 * Abstract type for a window.
56 */
57typedef struct _Ecore_WinCE_Window Ecore_WinCE_Window;
58
59
60/**
61 * @typedef Ecore_WinCE_Event_Mouse_In
62 * Event sent when the mouse enters the window.
63 */
64typedef struct _Ecore_WinCE_Event_Mouse_In Ecore_WinCE_Event_Mouse_In;
65
66/**
67 * @typedef Ecore_WinCE_Event_Mouse_Out
68 * Event sent when the mouse leaves the window.
69 */
70typedef struct _Ecore_WinCE_Event_Mouse_Out Ecore_WinCE_Event_Mouse_Out;
71
72/**
73 * @typedef Ecore_WinCE_Event_Window_Focus_In
74 * Event sent when the window gets the focus.
75 */
76typedef struct _Ecore_WinCE_Event_Window_Focus_In Ecore_WinCE_Event_Window_Focus_In;
77
78/**
79 * @typedef Ecore_WinCE_Event_Window_Focus_Out
80 * Event sent when the window looses the focus.
81 */
82typedef struct _Ecore_WinCE_Event_Window_Focus_Out Ecore_WinCE_Event_Window_Focus_Out;
83
84/**
85 * @typedef Ecore_WinCE_Event_Window_Damage
86 * Event sent when the window is damaged.
87 */
88typedef struct _Ecore_WinCE_Event_Window_Damage Ecore_WinCE_Event_Window_Damage;
89
90/**
91 * @typedef Ecore_WinCE_Event_Window_Create
92 * Event sent when the window is created.
93 */
94typedef struct _Ecore_WinCE_Event_Window_Create Ecore_WinCE_Event_Window_Create;
95
96/**
97 * @typedef Ecore_WinCE_Event_Window_Destroy
98 * Event sent when the window is destroyed.
99 */
100typedef struct _Ecore_WinCE_Event_Window_Destroy Ecore_WinCE_Event_Window_Destroy;
101
102/**
103 * @typedef Ecore_WinCE_Event_Window_Hide
104 * Event sent when the window is hidden.
105 */
106typedef struct _Ecore_WinCE_Event_Window_Hide Ecore_WinCE_Event_Window_Hide;
107
108/**
109 * @typedef Ecore_WinCE_Event_Window_Show
110 * Event sent when the window is shown.
111 */
112typedef struct _Ecore_WinCE_Event_Window_Show Ecore_WinCE_Event_Window_Show;
113
114/**
115 * @typedef Ecore_WinCE_Event_Window_Delete_Request
116 * Event sent when the window is deleted.
117 */
118typedef struct _Ecore_WinCE_Event_Window_Delete_Request Ecore_WinCE_Event_Window_Delete_Request;
119
120
121/**
122 * @struct _Ecore_WinCE_Event_Mouse_In
123 * Event sent when the mouse enters the window.
124 */
125struct _Ecore_WinCE_Event_Mouse_In
126{
127 Ecore_WinCE_Window *window; /**< The window that received the event */
128 int x; /**< The x coordinate where the mouse entered */
129 int y; /**< The y coordinate where the mouse entered */
130 long time; /**< The time the event occurred */
131};
132
133/**
134 * @struct _Ecore_WinCE_Event_Mouse_Out
135 * Event sent when the mouse leaves the window.
136 */
137struct _Ecore_WinCE_Event_Mouse_Out
138{
139 Ecore_WinCE_Window *window; /**< The window that received the event */
140 int x; /**< The x coordinate where the mouse leaved */
141 int y; /**< The y coordinate where the mouse leaved */
142 long time; /**< The time the event occurred */
143};
144
145/**
146 * @struct _Ecore_WinCE_Event_Window_Focus_In
147 * Event sent when the window gets the focus.
148 */
149struct _Ecore_WinCE_Event_Window_Focus_In
150{
151 Ecore_WinCE_Window *window; /**< The window that received the event */
152 long time; /**< The time the event occurred */
153};
154
155/**
156 * @struct _Ecore_WinCE_Event_Window_Focus_Out
157 * Event sent when the window looses the focus.
158 */
159struct _Ecore_WinCE_Event_Window_Focus_Out
160{
161 Ecore_WinCE_Window *window; /**< The window that received the event */
162 long time; /**< The time the event occurred */
163};
164
165/**
166 * @struct _Ecore_WinCE_Event_Window_Damage
167 * Event sent when the window is damaged.
168 */
169struct _Ecore_WinCE_Event_Window_Damage
170{
171 Ecore_WinCE_Window *window; /**< The window that received the event */
172 int x; /**< The x coordinate of the top left corner of the damaged region */
173 int y; /**< The y coordinate of the top left corner of the damaged region */
174 int width; /**< The width of the damaged region */
175 int height; /**< The height of the damaged region */
176 long time; /**< The time the event occurred */
177};
178
179/**
180 * @struct _Ecore_WinCE_Event_Window_Create
181 * Event sent when the window is created.
182 */
183struct _Ecore_WinCE_Event_Window_Create
184{
185 Ecore_WinCE_Window *window; /**< The window that received the event */
186 long time; /**< The time the event occurred */
187};
188
189/**
190 * @struct _Ecore_WinCE_Event_Window_Destroy
191 * Event sent when the window is destroyed.
192 */
193struct _Ecore_WinCE_Event_Window_Destroy
194{
195 Ecore_WinCE_Window *window; /**< The window that received the event */
196 long time; /**< The time the event occurred */
197};
198
199/**
200 * @struct _Ecore_WinCE_Event_Window_Hide
201 * Event sent when the window is hidden.
202 */
203struct _Ecore_WinCE_Event_Window_Hide
204{
205 Ecore_WinCE_Window *window; /**< The window that received the event */
206 long time; /**< The time the event occurred */
207};
208
209/**
210 * @struct _Ecore_WinCE_Event_Window_Show
211 * Event sent when the window is shown.
212 */
213struct _Ecore_WinCE_Event_Window_Show
214{
215 Ecore_WinCE_Window *window; /**< The window that received the event */
216 long time; /**< The time the event occurred */
217};
218
219/**
220 * @struct _Ecore_WinCE_Event_Window_Delete_Request
221 * Event sent when the window is deleted.
222 */
223struct _Ecore_WinCE_Event_Window_Delete_Request
224{
225 Ecore_WinCE_Window *window; /**< The window that received the event */
226 long time; /**< The time the event occurred */
227};
228
229
230EAPI extern int ECORE_WINCE_EVENT_MOUSE_IN; /**< Ecore_Event for the #Ecore_WinCE_Event_Mouse_In event */
231EAPI extern int ECORE_WINCE_EVENT_MOUSE_OUT; /**< Ecore_Event for the #Ecore_WinCE_Event_Mouse_Out event */
232EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN; /**< Ecore_Event for the #Ecore_WinCE_Event_Window_Focus_In event */
233EAPI extern int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT; /**< Ecore_Event for the #Ecore_WinCE_Event_Window_Focus_Out event */
234EAPI extern int ECORE_WINCE_EVENT_WINDOW_DAMAGE; /**< Ecore_Event for the #Ecore_WinCE_Event_Damage event */
235EAPI extern int ECORE_WINCE_EVENT_WINDOW_CREATE; /**< Ecore_Event for the #Ecore_WinCE_Event_Create event */
236EAPI extern int ECORE_WINCE_EVENT_WINDOW_DESTROY; /**< Ecore_Event for the #Ecore_WinCE_Event_Destroy event */
237EAPI extern int ECORE_WINCE_EVENT_WINDOW_HIDE; /**< Ecore_Event for the #Ecore_WinCE_Event_Hide event */
238EAPI extern int ECORE_WINCE_EVENT_WINDOW_SHOW; /**< Ecore_Event for the #Ecore_WinCE_Event_Show event */
239EAPI extern int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST; /**< Ecore_Event for the #Ecore_WinCE_Event_Window_Delete_Request event */
240
241
242/* Core */
243
244EAPI int ecore_wince_init();
245EAPI int ecore_wince_shutdown();
246EAPI void ecore_wince_double_click_time_set(double t);
247EAPI double ecore_wince_double_click_time_get(void);
248EAPI long ecore_wince_current_time_get(void);
249
250/* Window */
251
252EAPI Ecore_WinCE_Window *ecore_wince_window_new(Ecore_WinCE_Window *parent,
253 int x,
254 int y,
255 int width,
256 int height);
257
258EAPI void ecore_wince_window_free(Ecore_WinCE_Window *window);
259
260EAPI void *ecore_wince_window_hwnd_get(Ecore_WinCE_Window *window);
261
262EAPI void ecore_wince_window_move(Ecore_WinCE_Window *window,
263 int x,
264 int y);
265
266EAPI void ecore_wince_window_resize(Ecore_WinCE_Window *window,
267 int width,
268 int height);
269
270EAPI void ecore_wince_window_move_resize(Ecore_WinCE_Window *window,
271 int x,
272 int y,
273 int width,
274 int height);
275
276EAPI void ecore_wince_window_show(Ecore_WinCE_Window *window);
277
278EAPI void ecore_wince_window_hide(Ecore_WinCE_Window *window);
279
280EAPI void ecore_wince_window_title_set(Ecore_WinCE_Window *window,
281 const char *title);
282
283EAPI void ecore_wince_window_backend_set(Ecore_WinCE_Window *window, int backend);
284
285EAPI void ecore_wince_window_suspend_cb_set(Ecore_WinCE_Window *window, int (*suspend_cb)(int));
286
287EAPI void ecore_wince_window_resume_cb_set(Ecore_WinCE_Window *window, int (*resume_cb)(int));
288
289EAPI void ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
290 int *x,
291 int *y,
292 int *width,
293 int *height);
294
295EAPI void ecore_wince_window_size_get(Ecore_WinCE_Window *window,
296 int *width,
297 int *height);
298
299EAPI void ecore_wince_window_fullscreen_set(Ecore_WinCE_Window *window,
300 Eina_Bool on);
301
302/**
303 * @}
304 */
305
306#ifdef __cplusplus
307}
308#endif
309
310#endif /* __ECORE_WINCE_H__ */
diff --git a/libraries/ecore/src/lib/ecore_wince/Makefile.am b/libraries/ecore/src/lib/ecore_wince/Makefile.am
new file mode 100644
index 0000000..a264ffb
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/Makefile.am
@@ -0,0 +1,35 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3AM_CPPFLAGS = \
4-I$(top_srcdir)/src/lib/ecore \
5-I$(top_srcdir)/src/lib/ecore_input \
6-I$(top_builddir)/src/lib/ecore \
7-I$(top_builddir)/src/lib/ecore_input \
8@EFL_ECORE_WINCE_BUILD@ \
9@EVAS_CFLAGS@ \
10@EINA_CFLAGS@ \
11@WIN32_CPPFLAGS@
12
13AM_CFLAGS = @WIN32_CFLAGS@
14
15lib_LTLIBRARIES = libecore_wince.la
16
17includes_HEADERS = Ecore_WinCE.h
18includesdir = $(includedir)/ecore-@VMAJ@
19
20libecore_wince_la_SOURCES = \
21ecore_wince.c \
22ecore_wince_event.c \
23ecore_wince_window.c
24
25libecore_wince_la_LIBADD = \
26@WIN32_LIBS@ \
27$(top_builddir)/src/lib/ecore_input/libecore_input.la \
28$(top_builddir)/src/lib/ecore/libecore.la \
29@EVAS_LIBS@ \
30@EINA_LIBS@ \
31@EVIL_LIBS@
32
33libecore_wince_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
34
35EXTRA_DIST = ecore_wince_private.h
diff --git a/libraries/ecore/src/lib/ecore_wince/Makefile.in b/libraries/ecore/src/lib/ecore_wince/Makefile.in
new file mode 100644
index 0000000..0610122
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/Makefile.in
@@ -0,0 +1,829 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_wince
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89libecore_wince_la_DEPENDENCIES = \
90 $(top_builddir)/src/lib/ecore_input/libecore_input.la \
91 $(top_builddir)/src/lib/ecore/libecore.la
92am_libecore_wince_la_OBJECTS = ecore_wince.lo ecore_wince_event.lo \
93 ecore_wince_window.lo
94libecore_wince_la_OBJECTS = $(am_libecore_wince_la_OBJECTS)
95AM_V_lt = $(am__v_lt_$(V))
96am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
97am__v_lt_0 = --silent
98libecore_wince_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
99 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
100 $(AM_CFLAGS) $(CFLAGS) $(libecore_wince_la_LDFLAGS) $(LDFLAGS) \
101 -o $@
102DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
103depcomp = $(SHELL) $(top_srcdir)/depcomp
104am__depfiles_maybe = depfiles
105am__mv = mv -f
106COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
107 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
108LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
109 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
110 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
111 $(AM_CFLAGS) $(CFLAGS)
112AM_V_CC = $(am__v_CC_$(V))
113am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
114am__v_CC_0 = @echo " CC " $@;
115AM_V_at = $(am__v_at_$(V))
116am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
117am__v_at_0 = @
118CCLD = $(CC)
119LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
120 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
121 $(AM_LDFLAGS) $(LDFLAGS) -o $@
122AM_V_CCLD = $(am__v_CCLD_$(V))
123am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
124am__v_CCLD_0 = @echo " CCLD " $@;
125AM_V_GEN = $(am__v_GEN_$(V))
126am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
127am__v_GEN_0 = @echo " GEN " $@;
128SOURCES = $(libecore_wince_la_SOURCES)
129DIST_SOURCES = $(libecore_wince_la_SOURCES)
130HEADERS = $(includes_HEADERS)
131ETAGS = etags
132CTAGS = ctags
133DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
134ACLOCAL = @ACLOCAL@
135ALLOCA = @ALLOCA@
136AMTAR = @AMTAR@
137AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
138AR = @AR@
139AS = @AS@
140AUTOCONF = @AUTOCONF@
141AUTOHEADER = @AUTOHEADER@
142AUTOMAKE = @AUTOMAKE@
143AWK = @AWK@
144CARES_CFLAGS = @CARES_CFLAGS@
145CARES_LIBS = @CARES_LIBS@
146CC = @CC@
147CCDEPMODE = @CCDEPMODE@
148CFLAGS = @CFLAGS@
149CHECK_CFLAGS = @CHECK_CFLAGS@
150CHECK_LIBS = @CHECK_LIBS@
151CPP = @CPP@
152CPPFLAGS = @CPPFLAGS@
153CURL_CFLAGS = @CURL_CFLAGS@
154CURL_LIBS = @CURL_LIBS@
155CXX = @CXX@
156CXXCPP = @CXXCPP@
157CXXDEPMODE = @CXXDEPMODE@
158CXXFLAGS = @CXXFLAGS@
159CYGPATH_W = @CYGPATH_W@
160DEFS = @DEFS@
161DEPDIR = @DEPDIR@
162DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
163DIRECTFB_LIBS = @DIRECTFB_LIBS@
164DLLTOOL = @DLLTOOL@
165DSYMUTIL = @DSYMUTIL@
166DUMPBIN = @DUMPBIN@
167ECHO_C = @ECHO_C@
168ECHO_N = @ECHO_N@
169ECHO_T = @ECHO_T@
170ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
171ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
172EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
173EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
174EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
175EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
176EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
177EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
178EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
179EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
180EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
181EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
182EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
183EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
184EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
185EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
186EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
187EGREP = @EGREP@
188EINA_CFLAGS = @EINA_CFLAGS@
189EINA_LIBS = @EINA_LIBS@
190ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
191ESCAPE_LIBS = @ESCAPE_LIBS@
192EVAS_CFLAGS = @EVAS_CFLAGS@
193EVAS_LIBS = @EVAS_LIBS@
194EVIL_CFLAGS = @EVIL_CFLAGS@
195EVIL_LIBS = @EVIL_LIBS@
196EXEEXT = @EXEEXT@
197FGREP = @FGREP@
198GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
199GLIB_CFLAGS = @GLIB_CFLAGS@
200GLIB_LIBS = @GLIB_LIBS@
201GMSGFMT = @GMSGFMT@
202GMSGFMT_015 = @GMSGFMT_015@
203GREP = @GREP@
204INSTALL = @INSTALL@
205INSTALL_DATA = @INSTALL_DATA@
206INSTALL_PROGRAM = @INSTALL_PROGRAM@
207INSTALL_SCRIPT = @INSTALL_SCRIPT@
208INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
209INTLLIBS = @INTLLIBS@
210INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
211KEYSYMDEFS = @KEYSYMDEFS@
212LD = @LD@
213LDFLAGS = @LDFLAGS@
214LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
215LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
216LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
217LIBICONV = @LIBICONV@
218LIBINTL = @LIBINTL@
219LIBOBJS = @LIBOBJS@
220LIBS = @LIBS@
221LIBTOOL = @LIBTOOL@
222LIPO = @LIPO@
223LN_S = @LN_S@
224LTLIBICONV = @LTLIBICONV@
225LTLIBINTL = @LTLIBINTL@
226LTLIBOBJS = @LTLIBOBJS@
227MAKEINFO = @MAKEINFO@
228MKDIR_P = @MKDIR_P@
229MSGFMT = @MSGFMT@
230MSGFMT_015 = @MSGFMT_015@
231MSGMERGE = @MSGMERGE@
232NM = @NM@
233NMEDIT = @NMEDIT@
234OBJC = @OBJC@
235OBJCDEPMODE = @OBJCDEPMODE@
236OBJCFLAGS = @OBJCFLAGS@
237OBJDUMP = @OBJDUMP@
238OBJEXT = @OBJEXT@
239OTOOL = @OTOOL@
240OTOOL64 = @OTOOL64@
241PACKAGE = @PACKAGE@
242PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
243PACKAGE_NAME = @PACKAGE_NAME@
244PACKAGE_STRING = @PACKAGE_STRING@
245PACKAGE_TARNAME = @PACKAGE_TARNAME@
246PACKAGE_URL = @PACKAGE_URL@
247PACKAGE_VERSION = @PACKAGE_VERSION@
248PATH_SEPARATOR = @PATH_SEPARATOR@
249PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
250PIXMAN_LIBS = @PIXMAN_LIBS@
251PKG_CONFIG = @PKG_CONFIG@
252PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
253PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
254POSUB = @POSUB@
255RANLIB = @RANLIB@
256SDL_CFLAGS = @SDL_CFLAGS@
257SDL_CONFIG = @SDL_CONFIG@
258SDL_LIBS = @SDL_LIBS@
259SED = @SED@
260SET_MAKE = @SET_MAKE@
261SHELL = @SHELL@
262SSL_CFLAGS = @SSL_CFLAGS@
263SSL_LIBS = @SSL_LIBS@
264STRIP = @STRIP@
265TLS2_CFLAGS = @TLS2_CFLAGS@
266TLS2_LIBS = @TLS2_LIBS@
267TLS_CFLAGS = @TLS_CFLAGS@
268TLS_LIBS = @TLS_LIBS@
269TSLIB_CFLAGS = @TSLIB_CFLAGS@
270TSLIB_LIBS = @TSLIB_LIBS@
271USE_NLS = @USE_NLS@
272VERSION = @VERSION@
273VMAJ = @VMAJ@
274WIN32_CFLAGS = @WIN32_CFLAGS@
275WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
276WIN32_LIBS = @WIN32_LIBS@
277XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
278XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
279XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
280XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
281XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
282XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
283XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
284XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
285XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
286XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
287XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
288XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
289XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
290XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
291XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
292XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
293XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
294XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
295XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
296XCB_X11_LIBS = @XCB_X11_LIBS@
297XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
298XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
299XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
300XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
301XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
302XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
303XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
304XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
305XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
306XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
307XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
308XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
309XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
310XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
311XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
312XDAMAGE_LIBS = @XDAMAGE_LIBS@
313XDPMS_CFLAGS = @XDPMS_CFLAGS@
314XDPMS_LIBS = @XDPMS_LIBS@
315XFIXES_CFLAGS = @XFIXES_CFLAGS@
316XFIXES_LIBS = @XFIXES_LIBS@
317XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
318XGESTURE_LIBS = @XGESTURE_LIBS@
319XGETTEXT = @XGETTEXT@
320XGETTEXT_015 = @XGETTEXT_015@
321XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
322XI2_CFLAGS = @XI2_CFLAGS@
323XI2_LIBS = @XI2_LIBS@
324XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
325XINERAMA_LIBS = @XINERAMA_LIBS@
326XKB_CFLAGS = @XKB_CFLAGS@
327XKB_LIBS = @XKB_LIBS@
328XMKMF = @XMKMF@
329XPRINT_CFLAGS = @XPRINT_CFLAGS@
330XPRINT_LIBS = @XPRINT_LIBS@
331XRANDR_CFLAGS = @XRANDR_CFLAGS@
332XRANDR_LIBS = @XRANDR_LIBS@
333XRENDER_CFLAGS = @XRENDER_CFLAGS@
334XRENDER_LIBS = @XRENDER_LIBS@
335XSS_CFLAGS = @XSS_CFLAGS@
336XSS_LIBS = @XSS_LIBS@
337XTEST_CFLAGS = @XTEST_CFLAGS@
338XTEST_LIBS = @XTEST_LIBS@
339X_CFLAGS = @X_CFLAGS@
340X_EXTRA_LIBS = @X_EXTRA_LIBS@
341X_LIBS = @X_LIBS@
342X_PRE_LIBS = @X_PRE_LIBS@
343Xcursor_cflags = @Xcursor_cflags@
344Xcursor_libs = @Xcursor_libs@
345abs_builddir = @abs_builddir@
346abs_srcdir = @abs_srcdir@
347abs_top_builddir = @abs_top_builddir@
348abs_top_srcdir = @abs_top_srcdir@
349ac_ct_CC = @ac_ct_CC@
350ac_ct_CXX = @ac_ct_CXX@
351ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
352ac_ct_OBJC = @ac_ct_OBJC@
353am__include = @am__include@
354am__leading_dot = @am__leading_dot@
355am__quote = @am__quote@
356am__tar = @am__tar@
357am__untar = @am__untar@
358bindir = @bindir@
359build = @build@
360build_alias = @build_alias@
361build_cpu = @build_cpu@
362build_os = @build_os@
363build_vendor = @build_vendor@
364builddir = @builddir@
365cocoa_ldflags = @cocoa_ldflags@
366datadir = @datadir@
367datarootdir = @datarootdir@
368dlopen_libs = @dlopen_libs@
369docdir = @docdir@
370dvidir = @dvidir@
371ecore_cocoa_cflags = @ecore_cocoa_cflags@
372ecore_cocoa_libs = @ecore_cocoa_libs@
373ecore_con_cflags = @ecore_con_cflags@
374ecore_con_libs = @ecore_con_libs@
375ecore_directfb_cflags = @ecore_directfb_cflags@
376ecore_directfb_libs = @ecore_directfb_libs@
377ecore_evas_cflags = @ecore_evas_cflags@
378ecore_evas_libs = @ecore_evas_libs@
379ecore_fb_cflags = @ecore_fb_cflags@
380ecore_fb_libs = @ecore_fb_libs@
381ecore_file_cflags = @ecore_file_cflags@
382ecore_file_libs = @ecore_file_libs@
383ecore_imf_cflags = @ecore_imf_cflags@
384ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
385ecore_imf_evas_libs = @ecore_imf_evas_libs@
386ecore_imf_libs = @ecore_imf_libs@
387ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
388ecore_imf_xim_libs = @ecore_imf_xim_libs@
389ecore_input_cflags = @ecore_input_cflags@
390ecore_input_evas_cflags = @ecore_input_evas_cflags@
391ecore_input_evas_libs = @ecore_input_evas_libs@
392ecore_input_libs = @ecore_input_libs@
393ecore_ipc_cflags = @ecore_ipc_cflags@
394ecore_ipc_libs = @ecore_ipc_libs@
395ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
396ecore_psl1ght_libs = @ecore_psl1ght_libs@
397ecore_sdl_cflags = @ecore_sdl_cflags@
398ecore_sdl_libs = @ecore_sdl_libs@
399ecore_win32_cflags = @ecore_win32_cflags@
400ecore_win32_libs = @ecore_win32_libs@
401ecore_wince_cflags = @ecore_wince_cflags@
402ecore_wince_libs = @ecore_wince_libs@
403ecore_x_cflags = @ecore_x_cflags@
404ecore_x_libs = @ecore_x_libs@
405ecore_x_libs_private = @ecore_x_libs_private@
406efl_doxygen = @efl_doxygen@
407efl_have_doxygen = @efl_have_doxygen@
408exec_prefix = @exec_prefix@
409have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
410host = @host@
411host_alias = @host_alias@
412host_cpu = @host_cpu@
413host_os = @host_os@
414host_vendor = @host_vendor@
415htmldir = @htmldir@
416includedir = @includedir@
417infodir = @infodir@
418install_sh = @install_sh@
419libdir = @libdir@
420libexecdir = @libexecdir@
421localedir = @localedir@
422localstatedir = @localstatedir@
423lt_ECHO = @lt_ECHO@
424lt_enable_auto_import = @lt_enable_auto_import@
425mandir = @mandir@
426mkdir_p = @mkdir_p@
427oldincludedir = @oldincludedir@
428pdfdir = @pdfdir@
429pkgconfig_requires_private = @pkgconfig_requires_private@
430prefix = @prefix@
431program_transform_name = @program_transform_name@
432psdir = @psdir@
433release_info = @release_info@
434requirements_ecore = @requirements_ecore@
435requirements_ecore_cocoa = @requirements_ecore_cocoa@
436requirements_ecore_con = @requirements_ecore_con@
437requirements_ecore_directfb = @requirements_ecore_directfb@
438requirements_ecore_evas = @requirements_ecore_evas@
439requirements_ecore_fb = @requirements_ecore_fb@
440requirements_ecore_file = @requirements_ecore_file@
441requirements_ecore_imf = @requirements_ecore_imf@
442requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
443requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
444requirements_ecore_input = @requirements_ecore_input@
445requirements_ecore_input_evas = @requirements_ecore_input_evas@
446requirements_ecore_ipc = @requirements_ecore_ipc@
447requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
448requirements_ecore_sdl = @requirements_ecore_sdl@
449requirements_ecore_win32 = @requirements_ecore_win32@
450requirements_ecore_wince = @requirements_ecore_wince@
451requirements_ecore_x = @requirements_ecore_x@
452rt_libs = @rt_libs@
453sbindir = @sbindir@
454sharedstatedir = @sharedstatedir@
455srcdir = @srcdir@
456sysconfdir = @sysconfdir@
457target_alias = @target_alias@
458top_build_prefix = @top_build_prefix@
459top_builddir = @top_builddir@
460top_srcdir = @top_srcdir@
461version_info = @version_info@
462x_cflags = @x_cflags@
463x_includes = @x_includes@
464x_libs = @x_libs@
465MAINTAINERCLEANFILES = Makefile.in
466AM_CPPFLAGS = \
467-I$(top_srcdir)/src/lib/ecore \
468-I$(top_srcdir)/src/lib/ecore_input \
469-I$(top_builddir)/src/lib/ecore \
470-I$(top_builddir)/src/lib/ecore_input \
471@EFL_ECORE_WINCE_BUILD@ \
472@EVAS_CFLAGS@ \
473@EINA_CFLAGS@ \
474@WIN32_CPPFLAGS@
475
476AM_CFLAGS = @WIN32_CFLAGS@
477lib_LTLIBRARIES = libecore_wince.la
478includes_HEADERS = Ecore_WinCE.h
479includesdir = $(includedir)/ecore-@VMAJ@
480libecore_wince_la_SOURCES = \
481ecore_wince.c \
482ecore_wince_event.c \
483ecore_wince_window.c
484
485libecore_wince_la_LIBADD = \
486@WIN32_LIBS@ \
487$(top_builddir)/src/lib/ecore_input/libecore_input.la \
488$(top_builddir)/src/lib/ecore/libecore.la \
489@EVAS_LIBS@ \
490@EINA_LIBS@ \
491@EVIL_LIBS@
492
493libecore_wince_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
494EXTRA_DIST = ecore_wince_private.h
495all: all-am
496
497.SUFFIXES:
498.SUFFIXES: .c .lo .o .obj
499$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
500 @for dep in $?; do \
501 case '$(am__configure_deps)' in \
502 *$$dep*) \
503 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
504 && { if test -f $@; then exit 0; else break; fi; }; \
505 exit 1;; \
506 esac; \
507 done; \
508 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_wince/Makefile'; \
509 $(am__cd) $(top_srcdir) && \
510 $(AUTOMAKE) --gnu src/lib/ecore_wince/Makefile
511.PRECIOUS: Makefile
512Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
513 @case '$?' in \
514 *config.status*) \
515 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
516 *) \
517 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
518 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
519 esac;
520
521$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
522 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
523
524$(top_srcdir)/configure: $(am__configure_deps)
525 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
526$(ACLOCAL_M4): $(am__aclocal_m4_deps)
527 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
528$(am__aclocal_m4_deps):
529install-libLTLIBRARIES: $(lib_LTLIBRARIES)
530 @$(NORMAL_INSTALL)
531 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
532 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
533 list2=; for p in $$list; do \
534 if test -f $$p; then \
535 list2="$$list2 $$p"; \
536 else :; fi; \
537 done; \
538 test -z "$$list2" || { \
539 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
540 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
541 }
542
543uninstall-libLTLIBRARIES:
544 @$(NORMAL_UNINSTALL)
545 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
546 for p in $$list; do \
547 $(am__strip_dir) \
548 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
549 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
550 done
551
552clean-libLTLIBRARIES:
553 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
554 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
555 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
556 test "$$dir" != "$$p" || dir=.; \
557 echo "rm -f \"$${dir}/so_locations\""; \
558 rm -f "$${dir}/so_locations"; \
559 done
560libecore_wince.la: $(libecore_wince_la_OBJECTS) $(libecore_wince_la_DEPENDENCIES)
561 $(AM_V_CCLD)$(libecore_wince_la_LINK) -rpath $(libdir) $(libecore_wince_la_OBJECTS) $(libecore_wince_la_LIBADD) $(LIBS)
562
563mostlyclean-compile:
564 -rm -f *.$(OBJEXT)
565
566distclean-compile:
567 -rm -f *.tab.c
568
569@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_wince.Plo@am__quote@
570@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_wince_event.Plo@am__quote@
571@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_wince_window.Plo@am__quote@
572
573.c.o:
574@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
575@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
576@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
577@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
578@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
579@am__fastdepCC_FALSE@ $(COMPILE) -c $<
580
581.c.obj:
582@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
583@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
584@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
585@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
586@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
587@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
588
589.c.lo:
590@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
591@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
592@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
593@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
594@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
595@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
596
597mostlyclean-libtool:
598 -rm -f *.lo
599
600clean-libtool:
601 -rm -rf .libs _libs
602install-includesHEADERS: $(includes_HEADERS)
603 @$(NORMAL_INSTALL)
604 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
605 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
606 for p in $$list; do \
607 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
608 echo "$$d$$p"; \
609 done | $(am__base_list) | \
610 while read files; do \
611 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
612 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
613 done
614
615uninstall-includesHEADERS:
616 @$(NORMAL_UNINSTALL)
617 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
618 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
619 test -n "$$files" || exit 0; \
620 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
621 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
622
623ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
624 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
625 unique=`for i in $$list; do \
626 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
627 done | \
628 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
629 END { if (nonempty) { for (i in files) print i; }; }'`; \
630 mkid -fID $$unique
631tags: TAGS
632
633TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
634 $(TAGS_FILES) $(LISP)
635 set x; \
636 here=`pwd`; \
637 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
638 unique=`for i in $$list; do \
639 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
640 done | \
641 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
642 END { if (nonempty) { for (i in files) print i; }; }'`; \
643 shift; \
644 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
645 test -n "$$unique" || unique=$$empty_fix; \
646 if test $$# -gt 0; then \
647 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
648 "$$@" $$unique; \
649 else \
650 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
651 $$unique; \
652 fi; \
653 fi
654ctags: CTAGS
655CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
656 $(TAGS_FILES) $(LISP)
657 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
658 unique=`for i in $$list; do \
659 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
660 done | \
661 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
662 END { if (nonempty) { for (i in files) print i; }; }'`; \
663 test -z "$(CTAGS_ARGS)$$unique" \
664 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
665 $$unique
666
667GTAGS:
668 here=`$(am__cd) $(top_builddir) && pwd` \
669 && $(am__cd) $(top_srcdir) \
670 && gtags -i $(GTAGS_ARGS) "$$here"
671
672distclean-tags:
673 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
674
675distdir: $(DISTFILES)
676 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
677 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
678 list='$(DISTFILES)'; \
679 dist_files=`for file in $$list; do echo $$file; done | \
680 sed -e "s|^$$srcdirstrip/||;t" \
681 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
682 case $$dist_files in \
683 */*) $(MKDIR_P) `echo "$$dist_files" | \
684 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
685 sort -u` ;; \
686 esac; \
687 for file in $$dist_files; do \
688 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
689 if test -d $$d/$$file; then \
690 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
691 if test -d "$(distdir)/$$file"; then \
692 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
693 fi; \
694 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
695 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
696 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
697 fi; \
698 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
699 else \
700 test -f "$(distdir)/$$file" \
701 || cp -p $$d/$$file "$(distdir)/$$file" \
702 || exit 1; \
703 fi; \
704 done
705check-am: all-am
706check: check-am
707all-am: Makefile $(LTLIBRARIES) $(HEADERS)
708installdirs:
709 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
710 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
711 done
712install: install-am
713install-exec: install-exec-am
714install-data: install-data-am
715uninstall: uninstall-am
716
717install-am: all-am
718 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
719
720installcheck: installcheck-am
721install-strip:
722 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
723 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
724 `test -z '$(STRIP)' || \
725 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
726mostlyclean-generic:
727
728clean-generic:
729
730distclean-generic:
731 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
732 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
733
734maintainer-clean-generic:
735 @echo "This command is intended for maintainers to use"
736 @echo "it deletes files that may require special tools to rebuild."
737 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
738clean: clean-am
739
740clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
741 mostlyclean-am
742
743distclean: distclean-am
744 -rm -rf ./$(DEPDIR)
745 -rm -f Makefile
746distclean-am: clean-am distclean-compile distclean-generic \
747 distclean-tags
748
749dvi: dvi-am
750
751dvi-am:
752
753html: html-am
754
755html-am:
756
757info: info-am
758
759info-am:
760
761install-data-am: install-includesHEADERS
762
763install-dvi: install-dvi-am
764
765install-dvi-am:
766
767install-exec-am: install-libLTLIBRARIES
768
769install-html: install-html-am
770
771install-html-am:
772
773install-info: install-info-am
774
775install-info-am:
776
777install-man:
778
779install-pdf: install-pdf-am
780
781install-pdf-am:
782
783install-ps: install-ps-am
784
785install-ps-am:
786
787installcheck-am:
788
789maintainer-clean: maintainer-clean-am
790 -rm -rf ./$(DEPDIR)
791 -rm -f Makefile
792maintainer-clean-am: distclean-am maintainer-clean-generic
793
794mostlyclean: mostlyclean-am
795
796mostlyclean-am: mostlyclean-compile mostlyclean-generic \
797 mostlyclean-libtool
798
799pdf: pdf-am
800
801pdf-am:
802
803ps: ps-am
804
805ps-am:
806
807uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
808
809.MAKE: install-am install-strip
810
811.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
812 clean-libLTLIBRARIES clean-libtool ctags distclean \
813 distclean-compile distclean-generic distclean-libtool \
814 distclean-tags distdir dvi dvi-am html html-am info info-am \
815 install install-am install-data install-data-am install-dvi \
816 install-dvi-am install-exec install-exec-am install-html \
817 install-html-am install-includesHEADERS install-info \
818 install-info-am install-libLTLIBRARIES install-man install-pdf \
819 install-pdf-am install-ps install-ps-am install-strip \
820 installcheck installcheck-am installdirs maintainer-clean \
821 maintainer-clean-generic mostlyclean mostlyclean-compile \
822 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
823 tags uninstall uninstall-am uninstall-includesHEADERS \
824 uninstall-libLTLIBRARIES
825
826
827# Tell versions [3.59,3.63) of GNU make to not export all variables.
828# Otherwise a system limit (for SysV at least) may be exceeded.
829.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_wince/ecore_wince.c b/libraries/ecore/src/lib/ecore_wince/ecore_wince.c
new file mode 100644
index 0000000..5638ad3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/ecore_wince.c
@@ -0,0 +1,400 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6#include <stdio.h> /* for printf */
7
8#define WIN32_LEAN_AND_MEAN
9#include <windows.h>
10#undef WIN32_LEAN_AND_MEAN
11
12#include <Eina.h>
13#include <Ecore.h>
14#include <Ecore_Input.h>
15
16#include "Ecore_WinCE.h"
17#include "ecore_wince_private.h"
18
19/*============================================================================*
20 * Local *
21 *============================================================================*/
22
23/**
24 * @cond LOCAL
25 */
26
27static int _ecore_wince_init_count = 0;
28
29LRESULT CALLBACK
30_ecore_wince_window_procedure(HWND window,
31 UINT message,
32 WPARAM window_param,
33 LPARAM data_param)
34{
35 Ecore_WinCE_Callback_Data *data;
36 POINTS pt;
37 DWORD coord;
38
39 data = (Ecore_WinCE_Callback_Data *)malloc(sizeof(Ecore_WinCE_Callback_Data));
40 if (!data) return DefWindowProc(window, message, window_param, data_param);
41
42 data->window = window;
43 data->message = message;
44 data->window_param = window_param;
45 data->data_param = data_param;
46 data->time = GetTickCount();
47 coord = GetMessagePos();
48 pt = MAKEPOINTS(coord);
49 data->x = pt.x;
50 data->y = pt.y;
51
52 switch (data->message)
53 {
54 /* Keyboard input notifications */
55 case WM_CHAR:
56 _ecore_wince_event_handle_key_press(data, 0);
57 break;
58 case WM_HOTKEY:
59 _ecore_wince_event_handle_key_press(data, 1);
60 break;
61 case WM_KEYDOWN:
62 case WM_SYSKEYDOWN:
63 _ecore_wince_event_handle_key_press(data, 1);
64 break;
65 case WM_KEYUP:
66 case WM_SYSKEYUP:
67 _ecore_wince_event_handle_key_release(data, 1);
68 break;
69 case WM_SETFOCUS:
70 _ecore_wince_event_handle_focus_in(data);
71 break;
72 case WM_KILLFOCUS:
73 _ecore_wince_event_handle_focus_out(data);
74 break;
75 /* Mouse input notifications */
76 case WM_LBUTTONDOWN:
77 _ecore_wince_event_handle_button_press(data, 1);
78 break;
79 case WM_LBUTTONUP:
80 _ecore_wince_event_handle_button_release(data, 1);
81 break;
82 case WM_MOUSEMOVE:
83 {
84 RECT rect;
85 Ecore_WinCE_Window *w = NULL;
86
87 w = (Ecore_WinCE_Window *)GetWindowLong(window, GWL_USERDATA);
88
89 if (GetClientRect(window, &rect))
90 {
91 POINT pt;
92
93 INF("mouse in window");
94
95 pt.x = LOWORD(data_param);
96 pt.y = HIWORD(data_param);
97 if (!PtInRect(&rect, pt))
98 {
99 if (w->pointer_is_in)
100 {
101 w->pointer_is_in = 0;
102 _ecore_wince_event_handle_leave_notify(data);
103 }
104 }
105 else
106 {
107 if (!w->pointer_is_in)
108 {
109 w->pointer_is_in = 1;
110 _ecore_wince_event_handle_enter_notify(data);
111 }
112 }
113 }
114 else
115 {
116 ERR("GetClientRect() failed");
117 }
118 _ecore_wince_event_handle_motion_notify(data);
119
120 break;
121 }
122 /* Window notifications */
123 case WM_CREATE:
124 _ecore_wince_event_handle_create_notify(data);
125 break;
126 case WM_DESTROY:
127 _ecore_wince_event_handle_destroy_notify(data);
128 break;
129 case WM_SHOWWINDOW:
130 if ((data->data_param == SW_OTHERUNZOOM) ||
131 (data->data_param == SW_OTHERZOOM))
132 break;
133
134 if (data->window_param)
135 _ecore_wince_event_handle_map_notify(data);
136 else
137 _ecore_wince_event_handle_unmap_notify(data);
138
139 break;
140 case WM_CLOSE:
141 _ecore_wince_event_handle_delete_request(data);
142 break;
143 /* GDI notifications */
144 case WM_ERASEBKGND:
145 return 1;
146 case WM_PAINT:
147 {
148 PAINTSTRUCT paint;
149
150 if (BeginPaint(window, &paint))
151 {
152 data->update = paint.rcPaint;
153 _ecore_wince_event_handle_expose(data);
154 EndPaint(window, &paint);
155 }
156 break;
157 }
158 default:
159 return DefWindowProc(window, message, window_param, data_param);
160 }
161
162 return 0;
163}
164
165static void
166_ecore_wince_error_print_cb(const Eina_Log_Domain *d __UNUSED__,
167 Eina_Log_Level level __UNUSED__,
168 const char *file __UNUSED__,
169 const char *fnc,
170 int line,
171 const char *fmt,
172 void *data __UNUSED__,
173 va_list args)
174{
175 fprintf(stderr, "[%s:%d] ", fnc, line);
176 vfprintf(stderr, fmt, args);
177}
178
179/**
180 * @endcond
181 */
182
183
184/*============================================================================*
185 * Global *
186 *============================================================================*/
187
188
189double _ecore_wince_double_click_time = 0.25;
190long _ecore_wince_event_last_time = 0;
191Ecore_WinCE_Window *_ecore_wince_event_last_window = NULL;
192HINSTANCE _ecore_wince_instance = NULL;
193int _ecore_wince_log_dom_global = -1;
194
195int ECORE_WINCE_EVENT_MOUSE_IN = 0;
196int ECORE_WINCE_EVENT_MOUSE_OUT = 0;
197int ECORE_WINCE_EVENT_WINDOW_FOCUS_IN = 0;
198int ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT = 0;
199int ECORE_WINCE_EVENT_WINDOW_DAMAGE = 0;
200int ECORE_WINCE_EVENT_WINDOW_CREATE = 0;
201int ECORE_WINCE_EVENT_WINDOW_DESTROY = 0;
202int ECORE_WINCE_EVENT_WINDOW_SHOW = 0;
203int ECORE_WINCE_EVENT_WINDOW_HIDE = 0;
204int ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = 0;
205
206/*============================================================================*
207 * API *
208 *============================================================================*/
209
210/**
211 * @addtogroup Ecore_WinCE_Group Ecore_WinCE library
212 *
213 * Ecore_WinCE is a library that wraps Windows CE graphic functions
214 * and integrate them nicely into the Ecore main loop.
215 *
216 * @{
217 */
218
219/**
220 * @brief Initialize the Ecore_WinCE library.
221 *
222 * @return 1 or greater on success, 0 on error.
223 *
224 * This function sets up the Windows CE graphic system. It returns 0 on
225 * failure, otherwise it returns the number of times it has already been
226 * called.
227 *
228 * When Ecore_WinCE is not used anymore, call ecore_wince_shutdown()
229 * to shut down the Ecore_WinCE library.
230 */
231EAPI int
232ecore_wince_init()
233{
234 WNDCLASS wc;
235
236 if (++_ecore_wince_init_count != 1)
237 return _ecore_wince_init_count;
238
239 if (!eina_init())
240 return --_ecore_wince_init_count;
241
242 eina_log_print_cb_set(_ecore_wince_error_print_cb, NULL);
243 _ecore_wince_log_dom_global = eina_log_domain_register
244 ("ecore_wince", ECORE_WINCE_DEFAULT_LOG_COLOR);
245 if (_ecore_wince_log_dom_global < 0)
246 {
247 EINA_LOG_ERR("Ecore_WinCE: Could not register log domain");
248 goto shutdown_eina;
249 }
250
251 if (!ecore_event_init())
252 {
253 ERR("Ecore_WinCE: Could not init ecore_event");
254 goto unregister_log_domain;
255 }
256
257 _ecore_wince_instance = GetModuleHandle(NULL);
258 if (!_ecore_wince_instance)
259 {
260 ERR("GetModuleHandle() failed");
261 goto shutdown_ecore_event;
262 }
263
264 memset (&wc, 0, sizeof (wc));
265 wc.style = CS_HREDRAW | CS_VREDRAW;
266 wc.lpfnWndProc = _ecore_wince_window_procedure;
267 wc.cbClsExtra = 0;
268 wc.cbWndExtra = 0;
269 wc.hInstance = _ecore_wince_instance;
270 wc.hIcon = NULL;
271 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
272 wc.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
273 wc.lpszMenuName = NULL;
274 wc.lpszClassName = ECORE_WINCE_WINDOW_CLASS;
275
276 if(!RegisterClass(&wc))
277 {
278 ERR("RegisterClass() failed");
279 goto free_library;
280 }
281
282 if (!ECORE_WINCE_EVENT_MOUSE_IN)
283 {
284 ECORE_WINCE_EVENT_MOUSE_IN = ecore_event_type_new();
285 ECORE_WINCE_EVENT_MOUSE_OUT = ecore_event_type_new();
286 ECORE_WINCE_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
287 ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
288 ECORE_WINCE_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
289 ECORE_WINCE_EVENT_WINDOW_CREATE = ecore_event_type_new();
290 ECORE_WINCE_EVENT_WINDOW_DESTROY = ecore_event_type_new();
291 ECORE_WINCE_EVENT_WINDOW_SHOW = ecore_event_type_new();
292 ECORE_WINCE_EVENT_WINDOW_HIDE = ecore_event_type_new();
293 ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
294 }
295
296 return _ecore_wince_init_count;
297
298 free_library:
299 FreeLibrary(_ecore_wince_instance);
300 shutdown_ecore_event:
301 ecore_event_shutdown();
302 unregister_log_domain:
303 eina_log_domain_unregister(_ecore_wince_log_dom_global);
304 shutdown_eina:
305 eina_shutdown();
306
307 return --_ecore_wince_init_count;
308}
309
310/**
311 * @brief Shut down the Ecore_WinCE library.
312 *
313 * @return 0 when the library is completely shut down, 1 or
314 * greater otherwise.
315 *
316 * This function shuts down the Ecore_WinCE library. It returns 0 when it has
317 * been called the same number of times than ecore_wince_init(). In that case
318 * it shuts down all the Windows CE graphic system.
319 */
320EAPI int
321ecore_wince_shutdown()
322{
323 HWND task_bar;
324
325 if (--_ecore_wince_init_count != 0)
326 return _ecore_wince_init_count;
327
328 /* force task bar to be shown (in case the application exits */
329 /* while being fullscreen) */
330 task_bar = FindWindow(L"HHTaskBar", NULL);
331 if (task_bar)
332 {
333 ShowWindow(task_bar, SW_SHOW);
334 EnableWindow(task_bar, TRUE);
335 }
336
337 if (!UnregisterClass(ECORE_WINCE_WINDOW_CLASS, _ecore_wince_instance))
338 ERR("UnregisterClass() failed");
339
340 if (!FreeLibrary(_ecore_wince_instance))
341 ERR("FreeLibrary() failed");
342
343 _ecore_wince_instance = NULL;
344
345 ecore_event_shutdown();
346 eina_log_domain_unregister(_ecore_wince_log_dom_global);
347 _ecore_wince_log_dom_global = -1;
348 eina_shutdown();
349
350 return _ecore_wince_init_count;
351}
352
353/**
354 * @brief Set the timeout for a double and triple clicks to be flagged.
355 *
356 * @param t The time in seconds.
357 *
358 * This function sets the time @p t between clicks before the
359 * double_click flag is set in a button down event. If 3 clicks occur
360 * within double this time, the triple_click flag is also set.
361 */
362EAPI void
363ecore_wince_double_click_time_set(double t)
364{
365 if (t < 0.0) t = 0.0;
366 _ecore_wince_double_click_time = t;
367}
368
369/**
370 * @brief Retrieve the double and triple click flag timeout.
371 *
372 * @return The timeout for double clicks in seconds.
373 *
374 * This function returns the double clicks in seconds. If
375 * ecore_wince_double_click_time_set() has not been called, the
376 * default value is returned. See ecore_wince_double_click_time_set()
377 * for more informations.
378 */
379EAPI double
380ecore_wince_double_click_time_get(void)
381{
382 return _ecore_wince_double_click_time;
383}
384
385/**
386 * @brief Return the last event time.
387 *
388 * @return The last envent time.
389 *
390 * This function returns the last event time.
391 */
392EAPI long
393ecore_wince_current_time_get(void)
394{
395 return _ecore_wince_event_last_time;
396}
397
398/**
399 * @}
400 */
diff --git a/libraries/ecore/src/lib/ecore_wince/ecore_wince_event.c b/libraries/ecore/src/lib/ecore_wince/ecore_wince_event.c
new file mode 100644
index 0000000..41c355b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/ecore_wince_event.c
@@ -0,0 +1,1074 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <stdlib.h>
6
7#define WIN32_LEAN_AND_MEAN
8#include <windows.h>
9#undef WIN32_LEAN_AND_MEAN
10
11#include <Eina.h>
12#include <Ecore.h>
13#include <Ecore_Input.h>
14
15#include "Ecore_WinCE.h"
16#include "ecore_wince_private.h"
17
18/*============================================================================*
19 * Local *
20 *============================================================================*/
21
22/**
23 * @cond LOCAL
24 */
25
26typedef enum
27{
28 ECORE_WINCE_KEY_MASK_LSHIFT = 1 << 0,
29 ECORE_WINCE_KEY_MASK_RSHIFT = 1 << 1,
30 ECORE_WINCE_KEY_MASK_LCONTROL = 1 << 2,
31 ECORE_WINCE_KEY_MASK_RCONTROL = 1 << 3,
32 ECORE_WINCE_KEY_MASK_LMENU = 1 << 4,
33 ECORE_WINCE_KEY_MASK_RMENU = 1 << 5
34} Ecore_Wince_Key_Mask;
35
36static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_window = NULL;
37static Ecore_WinCE_Window *_ecore_wince_mouse_down_last_last_window = NULL;
38static long _ecore_wince_mouse_down_last_time = 0;
39static long _ecore_wince_mouse_down_last_last_time = 0;
40static int _ecore_wince_mouse_down_did_triple = 0;
41static int _ecore_wince_mouse_up_count = 0;
42static Ecore_Wince_Key_Mask _ecore_wince_key_mask = 0;
43
44static void
45_ecore_wince_event_free_key_down(void *data __UNUSED__,
46 void *ev)
47{
48 Ecore_Event_Key *e;
49
50 e = ev;
51 if (e->keyname) free((char *)e->keyname);
52 if (e->key) free((char *)e->key);
53 if (e->string) free((char *)e->string);
54 free(e);
55}
56
57static void
58_ecore_wince_event_free_key_up(void *data __UNUSED__,
59 void *ev)
60{
61 Ecore_Event_Key *e;
62
63 e = ev;
64 if (e->keyname) free((char *)e->keyname);
65 if (e->key) free((char *)e->key);
66 if (e->string) free((char *)e->string);
67 free(e);
68}
69
70static int
71_ecore_wince_event_keystroke_get(int key,
72 Eina_Bool is_down,
73 char **keyname,
74 char **keysymbol,
75 char **keycompose)
76{
77 char *kn;
78 char *ks;
79 char *kc;
80
81 *keyname = NULL;
82 *keysymbol = NULL;
83 *keycompose = NULL;
84
85 switch (key)
86 {
87 /* Keystroke */
88 case VK_PRIOR:
89 kn = "Prior";
90 ks = "Prior";
91 kc = "Prior";
92 break;
93 case VK_NEXT:
94 kn = "Next";
95 ks = "Next";
96 kc = "Next";
97 break;
98 case VK_END:
99 kn = "End";
100 ks = "End";
101 kc = "End";
102 break;
103 case VK_HOME:
104 kn = "Home";
105 ks = "Home";
106 kc = "Home";
107 break;
108 case VK_LEFT:
109 kn = "Left";
110 ks = "Left";
111 kc = "Left";
112 break;
113 case VK_UP:
114 kn = "Up";
115 ks = "Up";
116 kc = "Up";
117 break;
118 case VK_RIGHT:
119 kn = "Right";
120 ks = "Right";
121 kc = "Right";
122 break;
123 case VK_DOWN:
124 kn = "Down";
125 ks = "Down";
126 kc = "Down";
127 break;
128 case VK_INSERT:
129 kn = "Insert";
130 ks = "Insert";
131 kc = "Insert";
132 break;
133 case VK_DELETE:
134 kn = "Delete";
135 ks = "Delete";
136 kc = "Delete";
137 break;
138 case VK_F1:
139 kn = "F1";
140 ks = "F1";
141 kc = "";
142 break;
143 case VK_F2:
144 kn = "F2";
145 ks = "F2";
146 kc = "";
147 break;
148 case VK_F3:
149 kn = "F3";
150 ks = "F3";
151 kc = "";
152 break;
153 case VK_F4:
154 kn = "F4";
155 ks = "F4";
156 kc = "";
157 break;
158 case VK_F5:
159 kn = "F5";
160 ks = "F5";
161 kc = "";
162 break;
163 case VK_F6:
164 kn = "F6";
165 ks = "F6";
166 kc = "";
167 break;
168 case VK_F7:
169 kn = "F7";
170 ks = "F7";
171 kc = "";
172 break;
173 case VK_F8:
174 kn = "F8";
175 ks = "F8";
176 kc = "";
177 break;
178 case VK_F9:
179 kn = "F9";
180 ks = "F9";
181 kc = "";
182 break;
183 case VK_F10:
184 kn = "F10";
185 ks = "F10";
186 kc = "";
187 break;
188 case VK_F11:
189 kn = "F11";
190 ks = "F11";
191 kc = "";
192 break;
193 case VK_F12:
194 kn = "F12";
195 ks = "F12";
196 kc = "";
197 break;
198 case VK_F13:
199 kn = "F13";
200 ks = "F13";
201 kc = "";
202 break;
203 case VK_F14:
204 kn = "F14";
205 ks = "F14";
206 kc = "";
207 break;
208 case VK_F15:
209 kn = "F15";
210 ks = "F15";
211 kc = "";
212 break;
213 case VK_F16:
214 kn = "F16";
215 ks = "F16";
216 kc = "";
217 break;
218 case VK_F17:
219 kn = "F17";
220 ks = "F17";
221 kc = "";
222 break;
223 case VK_F18:
224 kn = "F18";
225 ks = "F18";
226 kc = "";
227 break;
228 case VK_F19:
229 kn = "F19";
230 ks = "F19";
231 kc = "";
232 break;
233 case VK_F20:
234 /*
235 * VK_F20 indicates that an arrow key came from a rocker.
236 * This can safely be ignored.
237 */
238 return 0;
239 case VK_F21:
240 /*
241 * VK_F21 indicates that an arrow key came from a directional
242 * pad. This can safely be ignored.
243 */
244 return 0;
245 case VK_F22:
246 kn = "F22";
247 ks = "F22";
248 kc = "";
249 break;
250 case VK_F23:
251 /*
252 * Sent with VK_RETURN when doing an action (usually the middle
253 * button on a directional pad. This can safely be ignored.
254 */
255 return 0;
256 case VK_F24:
257 kn = "F24";
258 ks = "F24";
259 kc = "";
260 break;
261 case VK_APPS:
262 kn = "Application";
263 ks = "Application";
264 kc = "";
265 break;
266 case VK_SHIFT:
267 {
268 SHORT res;
269
270 if (is_down)
271 {
272 res = GetKeyState(VK_LSHIFT);
273 if (res & 0x8000)
274 {
275 _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LSHIFT;
276 kn = "Shift_L";
277 ks = "Shift_L";
278 kc = "";
279 }
280 res = GetKeyState(VK_RSHIFT);
281 if (res & 0x8000)
282 {
283 _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RSHIFT;
284 kn = "Shift_R";
285 ks = "Shift_R";
286 kc = "";
287 }
288 }
289 else /* is_up */
290 {
291 res = GetKeyState(VK_LSHIFT);
292 if (!(res & 0x8000) &&
293 (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LSHIFT))
294 {
295 kn = "Shift_L";
296 ks = "Shift_L";
297 kc = "";
298 _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LSHIFT;
299 }
300 res = GetKeyState(VK_RSHIFT);
301 if (!(res & 0x8000) &&
302 (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RSHIFT))
303 {
304 kn = "Shift_R";
305 ks = "Shift_R";
306 kc = "";
307 _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RSHIFT;
308 }
309 }
310 break;
311 }
312 case VK_CONTROL:
313 {
314 SHORT res;
315
316 if (is_down)
317 {
318 res = GetKeyState(VK_LCONTROL);
319 if (res & 0x8000)
320 {
321 _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LCONTROL;
322 kn = "Control_L";
323 ks = "Control_L";
324 kc = "";
325 break;
326 }
327 res = GetKeyState(VK_RCONTROL);
328 if (res & 0x8000)
329 {
330 _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RCONTROL;
331 kn = "Control_R";
332 ks = "Control_R";
333 kc = "";
334 break;
335 }
336 }
337 else /* is_up */
338 {
339 res = GetKeyState(VK_LCONTROL);
340 if (!(res & 0x8000) &&
341 (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LCONTROL))
342 {
343 kn = "Control_L";
344 ks = "Control_L";
345 kc = "";
346 _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LCONTROL;
347 break;
348 }
349 res = GetKeyState(VK_RCONTROL);
350 if (!(res & 0x8000) &&
351 (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RCONTROL))
352 {
353 kn = "Control_R";
354 ks = "Control_R";
355 kc = "";
356 _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RCONTROL;
357 break;
358 }
359 }
360 break;
361 }
362 case VK_MENU:
363 {
364 SHORT res;
365
366 if (is_down)
367 {
368 res = GetKeyState(VK_LMENU);
369 if (res & 0x8000)
370 {
371 _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_LMENU;
372 kn = "Alt_L";
373 ks = "Alt_L";
374 kc = "";
375 }
376 res = GetKeyState(VK_RMENU);
377 if (res & 0x8000)
378 {
379 _ecore_wince_key_mask |= ECORE_WINCE_KEY_MASK_RMENU;
380 kn = "Alt_R";
381 ks = "Alt_R";
382 kc = "";
383 }
384 }
385 else /* is_up */
386 {
387 res = GetKeyState(VK_LMENU);
388 if (!(res & 0x8000) &&
389 (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_LMENU))
390 {
391 kn = "Alt_L";
392 ks = "Alt_L";
393 kc = "";
394 _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_LMENU;
395 }
396 res = GetKeyState(VK_RMENU);
397 if (!(res & 0x8000) &&
398 (_ecore_wince_key_mask & ECORE_WINCE_KEY_MASK_RMENU))
399 {
400 kn = "Alt_R";
401 ks = "Alt_R";
402 kc = "";
403 _ecore_wince_key_mask &= ~ECORE_WINCE_KEY_MASK_RMENU;
404 }
405 }
406 break;
407 }
408 default:
409 /* other non keystroke characters */
410 return 0;
411 }
412 *keyname = strdup(kn);
413 if (!*keyname) return 0;
414 *keysymbol = strdup(ks);
415 if (!*keysymbol)
416 {
417 free(*keyname);
418 *keyname = NULL;
419 return 0;
420 }
421 *keycompose = strdup(kc);
422 if (!*keycompose)
423 {
424 free(*keyname);
425 free(*keysymbol);
426 *keyname = NULL;
427 *keysymbol = NULL;
428 return 0;
429 }
430
431 return 1;
432}
433
434static int
435_ecore_wince_event_char_get(int key,
436 char **keyname,
437 char **keysymbol,
438 char **keycompose)
439{
440 char kn[32];
441 char ks[32];
442 char kc[32];
443
444 *keyname = NULL;
445 *keysymbol = NULL;
446 *keycompose = NULL;
447
448 switch (key)
449 {
450 case VK_APP3:
451 case VK_BACK:
452 strncpy(kn, "BackSpace", 32);
453 strncpy(ks, "BackSpace", 32);
454 strncpy(kc, "BackSpace", 32);
455 break;
456 case VK_APP4:
457 case VK_TAB:
458 strncpy(kn, "Tab", 32);
459 strncpy(ks, "Tab", 32);
460 strncpy(kc, "Tab", 32);
461 break;
462 case VK_APP5:
463 case 0x0a:
464 /* Line feed (Shift + Enter) */
465 strncpy(kn, "LineFeed", 32);
466 strncpy(ks, "LineFeed", 32);
467 strncpy(kc, "LineFeed", 32);
468 break;
469 case VK_APP2:
470 case VK_RETURN:
471 strncpy(kn, "Return", 32);
472 strncpy(ks, "Return", 32);
473 strncpy(kc, "Return", 32);
474 break;
475 case VK_APP1:
476 case VK_ESCAPE:
477 strncpy(kn, "Escape", 32);
478 strncpy(ks, "Escape", 32);
479 strncpy(kc, "Escape", 32);
480 break;
481 case VK_SPACE:
482 strncpy(kn, "space", 32);
483 strncpy(ks, "space", 32);
484 strncpy(kc, " ", 32);
485 break;
486 default:
487 /* displayable characters */
488 printf (" * key : %d\n", key);
489 kn[0] = (TCHAR)key;
490 kn[1] = '\0';
491 ks[0] = (TCHAR)key;
492 ks[1] = '\0';
493 kc[0] = (TCHAR)key;
494 kc[1] = '\0';
495 break;
496 }
497 *keyname = strdup(kn);
498 if (!*keyname) return 0;
499 *keysymbol = strdup(ks);
500 if (!*keysymbol)
501 {
502 free(*keyname);
503 *keyname = NULL;
504 return 0;
505 }
506 *keycompose = strdup(kc);
507 if (!*keycompose)
508 {
509 free(*keyname);
510 free(*keysymbol);
511 *keyname = NULL;
512 *keysymbol = NULL;
513 return 0;
514 }
515
516 return 1;
517}
518
519/**
520 * @endcond
521 */
522
523
524/*============================================================================*
525 * Global *
526 *============================================================================*/
527
528void
529_ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg,
530 int is_keystroke)
531{
532 Ecore_Event_Key *e;
533
534 INF("key pressed");
535
536 e = (Ecore_Event_Key *)malloc(sizeof(Ecore_Event_Key));
537 if (!e) return;
538
539 if (is_keystroke)
540 {
541 if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
542 EINA_TRUE,
543 (char **)&e->keyname,
544 (char **)&e->key,
545 (char **)&e->string))
546 {
547 free(e);
548 return;
549 }
550 }
551 else
552 {
553 if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
554 (char **)&e->keyname,
555 (char **)&e->key,
556 (char **)&e->string))
557 {
558 free(e);
559 return;
560 }
561 }
562
563 e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
564 e->event_window = e->window;
565 if (!e->window)
566 {
567 free(e);
568 return;
569 }
570 e->timestamp = msg->time;
571
572 _ecore_wince_event_last_time = e->timestamp;
573
574 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, _ecore_wince_event_free_key_down, NULL);
575}
576
577void
578_ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg,
579 int is_keystroke)
580{
581 Ecore_Event_Key *e;
582
583 INF("key released");
584
585 e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key));
586 if (!e) return;
587
588 if (is_keystroke)
589 {
590 if (!_ecore_wince_event_keystroke_get(LOWORD(msg->window_param),
591 EINA_FALSE,
592 (char **)&e->keyname,
593 (char **)&e->key,
594 (char **)&e->string))
595 {
596 free(e);
597 return;
598 }
599 }
600 else
601 {
602 if (!_ecore_wince_event_char_get(LOWORD(msg->window_param),
603 (char **)&e->keyname,
604 (char **)&e->key,
605 (char **)&e->string))
606 {
607 free(e);
608 return;
609 }
610 }
611
612 e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
613 e->event_window = e->window;
614 if (!e->window)
615 {
616 free(e);
617 return;
618 }
619 e->timestamp = msg->time;
620
621 _ecore_wince_event_last_time = e->timestamp;
622
623 ecore_event_add(ECORE_EVENT_KEY_UP, e, _ecore_wince_event_free_key_up, NULL);
624}
625
626void
627_ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg,
628 int button)
629{
630 Ecore_WinCE_Window *window;
631
632 INF("mouse button pressed");
633
634 window = (Ecore_WinCE_Window *)GetWindowLong(msg->window, GWL_USERDATA);
635
636 {
637 Ecore_Event_Mouse_Move *e;
638
639 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
640 if (!e) return;
641
642 e->window = (Ecore_Window)window;
643 e->event_window = e->window;
644 e->x = LOWORD(msg->data_param);
645 e->y = HIWORD(msg->data_param);
646 e->timestamp = msg->time;
647
648 _ecore_wince_event_last_time = e->timestamp;
649 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
650
651 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
652 }
653
654 {
655 Ecore_Event_Mouse_Button *e;
656
657 if (_ecore_wince_mouse_down_did_triple)
658 {
659 _ecore_wince_mouse_down_last_window = NULL;
660 _ecore_wince_mouse_down_last_last_window = NULL;
661 _ecore_wince_mouse_down_last_time = 0;
662 _ecore_wince_mouse_down_last_last_time = 0;
663 }
664
665 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
666 if (!e) return;
667
668 e->window = (Ecore_Window)window;
669 e->event_window = e->window;
670 e->buttons = button;
671 e->x = LOWORD(msg->data_param);
672 e->y = HIWORD(msg->data_param);
673 e->timestamp = msg->time;
674
675 if (((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
676 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
677 e->double_click = 1;
678
679 if (((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
680 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
681 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
682 {
683 e->triple_click = 1;
684 _ecore_wince_mouse_down_did_triple = 1;
685 }
686 else
687 _ecore_wince_mouse_down_did_triple = 0;
688
689 if (!e->double_click && !e->triple_click)
690 _ecore_wince_mouse_up_count = 0;
691
692 _ecore_wince_event_last_time = e->timestamp;
693 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
694
695 if (!_ecore_wince_mouse_down_did_triple)
696 {
697 _ecore_wince_mouse_down_last_last_window = _ecore_wince_mouse_down_last_window;
698 _ecore_wince_mouse_down_last_window = (Ecore_WinCE_Window *)e->window;
699 _ecore_wince_mouse_down_last_last_time = _ecore_wince_mouse_down_last_time;
700 _ecore_wince_mouse_down_last_time = e->timestamp;
701 }
702
703 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, e, NULL, NULL);
704 }
705}
706
707void
708_ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg,
709 int button)
710{
711 Ecore_WinCE_Window *window;
712
713 INF("mouse button released");
714
715 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
716
717 {
718 Ecore_Event_Mouse_Move *e;
719
720 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
721 if (!e) return;
722
723 e->window = (Ecore_Window)window;
724 e->event_window = e->window;
725 e->x = LOWORD(msg->data_param);
726 e->y = HIWORD(msg->data_param);
727 e->timestamp = msg->time;
728
729 _ecore_wince_event_last_time = e->timestamp;
730 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
731
732 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
733 }
734
735 {
736 Ecore_Event_Mouse_Button *e;
737
738 e = (Ecore_Event_Mouse_Button *)calloc(1, sizeof(Ecore_Event_Mouse_Button));
739 if (!e) return;
740
741 e->window = (Ecore_Window)window;
742 e->event_window = e->window;
743 e->buttons = button;
744 e->x = LOWORD(msg->data_param);
745 e->y = HIWORD(msg->data_param);
746 e->timestamp = msg->time;
747
748 _ecore_wince_mouse_up_count++;
749
750 if ((_ecore_wince_mouse_up_count >= 2) &&
751 ((e->timestamp - _ecore_wince_mouse_down_last_time) <= (long)(1000 * _ecore_wince_double_click_time)) &&
752 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window))
753 e->double_click = 1;
754
755 if ((_ecore_wince_mouse_up_count >= 3) &&
756 ((e->timestamp - _ecore_wince_mouse_down_last_last_time) <= (long)(2 * 1000 * _ecore_wince_double_click_time)) &&
757 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_window) &&
758 (e->window == (Ecore_Window)_ecore_wince_mouse_down_last_last_window))
759 e->triple_click = 1;
760
761 _ecore_wince_event_last_time = e->timestamp;
762 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
763
764 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, e, NULL, NULL);
765 }
766}
767
768void
769_ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg)
770{
771 Ecore_Event_Mouse_Move *e;
772
773 INF("mouse moved");
774
775 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
776 if (!e) return;
777
778 e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA);
779 e->event_window = e->window;
780 e->x = LOWORD(msg->data_param);
781 e->y = HIWORD(msg->data_param);
782 e->timestamp = msg->time;
783
784 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
785}
786
787void
788_ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg)
789{
790 Ecore_WinCE_Window *window;
791
792 INF("mouse in");
793
794 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
795
796 {
797 Ecore_Event_Mouse_Move *e;
798
799 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
800 if (!e) return;
801
802 e->window = (Ecore_Window)window;
803 e->event_window = e->window;
804 e->x = msg->x;
805 e->y = msg->y;
806 e->timestamp = msg->time;
807
808 _ecore_wince_event_last_time = e->timestamp;
809 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
810
811 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
812 }
813
814 {
815 Ecore_WinCE_Event_Mouse_In *e;
816
817 e = (Ecore_WinCE_Event_Mouse_In *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_In));
818 if (!e) return;
819
820 e->window = window;
821 e->x = msg->x;
822 e->y = msg->y;
823 e->time = msg->time;
824
825 _ecore_wince_event_last_time = e->time;
826
827 ecore_event_add(ECORE_WINCE_EVENT_MOUSE_IN, e, NULL, NULL);
828 }
829}
830
831void
832_ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg)
833{
834 Ecore_WinCE_Window *window;
835
836 INF("mouse out");
837
838 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
839
840 {
841 Ecore_Event_Mouse_Move *e;
842
843 e = (Ecore_Event_Mouse_Move *)calloc(1, sizeof(Ecore_Event_Mouse_Move));
844 if (!e) return;
845
846 e->window = (Ecore_Window)window;
847 e->event_window = e->window;
848 e->x = msg->x;
849 e->y = msg->y;
850 e->timestamp = msg->time;
851
852 _ecore_wince_event_last_time = e->timestamp;
853 _ecore_wince_event_last_window = (Ecore_WinCE_Window *)e->window;
854
855 ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e, NULL, NULL);
856 }
857
858 {
859 Ecore_WinCE_Event_Mouse_Out *e;
860
861 e = (Ecore_WinCE_Event_Mouse_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Mouse_Out));
862 if (!e) return;
863
864 e->window = window;
865 e->x = msg->x;
866 e->y = msg->y;
867 e->time = msg->time;
868
869 _ecore_wince_event_last_time = e->time;
870
871 ecore_event_add(ECORE_WINCE_EVENT_MOUSE_OUT, e, NULL, NULL);
872 }
873}
874
875void
876_ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg)
877{
878 Ecore_WinCE_Event_Window_Focus_In *e;
879 Ecore_WinCE_Window *window;
880
881 INF("focus in");
882
883 e = (Ecore_WinCE_Event_Window_Focus_In *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_In));
884 if (!e) return;
885
886 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
887 if (!e->window)
888 {
889 free(e);
890 return;
891 }
892
893 if (window->resume_cb)
894 window->resume_cb(window->backend);
895
896 e->window = window;
897
898 e->time = _ecore_wince_event_last_time;
899 _ecore_wince_event_last_time = e->time;
900
901 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
902}
903
904void
905_ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg)
906{
907 Ecore_WinCE_Event_Window_Focus_Out *e;
908 Ecore_WinCE_Window *window;
909
910 INF("focus out");
911
912 e = (Ecore_WinCE_Event_Window_Focus_Out *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Focus_Out));
913 if (!e) return;
914
915 window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
916 if (!e->window)
917 {
918 free(e);
919 return;
920 }
921 if (window->suspend_cb)
922 window->suspend_cb(window->backend);
923
924 e->window = window;
925
926 e->time = _ecore_wince_event_last_time;
927 _ecore_wince_event_last_time = e->time;
928
929 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
930}
931
932void
933_ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg)
934{
935 Ecore_WinCE_Event_Window_Damage *e;
936
937 INF("window expose");
938
939 e = (Ecore_WinCE_Event_Window_Damage *)calloc(1, sizeof(Ecore_WinCE_Event_Window_Damage));
940 if (!e) return;
941
942 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
943 if (!e->window)
944 {
945 free(e);
946 return;
947 }
948
949 e->x = msg->update.left;
950 e->y = msg->update.top;
951 e->width = msg->update.right - msg->update.left;
952 e->height = msg->update.bottom - msg->update.top;
953 INF("window expose size: %dx%d", e->width, e->height);
954
955 e->time = _ecore_wince_event_last_time;
956
957 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
958}
959
960void
961_ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg)
962{
963 Ecore_WinCE_Event_Window_Create *e;
964
965 INF("window create notify");
966
967 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Create));
968 if (!e) return;
969
970 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
971 if (!e->window)
972 {
973 free(e);
974 return;
975 }
976
977 e->time = _ecore_wince_event_last_time;
978
979 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_CREATE, e, NULL, NULL);
980}
981
982void
983_ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg)
984{
985 Ecore_WinCE_Event_Window_Destroy *e;
986
987 INF("window destroy notify");
988
989 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Destroy));
990 if (!e) return;
991
992 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
993 if (!e->window)
994 {
995 free(e);
996 return;
997 }
998
999 e->time = _ecore_wince_event_last_time;
1000/* if (e->window == _ecore_wince_event_last_window) _ecore_wince_event_last_window = NULL; */
1001
1002 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DESTROY, e, NULL, NULL);
1003}
1004
1005void
1006_ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg)
1007{
1008 Ecore_WinCE_Event_Window_Show *e;
1009
1010 INF("window map notify");
1011
1012 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Show));
1013 if (!e) return;
1014
1015 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
1016 if (!e->window)
1017 {
1018 free(e);
1019 return;
1020 }
1021
1022 e->time = _ecore_wince_event_last_time;
1023
1024 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_SHOW, e, NULL, NULL);
1025}
1026
1027void
1028_ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg)
1029{
1030 Ecore_WinCE_Event_Window_Hide *e;
1031
1032 INF("window unmap notify");
1033
1034 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Hide));
1035 if (!e) return;
1036
1037 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
1038 if (!e->window)
1039 {
1040 free(e);
1041 return;
1042 }
1043
1044 e->time = _ecore_wince_event_last_time;
1045
1046 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_HIDE, e, NULL, NULL);
1047}
1048
1049void
1050_ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg)
1051{
1052 Ecore_WinCE_Event_Window_Delete_Request *e;
1053
1054 INF("window delete request");
1055
1056 e = calloc(1, sizeof(Ecore_WinCE_Event_Window_Delete_Request));
1057 if (!e) return;
1058
1059 e->window = (void *)GetWindowLong(msg->window, GWL_USERDATA);
1060 if (!e->window)
1061 {
1062 free(e);
1063 return;
1064 }
1065
1066 e->time = _ecore_wince_event_last_time;
1067
1068 ecore_event_add(ECORE_WINCE_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1069}
1070
1071/*============================================================================*
1072 * API *
1073 *============================================================================*/
1074
diff --git a/libraries/ecore/src/lib/ecore_wince/ecore_wince_private.h b/libraries/ecore/src/lib/ecore_wince/ecore_wince_private.h
new file mode 100644
index 0000000..b506312
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/ecore_wince_private.h
@@ -0,0 +1,85 @@
1#ifndef __ECORE_WINCE_PRIVATE_H__
2#define __ECORE_WINCE_PRIVATE_H__
3
4
5/* logging messages macros */
6extern int _ecore_wince_log_dom_global;
7
8#ifdef ECORE_WINCE_DEFAULT_LOG_COLOR
9#undef ECORE_WINCE_DEFAULT_LOG_COLOR
10#endif
11#define ECORE_WINCE_DEFAULT_LOG_COLOR EINA_COLOR_LIGHTBLUE
12
13#ifdef ERR
14# undef ERR
15#endif
16#define ERR(...) EINA_LOG_DOM_ERR(_ecore_wince_log_dom_global , __VA_ARGS__)
17#ifdef DBG
18# undef DBG
19#endif
20#define DBG(...) EINA_LOG_DOM_DBG(_ecore_wince_log_dom_global , __VA_ARGS__)
21#ifdef INF
22# undef INF
23#endif
24#define INF(...) EINA_LOG_DOM_INFO(_ecore_wince_log_dom_global , __VA_ARGS__)
25
26#define ECORE_WINCE_WINDOW_CLASS L"Ecore_WinCE_Window_Class"
27
28
29typedef struct _Ecore_WinCE_Callback_Data Ecore_WinCE_Callback_Data;
30
31struct _Ecore_WinCE_Callback_Data
32{
33 RECT update;
34 HWND window;
35 unsigned int message;
36 WPARAM window_param;
37 LPARAM data_param;
38 long time;
39 int x;
40 int y;
41};
42
43
44typedef int (*ecore_wince_suspend_cb) (int);
45typedef int (*ecore_wince_resume_cb) (int);
46
47
48struct _Ecore_WinCE_Window
49{
50 HWND window;
51
52 int backend;
53 ecore_wince_suspend_cb suspend_cb;
54 ecore_wince_resume_cb resume_cb;
55
56 RECT rect; /* used to go fullscreen to normal */
57
58 unsigned int pointer_is_in : 1;
59 unsigned int fullscreen : 1;
60};
61
62extern HINSTANCE _ecore_wince_instance;
63extern double _ecore_wince_double_click_time;
64extern long _ecore_wince_event_last_time;
65extern Ecore_WinCE_Window *_ecore_wince_event_last_window;
66
67
68void _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg, int is_keystroke);
69void _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg, int is_keystroke);
70void _ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg, int button);
71void _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg, int button);
72void _ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg);
73void _ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg);
74void _ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg);
75void _ecore_wince_event_handle_focus_in(Ecore_WinCE_Callback_Data *msg);
76void _ecore_wince_event_handle_focus_out(Ecore_WinCE_Callback_Data *msg);
77void _ecore_wince_event_handle_expose(Ecore_WinCE_Callback_Data *msg);
78void _ecore_wince_event_handle_create_notify(Ecore_WinCE_Callback_Data *msg);
79void _ecore_wince_event_handle_destroy_notify(Ecore_WinCE_Callback_Data *msg);
80void _ecore_wince_event_handle_map_notify(Ecore_WinCE_Callback_Data *msg);
81void _ecore_wince_event_handle_unmap_notify(Ecore_WinCE_Callback_Data *msg);
82void _ecore_wince_event_handle_delete_request(Ecore_WinCE_Callback_Data *msg);
83
84
85#endif /* __ECORE_WINCE_PRIVATE_H__ */
diff --git a/libraries/ecore/src/lib/ecore_wince/ecore_wince_window.c b/libraries/ecore/src/lib/ecore_wince/ecore_wince_window.c
new file mode 100644
index 0000000..4e8b7b1
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_wince/ecore_wince_window.c
@@ -0,0 +1,775 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#define WIN32_LEAN_AND_MEAN
6#include <windows.h>
7#undef WIN32_LEAN_AND_MEAN
8
9#include <Evil.h>
10#include <Eina.h>
11
12#include "Ecore_WinCE.h"
13#include "ecore_wince_private.h"
14
15/*============================================================================*
16 * Local *
17 *============================================================================*/
18
19/**
20 * @cond LOCAL
21 */
22
23
24typedef BOOL (__stdcall *UnregisterFunc1Proc)(UINT, UINT);
25
26static int
27_ecore_wince_hardware_keys_register(HWND window)
28{
29 HINSTANCE core_dll;
30 UnregisterFunc1Proc unregister_fct;
31 int i;
32
33 core_dll = LoadLibrary(L"coredll.dll");
34 if (!core_dll)
35 {
36 ERR("LoadLibrary() failed");
37 return 0;
38 }
39
40 unregister_fct = (UnregisterFunc1Proc)GetProcAddress(core_dll, L"UnregisterFunc1");
41 if (!unregister_fct)
42 {
43 ERR("GetProcAddress() failed");
44 FreeLibrary(core_dll);
45 return 0;
46 }
47
48 for (i = 0xc1; i <= 0xcf; i++)
49 {
50 unregister_fct(MOD_WIN, i);
51 RegisterHotKey(window, i, MOD_WIN, i);
52 }
53
54 FreeLibrary(core_dll);
55
56 return 1;
57}
58
59/**
60 * @endcond
61 */
62
63
64/*============================================================================*
65 * Global *
66 *============================================================================*/
67
68/*============================================================================*
69 * API *
70 *============================================================================*/
71
72/**
73 * @addtogroup Ecore_WinCE_Group Ecore_WinCE library
74 *
75 * @{
76 */
77
78/**
79 * @brief Creates a new window.
80 *
81 * @param parent The parent window.
82 * @param x The x coordinate of the top-left corner of the window.
83 * @param y The y coordinate of the top-left corner of the window.
84 * @param width The width of the window.
85 * @param height The height of hte window.
86 * @return A newly allocated window.
87 *
88 * This function creates a new window which parent is @p parent. @p width and
89 * @p height are the size of the window content (the client part),
90 * without the border and title bar. @p x and @p y are the system
91 * coordinates of the top left cerner of the window (that is, of the
92 * title bar). This function returns a newly created window on
93 * success, and @c NULL on failure.
94 */
95EAPI Ecore_WinCE_Window *
96ecore_wince_window_new(Ecore_WinCE_Window *parent,
97 int x,
98 int y,
99 int width,
100 int height)
101{
102 Ecore_WinCE_Window *w;
103 HWND window;
104 RECT rect;
105
106 INF("creating window");
107
108 w = (Ecore_WinCE_Window *)calloc(1, sizeof(Ecore_WinCE_Window));
109 if (!w)
110 {
111 ERR("malloc() failed");
112 return NULL;
113 }
114
115 rect.left = 0;
116 rect.top = 0;
117 rect.right = width;
118 rect.bottom = height;
119 if (!AdjustWindowRectEx(&rect, WS_CAPTION | WS_SYSMENU | WS_VISIBLE, FALSE, WS_EX_TOPMOST))
120 {
121 ERR("AdjustWindowRectEx() failed");
122 free(w);
123 return NULL;
124 }
125
126 window = CreateWindowEx(WS_EX_TOPMOST,
127 ECORE_WINCE_WINDOW_CLASS,
128 L"",
129 WS_CAPTION | WS_SYSMENU | WS_VISIBLE,
130 x, y,
131 rect.right - rect.left, rect.bottom - rect.top,
132 parent ? ((Ecore_WinCE_Window *)parent)->window : NULL,
133 NULL, _ecore_wince_instance, NULL);
134 if (!window)
135 {
136 ERR("CreateWindowEx() failed");
137 free(w);
138 return NULL;
139 }
140
141 if (!_ecore_wince_hardware_keys_register(window))
142 {
143 ERR("_ecore_wince_hardware_keys_register() failed");
144 DestroyWindow(window);
145 free(w);
146 return NULL;
147 }
148
149 w->window = window;
150
151 SetLastError(0);
152 if (!SetWindowLong(window, GWL_USERDATA, (LONG)w) && (GetLastError() != 0))
153 {
154 ERR("SetWindowLong() failed");
155 DestroyWindow(window);
156 free(w);
157 return NULL;
158 }
159
160 w->pointer_is_in = 0;
161
162 return w;
163}
164
165/**
166 * @brief Free the given window.
167 *
168 * @param window The window to free.
169 *
170 * This function frees @p window. If @p window is @c NULL, this
171 * function does nothing.
172 */
173EAPI void
174ecore_wince_window_free(Ecore_WinCE_Window *window)
175{
176 if (!window) return;
177
178 INF("destroying window");
179
180 DestroyWindow(window->window);
181 free(window);
182}
183
184/**
185 * @brief Return the window HANDLE associated to the given window.
186 *
187 * @param window The window to retrieve the HANDLE from.
188 *
189 * This function returns the window HANDLE associated to @p window. If
190 * @p window is @c NULL, this function returns @c NULL.
191 */
192EAPI void *
193ecore_wince_window_hwnd_get(Ecore_WinCE_Window *window)
194{
195 if (!window)
196 return NULL;
197
198 return window->window;
199}
200
201/**
202 * @brief Move the given window to a given position.
203 *
204 * @param window The window to move.
205 * @param x The x coordinate of the destination position.
206 * @param y The y coordinate of the destination position.
207 *
208 * This function move @p window to the new position of coordinates @p x
209 * and @p y. If @p window is @c NULL, or if it is fullscreen, or on
210 * error, this function does nothing.
211 */
212EAPI void
213ecore_wince_window_move(Ecore_WinCE_Window *window,
214 int x,
215 int y)
216{
217 RECT rect;
218
219 if (!window || window->fullscreen)
220 return;
221
222 INF("moving window (%dx%d)", x, y);
223
224 if (!GetWindowRect(window->window, &rect))
225 {
226 ERR("GetWindowRect() failed");
227 return;
228 }
229
230 if (!MoveWindow(window->window, x, y,
231 rect.right - rect.left,
232 rect.bottom - rect.top,
233 TRUE))
234 {
235 ERR("MoveWindow() failed");
236 }
237}
238
239/**
240 * @brief Resize the given window to a given size.
241 *
242 * @param window The window to resize.
243 * @param width The new width.
244 * @param height The new height.
245 *
246 * This function resize @p window to the new @p width and @p height.
247 * If @p window is @c NULL, or if it is fullscreen, or on error, this
248 * function does nothing.
249 */
250EAPI void
251ecore_wince_window_resize(Ecore_WinCE_Window *window,
252 int width,
253 int height)
254{
255 RECT rect;
256 DWORD style;
257 DWORD exstyle;
258 int x;
259 int y;
260
261 if (!window || window->fullscreen)
262 return;
263
264 INF("resizing window (%dx%d)", width, height);
265
266 if (!GetWindowRect(window->window, &rect))
267 {
268 ERR("GetWindowRect() failed");
269 return;
270 }
271
272 x = rect.left;
273 y = rect.top;
274 rect.left = 0;
275 rect.top = 0;
276 rect.right = width;
277 rect.bottom = height;
278 if (!(style = GetWindowLong(window->window, GWL_STYLE)))
279 {
280 ERR("GetWindowLong() failed");
281 return;
282 }
283 if (!(exstyle = GetWindowLong(window->window, GWL_EXSTYLE)))
284 {
285 ERR("GetWindowLong() failed");
286 return;
287 }
288 if (!AdjustWindowRectEx(&rect, style, FALSE, exstyle))
289 {
290 ERR("AdjustWindowRectEx() failed");
291 return;
292 }
293
294 if (!MoveWindow(window->window, x, y,
295 rect.right - rect.left,
296 rect.bottom - rect.top,
297 FALSE))
298 {
299 ERR("MoveWindow() failed");
300 }
301}
302
303/**
304 * @brief Move and resize the given window to a given position and size.
305 *
306 * @param window The window to move and resize.
307 * @param x The x coordinate of the destination position.
308 * @param y The x coordinate of the destination position.
309 * @param width The new width.
310 * @param height The new height.
311 *
312 * This function resize @p window to the new position of coordinates @p x
313 * and @p y and the new @p width and @p height. If @p window is @c NULL,
314 * or if it is fullscreen, or on error, this function does nothing.
315 */
316EAPI void
317ecore_wince_window_move_resize(Ecore_WinCE_Window *window,
318 int x,
319 int y,
320 int width,
321 int height)
322{
323 RECT rect;
324 DWORD style;
325 DWORD exstyle;
326
327 if (!window || window->fullscreen)
328 return;
329
330 INF("moving and resizing window (%dx%d %dx%d)", x, y, width, height);
331
332 rect.left = 0;
333 rect.top = 0;
334 rect.right = width;
335 rect.bottom = height;
336 if (!(style = GetWindowLong(window->window, GWL_STYLE)))
337 {
338 ERR("GetWindowLong() failed");
339 return;
340 }
341 if (!(exstyle = GetWindowLong(window->window, GWL_EXSTYLE)))
342 {
343 ERR("GetWindowLong() failed");
344 return;
345 }
346 if (!AdjustWindowRectEx(&rect, style, FALSE, exstyle))
347 {
348 ERR("AdjustWindowRectEx() failed");
349 return;
350 }
351
352 if (!MoveWindow(window->window, x, y,
353 rect.right - rect.left,
354 rect.bottom - rect.top,
355 TRUE))
356 {
357 ERR("MoveWindow() failed");
358 }
359}
360
361/**
362 * @brief Show the given window.
363 *
364 * @param window The window to show.
365 *
366 * This function shows @p window. If @p window is @c NULL, or on
367 * error, this function does nothing.
368 */
369EAPI void
370ecore_wince_window_show(Ecore_WinCE_Window *window)
371{
372 if (!window) return;
373
374 INF("showing window");
375
376 if (!ShowWindow(window->window, SW_SHOWNORMAL))
377 {
378 ERR("ShowWindow() failed");
379 return;
380 }
381 if (!UpdateWindow(window->window))
382 {
383 ERR("UpdateWindow() failed");
384 }
385 if (!SendMessage(window->window, WM_SHOWWINDOW, 1, 0))
386 {
387 ERR("SendMessage() failed");
388 }
389}
390
391/**
392 * @brief Hide the given window.
393 *
394 * @param window The window to show.
395 *
396 * This function hides @p window. If @p window is @c NULL, or on
397 * error, this function does nothing.
398 */
399EAPI void
400ecore_wince_window_hide(Ecore_WinCE_Window *window)
401{
402 if (!window) return;
403
404 INF("hiding window");
405
406 if (!ShowWindow(window->window, SW_HIDE))
407 {
408 ERR("ShowWindow() failed");
409 return;
410 }
411 if (!SendMessage(window->window, WM_SHOWWINDOW, 0, 0))
412 {
413 ERR("SendMessage() failed");
414 }
415}
416
417/**
418 * @brief Set the title of the given window.
419 *
420 * @param window The window to set the title.
421 * @param title The new title.
422 *
423 * This function sets the title of @p window to @p title. If @p window
424 * is @c NULL, or if @p title is @c NULL or empty, or on error, this
425 * function does nothing.
426 */
427EAPI void
428ecore_wince_window_title_set(Ecore_WinCE_Window *window,
429 const char *title)
430{
431 wchar_t *wtitle;
432
433 if (!window) return;
434
435 if (!title || !title[0]) return;
436
437 INF("setting window title");
438
439 wtitle = evil_char_to_wchar(title);
440 if (!wtitle) return;
441
442 if (!SetWindowText(window->window, wtitle))
443 {
444 ERR("SetWindowText() failed");
445 }
446 free(wtitle);
447}
448
449/**
450 * @brief Set the graphic backend used for the given window.
451 *
452 * @param window The window.
453 * @param backend The backend.
454 *
455 * This function sets the graphic backend to use with @p window to
456 * @p backend. If @p window if @c NULL, this function does nothing.
457 *
458 * The valid values for @p backend are
459 *
460 * @li 0: automatic choice of the backend.
461 * @li 1: the framebuffer (fast but could be not well suported).
462 * @li 2: GAPI (less fast but almost always supported).
463 * @li 3: DirectDraw (less fast than GAPI but almost always
464 * supported).
465 * @li 4: GDI (the slowest but always supported).
466 *
467 * The @p backend is used only in Evas and Ecore_Evas. So this
468 * function should not be called if Ecore_Evas is used.
469 */
470EAPI void
471ecore_wince_window_backend_set(Ecore_WinCE_Window *window,
472 int backend)
473{
474 if (!window)
475 return;
476
477 INF("setting backend");
478
479 window->backend = backend;
480}
481
482/**
483 * @brief Set the suspend callback used for the given window.
484 *
485 * @param window The window.
486 * @param suspend_cb The suspend callback.
487 *
488 * This function sets the suspend callback to use with @p window to
489 * @p suspend_cb. If @p window if @c NULL, this function does nothing.
490 *
491 * The @p suspend_cb is used only in Evas and Ecore_Evas. So this
492 * function should not be called if Ecore_Evas is used.
493 */
494EAPI void
495ecore_wince_window_suspend_cb_set(Ecore_WinCE_Window *window, int (*suspend_cb)(int))
496{
497 if (!window)
498 return;
499
500 INF("setting suspend callback");
501
502 window->suspend_cb = suspend_cb;
503}
504
505/**
506 * @brief Set the resume callback used for the given window.
507 *
508 * @param window The window.
509 * @param resume_cb The resume callback.
510 *
511 * This function sets the resume callback to use with @p window to
512 * @p resume_cb. If @p window if @c NULL, this function does nothing.
513 *
514 * The @p resume_cb is used only in Evas and Ecore_Evas. So this
515 * function should not be called if Ecore_Evas is used.
516 */
517EAPI void
518ecore_wince_window_resume_cb_set(Ecore_WinCE_Window *window, int (*resume_cb)(int))
519{
520 if (!window)
521 return;
522
523 INF("setting resume callback");
524
525 window->resume_cb = resume_cb;
526}
527
528/**
529 * @brief Get the geometry of the given window.
530 *
531 * @param window The window to retrieve the geometry from.
532 * @param x The x coordinate of the position.
533 * @param y The x coordinate of the position.
534 * @param width The width.
535 * @param height The height.
536 *
537 * This function retrieves the position and size of @p window. @p x,
538 * @p y, @p width and @p height can be buffers that will be filled with
539 * the corresponding values. If one of them is @c NULL, nothing will
540 * be done for that parameter. If @p window is @c NULL, and if the
541 * buffers are not @c NULL, they will be filled with respectively 0,
542 * 0, the size of the screen and the height of the screen.
543 */
544EAPI void
545ecore_wince_window_geometry_get(Ecore_WinCE_Window *window,
546 int *x,
547 int *y,
548 int *width,
549 int *height)
550{
551 RECT rect;
552 int w;
553 int h;
554
555 INF("getting window geometry");
556
557 if (!window)
558 {
559 if (x) *x = 0;
560 if (y) *y = 0;
561 if (width) *width = GetSystemMetrics(SM_CXSCREEN);
562 if (height) *height = GetSystemMetrics(SM_CYSCREEN);
563
564 return;
565 }
566
567 if (!GetClientRect(window->window, &rect))
568 {
569 ERR("GetClientRect() failed");
570
571 if (x) *x = 0;
572 if (y) *y = 0;
573 if (width) *width = 0;
574 if (height) *height = 0;
575
576 return;
577 }
578
579 w = rect.right - rect.left;
580 h = rect.bottom - rect.top;
581
582 if (!GetWindowRect(window->window, &rect))
583 {
584 ERR("GetWindowRect() failed");
585
586 if (x) *x = 0;
587 if (y) *y = 0;
588 if (width) *width = 0;
589 if (height) *height = 0;
590
591 return;
592 }
593
594 if (x) *x = rect.left;
595 if (y) *y = rect.top;
596 if (width) *width = w;
597 if (height) *height = h;
598}
599
600/**
601 * @brief Get the size of the given window.
602 *
603 * @param window The window to retrieve the size from.
604 * @param width The width.
605 * @param height The height.
606 *
607 * This function retrieves the size of @p window. @p width and
608 * @p height can be buffers that will be filled with the corresponding
609 * values. If one of them is @c NULL, nothing will be done for that
610 * parameter. If @p window is @c NULL, and if the buffers are not
611 * @c NULL, they will be filled with respectively the size of the screen
612 * and the height of the screen.
613 */
614EAPI void
615ecore_wince_window_size_get(Ecore_WinCE_Window *window,
616 int *width,
617 int *height)
618{
619 RECT rect;
620
621 INF("getting window size");
622
623 if (!window)
624 {
625 if (width) *width = GetSystemMetrics(SM_CXSCREEN);
626 if (height) *height = GetSystemMetrics(SM_CYSCREEN);
627
628 return;
629 }
630
631 if (!GetClientRect(window->window, &rect))
632 {
633 ERR("GetClientRect() failed");
634
635 if (width) *width = 0;
636 if (height) *height = 0;
637 }
638
639 if (width) *width = rect.right - rect.left;
640 if (height) *height = rect.bottom - rect.top;
641}
642
643/**
644 * @brief Set the given window to fullscreen.
645 *
646 * @param window The window.
647 * @param on EINA_TRUE for fullscreen mode, EINA_FALSE for windowed mode.
648 *
649 * This function set @p window to fullscreen or windowed mode. If @p on
650 * is set to EINA_TRUE, the window will be fullscreen, if it is set to
651 * EINA_FALSE, it will be windowed. If @p window is @c NULL or if the
652 * state does not change (like setting to fullscreen while the window
653 * is already fullscreen), this function does nothing.
654 */
655EAPI void
656ecore_wince_window_fullscreen_set(Ecore_WinCE_Window *window,
657 Eina_Bool on)
658{
659 HWND task_bar;
660
661 if (!window) return;
662
663 if (((window->fullscreen) && (on)) ||
664 ((!window->fullscreen) && (!on)))
665 return;
666
667 INF("setting fullscreen: %s", on ? "yes" : "no");
668
669 window->fullscreen = !!on;
670
671 if (on)
672 {
673 /* save the position and size of the window */
674 if (!GetWindowRect(window->window, &window->rect))
675 {
676 ERR("GetWindowRect() failed");
677 return;
678 }
679
680 /* hide task bar */
681 task_bar = FindWindow(L"HHTaskBar", NULL);
682 if (!task_bar)
683 {
684 INF("FindWindow(): can not find task bar");
685 }
686 if (!ShowWindow(task_bar, SW_HIDE))
687 {
688 INF("ShowWindow(): task bar already hidden");
689 }
690 if (!EnableWindow(task_bar, FALSE))
691 {
692 INF("EnableWindow(): input already disabled");
693 }
694
695 /* style: visible + popup */
696 if (!SetWindowLong(window->window, GWL_STYLE, WS_POPUP | WS_VISIBLE))
697 {
698 INF("SetWindowLong() failed");
699 }
700
701 /* resize window to fit the entire screen */
702 if (!SetWindowPos(window->window, HWND_TOPMOST,
703 0, 0,
704 GetSystemMetrics(SM_CXSCREEN),
705 GetSystemMetrics(SM_CYSCREEN),
706 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED))
707 {
708 INF("SetWindowPos() failed");
709 }
710 /*
711 * It seems that SetWindowPos is not sufficient.
712 * Call MoveWindow with the correct size and force painting.
713 * Note that UpdateWindow (forcing repainting) is not sufficient
714 */
715 if (!MoveWindow(window->window,
716 0, 0,
717 GetSystemMetrics(SM_CXSCREEN),
718 GetSystemMetrics(SM_CYSCREEN),
719 TRUE))
720 {
721 INF("MoveWindow() failed");
722 }
723 }
724 else
725 {
726 /* show task bar */
727 task_bar = FindWindow(L"HHTaskBar", NULL);
728 if (!task_bar)
729 {
730 INF("FindWindow(): can not find task bar");
731 }
732 if (!ShowWindow(task_bar, SW_SHOW))
733 {
734 INF("ShowWindow(): task bar already visible");
735 }
736 if (!EnableWindow(task_bar, TRUE))
737 {
738 INF("EnableWindow(): input already enabled");
739 }
740
741 /* style: visible + caption + sysmenu */
742 if (!SetWindowLong(window->window, GWL_STYLE, WS_CAPTION | WS_SYSMENU | WS_VISIBLE))
743 {
744 INF("SetWindowLong() failed");
745 }
746 /* restaure the position and size of the window */
747 if (!SetWindowPos(window->window, HWND_TOPMOST,
748 window->rect.left,
749 window->rect.top,
750 window->rect.right - window->rect.left,
751 window->rect.bottom - window->rect.top,
752 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED))
753 {
754 INF("SetWindowLong() failed");
755 }
756 /*
757 * It seems that SetWindowPos is not sufficient.
758 * Call MoveWindow with the correct size and force painting.
759 * Note that UpdateWindow (forcing repainting) is not sufficient
760 */
761 if (!MoveWindow(window->window,
762 window->rect.left,
763 window->rect.top,
764 window->rect.right - window->rect.left,
765 window->rect.bottom - window->rect.top,
766 TRUE))
767 {
768 INF("MoveWindow() failed");
769 }
770 }
771}
772
773/**
774 * @}
775 */
diff --git a/libraries/ecore/src/lib/ecore_x/Ecore_X.h b/libraries/ecore/src/lib/ecore_x/Ecore_X.h
new file mode 100644
index 0000000..6588a75
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/Ecore_X.h
@@ -0,0 +1,3622 @@
1#ifndef _ECORE_X_H
2#define _ECORE_X_H
3
4#include <Eina.h>
5
6#ifdef EAPI
7# undef EAPI
8#endif // ifdef EAPI
9
10#ifdef _MSC_VER
11# ifdef BUILDING_DLL
12# define EAPI __declspec(dllexport)
13# else // ifdef BUILDING_DLL
14# define EAPI __declspec(dllimport)
15# endif // ifdef BUILDING_DLL
16#else // ifdef _MSC_VER
17# ifdef __GNUC__
18# if __GNUC__ >= 4
19# define EAPI __attribute__ ((visibility("default")))
20# else // if __GNUC__ >= 4
21# define EAPI
22# endif // if __GNUC__ >= 4
23# else // ifdef __GNUC__
24# define EAPI
25# endif // ifdef __GNUC__
26#endif // ifdef _MSC_VER
27
28#include <sys/types.h>
29
30/**
31 * @file
32 * @brief Ecore functions for dealing with the X Windows System
33 *
34 * Ecore_X provides a wrapper and convenience functions for using the
35 * X Windows System. Function groups for this part of the library
36 * include the following:
37 * @li @ref Ecore_X_Init_Group
38 * @li @ref Ecore_X_Display_Attr_Group
39 * @li @ref Ecore_X_Flush_Group
40 */
41
42typedef unsigned int Ecore_X_ID;
43#ifndef _ECORE_X_WINDOW_PREDEF
44typedef Ecore_X_ID Ecore_X_Window;
45#endif // ifndef _ECORE_X_WINDOW_PREDEF
46typedef void *Ecore_X_Visual;
47typedef Ecore_X_ID Ecore_X_Pixmap;
48typedef Ecore_X_ID Ecore_X_Drawable;
49#ifdef HAVE_ECORE_X_XCB
50typedef Ecore_X_ID Ecore_X_GC;
51#else // ifdef HAVE_ECORE_X_XCB
52typedef void *Ecore_X_GC;
53#endif /* HAVE_ECORE_X_XCB */
54typedef Ecore_X_ID Ecore_X_Atom;
55typedef Ecore_X_ID Ecore_X_Colormap;
56typedef Ecore_X_ID Ecore_X_Time;
57typedef Ecore_X_ID Ecore_X_Cursor;
58typedef void Ecore_X_Display;
59typedef void Ecore_X_Connection;
60typedef void Ecore_X_Screen;
61typedef Ecore_X_ID Ecore_X_Sync_Counter;
62typedef Ecore_X_ID Ecore_X_Sync_Alarm;
63typedef void Ecore_X_XRegion;
64
65typedef Ecore_X_ID Ecore_X_Randr_Output;
66typedef Ecore_X_ID Ecore_X_Randr_Crtc;
67typedef Ecore_X_ID Ecore_X_Randr_Mode;
68typedef unsigned short Ecore_X_Randr_Size_ID;
69typedef int Ecore_X_Randr_Screen;
70
71typedef Ecore_X_ID Ecore_X_Device;
72
73#ifdef __cplusplus
74extern "C" {
75#endif // ifdef __cplusplus
76
77typedef struct _Ecore_X_Rectangle
78{
79 int x, y;
80 unsigned int width, height;
81} Ecore_X_Rectangle;
82
83typedef struct _Ecore_X_Icon
84{
85 unsigned int width, height;
86 unsigned int *data;
87} Ecore_X_Icon;
88
89typedef enum _Ecore_X_GC_Value_Mask
90{
91 ECORE_X_GC_VALUE_MASK_FUNCTION = (1L << 0),
92 ECORE_X_GC_VALUE_MASK_PLANE_MASK = (1L << 1),
93 ECORE_X_GC_VALUE_MASK_FOREGROUND = (1L << 2),
94 ECORE_X_GC_VALUE_MASK_BACKGROUND = (1L << 3),
95 ECORE_X_GC_VALUE_MASK_LINE_WIDTH = (1L << 4),
96 ECORE_X_GC_VALUE_MASK_LINE_STYLE = (1L << 5),
97 ECORE_X_GC_VALUE_MASK_CAP_STYLE = (1L << 6),
98 ECORE_X_GC_VALUE_MASK_JOIN_STYLE = (1L << 7),
99 ECORE_X_GC_VALUE_MASK_FILL_STYLE = (1L << 8),
100 ECORE_X_GC_VALUE_MASK_FILL_RULE = (1L << 9),
101 ECORE_X_GC_VALUE_MASK_TILE = (1L << 10),
102 ECORE_X_GC_VALUE_MASK_STIPPLE = (1L << 11),
103 ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X = (1L << 12),
104 ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y = (1L << 13),
105 ECORE_X_GC_VALUE_MASK_FONT = (1L << 14),
106 ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE = (1L << 15),
107 ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES = (1L << 16),
108 ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X = (1L << 17),
109 ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y = (1L << 18),
110 ECORE_X_GC_VALUE_MASK_CLIP_MASK = (1L << 19),
111 ECORE_X_GC_VALUE_MASK_DASH_OFFSET = (1L << 20),
112 ECORE_X_GC_VALUE_MASK_DASH_LIST = (1L << 21),
113 ECORE_X_GC_VALUE_MASK_ARC_MODE = (1L << 22)
114} Ecore_X_GC_Value_Mask;
115
116typedef enum _Ecore_X_Composite_Update_Type
117{
118 ECORE_X_COMPOSITE_UPDATE_AUTOMATIC,
119 ECORE_X_COMPOSITE_UPDATE_MANUAL
120} Ecore_X_Composite_Update_Type;
121
122typedef enum _Ecore_X_Window_State
123{
124 /* Unknown state */
125 ECORE_X_WINDOW_STATE_UNKNOWN = 0,
126 /** The window is iconified. */
127 ECORE_X_WINDOW_STATE_ICONIFIED,
128 /** The window is a modal dialog box. */
129 ECORE_X_WINDOW_STATE_MODAL,
130 /** The window manager should keep the window's position fixed
131 * even if the virtual desktop scrolls. */
132 ECORE_X_WINDOW_STATE_STICKY,
133 /** The window has the maximum vertical size. */
134 ECORE_X_WINDOW_STATE_MAXIMIZED_VERT,
135 /** The window has the maximum horizontal size. */
136 ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ,
137 /** The window is shaded. */
138 ECORE_X_WINDOW_STATE_SHADED,
139 /** The window should not be included in the taskbar. */
140 ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
141 /** The window should not be included in the pager. */
142 ECORE_X_WINDOW_STATE_SKIP_PAGER,
143 /** The window is invisible (i.e. minimized/iconified) */
144 ECORE_X_WINDOW_STATE_HIDDEN,
145 /** The window should fill the entire screen and have no
146 * window border/decorations */
147 ECORE_X_WINDOW_STATE_FULLSCREEN,
148 /* The following are not documented because they are not
149 * intended for use in applications. */
150 ECORE_X_WINDOW_STATE_ABOVE,
151 ECORE_X_WINDOW_STATE_BELOW,
152 /* FIXME: Documentation */
153 ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION
154} Ecore_X_Window_State;
155
156typedef enum _Ecore_X_Window_State_Action
157{
158 ECORE_X_WINDOW_STATE_ACTION_REMOVE,
159 ECORE_X_WINDOW_STATE_ACTION_ADD,
160 ECORE_X_WINDOW_STATE_ACTION_TOGGLE
161} Ecore_X_Window_State_Action;
162
163typedef enum _Ecore_X_Window_Stack_Mode
164{
165 ECORE_X_WINDOW_STACK_ABOVE = 0,
166 ECORE_X_WINDOW_STACK_BELOW = 1,
167 ECORE_X_WINDOW_STACK_TOP_IF = 2,
168 ECORE_X_WINDOW_STACK_BOTTOM_IF = 3,
169 ECORE_X_WINDOW_STACK_OPPOSITE = 4
170} Ecore_X_Window_Stack_Mode;
171
172typedef enum _Ecore_X_Randr_Orientation
173{
174 ECORE_X_RANDR_ORIENTATION_ROT_0 = (1 << 0),
175 ECORE_X_RANDR_ORIENTATION_ROT_90 = (1 << 1),
176 ECORE_X_RANDR_ORIENTATION_ROT_180 = (1 << 2),
177 ECORE_X_RANDR_ORIENTATION_ROT_270 = (1 << 3),
178 ECORE_X_RANDR_ORIENTATION_FLIP_X = (1 << 4),
179 ECORE_X_RANDR_ORIENTATION_FLIP_Y = (1 << 5)
180} Ecore_X_Randr_Orientation;
181
182typedef enum _Ecore_X_Randr_Connection_Status
183{
184 ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED = 0,
185 ECORE_X_RANDR_CONNECTION_STATUS_DISCONNECTED = 1,
186 ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN = 2
187} Ecore_X_Randr_Connection_Status;
188
189typedef enum _Ecore_X_Randr_Output_Policy
190{
191 ECORE_X_RANDR_OUTPUT_POLICY_ABOVE = 1,
192 ECORE_X_RANDR_OUTPUT_POLICY_RIGHT = 2,
193 ECORE_X_RANDR_OUTPUT_POLICY_BELOW = 3,
194 ECORE_X_RANDR_OUTPUT_POLICY_LEFT = 4,
195 ECORE_X_RANDR_OUTPUT_POLICY_CLONE = 5,
196 ECORE_X_RANDR_OUTPUT_POLICY_NONE = 6
197} Ecore_X_Randr_Output_Policy;
198
199typedef enum _Ecore_X_Randr_Relative_Alignment
200{
201 ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE = 0,
202 ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL = 1,
203 ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR = 2
204} Ecore_X_Randr_Relative_Alignment;
205
206typedef enum _Ecore_X_Render_Subpixel_Order
207{
208 ECORE_X_RENDER_SUBPIXEL_ORDER_UNKNOWN = 0,
209 ECORE_X_RENDER_SUBPIXEL_ORDER_HORIZONTAL_RGB = 1,
210 ECORE_X_RENDER_SUBPIXEL_ORDER_HORIZONTAL_BGR = 2,
211 ECORE_X_RENDER_SUBPIXEL_ORDER_VERTICAL_RGB = 3,
212 ECORE_X_RENDER_SUBPIXEL_ORDER_VERTICAL_BGR = 4,
213 ECORE_X_RENDER_SUBPIXEL_ORDER_NONE = 5
214} Ecore_X_Render_Subpixel_Order;
215
216typedef enum _Ecore_X_Randr_Edid_Display_Interface_Type
217{
218 ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_UNDEFINED,
219 ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DVI,
220 ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_A,
221 ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_B,
222 ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_MDDI,
223 ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT
224} Ecore_X_Randr_Edid_Display_Interface_Type;
225
226typedef enum _Ecore_X_Randr_Edid_Display_Colorscheme
227{
228 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_MONOCHROME_GRAYSCALE = 0x00,
229 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB = 0x08,
230 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_NON_RGB = 0x10,
231 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_UNDEFINED = 0x18,
232 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4 = 0x444000,
233 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4 = 0x444,
234 ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2 = 0x422
235} Ecore_X_Randr_Edid_Display_Colorscheme;
236
237typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio
238{
239 ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3 = 0x0,
240 ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9 = 0x1,
241 ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10 = 0x2,
242 ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4 = 0x4,
243 ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9 = 0x8
244} Ecore_X_Randr_Edid_Aspect_Ratio;
245
246#define ECORE_X_RANDR_EDID_UNKNOWN_VALUE -1
247
248#define ECORE_X_SELECTION_TARGET_TARGETS "TARGETS"
249#define ECORE_X_SELECTION_TARGET_TEXT "TEXT"
250#define ECORE_X_SELECTION_TARGET_COMPOUND_TEXT "COMPOUND_TEXT"
251#define ECORE_X_SELECTION_TARGET_STRING "STRING"
252#define ECORE_X_SELECTION_TARGET_UTF8_STRING "UTF8_STRING"
253#define ECORE_X_SELECTION_TARGET_FILENAME "FILENAME"
254
255#define ECORE_X_DND_VERSION 5
256
257typedef enum _Ecore_X_Selection
258{
259 ECORE_X_SELECTION_PRIMARY,
260 ECORE_X_SELECTION_SECONDARY,
261 ECORE_X_SELECTION_XDND,
262 ECORE_X_SELECTION_CLIPBOARD,
263 ECORE_X_SELECTION_OTHER
264} Ecore_X_Selection;
265
266typedef enum _Ecore_X_Event_Mode
267{
268 ECORE_X_EVENT_MODE_NORMAL,
269 ECORE_X_EVENT_MODE_WHILE_GRABBED,
270 ECORE_X_EVENT_MODE_GRAB,
271 ECORE_X_EVENT_MODE_UNGRAB
272} Ecore_X_Event_Mode;
273
274typedef enum _Ecore_X_Event_Detail
275{
276 ECORE_X_EVENT_DETAIL_ANCESTOR,
277 ECORE_X_EVENT_DETAIL_VIRTUAL,
278 ECORE_X_EVENT_DETAIL_INFERIOR,
279 ECORE_X_EVENT_DETAIL_NON_LINEAR,
280 ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL,
281 ECORE_X_EVENT_DETAIL_POINTER,
282 ECORE_X_EVENT_DETAIL_POINTER_ROOT,
283 ECORE_X_EVENT_DETAIL_DETAIL_NONE
284} Ecore_X_Event_Detail;
285
286typedef enum _Ecore_X_Event_Mask
287{
288 ECORE_X_EVENT_MASK_NONE = 0L,
289 ECORE_X_EVENT_MASK_KEY_DOWN = (1L << 0),
290 ECORE_X_EVENT_MASK_KEY_UP = (1L << 1),
291 ECORE_X_EVENT_MASK_MOUSE_DOWN = (1L << 2),
292 ECORE_X_EVENT_MASK_MOUSE_UP = (1L << 3),
293 ECORE_X_EVENT_MASK_MOUSE_IN = (1L << 4),
294 ECORE_X_EVENT_MASK_MOUSE_OUT = (1L << 5),
295 ECORE_X_EVENT_MASK_MOUSE_MOVE = (1L << 6),
296 ECORE_X_EVENT_MASK_WINDOW_DAMAGE = (1L << 15),
297 ECORE_X_EVENT_MASK_WINDOW_VISIBILITY = (1L << 16),
298 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE = (1L << 17),
299 ECORE_X_EVENT_MASK_WINDOW_RESIZE_MANAGE = (1L << 18),
300 ECORE_X_EVENT_MASK_WINDOW_MANAGE = (1L << 19),
301 ECORE_X_EVENT_MASK_WINDOW_CHILD_CONFIGURE = (1L << 20),
302 ECORE_X_EVENT_MASK_WINDOW_FOCUS_CHANGE = (1L << 21),
303 ECORE_X_EVENT_MASK_WINDOW_PROPERTY = (1L << 22),
304 ECORE_X_EVENT_MASK_WINDOW_COLORMAP = (1L << 23),
305 ECORE_X_EVENT_MASK_WINDOW_GRAB = (1L << 24),
306 ECORE_X_EVENT_MASK_MOUSE_WHEEL = (1L << 29),
307 ECORE_X_EVENT_MASK_WINDOW_FOCUS_IN = (1L << 30),
308 ECORE_X_EVENT_MASK_WINDOW_FOCUS_OUT = (1L << 31)
309} Ecore_X_Event_Mask;
310
311typedef enum _Ecore_X_Gravity
312{
313 ECORE_X_GRAVITY_FORGET = 0,
314 ECORE_X_GRAVITY_UNMAP = 0,
315 ECORE_X_GRAVITY_NW = 1,
316 ECORE_X_GRAVITY_N = 2,
317 ECORE_X_GRAVITY_NE = 3,
318 ECORE_X_GRAVITY_W = 4,
319 ECORE_X_GRAVITY_CENTER = 5,
320 ECORE_X_GRAVITY_E = 6,
321 ECORE_X_GRAVITY_SW = 7,
322 ECORE_X_GRAVITY_S = 8,
323 ECORE_X_GRAVITY_SE = 9,
324 ECORE_X_GRAVITY_STATIC = 10
325} Ecore_X_Gravity;
326
327/* Needed for ecore_x_region_window_shape_set */
328typedef enum _Ecore_X_Shape_Type
329{
330 ECORE_X_SHAPE_BOUNDING,
331 ECORE_X_SHAPE_CLIP,
332 ECORE_X_SHAPE_INPUT
333} Ecore_X_Shape_Type;
334
335typedef enum _Ecore_X_Mapping_Type
336{
337 ECORE_X_MAPPING_MODIFIER,
338 ECORE_X_MAPPING_KEYBOARD,
339 ECORE_X_MAPPING_MOUSE
340} Ecore_X_Mapping_Type;
341
342typedef enum _Ecore_X_Randr_Property_Change
343{
344 ECORE_X_RANDR_PROPERTY_CHANGE_ADD,
345 ECORE_X_RANDR_PROPERTY_CHANGE_DEL
346} Ecore_X_Randr_Property_Change;
347
348typedef struct _Ecore_X_Event_Mouse_In Ecore_X_Event_Mouse_In;
349typedef struct _Ecore_X_Event_Mouse_Out Ecore_X_Event_Mouse_Out;
350typedef struct _Ecore_X_Event_Window_Focus_In Ecore_X_Event_Window_Focus_In;
351typedef struct _Ecore_X_Event_Window_Focus_Out Ecore_X_Event_Window_Focus_Out;
352typedef struct _Ecore_X_Event_Window_Keymap Ecore_X_Event_Window_Keymap;
353typedef struct _Ecore_X_Event_Window_Damage Ecore_X_Event_Window_Damage;
354typedef struct _Ecore_X_Event_Window_Visibility_Change Ecore_X_Event_Window_Visibility_Change;
355typedef struct _Ecore_X_Event_Window_Create Ecore_X_Event_Window_Create;
356typedef struct _Ecore_X_Event_Window_Destroy Ecore_X_Event_Window_Destroy;
357typedef struct _Ecore_X_Event_Window_Hide Ecore_X_Event_Window_Hide;
358typedef struct _Ecore_X_Event_Window_Show Ecore_X_Event_Window_Show;
359typedef struct _Ecore_X_Event_Window_Show_Request Ecore_X_Event_Window_Show_Request;
360typedef struct _Ecore_X_Event_Window_Reparent Ecore_X_Event_Window_Reparent;
361typedef struct _Ecore_X_Event_Window_Configure Ecore_X_Event_Window_Configure;
362typedef struct _Ecore_X_Event_Window_Configure_Request Ecore_X_Event_Window_Configure_Request;
363typedef struct _Ecore_X_Event_Window_Gravity Ecore_X_Event_Window_Gravity;
364typedef struct _Ecore_X_Event_Window_Resize_Request Ecore_X_Event_Window_Resize_Request;
365typedef struct _Ecore_X_Event_Window_Stack Ecore_X_Event_Window_Stack;
366typedef struct _Ecore_X_Event_Window_Stack_Request Ecore_X_Event_Window_Stack_Request;
367typedef struct _Ecore_X_Event_Window_Property Ecore_X_Event_Window_Property;
368typedef struct _Ecore_X_Event_Window_Colormap Ecore_X_Event_Window_Colormap;
369typedef struct _Ecore_X_Event_Mapping_Change Ecore_X_Event_Mapping_Change;
370typedef struct _Ecore_X_Event_Window_Mapping Ecore_X_Event_Window_Mapping;
371typedef struct _Ecore_X_Event_Selection_Clear Ecore_X_Event_Selection_Clear;
372typedef struct _Ecore_X_Event_Selection_Request Ecore_X_Event_Selection_Request;
373typedef struct _Ecore_X_Event_Selection_Notify Ecore_X_Event_Selection_Notify;
374typedef struct _Ecore_X_Event_Fixes_Selection_Notify Ecore_X_Event_Fixes_Selection_Notify;
375typedef struct _Ecore_X_Selection_Data Ecore_X_Selection_Data;
376typedef struct _Ecore_X_Selection_Data_Files Ecore_X_Selection_Data_Files;
377typedef struct _Ecore_X_Selection_Data_Text Ecore_X_Selection_Data_Text;
378typedef struct _Ecore_X_Selection_Data_Targets Ecore_X_Selection_Data_Targets;
379typedef struct _Ecore_X_Event_Xdnd_Enter Ecore_X_Event_Xdnd_Enter;
380typedef struct _Ecore_X_Event_Xdnd_Position Ecore_X_Event_Xdnd_Position;
381typedef struct _Ecore_X_Event_Xdnd_Status Ecore_X_Event_Xdnd_Status;
382typedef struct _Ecore_X_Event_Xdnd_Leave Ecore_X_Event_Xdnd_Leave;
383typedef struct _Ecore_X_Event_Xdnd_Drop Ecore_X_Event_Xdnd_Drop;
384typedef struct _Ecore_X_Event_Xdnd_Finished Ecore_X_Event_Xdnd_Finished;
385typedef struct _Ecore_X_Event_Client_Message Ecore_X_Event_Client_Message;
386typedef struct _Ecore_X_Event_Window_Shape Ecore_X_Event_Window_Shape;
387typedef struct _Ecore_X_Event_Screensaver_Notify Ecore_X_Event_Screensaver_Notify;
388typedef struct _Ecore_X_Event_Gesture_Notify_Flick Ecore_X_Event_Gesture_Notify_Flick;
389typedef struct _Ecore_X_Event_Gesture_Notify_Pan Ecore_X_Event_Gesture_Notify_Pan;
390typedef struct _Ecore_X_Event_Gesture_Notify_PinchRotation Ecore_X_Event_Gesture_Notify_PinchRotation;
391typedef struct _Ecore_X_Event_Gesture_Notify_Tap Ecore_X_Event_Gesture_Notify_Tap;
392typedef struct _Ecore_X_Event_Gesture_Notify_TapNHold Ecore_X_Event_Gesture_Notify_TapNHold;
393typedef struct _Ecore_X_Event_Gesture_Notify_Hold Ecore_X_Event_Gesture_Notify_Hold;
394typedef struct _Ecore_X_Event_Gesture_Notify_Group Ecore_X_Event_Gesture_Notify_Group;
395typedef struct _Ecore_X_Event_Sync_Counter Ecore_X_Event_Sync_Counter;
396typedef struct _Ecore_X_Event_Sync_Alarm Ecore_X_Event_Sync_Alarm;
397typedef struct _Ecore_X_Event_Screen_Change Ecore_X_Event_Screen_Change;
398typedef struct _Ecore_X_Event_Randr_Crtc_Change Ecore_X_Event_Randr_Crtc_Change;
399typedef struct _Ecore_X_Event_Randr_Output_Change Ecore_X_Event_Randr_Output_Change;
400typedef struct _Ecore_X_Event_Randr_Output_Property_Notify Ecore_X_Event_Randr_Output_Property_Notify;
401
402typedef struct _Ecore_X_Event_Window_Delete_Request Ecore_X_Event_Window_Delete_Request;
403typedef struct _Ecore_X_Event_Window_Move_Resize_Request Ecore_X_Event_Window_Move_Resize_Request;
404typedef struct _Ecore_X_Event_Window_State_Request Ecore_X_Event_Window_State_Request;
405typedef struct _Ecore_X_Event_Frame_Extents_Request Ecore_X_Event_Frame_Extents_Request;
406typedef struct _Ecore_X_Event_Ping Ecore_X_Event_Ping;
407typedef struct _Ecore_X_Event_Desktop_Change Ecore_X_Event_Desktop_Change;
408
409typedef struct _Ecore_X_Event_Startup_Sequence Ecore_X_Event_Startup_Sequence;
410
411typedef struct _Ecore_X_Event_Generic Ecore_X_Event_Generic;
412
413typedef struct _Ecore_X_Randr_Screen_Size Ecore_X_Randr_Screen_Size;
414typedef struct _Ecore_X_Randr_Screen_Size_MM Ecore_X_Randr_Screen_Size_MM;
415
416typedef struct _Ecore_X_Xdnd_Position Ecore_X_Xdnd_Position;
417
418struct _Ecore_X_Event_Mouse_In
419{
420 int modifiers;
421 int x, y;
422 Eina_Bool same_screen : 1;
423 struct
424 {
425 int x, y;
426 } root;
427 Ecore_X_Window win;
428 Ecore_X_Window event_win;
429 Ecore_X_Window root_win;
430 Ecore_X_Event_Mode mode;
431 Ecore_X_Event_Detail detail;
432 Ecore_X_Time time;
433};
434
435struct _Ecore_X_Event_Mouse_Out
436{
437 int modifiers;
438 int x, y;
439 int same_screen;
440 struct
441 {
442 int x, y;
443 } root;
444 Ecore_X_Window win;
445 Ecore_X_Window event_win;
446 Ecore_X_Window root_win;
447 Ecore_X_Event_Mode mode;
448 Ecore_X_Event_Detail detail;
449 Ecore_X_Time time;
450};
451
452struct _Ecore_X_Event_Window_Focus_In
453{
454 Ecore_X_Window win;
455 Ecore_X_Event_Mode mode;
456 Ecore_X_Event_Detail detail;
457 Ecore_X_Time time;
458};
459
460struct _Ecore_X_Event_Window_Focus_Out
461{
462 Ecore_X_Window win;
463 Ecore_X_Event_Mode mode;
464 Ecore_X_Event_Detail detail;
465 Ecore_X_Time time;
466};
467
468struct _Ecore_X_Event_Window_Keymap
469{
470 Ecore_X_Window win;
471};
472
473struct _Ecore_X_Event_Window_Damage
474{
475 Ecore_X_Window win;
476 int x, y, w, h;
477 int count;
478 Ecore_X_Time time;
479};
480
481struct _Ecore_X_Event_Window_Visibility_Change
482{
483 Ecore_X_Window win;
484 int fully_obscured;
485 Ecore_X_Time time;
486};
487
488struct _Ecore_X_Event_Window_Create
489{
490 Ecore_X_Window win;
491 Ecore_X_Window parent;
492 int override;
493 int x, y, w, h;
494 int border;
495 Ecore_X_Time time;
496};
497
498struct _Ecore_X_Event_Window_Destroy
499{
500 Ecore_X_Window win;
501 Ecore_X_Window event_win;
502 Ecore_X_Time time;
503};
504
505struct _Ecore_X_Event_Window_Hide
506{
507 Ecore_X_Window win;
508 Ecore_X_Window event_win;
509 Ecore_X_Time time;
510};
511
512struct _Ecore_X_Event_Window_Show
513{
514 Ecore_X_Window win;
515 Ecore_X_Window event_win;
516 Ecore_X_Time time;
517};
518
519struct _Ecore_X_Event_Window_Show_Request
520{
521 Ecore_X_Window win;
522 Ecore_X_Window parent;
523 Ecore_X_Time time;
524};
525
526struct _Ecore_X_Event_Window_Reparent
527{
528 Ecore_X_Window win;
529 Ecore_X_Window event_win;
530 Ecore_X_Window parent;
531 Ecore_X_Time time;
532};
533
534struct _Ecore_X_Event_Window_Configure
535{
536 Ecore_X_Window win;
537 Ecore_X_Window event_win;
538 Ecore_X_Window abovewin;
539 int x, y, w, h;
540 int border;
541 Eina_Bool override : 1;
542 Eina_Bool from_wm : 1;
543 Ecore_X_Time time;
544};
545
546struct _Ecore_X_Event_Window_Configure_Request
547{
548 Ecore_X_Window win;
549 Ecore_X_Window parent_win;
550 Ecore_X_Window abovewin;
551 int x, y, w, h;
552 int border;
553 Ecore_X_Window_Stack_Mode detail;
554 unsigned long value_mask;
555 Ecore_X_Time time;
556};
557
558struct _Ecore_X_Event_Window_Gravity
559{
560 Ecore_X_Window win;
561 Ecore_X_Window event_win;
562 Ecore_X_Time time;
563};
564
565struct _Ecore_X_Event_Window_Resize_Request
566{
567 Ecore_X_Window win;
568 int w, h;
569 Ecore_X_Time time;
570};
571
572struct _Ecore_X_Event_Window_Stack
573{
574 Ecore_X_Window win;
575 Ecore_X_Window event_win;
576 Ecore_X_Window_Stack_Mode detail;
577 Ecore_X_Time time;
578};
579
580struct _Ecore_X_Event_Window_Stack_Request
581{
582 Ecore_X_Window win;
583 Ecore_X_Window parent;
584 Ecore_X_Window_Stack_Mode detail;
585 Ecore_X_Time time;
586};
587
588struct _Ecore_X_Event_Window_Property
589{
590 Ecore_X_Window win;
591 Ecore_X_Atom atom;
592 Ecore_X_Time time;
593};
594
595struct _Ecore_X_Event_Window_Colormap
596{
597 Ecore_X_Window win;
598 Ecore_X_Colormap cmap;
599 Eina_Bool installed : 1;
600 Ecore_X_Time time;
601};
602
603struct _Ecore_X_Event_Mapping_Change
604{
605 Ecore_X_Mapping_Type type;
606 int keycode;
607 int num;
608};
609
610struct _Ecore_X_Event_Selection_Clear
611{
612 Ecore_X_Window win;
613 Ecore_X_Selection selection;
614 Ecore_X_Atom atom;
615 Ecore_X_Time time;
616};
617
618struct _Ecore_X_Event_Selection_Request
619{
620 Ecore_X_Window owner;
621 Ecore_X_Window requestor;
622 Ecore_X_Time time;
623 Ecore_X_Atom selection;
624 Ecore_X_Atom target;
625 Ecore_X_Atom property;
626};
627
628typedef enum
629{
630 ECORE_X_OWNER_CHANGE_REASON_NEW_OWNER,
631 ECORE_X_OWNER_CHANGE_REASON_DESTROY,
632 ECORE_X_OWNER_CHANGE_REASON_CLOSE
633} Ecore_X_Owner_Change_Reason;
634
635struct _Ecore_X_Event_Fixes_Selection_Notify
636{
637 Ecore_X_Window win;
638 Ecore_X_Window owner;
639 Ecore_X_Time time;
640 Ecore_X_Time selection_time;
641 Ecore_X_Selection selection;
642 Ecore_X_Atom atom;
643 Ecore_X_Owner_Change_Reason reason;
644};
645
646struct _Ecore_X_Event_Selection_Notify
647{
648 Ecore_X_Window win;
649 Ecore_X_Time time;
650 Ecore_X_Selection selection;
651 Ecore_X_Atom atom;
652 char *target;
653 void *data;
654};
655
656struct _Ecore_X_Selection_Data
657{
658 enum
659 {
660 ECORE_X_SELECTION_CONTENT_NONE,
661 ECORE_X_SELECTION_CONTENT_TEXT,
662 ECORE_X_SELECTION_CONTENT_FILES,
663 ECORE_X_SELECTION_CONTENT_TARGETS,
664 ECORE_X_SELECTION_CONTENT_CUSTOM
665 } content;
666 unsigned char *data;
667 int length;
668 int format;
669 int (*free)(void *data);
670};
671
672struct _Ecore_X_Selection_Data_Files
673{
674 Ecore_X_Selection_Data data;
675 char **files;
676 int num_files;
677};
678
679struct _Ecore_X_Selection_Data_Text
680{
681 Ecore_X_Selection_Data data;
682 char *text;
683};
684
685struct _Ecore_X_Selection_Data_Targets
686{
687 Ecore_X_Selection_Data data;
688 char **targets;
689 int num_targets;
690};
691
692struct _Ecore_X_Event_Xdnd_Enter
693{
694 Ecore_X_Window win, source;
695
696 char **types;
697 int num_types;
698};
699
700struct _Ecore_X_Event_Xdnd_Position
701{
702 Ecore_X_Window win, source;
703 struct
704 {
705 int x, y;
706 } position;
707 Ecore_X_Atom action;
708};
709
710struct _Ecore_X_Xdnd_Position
711{
712 Ecore_X_Window win, prev;
713 struct
714 {
715 int x, y;
716 } position;
717};
718
719struct _Ecore_X_Event_Xdnd_Status
720{
721 Ecore_X_Window win, target;
722 Eina_Bool will_accept : 1;
723 Ecore_X_Rectangle rectangle;
724 Ecore_X_Atom action;
725};
726
727struct _Ecore_X_Event_Xdnd_Leave
728{
729 Ecore_X_Window win, source;
730};
731
732struct _Ecore_X_Event_Xdnd_Drop
733{
734 Ecore_X_Window win, source;
735 Ecore_X_Atom action;
736 struct
737 {
738 int x, y;
739 } position;
740};
741
742struct _Ecore_X_Event_Xdnd_Finished
743{
744 Ecore_X_Window win, target;
745 Eina_Bool completed : 1;
746 Ecore_X_Atom action;
747};
748
749struct _Ecore_X_Event_Client_Message
750{
751 Ecore_X_Window win;
752 Ecore_X_Atom message_type;
753 int format;
754 union
755 {
756 char b[20];
757 short s[10];
758 long l[5];
759 } data;
760 Ecore_X_Time time;
761};
762
763struct _Ecore_X_Event_Window_Shape
764{
765 Ecore_X_Window win;
766 Ecore_X_Time time;
767 Ecore_X_Shape_Type type;
768 int x, y, w, h;
769 Eina_Bool shaped : 1;
770};
771
772struct _Ecore_X_Event_Screensaver_Notify
773{
774 Ecore_X_Window win;
775 Eina_Bool on : 1;
776 Ecore_X_Time time;
777};
778
779struct _Ecore_X_Event_Sync_Counter
780{
781 Ecore_X_Time time;
782};
783
784struct _Ecore_X_Event_Sync_Alarm
785{
786 Ecore_X_Time time;
787 Ecore_X_Sync_Alarm alarm;
788};
789
790struct _Ecore_X_Randr_Screen_Size
791{
792 int width, height;
793};
794
795struct _Ecore_X_Randr_Screen_Size_MM
796{
797 int width, height, width_mm, height_mm;
798};
799
800struct _Ecore_X_Event_Screen_Change
801{
802 Ecore_X_Window win;
803 Ecore_X_Window root;
804 Ecore_X_Randr_Screen_Size_MM size; /* in pixel and millimeters */
805 Ecore_X_Time time;
806 Ecore_X_Time config_time;
807 Ecore_X_Randr_Orientation orientation;
808 Ecore_X_Render_Subpixel_Order subpixel_order;
809 Ecore_X_Randr_Size_ID size_id;
810};
811
812struct _Ecore_X_Event_Randr_Crtc_Change
813{
814 Ecore_X_Window win;
815 Ecore_X_Randr_Crtc crtc;
816 Ecore_X_Randr_Mode mode;
817 Ecore_X_Randr_Orientation orientation;
818 Eina_Rectangle geo;
819};
820
821struct _Ecore_X_Event_Randr_Output_Change
822{
823 Ecore_X_Window win;
824 Ecore_X_Randr_Output output;
825 Ecore_X_Randr_Crtc crtc;
826 Ecore_X_Randr_Mode mode;
827 Ecore_X_Randr_Orientation orientation;
828 Ecore_X_Randr_Connection_Status connection;
829 Ecore_X_Render_Subpixel_Order subpixel_order;
830};
831
832struct _Ecore_X_Event_Randr_Output_Property_Notify
833{
834 Ecore_X_Window win;
835 Ecore_X_Randr_Output output;
836 Ecore_X_Atom property;
837 Ecore_X_Time time;
838 Ecore_X_Randr_Property_Change state;
839};
840
841struct _Ecore_X_Event_Window_Delete_Request
842{
843 Ecore_X_Window win;
844 Ecore_X_Time time;
845};
846
847struct _Ecore_X_Event_Startup_Sequence
848{
849 Ecore_X_Window win;
850};
851
852struct _Ecore_X_Event_Window_Move_Resize_Request
853{
854 Ecore_X_Window win;
855 int x, y;
856 int direction;
857 int button;
858 int source;
859};
860
861struct _Ecore_X_Event_Window_State_Request
862{
863 Ecore_X_Window win;
864 Ecore_X_Window_State_Action action;
865 Ecore_X_Window_State state[2];
866 int source;
867};
868
869struct _Ecore_X_Event_Frame_Extents_Request
870{
871 Ecore_X_Window win;
872};
873
874struct _Ecore_X_Event_Ping
875{
876 Ecore_X_Window win;
877 Ecore_X_Window event_win;
878 Ecore_X_Time time;
879};
880
881struct _Ecore_X_Event_Desktop_Change
882{
883 Ecore_X_Window win;
884 unsigned int desk;
885 int source;
886};
887
888struct _Ecore_X_Event_Generic
889{
890 int extension;
891 int evtype;
892 unsigned int cookie;
893 void *data;
894};
895
896EAPI extern int ECORE_X_EVENT_ANY; /**< low level event dependent on
897 backend in use, if Xlib will be XEvent,
898 if XCB will be xcb_generic_event_t.
899 @warning avoid using it.
900 */
901EAPI extern int ECORE_X_EVENT_MOUSE_IN;
902EAPI extern int ECORE_X_EVENT_MOUSE_OUT;
903EAPI extern int ECORE_X_EVENT_WINDOW_FOCUS_IN;
904EAPI extern int ECORE_X_EVENT_WINDOW_FOCUS_OUT;
905EAPI extern int ECORE_X_EVENT_WINDOW_KEYMAP;
906EAPI extern int ECORE_X_EVENT_WINDOW_DAMAGE;
907EAPI extern int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE;
908EAPI extern int ECORE_X_EVENT_WINDOW_CREATE;
909EAPI extern int ECORE_X_EVENT_WINDOW_DESTROY;
910EAPI extern int ECORE_X_EVENT_WINDOW_HIDE;
911EAPI extern int ECORE_X_EVENT_WINDOW_SHOW;
912EAPI extern int ECORE_X_EVENT_WINDOW_SHOW_REQUEST;
913EAPI extern int ECORE_X_EVENT_WINDOW_REPARENT;
914EAPI extern int ECORE_X_EVENT_WINDOW_CONFIGURE;
915EAPI extern int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST;
916EAPI extern int ECORE_X_EVENT_WINDOW_GRAVITY;
917EAPI extern int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST;
918EAPI extern int ECORE_X_EVENT_WINDOW_STACK;
919EAPI extern int ECORE_X_EVENT_WINDOW_STACK_REQUEST;
920EAPI extern int ECORE_X_EVENT_WINDOW_PROPERTY;
921EAPI extern int ECORE_X_EVENT_WINDOW_COLORMAP;
922EAPI extern int ECORE_X_EVENT_WINDOW_MAPPING;
923EAPI extern int ECORE_X_EVENT_MAPPING_CHANGE;
924EAPI extern int ECORE_X_EVENT_SELECTION_CLEAR;
925EAPI extern int ECORE_X_EVENT_SELECTION_REQUEST;
926EAPI extern int ECORE_X_EVENT_SELECTION_NOTIFY;
927EAPI extern int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY;
928EAPI extern int ECORE_X_EVENT_CLIENT_MESSAGE;
929EAPI extern int ECORE_X_EVENT_WINDOW_SHAPE;
930EAPI extern int ECORE_X_EVENT_SCREENSAVER_NOTIFY;
931EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK;
932EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_PAN;
933EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION;
934EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_TAP;
935EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD;
936EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD;
937EAPI extern int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP;
938EAPI extern int ECORE_X_EVENT_SYNC_COUNTER;
939EAPI extern int ECORE_X_EVENT_SYNC_ALARM;
940EAPI extern int ECORE_X_EVENT_SCREEN_CHANGE;
941EAPI extern int ECORE_X_EVENT_RANDR_CRTC_CHANGE;
942EAPI extern int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE;
943EAPI extern int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY;
944EAPI extern int ECORE_X_EVENT_DAMAGE_NOTIFY;
945
946EAPI extern int ECORE_X_EVENT_WINDOW_DELETE_REQUEST;
947
948EAPI extern int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST;
949EAPI extern int ECORE_X_EVENT_WINDOW_STATE_REQUEST;
950EAPI extern int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST;
951EAPI extern int ECORE_X_EVENT_PING;
952EAPI extern int ECORE_X_EVENT_DESKTOP_CHANGE;
953
954EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
955EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
956EAPI extern int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
957
958EAPI extern int ECORE_X_EVENT_GENERIC;
959
960EAPI extern int ECORE_X_EVENT_XDND_ENTER;
961EAPI extern int ECORE_X_EVENT_XDND_POSITION;
962EAPI extern int ECORE_X_EVENT_XDND_STATUS;
963EAPI extern int ECORE_X_EVENT_XDND_LEAVE;
964EAPI extern int ECORE_X_EVENT_XDND_DROP;
965EAPI extern int ECORE_X_EVENT_XDND_FINISHED;
966
967EAPI extern int ECORE_X_LOCK_SCROLL;
968EAPI extern int ECORE_X_LOCK_NUM;
969EAPI extern int ECORE_X_LOCK_CAPS;
970EAPI extern int ECORE_X_LOCK_SHIFT;
971
972typedef enum _Ecore_X_WM_Protocol
973{
974 /* If enabled the window manager will be asked to send a
975 * delete message instead of just closing (destroying) the window. */
976 ECORE_X_WM_PROTOCOL_DELETE_REQUEST,
977
978 /* If enabled the window manager will be told that the window
979 * explicitly sets input focus. */
980 ECORE_X_WM_PROTOCOL_TAKE_FOCUS,
981
982 /* If enabled the window manager can ping the window to check
983 * if it is alive. */
984 ECORE_X_NET_WM_PROTOCOL_PING,
985
986 /* If enabled the window manager can sync updating with the
987 * window (?) */
988 ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST,
989
990 /* Number of defined items */
991 ECORE_X_WM_PROTOCOL_NUM
992} Ecore_X_WM_Protocol;
993
994typedef enum _Ecore_X_Window_Input_Mode
995{
996 /* The window can never be focused */
997 ECORE_X_WINDOW_INPUT_MODE_NONE,
998
999 /* The window can be focused by the WM but doesn't focus itself */
1000 ECORE_X_WINDOW_INPUT_MODE_PASSIVE,
1001
1002 /* The window sets the focus itself if one of its sub-windows
1003 * already is focused */
1004 ECORE_X_WINDOW_INPUT_MODE_ACTIVE_LOCAL,
1005
1006 /* The window sets the focus itself even if another window
1007 * is currently focused */
1008 ECORE_X_WINDOW_INPUT_MODE_ACTIVE_GLOBAL
1009} Ecore_X_Window_Input_Mode;
1010
1011typedef enum _Ecore_X_Window_State_Hint
1012{
1013 /** Do not provide any state hint to the window manager */
1014 ECORE_X_WINDOW_STATE_HINT_NONE = -1,
1015
1016 /** The window wants to remain hidden and NOT iconified */
1017 ECORE_X_WINDOW_STATE_HINT_WITHDRAWN,
1018
1019 /** The window wants to be mapped normally */
1020 ECORE_X_WINDOW_STATE_HINT_NORMAL,
1021
1022 /** The window wants to start in an iconified state */
1023 ECORE_X_WINDOW_STATE_HINT_ICONIC
1024} Ecore_X_Window_State_Hint;
1025
1026typedef enum _Ecore_X_Window_Type
1027{
1028 ECORE_X_WINDOW_TYPE_UNKNOWN = 0,
1029 ECORE_X_WINDOW_TYPE_DESKTOP,
1030 ECORE_X_WINDOW_TYPE_DOCK,
1031 ECORE_X_WINDOW_TYPE_TOOLBAR,
1032 ECORE_X_WINDOW_TYPE_MENU,
1033 ECORE_X_WINDOW_TYPE_UTILITY,
1034 ECORE_X_WINDOW_TYPE_SPLASH,
1035 ECORE_X_WINDOW_TYPE_DIALOG,
1036 ECORE_X_WINDOW_TYPE_NORMAL,
1037 ECORE_X_WINDOW_TYPE_DROPDOWN_MENU,
1038 ECORE_X_WINDOW_TYPE_POPUP_MENU,
1039 ECORE_X_WINDOW_TYPE_TOOLTIP,
1040 ECORE_X_WINDOW_TYPE_NOTIFICATION,
1041 ECORE_X_WINDOW_TYPE_COMBO,
1042 ECORE_X_WINDOW_TYPE_DND
1043} Ecore_X_Window_Type;
1044
1045typedef enum _Ecore_X_Action
1046{
1047 ECORE_X_ACTION_MOVE,
1048 ECORE_X_ACTION_RESIZE,
1049 ECORE_X_ACTION_MINIMIZE,
1050 ECORE_X_ACTION_SHADE,
1051 ECORE_X_ACTION_STICK,
1052 ECORE_X_ACTION_MAXIMIZE_HORZ,
1053 ECORE_X_ACTION_MAXIMIZE_VERT,
1054 ECORE_X_ACTION_FULLSCREEN,
1055 ECORE_X_ACTION_CHANGE_DESKTOP,
1056 ECORE_X_ACTION_CLOSE,
1057 ECORE_X_ACTION_ABOVE,
1058 ECORE_X_ACTION_BELOW
1059} Ecore_X_Action;
1060
1061typedef enum _Ecore_X_Window_Configure_Mask
1062{
1063 ECORE_X_WINDOW_CONFIGURE_MASK_X = (1 << 0),
1064 ECORE_X_WINDOW_CONFIGURE_MASK_Y = (1 << 1),
1065 ECORE_X_WINDOW_CONFIGURE_MASK_W = (1 << 2),
1066 ECORE_X_WINDOW_CONFIGURE_MASK_H = (1 << 3),
1067 ECORE_X_WINDOW_CONFIGURE_MASK_BORDER_WIDTH = (1 << 4),
1068 ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING = (1 << 5),
1069 ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE = (1 << 6)
1070} Ecore_X_Window_Configure_Mask;
1071
1072typedef enum _Ecore_X_Virtual_Keyboard_State
1073{
1074 ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN = 0,
1075 ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF,
1076 ECORE_X_VIRTUAL_KEYBOARD_STATE_ON,
1077 ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA,
1078 ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC,
1079 ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN,
1080 ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER,
1081 ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX,
1082 ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL,
1083 ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD,
1084 ECORE_X_VIRTUAL_KEYBOARD_STATE_IP,
1085 ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST,
1086 ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE,
1087 ECORE_X_VIRTUAL_KEYBOARD_STATE_URL,
1088 ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD,
1089 ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME
1090} Ecore_X_Virtual_Keyboard_State;
1091
1092typedef enum _Ecore_X_Illume_Mode
1093{
1094 ECORE_X_ILLUME_MODE_UNKNOWN = 0,
1095 ECORE_X_ILLUME_MODE_SINGLE,
1096 ECORE_X_ILLUME_MODE_DUAL_TOP,
1097 ECORE_X_ILLUME_MODE_DUAL_LEFT
1098} Ecore_X_Illume_Mode;
1099
1100typedef enum _Ecore_X_Illume_Quickpanel_State
1101{
1102 ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN = 0,
1103 ECORE_X_ILLUME_QUICKPANEL_STATE_OFF,
1104 ECORE_X_ILLUME_QUICKPANEL_STATE_ON
1105} Ecore_X_Illume_Quickpanel_State;
1106
1107/* Window layer constants */
1108#define ECORE_X_WINDOW_LAYER_BELOW 2
1109#define ECORE_X_WINDOW_LAYER_NORMAL 4
1110#define ECORE_X_WINDOW_LAYER_ABOVE 6
1111
1112/* Property list operations */
1113#define ECORE_X_PROP_LIST_REMOVE 0
1114#define ECORE_X_PROP_LIST_ADD 1
1115#define ECORE_X_PROP_LIST_TOGGLE 2
1116
1117EAPI int
1118 ecore_x_init(const char *name);
1119EAPI int
1120 ecore_x_shutdown(void);
1121EAPI int
1122 ecore_x_disconnect(void);
1123EAPI Ecore_X_Display *
1124 ecore_x_display_get(void);
1125EAPI Ecore_X_Connection *
1126 ecore_x_connection_get(void);
1127EAPI int
1128 ecore_x_fd_get(void);
1129EAPI Ecore_X_Screen *
1130 ecore_x_default_screen_get(void);
1131EAPI void
1132 ecore_x_screen_size_get(const Ecore_X_Screen *screen,
1133 int *w,
1134 int *h);
1135EAPI int
1136 ecore_x_screen_count_get(void);
1137EAPI int
1138 ecore_x_screen_index_get(const Ecore_X_Screen *screen);
1139EAPI Ecore_X_Screen *
1140 ecore_x_screen_get(int index);
1141
1142EAPI void
1143 ecore_x_double_click_time_set(double t);
1144EAPI double
1145 ecore_x_double_click_time_get(void);
1146EAPI void
1147 ecore_x_flush(void);
1148EAPI void
1149 ecore_x_sync(void);
1150EAPI void
1151 ecore_x_killall(Ecore_X_Window root);
1152EAPI void
1153 ecore_x_kill(Ecore_X_Window win);
1154EAPI int
1155 ecore_x_dpi_get(void);
1156EAPI Eina_Bool
1157 ecore_x_bell(int percent);
1158EAPI unsigned int
1159 ecore_x_visual_id_get(Ecore_X_Visual visual);
1160
1161EAPI Ecore_X_Visual
1162ecore_x_default_visual_get(Ecore_X_Display *disp,
1163 Ecore_X_Screen *screen);
1164EAPI Ecore_X_Colormap
1165ecore_x_default_colormap_get(Ecore_X_Display *disp,
1166 Ecore_X_Screen *screen);
1167EAPI int
1168ecore_x_default_depth_get(Ecore_X_Display *disp,
1169 Ecore_X_Screen *screen);
1170
1171EAPI Ecore_X_Time
1172ecore_x_current_time_get(void);
1173
1174EAPI void
1175ecore_x_error_handler_set(void (*func)(void *data),
1176 const void *data);
1177EAPI void
1178ecore_x_io_error_handler_set(void (*func)(void *data),
1179 const void *data);
1180EAPI int
1181 ecore_x_error_request_get(void);
1182EAPI int
1183 ecore_x_error_code_get(void);
1184
1185EAPI void
1186ecore_x_event_mask_set(Ecore_X_Window w,
1187 Ecore_X_Event_Mask mask);
1188EAPI void
1189ecore_x_event_mask_unset(Ecore_X_Window w,
1190 Ecore_X_Event_Mask mask);
1191
1192EAPI Eina_Bool
1193ecore_x_selection_notify_send(Ecore_X_Window requestor,
1194 Ecore_X_Atom selection,
1195 Ecore_X_Atom target,
1196 Ecore_X_Atom property,
1197 Ecore_X_Time time);
1198EAPI Eina_Bool
1199ecore_x_selection_primary_set(Ecore_X_Window w,
1200 const void *data,
1201 int size);
1202EAPI Eina_Bool
1203 ecore_x_selection_primary_clear(void);
1204EAPI Eina_Bool
1205 ecore_x_selection_secondary_set(Ecore_X_Window w,
1206 const void *data,
1207 int size);
1208EAPI Eina_Bool
1209 ecore_x_selection_secondary_clear(void);
1210EAPI Eina_Bool
1211 ecore_x_selection_xdnd_set(Ecore_X_Window w,
1212 const void *data,
1213 int size);
1214EAPI Eina_Bool
1215 ecore_x_selection_xdnd_clear(void);
1216EAPI Eina_Bool
1217 ecore_x_selection_clipboard_set(Ecore_X_Window w,
1218 const void *data,
1219 int size);
1220EAPI Eina_Bool
1221 ecore_x_selection_clipboard_clear(void);
1222EAPI void
1223 ecore_x_selection_primary_request(Ecore_X_Window w,
1224 const char *target);
1225EAPI void
1226ecore_x_selection_secondary_request(Ecore_X_Window w,
1227 const char *target);
1228EAPI void
1229ecore_x_selection_xdnd_request(Ecore_X_Window w,
1230 const char *target);
1231EAPI void
1232ecore_x_selection_clipboard_request(Ecore_X_Window w,
1233 const char *target);
1234EAPI Eina_Bool
1235ecore_x_selection_convert(Ecore_X_Atom selection,
1236 Ecore_X_Atom target,
1237 void **data_ret,
1238 int *len,
1239 Ecore_X_Atom *targprop,
1240 int *targsize);
1241EAPI void
1242ecore_x_selection_converter_add(char *target,
1243 Eina_Bool (*func)(char *target,
1244 void *data,
1245 int size,
1246 void **data_ret,
1247 int *size_ret,
1248 Ecore_X_Atom *,
1249 int *));
1250EAPI void
1251ecore_x_selection_converter_atom_add(Ecore_X_Atom target,
1252 Eina_Bool (*func)(char *target,
1253 void *data,
1254 int size,
1255 void **data_ret,
1256 int *size_ret,
1257 Ecore_X_Atom *tprop,
1258 int *tsize));
1259EAPI void
1260 ecore_x_selection_converter_del(char *target);
1261EAPI void
1262 ecore_x_selection_converter_atom_del(Ecore_X_Atom target);
1263EAPI void
1264 ecore_x_selection_parser_add(const char *target,
1265 void *(*func)(const char *target, void *data, int size, int format));
1266EAPI void
1267 ecore_x_selection_parser_del(const char *target);
1268EAPI void
1269 ecore_x_selection_owner_set(Ecore_X_Window win,
1270 Ecore_X_Atom atom,
1271 Ecore_X_Time tm);
1272EAPI Ecore_X_Window
1273ecore_x_selection_owner_get(Ecore_X_Atom atom);
1274
1275EAPI void
1276ecore_x_dnd_aware_set(Ecore_X_Window win,
1277 Eina_Bool on);
1278EAPI int
1279 ecore_x_dnd_version_get(Ecore_X_Window win);
1280EAPI Eina_Bool
1281 ecore_x_dnd_type_isset(Ecore_X_Window win,
1282 const char *type);
1283EAPI void
1284ecore_x_dnd_type_set(Ecore_X_Window win,
1285 const char *type,
1286 Eina_Bool on);
1287EAPI void
1288ecore_x_dnd_types_set(Ecore_X_Window win,
1289 const char **types,
1290 unsigned int num_types);
1291EAPI void
1292ecore_x_dnd_actions_set(Ecore_X_Window win,
1293 Ecore_X_Atom *actions,
1294 unsigned int num_actions);
1295EAPI Eina_Bool
1296ecore_x_dnd_begin(Ecore_X_Window source,
1297 unsigned char *data,
1298 int size);
1299EAPI Eina_Bool
1300 ecore_x_dnd_drop(void);
1301EAPI void
1302 ecore_x_dnd_send_status(Eina_Bool will_accept,
1303 Eina_Bool suppress,
1304 Ecore_X_Rectangle rectangle,
1305 Ecore_X_Atom action);
1306EAPI void
1307 ecore_x_dnd_send_finished(void);
1308EAPI void
1309 ecore_x_dnd_source_action_set(Ecore_X_Atom action);
1310EAPI Ecore_X_Atom
1311 ecore_x_dnd_source_action_get(void);
1312EAPI void
1313 ecore_x_dnd_callback_pos_update_set(void (*cb)(void *,
1314 Ecore_X_Xdnd_Position *data),
1315 const void *data);
1316
1317EAPI Ecore_X_Window
1318ecore_x_window_new(Ecore_X_Window parent,
1319 int x,
1320 int y,
1321 int w,
1322 int h);
1323EAPI Ecore_X_Window
1324ecore_x_window_override_new(Ecore_X_Window parent,
1325 int x,
1326 int y,
1327 int w,
1328 int h);
1329EAPI int
1330 ecore_x_window_argb_get(Ecore_X_Window win);
1331EAPI Ecore_X_Window
1332 ecore_x_window_manager_argb_new(Ecore_X_Window parent,
1333 int x,
1334 int y,
1335 int w,
1336 int h);
1337EAPI Ecore_X_Window
1338ecore_x_window_argb_new(Ecore_X_Window parent,
1339 int x,
1340 int y,
1341 int w,
1342 int h);
1343EAPI Ecore_X_Window
1344ecore_x_window_override_argb_new(Ecore_X_Window parent,
1345 int x,
1346 int y,
1347 int w,
1348 int h);
1349EAPI Ecore_X_Window
1350ecore_x_window_input_new(Ecore_X_Window parent,
1351 int x,
1352 int y,
1353 int w,
1354 int h);
1355EAPI void
1356ecore_x_window_configure(Ecore_X_Window win,
1357 Ecore_X_Window_Configure_Mask mask,
1358 int x,
1359 int y,
1360 int w,
1361 int h,
1362 int border_width,
1363 Ecore_X_Window sibling,
1364 int stack_mode);
1365EAPI void
1366ecore_x_window_cursor_set(Ecore_X_Window win,
1367 Ecore_X_Cursor c);
1368EAPI void
1369 ecore_x_window_free(Ecore_X_Window win);
1370EAPI void
1371 ecore_x_window_ignore_set(Ecore_X_Window win,
1372 int ignore);
1373EAPI Ecore_X_Window *
1374ecore_x_window_ignore_list(int *num);
1375
1376EAPI void
1377 ecore_x_window_delete_request_send(Ecore_X_Window win);
1378EAPI void
1379 ecore_x_window_show(Ecore_X_Window win);
1380EAPI void
1381 ecore_x_window_hide(Ecore_X_Window win);
1382EAPI void
1383 ecore_x_window_move(Ecore_X_Window win,
1384 int x,
1385 int y);
1386EAPI void
1387ecore_x_window_resize(Ecore_X_Window win,
1388 int w,
1389 int h);
1390EAPI void
1391ecore_x_window_move_resize(Ecore_X_Window win,
1392 int x,
1393 int y,
1394 int w,
1395 int h);
1396EAPI void
1397 ecore_x_window_focus(Ecore_X_Window win);
1398EAPI void
1399 ecore_x_window_focus_at_time(Ecore_X_Window win,
1400 Ecore_X_Time t);
1401EAPI Ecore_X_Window
1402 ecore_x_window_focus_get(void);
1403EAPI void
1404 ecore_x_window_raise(Ecore_X_Window win);
1405EAPI void
1406 ecore_x_window_lower(Ecore_X_Window win);
1407EAPI void
1408 ecore_x_window_reparent(Ecore_X_Window win,
1409 Ecore_X_Window new_parent,
1410 int x,
1411 int y);
1412EAPI void
1413ecore_x_window_size_get(Ecore_X_Window win,
1414 int *w,
1415 int *h);
1416EAPI void
1417ecore_x_window_geometry_get(Ecore_X_Window win,
1418 int *x,
1419 int *y,
1420 int *w,
1421 int *h);
1422EAPI int
1423 ecore_x_window_border_width_get(Ecore_X_Window win);
1424EAPI void
1425 ecore_x_window_border_width_set(Ecore_X_Window win,
1426 int width);
1427EAPI int
1428 ecore_x_window_depth_get(Ecore_X_Window win);
1429EAPI void
1430 ecore_x_window_cursor_show(Ecore_X_Window win,
1431 Eina_Bool show);
1432EAPI void
1433 ecore_x_window_defaults_set(Ecore_X_Window win);
1434EAPI int
1435 ecore_x_window_visible_get(Ecore_X_Window win);
1436EAPI Ecore_X_Window
1437 ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base,
1438 int x,
1439 int y,
1440 Ecore_X_Window *skip,
1441 int skip_num);
1442EAPI Ecore_X_Window
1443ecore_x_window_shadow_parent_get(Ecore_X_Window root,
1444 Ecore_X_Window win);
1445EAPI void
1446 ecore_x_window_shadow_tree_flush(void);
1447EAPI Ecore_X_Window
1448 ecore_x_window_root_get(Ecore_X_Window win);
1449EAPI Ecore_X_Window
1450 ecore_x_window_at_xy_get(int x,
1451 int y);
1452EAPI Ecore_X_Window
1453ecore_x_window_at_xy_with_skip_get(int x,
1454 int y,
1455 Ecore_X_Window *skip,
1456 int skip_num);
1457EAPI Ecore_X_Window
1458ecore_x_window_at_xy_begin_get(Ecore_X_Window begin,
1459 int x,
1460 int y);
1461EAPI Ecore_X_Window
1462ecore_x_window_parent_get(Ecore_X_Window win);
1463
1464EAPI void
1465ecore_x_window_background_color_set(Ecore_X_Window win,
1466 unsigned short r,
1467 unsigned short g,
1468 unsigned short b);
1469EAPI void
1470ecore_x_window_gravity_set(Ecore_X_Window win,
1471 Ecore_X_Gravity grav);
1472EAPI void
1473ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
1474 Ecore_X_Gravity grav);
1475EAPI void
1476ecore_x_window_pixmap_set(Ecore_X_Window win,
1477 Ecore_X_Pixmap pmap);
1478EAPI void
1479ecore_x_window_area_clear(Ecore_X_Window win,
1480 int x,
1481 int y,
1482 int w,
1483 int h);
1484EAPI void
1485ecore_x_window_area_expose(Ecore_X_Window win,
1486 int x,
1487 int y,
1488 int w,
1489 int h);
1490EAPI void
1491ecore_x_window_override_set(Ecore_X_Window win,
1492 Eina_Bool override);
1493
1494EAPI void
1495ecore_x_window_prop_card32_set(Ecore_X_Window win,
1496 Ecore_X_Atom atom,
1497 unsigned int *val,
1498 unsigned int num);
1499EAPI int
1500ecore_x_window_prop_card32_get(Ecore_X_Window win,
1501 Ecore_X_Atom atom,
1502 unsigned int *val,
1503 unsigned int len);
1504EAPI int
1505ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
1506 Ecore_X_Atom atom,
1507 unsigned int **plst);
1508
1509EAPI void
1510ecore_x_window_prop_xid_set(Ecore_X_Window win,
1511 Ecore_X_Atom atom,
1512 Ecore_X_Atom type,
1513 Ecore_X_ID *lst,
1514 unsigned int num);
1515EAPI int
1516ecore_x_window_prop_xid_get(Ecore_X_Window win,
1517 Ecore_X_Atom atom,
1518 Ecore_X_Atom type,
1519 Ecore_X_ID *lst,
1520 unsigned int len);
1521EAPI int
1522ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
1523 Ecore_X_Atom atom,
1524 Ecore_X_Atom type,
1525 Ecore_X_ID **plst);
1526EAPI void
1527ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
1528 Ecore_X_Atom atom,
1529 Ecore_X_Atom type,
1530 Ecore_X_ID item,
1531 int op);
1532EAPI void
1533ecore_x_window_prop_atom_set(Ecore_X_Window win,
1534 Ecore_X_Atom atom,
1535 Ecore_X_Atom *val,
1536 unsigned int num);
1537EAPI int
1538ecore_x_window_prop_atom_get(Ecore_X_Window win,
1539 Ecore_X_Atom atom,
1540 Ecore_X_Atom *val,
1541 unsigned int len);
1542EAPI int
1543ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
1544 Ecore_X_Atom atom,
1545 Ecore_X_Atom **plst);
1546EAPI void
1547ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
1548 Ecore_X_Atom atom,
1549 Ecore_X_Atom item,
1550 int op);
1551EAPI void
1552ecore_x_window_prop_window_set(Ecore_X_Window win,
1553 Ecore_X_Atom atom,
1554 Ecore_X_Window *val,
1555 unsigned int num);
1556EAPI int
1557ecore_x_window_prop_window_get(Ecore_X_Window win,
1558 Ecore_X_Atom atom,
1559 Ecore_X_Window *val,
1560 unsigned int len);
1561EAPI int
1562ecore_x_window_prop_window_list_get(Ecore_X_Window win,
1563 Ecore_X_Atom atom,
1564 Ecore_X_Window **plst);
1565
1566EAPI Ecore_X_Atom
1567 ecore_x_window_prop_any_type(void);
1568EAPI void
1569 ecore_x_window_prop_property_set(Ecore_X_Window win,
1570 Ecore_X_Atom type,
1571 Ecore_X_Atom format,
1572 int size,
1573 void *data,
1574 int number);
1575EAPI int
1576ecore_x_window_prop_property_get(Ecore_X_Window win,
1577 Ecore_X_Atom property,
1578 Ecore_X_Atom type,
1579 int size,
1580 unsigned char **data,
1581 int *num);
1582EAPI void
1583ecore_x_window_prop_property_del(Ecore_X_Window win,
1584 Ecore_X_Atom property);
1585EAPI Ecore_X_Atom *
1586ecore_x_window_prop_list(Ecore_X_Window win,
1587 int *num_ret);
1588EAPI void
1589ecore_x_window_prop_string_set(Ecore_X_Window win,
1590 Ecore_X_Atom type,
1591 const char *str);
1592EAPI char *
1593ecore_x_window_prop_string_get(Ecore_X_Window win,
1594 Ecore_X_Atom type);
1595EAPI Eina_Bool
1596ecore_x_window_prop_protocol_isset(Ecore_X_Window win,
1597 Ecore_X_WM_Protocol protocol);
1598EAPI Ecore_X_WM_Protocol *
1599ecore_x_window_prop_protocol_list_get(Ecore_X_Window win,
1600 int *num_ret);
1601
1602EAPI void
1603ecore_x_window_shape_mask_set(Ecore_X_Window win,
1604 Ecore_X_Pixmap mask);
1605EAPI void
1606ecore_x_window_shape_window_set(Ecore_X_Window win,
1607 Ecore_X_Window shape_win);
1608EAPI void
1609ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
1610 Ecore_X_Window shape_win,
1611 int x,
1612 int y);
1613EAPI void
1614ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
1615 int x,
1616 int y,
1617 int w,
1618 int h);
1619EAPI void
1620ecore_x_window_shape_rectangles_set(Ecore_X_Window win,
1621 Ecore_X_Rectangle *rects,
1622 int num);
1623EAPI void
1624ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win,
1625 int x,
1626 int y,
1627 int w,
1628 int h);
1629EAPI void
1630ecore_x_window_shape_input_rectangles_set(Ecore_X_Window win,
1631 Ecore_X_Rectangle *rects,
1632 int num);
1633EAPI void
1634ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win,
1635 int x,
1636 int y,
1637 int w,
1638 int h);
1639EAPI void
1640ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win,
1641 int x,
1642 int y,
1643 int w,
1644 int h);
1645EAPI void
1646ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win,
1647 int x,
1648 int y,
1649 int w,
1650 int h);
1651EAPI void
1652ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win,
1653 Ecore_X_Window shape_win,
1654 int x,
1655 int y);
1656EAPI void
1657ecore_x_window_shape_input_window_set(Ecore_X_Window win,
1658 Ecore_X_Window shape_win);
1659EAPI void
1660ecore_x_window_shape_window_add(Ecore_X_Window win,
1661 Ecore_X_Window shape_win);
1662EAPI void
1663ecore_x_window_shape_window_add_xy(Ecore_X_Window win,
1664 Ecore_X_Window shape_win,
1665 int x,
1666 int y);
1667EAPI void
1668ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win,
1669 Ecore_X_Window shape_win,
1670 int x,
1671 int y);
1672EAPI void
1673ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
1674 int x,
1675 int y,
1676 int w,
1677 int h);
1678EAPI void
1679ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
1680 int x,
1681 int y,
1682 int w,
1683 int h);
1684EAPI void
1685ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win,
1686 int x,
1687 int y,
1688 int w,
1689 int h);
1690EAPI void
1691ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
1692 Ecore_X_Rectangle *rects,
1693 int num);
1694EAPI void
1695ecore_x_window_shape_input_rectangles_add(Ecore_X_Window win,
1696 Ecore_X_Rectangle *rects,
1697 int num);
1698EAPI Ecore_X_Rectangle *
1699ecore_x_window_shape_rectangles_get(Ecore_X_Window win,
1700 int *num_ret);
1701EAPI Ecore_X_Rectangle *
1702ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win,
1703 int *num_ret);
1704EAPI void
1705ecore_x_window_shape_events_select(Ecore_X_Window win,
1706 Eina_Bool on);
1707EAPI void
1708ecore_x_window_shape_input_mask_set(Ecore_X_Window win,
1709 Ecore_X_Pixmap mask);
1710
1711EAPI Ecore_X_Pixmap
1712ecore_x_pixmap_new(Ecore_X_Window win,
1713 int w,
1714 int h,
1715 int dep);
1716EAPI void
1717 ecore_x_pixmap_free(Ecore_X_Pixmap pmap);
1718EAPI void
1719 ecore_x_pixmap_paste(Ecore_X_Pixmap pmap,
1720 Ecore_X_Drawable dest,
1721 Ecore_X_GC gc,
1722 int sx,
1723 int sy,
1724 int w,
1725 int h,
1726 int dx,
1727 int dy);
1728EAPI void
1729ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap,
1730 int *x,
1731 int *y,
1732 int *w,
1733 int *h);
1734EAPI int
1735ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap);
1736
1737EAPI Ecore_X_GC
1738ecore_x_gc_new(Ecore_X_Drawable draw,
1739 Ecore_X_GC_Value_Mask value_mask,
1740 const unsigned int *value_list);
1741EAPI void
1742 ecore_x_gc_free(Ecore_X_GC gc);
1743EAPI void
1744 ecore_x_gc_foreground_set(Ecore_X_GC gc,
1745 unsigned long foreground);
1746EAPI void
1747ecore_x_gc_background_set(Ecore_X_GC gc,
1748 unsigned long background);
1749
1750EAPI Eina_Bool
1751ecore_x_client_message32_send(Ecore_X_Window win,
1752 Ecore_X_Atom type,
1753 Ecore_X_Event_Mask mask,
1754 long d0,
1755 long d1,
1756 long d2,
1757 long d3,
1758 long d4);
1759EAPI Eina_Bool
1760ecore_x_client_message8_send(Ecore_X_Window win,
1761 Ecore_X_Atom type,
1762 const void *data,
1763 int len);
1764EAPI Eina_Bool
1765ecore_x_mouse_move_send(Ecore_X_Window win,
1766 int x,
1767 int y);
1768EAPI Eina_Bool
1769ecore_x_mouse_down_send(Ecore_X_Window win,
1770 int x,
1771 int y,
1772 int b);
1773EAPI Eina_Bool
1774ecore_x_mouse_up_send(Ecore_X_Window win,
1775 int x,
1776 int y,
1777 int b);
1778
1779EAPI void
1780ecore_x_drawable_geometry_get(Ecore_X_Drawable d,
1781 int *x,
1782 int *y,
1783 int *w,
1784 int *h);
1785EAPI int
1786 ecore_x_drawable_border_width_get(Ecore_X_Drawable d);
1787EAPI int
1788 ecore_x_drawable_depth_get(Ecore_X_Drawable d);
1789EAPI void
1790 ecore_x_drawable_rectangle_fill(Ecore_X_Drawable d,
1791 Ecore_X_GC gc,
1792 int x,
1793 int y,
1794 int width,
1795 int height);
1796
1797EAPI Eina_Bool
1798 ecore_x_cursor_color_supported_get(void);
1799EAPI Ecore_X_Cursor
1800 ecore_x_cursor_new(Ecore_X_Window win,
1801 int *pixels,
1802 int w,
1803 int h,
1804 int hot_x,
1805 int hot_y);
1806EAPI void
1807 ecore_x_cursor_free(Ecore_X_Cursor c);
1808EAPI Ecore_X_Cursor
1809 ecore_x_cursor_shape_get(int shape);
1810EAPI void
1811 ecore_x_cursor_size_set(int size);
1812EAPI int
1813 ecore_x_cursor_size_get(void);
1814
1815/* FIXME: these funcs need categorising */
1816EAPI Ecore_X_Window *
1817 ecore_x_window_root_list(int *num_ret);
1818EAPI Ecore_X_Window
1819 ecore_x_window_root_first_get(void);
1820EAPI Eina_Bool
1821 ecore_x_window_manage(Ecore_X_Window win);
1822EAPI void
1823 ecore_x_window_container_manage(Ecore_X_Window win);
1824EAPI void
1825 ecore_x_window_client_manage(Ecore_X_Window win);
1826EAPI void
1827 ecore_x_window_sniff(Ecore_X_Window win);
1828EAPI void
1829 ecore_x_window_client_sniff(Ecore_X_Window win);
1830
1831EAPI Ecore_X_Atom
1832 ecore_x_atom_get(const char *name);
1833EAPI void
1834 ecore_x_atoms_get(const char **names,
1835 int num,
1836 Ecore_X_Atom *atoms);
1837EAPI char *
1838ecore_x_atom_name_get(Ecore_X_Atom atom);
1839
1840EAPI void
1841 ecore_x_icccm_init(void);
1842EAPI void
1843 ecore_x_icccm_state_set(Ecore_X_Window win,
1844 Ecore_X_Window_State_Hint state);
1845EAPI Ecore_X_Window_State_Hint
1846 ecore_x_icccm_state_get(Ecore_X_Window win);
1847EAPI void
1848 ecore_x_icccm_delete_window_send(Ecore_X_Window win,
1849 Ecore_X_Time t);
1850EAPI void
1851ecore_x_icccm_take_focus_send(Ecore_X_Window win,
1852 Ecore_X_Time t);
1853EAPI void
1854ecore_x_icccm_save_yourself_send(Ecore_X_Window win,
1855 Ecore_X_Time t);
1856EAPI void
1857ecore_x_icccm_move_resize_send(Ecore_X_Window win,
1858 int x,
1859 int y,
1860 int w,
1861 int h);
1862EAPI void
1863ecore_x_icccm_hints_set(Ecore_X_Window win,
1864 Eina_Bool accepts_focus,
1865 Ecore_X_Window_State_Hint initial_state,
1866 Ecore_X_Pixmap icon_pixmap,
1867 Ecore_X_Pixmap icon_mask,
1868 Ecore_X_Window icon_window,
1869 Ecore_X_Window window_group,
1870 Eina_Bool is_urgent);
1871EAPI Eina_Bool
1872ecore_x_icccm_hints_get(Ecore_X_Window win,
1873 Eina_Bool *accepts_focus,
1874 Ecore_X_Window_State_Hint *initial_state,
1875 Ecore_X_Pixmap *icon_pixmap,
1876 Ecore_X_Pixmap *icon_mask,
1877 Ecore_X_Window *icon_window,
1878 Ecore_X_Window *window_group,
1879 Eina_Bool *is_urgent);
1880EAPI void
1881ecore_x_icccm_size_pos_hints_set(Ecore_X_Window win,
1882 Eina_Bool request_pos,
1883 Ecore_X_Gravity gravity,
1884 int min_w,
1885 int min_h,
1886 int max_w,
1887 int max_h,
1888 int base_w,
1889 int base_h,
1890 int step_x,
1891 int step_y,
1892 double min_aspect,
1893 double max_aspect);
1894EAPI Eina_Bool
1895ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win,
1896 Eina_Bool *request_pos,
1897 Ecore_X_Gravity *gravity,
1898 int *min_w,
1899 int *min_h,
1900 int *max_w,
1901 int *max_h,
1902 int *base_w,
1903 int *base_h,
1904 int *step_x,
1905 int *step_y,
1906 double *min_aspect,
1907 double *max_aspect);
1908EAPI void
1909ecore_x_icccm_title_set(Ecore_X_Window win,
1910 const char *t);
1911EAPI char *
1912 ecore_x_icccm_title_get(Ecore_X_Window win);
1913EAPI void
1914 ecore_x_icccm_protocol_atoms_set(Ecore_X_Window win,
1915 Ecore_X_Atom *protos,
1916 int num);
1917EAPI void
1918ecore_x_icccm_protocol_set(Ecore_X_Window win,
1919 Ecore_X_WM_Protocol protocol,
1920 Eina_Bool on);
1921EAPI Eina_Bool
1922ecore_x_icccm_protocol_isset(Ecore_X_Window win,
1923 Ecore_X_WM_Protocol protocol);
1924EAPI void
1925ecore_x_icccm_name_class_set(Ecore_X_Window win,
1926 const char *n,
1927 const char *c);
1928EAPI void
1929ecore_x_icccm_name_class_get(Ecore_X_Window win,
1930 char **n,
1931 char **c);
1932EAPI char *
1933 ecore_x_icccm_client_machine_get(Ecore_X_Window win);
1934EAPI void
1935 ecore_x_icccm_command_set(Ecore_X_Window win,
1936 int argc,
1937 char **argv);
1938EAPI void
1939ecore_x_icccm_command_get(Ecore_X_Window win,
1940 int *argc,
1941 char ***argv);
1942EAPI char *
1943 ecore_x_icccm_icon_name_get(Ecore_X_Window win);
1944EAPI void
1945 ecore_x_icccm_icon_name_set(Ecore_X_Window win,
1946 const char *t);
1947EAPI void
1948ecore_x_icccm_colormap_window_set(Ecore_X_Window win,
1949 Ecore_X_Window subwin);
1950EAPI void
1951ecore_x_icccm_colormap_window_unset(Ecore_X_Window win,
1952 Ecore_X_Window subwin);
1953EAPI void
1954ecore_x_icccm_transient_for_set(Ecore_X_Window win,
1955 Ecore_X_Window forwin);
1956EAPI void
1957 ecore_x_icccm_transient_for_unset(Ecore_X_Window win);
1958EAPI Ecore_X_Window
1959 ecore_x_icccm_transient_for_get(Ecore_X_Window win);
1960EAPI void
1961 ecore_x_icccm_window_role_set(Ecore_X_Window win,
1962 const char *role);
1963EAPI char *
1964 ecore_x_icccm_window_role_get(Ecore_X_Window win);
1965EAPI void
1966 ecore_x_icccm_client_leader_set(Ecore_X_Window win,
1967 Ecore_X_Window l);
1968EAPI Ecore_X_Window
1969 ecore_x_icccm_client_leader_get(Ecore_X_Window win);
1970EAPI void
1971 ecore_x_icccm_iconic_request_send(Ecore_X_Window win,
1972 Ecore_X_Window root);
1973
1974typedef enum _Ecore_X_MWM_Hint_Func
1975{
1976 ECORE_X_MWM_HINT_FUNC_ALL = (1 << 0),
1977 ECORE_X_MWM_HINT_FUNC_RESIZE = (1 << 1),
1978 ECORE_X_MWM_HINT_FUNC_MOVE = (1 << 2),
1979 ECORE_X_MWM_HINT_FUNC_MINIMIZE = (1 << 3),
1980 ECORE_X_MWM_HINT_FUNC_MAXIMIZE = (1 << 4),
1981 ECORE_X_MWM_HINT_FUNC_CLOSE = (1 << 5)
1982} Ecore_X_MWM_Hint_Func;
1983
1984typedef enum _Ecore_X_MWM_Hint_Decor
1985{
1986 ECORE_X_MWM_HINT_DECOR_ALL = (1 << 0),
1987 ECORE_X_MWM_HINT_DECOR_BORDER = (1 << 1),
1988 ECORE_X_MWM_HINT_DECOR_RESIZEH = (1 << 2),
1989 ECORE_X_MWM_HINT_DECOR_TITLE = (1 << 3),
1990 ECORE_X_MWM_HINT_DECOR_MENU = (1 << 4),
1991 ECORE_X_MWM_HINT_DECOR_MINIMIZE = (1 << 5),
1992 ECORE_X_MWM_HINT_DECOR_MAXIMIZE = (1 << 6)
1993} Ecore_X_MWM_Hint_Decor;
1994
1995typedef enum _Ecore_X_MWM_Hint_Input
1996{
1997 ECORE_X_MWM_HINT_INPUT_MODELESS = 0,
1998 ECORE_X_MWM_HINT_INPUT_PRIMARY_APPLICATION_MODAL = 1,
1999 ECORE_X_MWM_HINT_INPUT_SYSTEM_MODAL = 2,
2000 ECORE_X_MWM_HINT_INPUT_FULL_APPLICATION_MODAL = 3
2001} Ecore_X_MWM_Hint_Input;
2002
2003EAPI Eina_Bool
2004ecore_x_mwm_hints_get(Ecore_X_Window win,
2005 Ecore_X_MWM_Hint_Func *fhint,
2006 Ecore_X_MWM_Hint_Decor *dhint,
2007 Ecore_X_MWM_Hint_Input *ihint);
2008EAPI void
2009ecore_x_mwm_borderless_set(Ecore_X_Window win,
2010 Eina_Bool borderless);
2011
2012/* netwm */
2013EAPI void
2014 ecore_x_netwm_init(void);
2015EAPI void
2016 ecore_x_netwm_shutdown(void);
2017EAPI void
2018 ecore_x_netwm_wm_identify(Ecore_X_Window root,
2019 Ecore_X_Window check,
2020 const char *wm_name);
2021EAPI void
2022ecore_x_netwm_supported_set(Ecore_X_Window root,
2023 Ecore_X_Atom *supported,
2024 int num);
2025EAPI Eina_Bool
2026ecore_x_netwm_supported_get(Ecore_X_Window root,
2027 Ecore_X_Atom **supported,
2028 int *num);
2029EAPI void
2030ecore_x_netwm_desk_count_set(Ecore_X_Window root,
2031 unsigned int n_desks);
2032EAPI void
2033ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
2034 Ecore_X_Window *vroots,
2035 unsigned int n_desks);
2036EAPI void
2037ecore_x_netwm_desk_names_set(Ecore_X_Window root,
2038 const char **names,
2039 unsigned int n_desks);
2040EAPI void
2041ecore_x_netwm_desk_size_set(Ecore_X_Window root,
2042 unsigned int width,
2043 unsigned int height);
2044EAPI void
2045ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
2046 unsigned int *areas,
2047 unsigned int n_desks);
2048EAPI unsigned int *
2049ecore_x_netwm_desk_workareas_get(Ecore_X_Window root,
2050 unsigned int *n_desks);
2051EAPI void
2052ecore_x_netwm_desk_current_set(Ecore_X_Window root,
2053 unsigned int desk);
2054EAPI void
2055ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
2056 unsigned int *origins,
2057 unsigned int n_desks);
2058EAPI void
2059ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
2060 int orientation,
2061 int columns,
2062 int rows,
2063 int starting_corner);
2064EAPI void
2065ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
2066 Eina_Bool on);
2067EAPI void
2068ecore_x_netwm_client_list_set(Ecore_X_Window root,
2069 Ecore_X_Window *p_clients,
2070 unsigned int n_clients);
2071EAPI void
2072ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
2073 Ecore_X_Window *p_clients,
2074 unsigned int n_clients);
2075EAPI void
2076ecore_x_netwm_client_active_set(Ecore_X_Window root,
2077 Ecore_X_Window win);
2078EAPI void
2079ecore_x_netwm_client_active_request(Ecore_X_Window root,
2080 Ecore_X_Window win,
2081 int type,
2082 Ecore_X_Window current_win);
2083EAPI void
2084ecore_x_netwm_name_set(Ecore_X_Window win,
2085 const char *name);
2086EAPI int
2087ecore_x_netwm_name_get(Ecore_X_Window win,
2088 char **name);
2089EAPI void
2090ecore_x_netwm_startup_id_set(Ecore_X_Window win,
2091 const char *id);
2092EAPI int
2093ecore_x_netwm_startup_id_get(Ecore_X_Window win,
2094 char **id);
2095EAPI void
2096ecore_x_netwm_visible_name_set(Ecore_X_Window win,
2097 const char *name);
2098EAPI int
2099ecore_x_netwm_visible_name_get(Ecore_X_Window win,
2100 char **name);
2101EAPI void
2102ecore_x_netwm_icon_name_set(Ecore_X_Window win,
2103 const char *name);
2104EAPI int
2105ecore_x_netwm_icon_name_get(Ecore_X_Window win,
2106 char **name);
2107EAPI void
2108ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
2109 const char *name);
2110EAPI int
2111ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
2112 char **name);
2113EAPI void
2114ecore_x_netwm_desktop_set(Ecore_X_Window win,
2115 unsigned int desk);
2116EAPI Eina_Bool
2117ecore_x_netwm_desktop_get(Ecore_X_Window win,
2118 unsigned int *desk);
2119EAPI void
2120ecore_x_netwm_strut_set(Ecore_X_Window win,
2121 int left,
2122 int right,
2123 int top,
2124 int bottom);
2125EAPI Eina_Bool
2126ecore_x_netwm_strut_get(Ecore_X_Window win,
2127 int *left,
2128 int *right,
2129 int *top,
2130 int *bottom);
2131EAPI void
2132ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
2133 int left,
2134 int right,
2135 int top,
2136 int bottom,
2137 int left_start_y,
2138 int left_end_y,
2139 int right_start_y,
2140 int right_end_y,
2141 int top_start_x,
2142 int top_end_x,
2143 int bottom_start_x,
2144 int bottom_end_x);
2145EAPI Eina_Bool
2146ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
2147 int *left,
2148 int *right,
2149 int *top,
2150 int *bottom,
2151 int *left_start_y,
2152 int *left_end_y,
2153 int *right_start_y,
2154 int *right_end_y,
2155 int *top_start_x,
2156 int *top_end_x,
2157 int *bottom_start_x,
2158 int *bottom_end_x);
2159
2160EAPI Eina_Bool
2161ecore_x_netwm_icons_get(Ecore_X_Window win,
2162 Ecore_X_Icon **icon,
2163 int *num);
2164EAPI void
2165ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
2166 int x,
2167 int y,
2168 int width,
2169 int height);
2170EAPI Eina_Bool
2171ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
2172 int *x,
2173 int *y,
2174 int *width,
2175 int *height);
2176EAPI void
2177ecore_x_netwm_pid_set(Ecore_X_Window win,
2178 int pid);
2179EAPI Eina_Bool
2180ecore_x_netwm_pid_get(Ecore_X_Window win,
2181 int *pid);
2182EAPI void
2183 ecore_x_netwm_handled_icons_set(Ecore_X_Window win);
2184EAPI Eina_Bool
2185 ecore_x_netwm_handled_icons_get(Ecore_X_Window win);
2186EAPI void
2187 ecore_x_netwm_user_time_set(Ecore_X_Window win,
2188 unsigned int time);
2189EAPI Eina_Bool
2190ecore_x_netwm_user_time_get(Ecore_X_Window win,
2191 unsigned int *time);
2192EAPI void
2193ecore_x_netwm_window_state_set(Ecore_X_Window win,
2194 Ecore_X_Window_State *state,
2195 unsigned int num);
2196EAPI Eina_Bool
2197ecore_x_netwm_window_state_get(Ecore_X_Window win,
2198 Ecore_X_Window_State **state,
2199 unsigned int *num);
2200EAPI void
2201ecore_x_netwm_window_type_set(Ecore_X_Window win,
2202 Ecore_X_Window_Type type);
2203EAPI Eina_Bool
2204ecore_x_netwm_window_type_get(Ecore_X_Window win,
2205 Ecore_X_Window_Type *type);
2206EAPI int
2207ecore_x_netwm_window_types_get(Ecore_X_Window win,
2208 Ecore_X_Window_Type **types);
2209EAPI Eina_Bool
2210ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
2211 Ecore_X_Action action);
2212EAPI void
2213ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
2214 Ecore_X_Action *action,
2215 unsigned int num);
2216EAPI Eina_Bool
2217ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
2218 Ecore_X_Action **action,
2219 unsigned int *num);
2220EAPI void
2221ecore_x_netwm_opacity_set(Ecore_X_Window win,
2222 unsigned int opacity);
2223EAPI Eina_Bool
2224ecore_x_netwm_opacity_get(Ecore_X_Window win,
2225 unsigned int *opacity);
2226EAPI void
2227ecore_x_netwm_frame_size_set(Ecore_X_Window win,
2228 int fl,
2229 int fr,
2230 int ft,
2231 int fb);
2232EAPI Eina_Bool
2233ecore_x_netwm_frame_size_get(Ecore_X_Window win,
2234 int *fl,
2235 int *fr,
2236 int *ft,
2237 int *fb);
2238EAPI Eina_Bool
2239ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
2240 Ecore_X_Sync_Counter *counter);
2241EAPI void
2242 ecore_x_netwm_ping_send(Ecore_X_Window win);
2243EAPI void
2244 ecore_x_netwm_sync_request_send(Ecore_X_Window win,
2245 unsigned int serial);
2246EAPI void
2247ecore_x_netwm_state_request_send(Ecore_X_Window win,
2248 Ecore_X_Window root,
2249 Ecore_X_Window_State s1,
2250 Ecore_X_Window_State s2,
2251 Eina_Bool set);
2252EAPI void
2253ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
2254 Ecore_X_Window root,
2255 unsigned int desktop);
2256
2257EAPI void
2258 ecore_x_e_init(void);
2259EAPI void
2260 ecore_x_e_frame_size_set(Ecore_X_Window win,
2261 int fl,
2262 int fr,
2263 int ft,
2264 int fb);
2265EAPI void
2266ecore_x_e_virtual_keyboard_set(Ecore_X_Window win,
2267 unsigned int is_keyboard);
2268EAPI Eina_Bool
2269 ecore_x_e_virtual_keyboard_get(Ecore_X_Window win);
2270EAPI void
2271 ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win,
2272 Ecore_X_Virtual_Keyboard_State state);
2273EAPI Ecore_X_Virtual_Keyboard_State
2274 ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win);
2275EAPI void
2276 ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win,
2277 Ecore_X_Virtual_Keyboard_State state);
2278
2279/* Illume functions */
2280EAPI void
2281ecore_x_e_illume_zone_set(Ecore_X_Window win,
2282 Ecore_X_Window zone);
2283EAPI Ecore_X_Window
2284 ecore_x_e_illume_zone_get(Ecore_X_Window win);
2285EAPI void
2286 ecore_x_e_illume_zone_list_set(Ecore_X_Window win,
2287 Ecore_X_Window *zones,
2288 unsigned int n_zones);
2289EAPI void
2290ecore_x_e_illume_conformant_set(Ecore_X_Window win,
2291 unsigned int is_conformant);
2292EAPI Eina_Bool
2293 ecore_x_e_illume_conformant_get(Ecore_X_Window win);
2294EAPI void
2295 ecore_x_e_illume_mode_set(Ecore_X_Window win,
2296 Ecore_X_Illume_Mode mode);
2297EAPI Ecore_X_Illume_Mode
2298 ecore_x_e_illume_mode_get(Ecore_X_Window win);
2299EAPI void
2300 ecore_x_e_illume_mode_send(Ecore_X_Window win,
2301 Ecore_X_Illume_Mode mode);
2302EAPI void
2303 ecore_x_e_illume_focus_back_send(Ecore_X_Window win);
2304EAPI void
2305 ecore_x_e_illume_focus_forward_send(Ecore_X_Window win);
2306EAPI void
2307 ecore_x_e_illume_focus_home_send(Ecore_X_Window win);
2308EAPI void
2309 ecore_x_e_illume_close_send(Ecore_X_Window win);
2310EAPI void
2311 ecore_x_e_illume_home_new_send(Ecore_X_Window win);
2312EAPI void
2313 ecore_x_e_illume_home_del_send(Ecore_X_Window win);
2314EAPI void
2315 ecore_x_e_illume_drag_set(Ecore_X_Window win,
2316 unsigned int drag);
2317EAPI Eina_Bool
2318 ecore_x_e_illume_drag_get(Ecore_X_Window win);
2319EAPI void
2320 ecore_x_e_illume_drag_locked_set(Ecore_X_Window win,
2321 unsigned int is_locked);
2322EAPI Eina_Bool
2323 ecore_x_e_illume_drag_locked_get(Ecore_X_Window win);
2324EAPI void
2325 ecore_x_e_illume_drag_start_send(Ecore_X_Window win);
2326EAPI void
2327 ecore_x_e_illume_drag_end_send(Ecore_X_Window win);
2328EAPI void
2329 ecore_x_e_illume_indicator_geometry_set(Ecore_X_Window win,
2330 int x,
2331 int y,
2332 int w,
2333 int h);
2334EAPI Eina_Bool
2335ecore_x_e_illume_indicator_geometry_get(Ecore_X_Window win,
2336 int *x,
2337 int *y,
2338 int *w,
2339 int *h);
2340EAPI void
2341ecore_x_e_illume_softkey_geometry_set(Ecore_X_Window win,
2342 int x,
2343 int y,
2344 int w,
2345 int h);
2346EAPI Eina_Bool
2347ecore_x_e_illume_softkey_geometry_get(Ecore_X_Window win,
2348 int *x,
2349 int *y,
2350 int *w,
2351 int *h);
2352EAPI void
2353ecore_x_e_illume_keyboard_geometry_set(Ecore_X_Window win,
2354 int x,
2355 int y,
2356 int w,
2357 int h);
2358EAPI Eina_Bool
2359ecore_x_e_illume_keyboard_geometry_get(Ecore_X_Window win,
2360 int *x,
2361 int *y,
2362 int *w,
2363 int *h);
2364EAPI void
2365ecore_x_e_illume_quickpanel_set(Ecore_X_Window win,
2366 unsigned int is_quickpanel);
2367EAPI Eina_Bool
2368 ecore_x_e_illume_quickpanel_get(Ecore_X_Window win);
2369EAPI void
2370 ecore_x_e_illume_quickpanel_state_set(Ecore_X_Window win,
2371 Ecore_X_Illume_Quickpanel_State state);
2372EAPI Ecore_X_Illume_Quickpanel_State
2373 ecore_x_e_illume_quickpanel_state_get(Ecore_X_Window win);
2374EAPI void
2375 ecore_x_e_illume_quickpanel_state_send(Ecore_X_Window win,
2376 Ecore_X_Illume_Quickpanel_State state);
2377EAPI void
2378 ecore_x_e_illume_quickpanel_state_toggle(Ecore_X_Window win);
2379EAPI void
2380 ecore_x_e_illume_quickpanel_priority_major_set(Ecore_X_Window win,
2381 unsigned int priority);
2382EAPI int
2383 ecore_x_e_illume_quickpanel_priority_major_get(Ecore_X_Window win);
2384EAPI void
2385 ecore_x_e_illume_quickpanel_priority_minor_set(Ecore_X_Window win,
2386 unsigned int priority);
2387EAPI int
2388 ecore_x_e_illume_quickpanel_priority_minor_get(Ecore_X_Window win);
2389EAPI void
2390 ecore_x_e_illume_quickpanel_zone_set(Ecore_X_Window win,
2391 unsigned int zone);
2392EAPI int
2393 ecore_x_e_illume_quickpanel_zone_get(Ecore_X_Window win);
2394EAPI void
2395 ecore_x_e_illume_quickpanel_zone_request_send(Ecore_X_Window win);
2396EAPI void
2397 ecore_x_e_illume_quickpanel_position_update_send(Ecore_X_Window win);
2398
2399EAPI void
2400ecore_x_e_comp_sync_counter_set(Ecore_X_Window win,
2401 Ecore_X_Sync_Counter counter);
2402EAPI Ecore_X_Sync_Counter
2403 ecore_x_e_comp_sync_counter_get(Ecore_X_Window win);
2404EAPI void
2405 ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window root,
2406 Ecore_X_Window win);
2407EAPI void
2408ecore_x_e_comp_sync_draw_size_done_send(Ecore_X_Window root,
2409 Ecore_X_Window win,
2410 int w,
2411 int h);
2412EAPI void
2413ecore_x_e_comp_sync_supported_set(Ecore_X_Window root,
2414 Eina_Bool enabled);
2415EAPI Eina_Bool
2416 ecore_x_e_comp_sync_supported_get(Ecore_X_Window root);
2417EAPI void
2418 ecore_x_e_comp_sync_begin_send(Ecore_X_Window win);
2419EAPI void
2420 ecore_x_e_comp_sync_end_send(Ecore_X_Window win);
2421EAPI void
2422 ecore_x_e_comp_sync_cancel_send(Ecore_X_Window win);
2423
2424EAPI void
2425 ecore_x_e_comp_flush_send(Ecore_X_Window win);
2426EAPI void
2427 ecore_x_e_comp_dump_send(Ecore_X_Window win);
2428EAPI void
2429 ecore_x_e_comp_pixmap_set(Ecore_X_Window win,
2430 Ecore_X_Pixmap pixmap);
2431EAPI Ecore_X_Pixmap
2432ecore_x_e_comp_pixmap_get(Ecore_X_Window win);
2433
2434EAPI Ecore_X_Sync_Alarm
2435 ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter);
2436EAPI Eina_Bool
2437 ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm);
2438EAPI Eina_Bool
2439 ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
2440 unsigned int *val);
2441EAPI Ecore_X_Sync_Counter
2442 ecore_x_sync_counter_new(int val);
2443EAPI void
2444 ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter);
2445EAPI void
2446 ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
2447 int by);
2448EAPI void
2449ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
2450 int val);
2451
2452EAPI void
2453ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
2454 int val);
2455EAPI void
2456ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
2457 int val_hi,
2458 unsigned int val_lo);
2459EAPI Eina_Bool
2460ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
2461 int *val_hi,
2462 unsigned int *val_lo);
2463
2464EAPI int
2465 ecore_x_xinerama_screen_count_get(void);
2466EAPI Eina_Bool
2467 ecore_x_xinerama_screen_geometry_get(int screen,
2468 int *x,
2469 int *y,
2470 int *w,
2471 int *h);
2472
2473EAPI Eina_Bool
2474 ecore_x_screensaver_event_available_get(void);
2475EAPI int
2476 ecore_x_screensaver_idle_time_get(void);
2477EAPI void
2478 ecore_x_screensaver_set(int timeout,
2479 int interval,
2480 int prefer_blanking,
2481 int allow_exposures);
2482EAPI void
2483 ecore_x_screensaver_timeout_set(int timeout);
2484EAPI int
2485 ecore_x_screensaver_timeout_get(void);
2486EAPI void
2487 ecore_x_screensaver_blank_set(int timeout);
2488EAPI int
2489 ecore_x_screensaver_blank_get(void);
2490EAPI void
2491 ecore_x_screensaver_expose_set(int timeout);
2492EAPI int
2493 ecore_x_screensaver_expose_get(void);
2494EAPI void
2495 ecore_x_screensaver_interval_set(int timeout);
2496EAPI int
2497 ecore_x_screensaver_interval_get(void);
2498EAPI void
2499 ecore_x_screensaver_event_listen_set(Eina_Bool on);
2500
2501/* FIXME: these funcs need categorising */
2502
2503typedef struct _Ecore_X_Window_Attributes
2504{
2505 Ecore_X_Window root;
2506 int x, y, w, h;
2507 int border;
2508 int depth;
2509 Eina_Bool visible : 1;
2510 Eina_Bool viewable : 1;
2511 Eina_Bool override : 1;
2512 Eina_Bool input_only : 1;
2513 Eina_Bool save_under : 1;
2514 struct
2515 {
2516 Ecore_X_Event_Mask mine;
2517 Ecore_X_Event_Mask all;
2518 Ecore_X_Event_Mask no_propagate;
2519 } event_mask;
2520 Ecore_X_Gravity window_gravity;
2521 Ecore_X_Gravity pixel_gravity;
2522 Ecore_X_Colormap colormap;
2523 Ecore_X_Visual visual;
2524 /* FIXME: missing
2525 * int map_installed;
2526 * Screen *screen;
2527 */
2528} Ecore_X_Window_Attributes;
2529
2530EAPI Eina_Bool
2531ecore_x_window_attributes_get(Ecore_X_Window win,
2532 Ecore_X_Window_Attributes *att_ret);
2533EAPI void
2534 ecore_x_window_save_set_add(Ecore_X_Window win);
2535EAPI void
2536 ecore_x_window_save_set_del(Ecore_X_Window win);
2537EAPI Ecore_X_Window *
2538 ecore_x_window_children_get(Ecore_X_Window win,
2539 int *num);
2540
2541EAPI Eina_Bool
2542ecore_x_pointer_control_set(int accel_num,
2543 int accel_denom,
2544 int threshold);
2545EAPI Eina_Bool
2546ecore_x_pointer_control_get(int *accel_num,
2547 int *accel_denom,
2548 int *threshold);
2549EAPI Eina_Bool
2550ecore_x_pointer_mapping_set(unsigned char *map,
2551 int nmap);
2552EAPI Eina_Bool
2553ecore_x_pointer_mapping_get(unsigned char *map,
2554 int nmap);
2555EAPI Eina_Bool
2556 ecore_x_pointer_grab(Ecore_X_Window win);
2557EAPI Eina_Bool
2558 ecore_x_pointer_confine_grab(Ecore_X_Window win);
2559EAPI void
2560 ecore_x_pointer_ungrab(void);
2561EAPI Eina_Bool
2562 ecore_x_pointer_warp(Ecore_X_Window win,
2563 int x,
2564 int y);
2565EAPI Eina_Bool
2566 ecore_x_keyboard_grab(Ecore_X_Window win);
2567EAPI void
2568 ecore_x_keyboard_ungrab(void);
2569EAPI void
2570 ecore_x_grab(void);
2571EAPI void
2572 ecore_x_ungrab(void);
2573EAPI void
2574 ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data,
2575 int event_type,
2576 void *event),
2577 void *data);
2578EAPI void
2579ecore_x_window_button_grab(Ecore_X_Window win,
2580 int button,
2581 Ecore_X_Event_Mask event_mask,
2582 int mod,
2583 int any_mod);
2584EAPI void
2585ecore_x_window_button_ungrab(Ecore_X_Window win,
2586 int button,
2587 int mod,
2588 int any_mod);
2589EAPI void
2590ecore_x_window_key_grab(Ecore_X_Window win,
2591 const char *key,
2592 int mod,
2593 int any_mod);
2594EAPI void
2595ecore_x_window_key_ungrab(Ecore_X_Window win,
2596 const char *key,
2597 int mod,
2598 int any_mod);
2599
2600EAPI void
2601 ecore_x_focus_reset(void);
2602EAPI void
2603 ecore_x_events_allow_all(void);
2604EAPI void
2605 ecore_x_pointer_last_xy_get(int *x,
2606 int *y);
2607EAPI void
2608ecore_x_pointer_xy_get(Ecore_X_Window win,
2609 int *x,
2610 int *y);
2611
2612/* ecore_x_region.c */
2613EAPI Ecore_X_XRegion *
2614 ecore_x_xregion_new(void);
2615EAPI void
2616 ecore_x_xregion_free(Ecore_X_XRegion *region);
2617EAPI Eina_Bool
2618 ecore_x_xregion_set(Ecore_X_XRegion *region,
2619 Ecore_X_GC gc);
2620EAPI void
2621ecore_x_xregion_translate(Ecore_X_XRegion *region,
2622 int x,
2623 int y);
2624EAPI Eina_Bool
2625ecore_x_xregion_intersect(Ecore_X_XRegion *dst,
2626 Ecore_X_XRegion *r1,
2627 Ecore_X_XRegion *r2);
2628EAPI Eina_Bool
2629ecore_x_xregion_union(Ecore_X_XRegion *dst,
2630 Ecore_X_XRegion *r1,
2631 Ecore_X_XRegion *r2);
2632EAPI Eina_Bool
2633ecore_x_xregion_union_rect(Ecore_X_XRegion *dst,
2634 Ecore_X_XRegion *src,
2635 Ecore_X_Rectangle *rect);
2636EAPI Eina_Bool
2637ecore_x_xregion_subtract(Ecore_X_XRegion *dst,
2638 Ecore_X_XRegion *r1,
2639 Ecore_X_XRegion *r2);
2640EAPI Eina_Bool
2641 ecore_x_xregion_is_empty(Ecore_X_XRegion *region);
2642EAPI Eina_Bool
2643 ecore_x_xregion_is_equal(Ecore_X_XRegion *r1,
2644 Ecore_X_XRegion *r2);
2645EAPI Eina_Bool
2646ecore_x_xregion_point_contain(Ecore_X_XRegion *region,
2647 int x,
2648 int y);
2649EAPI Eina_Bool
2650ecore_x_xregion_rect_contain(Ecore_X_XRegion *region,
2651 Ecore_X_Rectangle *rect);
2652
2653/* ecore_x_randr.c */
2654
2655/* The usage of 'Ecore_X_Randr_None' or 'Ecore_X_Randr_Unset'
2656 * depends on the context. In most cases 'Ecore_X_Randr_Unset'
2657 * can be used, but in some cases -1 is a special value to
2658 * functions, thus 'Ecore_X_Randr_None' (=0) musst be used.
2659 */
2660
2661typedef short Ecore_X_Randr_Refresh_Rate;
2662typedef int Ecore_X_Randr_Crtc_Gamma;
2663typedef int Ecore_X_Randr_Signal_Format;
2664typedef int Ecore_X_Randr_Signal_Property;
2665typedef int Ecore_X_Randr_Connector_Type;
2666
2667typedef struct _Ecore_X_Randr_Mode_Info
2668{
2669 Ecore_X_ID xid;
2670 unsigned int width;
2671 unsigned int height;
2672 unsigned long dotClock;
2673 unsigned int hSyncStart;
2674 unsigned int hSyncEnd;
2675 unsigned int hTotal;
2676 unsigned int hSkew;
2677 unsigned int vSyncStart;
2678 unsigned int vSyncEnd;
2679 unsigned int vTotal;
2680 char *name;
2681 unsigned int nameLength;
2682 unsigned long modeFlags;
2683} Ecore_X_Randr_Mode_Info;
2684
2685EAPI int
2686 ecore_x_randr_version_get(void);
2687EAPI Eina_Bool
2688 ecore_x_randr_query(void);
2689
2690/* ecore_x_randr_11.c */
2691EAPI Ecore_X_Randr_Orientation
2692 ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root);
2693EAPI Ecore_X_Randr_Orientation
2694 ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root);
2695EAPI Eina_Bool
2696 ecore_x_randr_screen_primary_output_orientation_set(Ecore_X_Window root,
2697 Ecore_X_Randr_Orientation orientation);
2698EAPI Ecore_X_Randr_Screen_Size_MM *
2699ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root,
2700 int *num);
2701EAPI void
2702ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root,
2703 int *w,
2704 int *h,
2705 int *w_mm,
2706 int *h_mm,
2707 int *size_index);
2708EAPI Eina_Bool
2709ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root,
2710 int size_index);
2711EAPI Ecore_X_Randr_Refresh_Rate
2712 ecore_x_randr_screen_primary_output_current_refresh_rate_get(Ecore_X_Window root);
2713EAPI Ecore_X_Randr_Refresh_Rate *
2714 ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root,
2715 int size_index,
2716 int *num);
2717EAPI Eina_Bool
2718ecore_x_randr_screen_primary_output_refresh_rate_set(Ecore_X_Window root,
2719 int size_index,
2720 Ecore_X_Randr_Refresh_Rate rate);
2721
2722/* ecore_x_randr_12.c */
2723EAPI void
2724ecore_x_randr_events_select(Ecore_X_Window win,
2725 Eina_Bool on);
2726
2727EAPI void
2728ecore_x_randr_screen_current_size_get(Ecore_X_Window root,
2729 int *w,
2730 int *h,
2731 int *w_mm,
2732 int *h_mm);
2733EAPI void
2734ecore_x_randr_screen_size_range_get(Ecore_X_Window root,
2735 int *wmin,
2736 int *hmin,
2737 int *wmax,
2738 int *hmax);
2739EAPI void
2740 ecore_x_randr_screen_reset(Ecore_X_Window root);
2741EAPI Eina_Bool
2742 ecore_x_randr_screen_current_size_set(Ecore_X_Window root,
2743 int w,
2744 int h,
2745 int w_mm,
2746 int h_mm);
2747EAPI Ecore_X_Randr_Mode_Info **
2748ecore_x_randr_modes_info_get(Ecore_X_Window root,
2749 int *num);
2750EAPI Ecore_X_Randr_Mode_Info *
2751ecore_x_randr_mode_info_get(Ecore_X_Window root,
2752 Ecore_X_Randr_Mode mode);
2753EAPI void
2754 ecore_x_randr_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info);
2755EAPI Ecore_X_Randr_Crtc *
2756 ecore_x_randr_crtcs_get(Ecore_X_Window root,
2757 int *num);
2758EAPI Ecore_X_Randr_Output *ecore_x_randr_outputs_get(Ecore_X_Window root,
2759 int *num);
2760EAPI Ecore_X_Randr_Output *
2761ecore_x_randr_window_outputs_get(Ecore_X_Window window,
2762 int *num);
2763EINA_DEPRECATED EAPI Ecore_X_Randr_Output *
2764ecore_x_randr_current_output_get(Ecore_X_Window window,
2765 int *num);
2766EAPI Ecore_X_Randr_Crtc *
2767ecore_x_randr_current_crtc_get(Ecore_X_Window window,
2768 int *num);
2769EAPI Ecore_X_Randr_Output *
2770ecore_x_randr_crtc_outputs_get(Ecore_X_Window root,
2771 Ecore_X_Randr_Crtc crtc,
2772 int *num);
2773EAPI Ecore_X_Randr_Output *
2774ecore_x_randr_crtc_possible_outputs_get(Ecore_X_Window root,
2775 Ecore_X_Randr_Crtc crtc,
2776 int *num);
2777EAPI void
2778ecore_x_randr_crtc_geometry_get(Ecore_X_Window root,
2779 Ecore_X_Randr_Crtc crtc,
2780 int *x,
2781 int *y,
2782 int *w,
2783 int *h);
2784EAPI void
2785ecore_x_randr_crtc_pos_get(Ecore_X_Window root,
2786 Ecore_X_Randr_Crtc crtc,
2787 int *x,
2788 int *y);
2789EAPI Eina_Bool
2790ecore_x_randr_crtc_pos_set(Ecore_X_Window root,
2791 Ecore_X_Randr_Crtc crtc,
2792 int x,
2793 int y);
2794EAPI Ecore_X_Randr_Mode
2795ecore_x_randr_crtc_mode_get(Ecore_X_Window root,
2796 Ecore_X_Randr_Crtc crtc);
2797EAPI Eina_Bool
2798ecore_x_randr_crtc_mode_set(Ecore_X_Window root,
2799 Ecore_X_Randr_Crtc crtc,
2800 Ecore_X_Randr_Output *outputs,
2801 int noutputs,
2802 Ecore_X_Randr_Mode mode);
2803EAPI void
2804ecore_x_randr_crtc_size_get(Ecore_X_Window root,
2805 Ecore_X_Randr_Crtc crtc,
2806 int *w,
2807 int *h);
2808EAPI Ecore_X_Randr_Refresh_Rate
2809ecore_x_randr_crtc_refresh_rate_get(Ecore_X_Window root,
2810 Ecore_X_Randr_Crtc crtc,
2811 Ecore_X_Randr_Mode mode);
2812EAPI Ecore_X_Randr_Orientation
2813ecore_x_randr_crtc_orientations_get(Ecore_X_Window root,
2814 Ecore_X_Randr_Crtc crtc);
2815EAPI Ecore_X_Randr_Orientation
2816ecore_x_randr_crtc_orientation_get(Ecore_X_Window root,
2817 Ecore_X_Randr_Crtc crtc);
2818EAPI Eina_Bool
2819ecore_x_randr_crtc_orientation_set(Ecore_X_Window root,
2820 Ecore_X_Randr_Crtc crtc,
2821 const Ecore_X_Randr_Orientation orientation);
2822EAPI Eina_Bool
2823ecore_x_randr_crtc_clone_set(Ecore_X_Window root,
2824 Ecore_X_Randr_Crtc original,
2825 Ecore_X_Randr_Crtc clone);
2826EAPI Eina_Bool
2827ecore_x_randr_crtc_settings_set(Ecore_X_Window root,
2828 Ecore_X_Randr_Crtc crtc,
2829 Ecore_X_Randr_Output *outputs,
2830 int noutputs,
2831 int x,
2832 int y,
2833 Ecore_X_Randr_Mode mode,
2834 Ecore_X_Randr_Orientation orientation);
2835EAPI Eina_Bool
2836ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window root,
2837 Ecore_X_Randr_Crtc crtc_r1,
2838 Ecore_X_Randr_Crtc crtc_r2,
2839 Ecore_X_Randr_Output_Policy policy,
2840 Ecore_X_Randr_Relative_Alignment alignment);
2841EAPI Ecore_X_Randr_Mode *
2842ecore_x_randr_output_modes_get(Ecore_X_Window root,
2843 Ecore_X_Randr_Output output,
2844 int *num,
2845 int *npreferred);
2846EAPI Ecore_X_Randr_Output *ecore_x_randr_output_clones_get(Ecore_X_Window root,
2847 Ecore_X_Randr_Output output,
2848 int *num);
2849EAPI Ecore_X_Randr_Crtc *ecore_x_randr_output_possible_crtcs_get(Ecore_X_Window root,
2850 Ecore_X_Randr_Output output,
2851 int *num);
2852EAPI Ecore_X_Randr_Crtc
2853ecore_x_randr_output_crtc_get(Ecore_X_Window root,
2854 Ecore_X_Randr_Output output);
2855EAPI char *
2856ecore_x_randr_output_name_get(Ecore_X_Window root,
2857 Ecore_X_Randr_Output output,
2858 int *len);
2859EAPI int
2860 ecore_x_randr_crtc_gamma_ramp_size_get(Ecore_X_Randr_Crtc crtc);
2861EAPI Ecore_X_Randr_Crtc_Gamma **
2862 ecore_x_randr_crtc_gamma_ramps_get(Ecore_X_Randr_Crtc crtc);
2863EAPI Eina_Bool
2864 ecore_x_randr_crtc_gamma_ramps_set(Ecore_X_Randr_Crtc crtc,
2865 const Ecore_X_Randr_Crtc_Gamma *red,
2866 const Ecore_X_Randr_Crtc_Gamma *green,
2867 const Ecore_X_Randr_Crtc_Gamma *blue);
2868EAPI Eina_Bool
2869ecore_x_randr_move_all_crtcs_but(Ecore_X_Window root,
2870 const Ecore_X_Randr_Crtc *not_moved,
2871 int nnot_moved,
2872 int dx,
2873 int dy);
2874EAPI Eina_Bool
2875ecore_x_randr_move_crtcs(Ecore_X_Window root,
2876 const Ecore_X_Randr_Crtc *crtcs,
2877 int ncrtc,
2878 int dx,
2879 int dy);
2880EAPI void
2881ecore_x_randr_mode_size_get(Ecore_X_Window root,
2882 Ecore_X_Randr_Mode mode,
2883 int *w,
2884 int *h);
2885EAPI Ecore_X_Randr_Connection_Status
2886ecore_x_randr_output_connection_status_get(Ecore_X_Window root,
2887 Ecore_X_Randr_Output output);
2888EAPI void
2889ecore_x_randr_output_size_mm_get(Ecore_X_Window root,
2890 Ecore_X_Randr_Output output,
2891 int *w,
2892 int *h);
2893EAPI Eina_Bool
2894ecore_x_randr_output_crtc_set(Ecore_X_Window root,
2895 Ecore_X_Randr_Output output,
2896 const Ecore_X_Randr_Crtc crtc);
2897
2898/* ecore_x_randr_12_edid.c */
2899
2900/*
2901 * @brief Validates the header from raw EDID data.
2902 *
2903 * @param edid the edid structure
2904 * @param edid_length length of the edid structure
2905 * @return EINA_TRUE, if the header is valid. Else EINA_FALSE.
2906 */
2907EAPI Eina_Bool
2908ecore_x_randr_edid_has_valid_header(unsigned char *edid,
2909 unsigned long edid_length);
2910
2911/*
2912 * @brief Checks whether a display's EDID has a valid checksum.
2913 *
2914 * @param edid the edid structure
2915 * @param edid_length length of the edid structure
2916 * @return EINA_TRUE, if the checksum is valid. Else EINA_FALSE.
2917 */
2918EAPI Eina_Bool
2919ecore_x_randr_edid_info_has_valid_checksum(unsigned char *edid,
2920 unsigned long edid_length);
2921
2922/*
2923 * @brief Get the encoded version from raw EDID data.
2924 *
2925 * The return value has the minor version in the lowest 8 bits, and the major
2926 * version in all the rest of the bits. i.e.
2927 *
2928 * minor = (version & 0x000000ff);
2929 * major = (version & 0xffffff00) >> 8;
2930 *
2931 * @param edid the edid structure
2932 * @param edid_length length of the edid structure
2933 * @return The encoded major and minor version encasuplated an int.
2934 */
2935EAPI int
2936ecore_x_randr_edid_version_get(unsigned char *edid,
2937 unsigned long edid_length);
2938
2939/*
2940 * @brief Get the encoded manufacturer from raw EDID data.
2941 *
2942 * @param edid the edid structure
2943 * @param edid_length length of the edid structure
2944 * @return The encoded manufacturer identifier.
2945 */
2946EAPI char *
2947ecore_x_randr_edid_manufacturer_name_get(unsigned char *edid,
2948 unsigned long edid_length);
2949
2950/*
2951 * @brief Get the encoded name from raw EDID data.
2952 *
2953 * @param edid the edid structure
2954 * @param edid_length length of the edid structure
2955 * @return The encoded manufacturer identifier.
2956 */
2957EAPI char *
2958ecore_x_randr_edid_display_name_get(unsigned char *edid,
2959 unsigned long edid_length);
2960
2961/*
2962 * @brief Get the encoded ASCII from raw EDID data.
2963 *
2964 * @param edid the edid structure
2965 * @param edid_length length of the edid structure
2966 * @return The encoded ASCII display identifier.
2967 */
2968EAPI char *
2969ecore_x_randr_edid_display_ascii_get(unsigned char *edid,
2970 unsigned long edid_length);
2971
2972/*
2973 * @brief Get the encoded serial identifier from raw EDID data.
2974 *
2975 * @param edid the edid structure
2976 * @param edid_length length of the edid structure
2977 * @return The encoded serial identifier.
2978 */
2979EAPI char *
2980ecore_x_randr_edid_display_serial_get(unsigned char *edid,
2981 unsigned long edid_length);
2982
2983/*
2984 * @brief Get the encoded model number from raw EDID data.
2985 *
2986 * The manufacturer ID table is necessary for a useful description.
2987 *
2988 * @param edid the edid structure
2989 * @param edid_length length of the edid structure
2990 * @return The encoded model number.
2991 */
2992EAPI int
2993ecore_x_randr_edid_model_get(unsigned char *edid,
2994 unsigned long edid_length);
2995
2996/*
2997 * @brief Get the manufacturer serial number from raw EDID data.
2998 *
2999 * @param edid the edid structure
3000 * @param edid_length length of the edid structure
3001 * @return The encoded serial manufacturer serial number.
3002 */
3003EAPI int
3004ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char *edid,
3005 unsigned long edid_length);
3006
3007/*
3008 * @brief Get the manufacturer model number from raw EDID data.
3009 *
3010 * @param edid the edid structure
3011 * @param edid_length length of the edid structure
3012 * @return The manufacturer's model number.
3013 */
3014EAPI int
3015ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid,
3016 unsigned long edid_length);
3017
3018/*
3019 * @brief Looks up the DPMS support from raw EDID data.
3020 *
3021 * @param edid the edid structure
3022 * @param edid_length length of the edid structure
3023 * @return EINA_TRUE, if DPMS is supported in some way. Else EINA_FALSE.
3024 */
3025EAPI Eina_Bool
3026ecore_x_randr_edid_dpms_available_get(unsigned char *edid,
3027 unsigned long edid_length);
3028
3029/*
3030 * @brief Looks up the DPMS Standby support from raw EDID data.
3031 *
3032 * @param edid the edid structure
3033 * @param edid_length length of the edid structure
3034 * @return EINA_TRUE, if DPMS Standby is supported. Else EINA_FALSE.
3035 */
3036EAPI Eina_Bool
3037ecore_x_randr_edid_dpms_standby_available_get(unsigned char *edid,
3038 unsigned long edid_length);
3039
3040/*
3041 * @brief Looks up the DPMS Suspend support from raw EDID data.
3042 *
3043 * @param edid the edid structure
3044 * @param edid_length length of the edid structure
3045 * @return EINA_TRUE, if DPMS Suspend is supported. Else EINA_FALSE.
3046 */
3047EAPI Eina_Bool
3048ecore_x_randr_edid_dpms_suspend_available_get(unsigned char *edid,
3049 unsigned long edid_length);
3050
3051/*
3052 * @brief Looks up the DPMS Off support from raw EDID data.
3053 *
3054 * @param edid the edid structure
3055 * @param edid_length length of the edid structure
3056 * @return EINA_TRUE, if DPMS Off is supported. Else EINA_FALSE.
3057 */
3058EAPI Eina_Bool
3059ecore_x_randr_edid_dpms_off_available_get(unsigned char *edid,
3060 unsigned long edid_length);
3061
3062/*
3063 * @brief Get the preferred aspect ratio from raw EDID data.
3064 *
3065 * @param edid the edid structure
3066 * @param edid_length length of the edid structure
3067 * @return The preferred aspect ratio.
3068 */
3069EAPI Ecore_X_Randr_Edid_Aspect_Ratio
3070ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid,
3071 unsigned long edid_length);
3072
3073/*
3074 * @brief Get the supported aspect ratios from raw EDID data.
3075 *
3076 * @param edid the edid structure
3077 * @param edid_length length of the edid structure
3078 * @return The supported aspect ratios.
3079 */
3080EAPI Ecore_X_Randr_Edid_Aspect_Ratio
3081ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid,
3082 unsigned long edid_length);
3083
3084/*
3085 * @brief Get the supported colorschemes from raw EDID data.
3086 *
3087 * @param edid the edid structure
3088 * @param edid_length length of the edid structure
3089 * @return The supported colorschemes.
3090 */
3091EAPI Ecore_X_Randr_Edid_Display_Colorscheme
3092ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid,
3093 unsigned long edid_length);
3094
3095/*
3096 * @brief Get the display type from raw EDID data.
3097 *
3098 * @param edid the edid structure
3099 * @param edid_length length of the edid structure
3100 * @return EINA_TRUE, if the display is a digital one. Else EINA_FALSE.
3101 */
3102EAPI Eina_Bool
3103ecore_x_randr_edid_display_type_digital_get(unsigned char *edid,
3104 unsigned long edid_length);
3105
3106/*
3107 * @brief Get the display interface type from raw EDID data.
3108 *
3109 * @param edid the edid structure
3110 * @param edid_length length of the edid structure
3111 * @return The interface type.
3112 */
3113EAPI Ecore_X_Randr_Edid_Display_Interface_Type
3114ecore_x_randr_edid_display_interface_type_get(unsigned char *edid,
3115 unsigned long edid_length);
3116
3117/* ecore_x_randr_13.c */
3118EAPI void
3119ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root,
3120 double level);
3121EAPI double
3122ecore_x_randr_output_backlight_level_get(Ecore_X_Window root,
3123 Ecore_X_Randr_Output output);
3124EAPI Eina_Bool
3125ecore_x_randr_output_backlight_level_set(Ecore_X_Window root,
3126 Ecore_X_Randr_Output output,
3127 double level);
3128EAPI Ecore_X_Randr_Output
3129 ecore_x_randr_primary_output_get(Ecore_X_Window root);
3130EAPI void
3131 ecore_x_randr_primary_output_set(Ecore_X_Window root,
3132 Ecore_X_Randr_Output output);
3133EAPI Ecore_X_Render_Subpixel_Order
3134ecore_x_randr_output_subpixel_order_get(Ecore_X_Window root,
3135 Ecore_X_Randr_Output output);
3136EAPI unsigned char *
3137ecore_x_randr_output_edid_get(Ecore_X_Window root,
3138 Ecore_X_Randr_Output output,
3139 unsigned long *length);
3140EAPI Ecore_X_Randr_Output *
3141ecore_x_randr_output_wired_clones_get(Ecore_X_Window root,
3142 Ecore_X_Randr_Output output,
3143 int *num);
3144EAPI Ecore_X_Randr_Output **
3145ecore_x_randr_output_compatibility_list_get(Ecore_X_Window root,
3146 Ecore_X_Randr_Output output,
3147 int *num);
3148EAPI Ecore_X_Randr_Signal_Format *
3149ecore_x_randr_output_signal_formats_get(Ecore_X_Window root,
3150 Ecore_X_Randr_Output output,
3151 int *num);
3152EAPI Eina_Bool
3153ecore_x_randr_output_signal_format_set(Ecore_X_Window root,
3154 Ecore_X_Randr_Output output,
3155 Ecore_X_Randr_Signal_Format *signal);
3156EAPI Ecore_X_Randr_Signal_Property *
3157ecore_x_randr_output_signal_properties_get(Ecore_X_Window root,
3158 Ecore_X_Randr_Output output,
3159 int *num);
3160EAPI int
3161ecore_x_randr_output_connector_number_get(Ecore_X_Window root,
3162 Ecore_X_Randr_Output output);
3163EAPI Ecore_X_Randr_Connector_Type
3164ecore_x_randr_output_connector_type_get(Ecore_X_Window root,
3165 Ecore_X_Randr_Output output);
3166EAPI Eina_Rectangle *
3167ecore_x_randr_crtc_panning_area_get(Ecore_X_Window root,
3168 Ecore_X_Randr_Crtc crtc,
3169 int *x,
3170 int *y,
3171 int *w,
3172 int *h);
3173EAPI Eina_Bool
3174ecore_x_randr_crtc_panning_area_set(Ecore_X_Window root,
3175 Ecore_X_Randr_Crtc crtc,
3176 int x,
3177 const int y,
3178 const int w,
3179 const int h);
3180EAPI Eina_Rectangle *
3181ecore_x_randr_crtc_tracking_area_get(Ecore_X_Window root,
3182 Ecore_X_Randr_Crtc crtc,
3183 int *x,
3184 int *y,
3185 int *w,
3186 int *h);
3187EAPI Eina_Bool
3188ecore_x_randr_crtc_tracking_area_set(Ecore_X_Window root,
3189 Ecore_X_Randr_Crtc crtc,
3190 int x,
3191 const int y,
3192 const int w,
3193 const int h);
3194EAPI Eina_Rectangle *
3195ecore_x_randr_crtc_border_area_get(Ecore_X_Window root,
3196 Ecore_X_Randr_Crtc crtc);
3197EAPI Eina_Bool
3198ecore_x_randr_crtc_border_area_set(Ecore_X_Window root,
3199 Ecore_X_Randr_Crtc crtc,
3200 int left,
3201 const int top,
3202 const int right,
3203 const int bottom);
3204
3205/* XRender Support (horrendously incomplete) */
3206typedef Ecore_X_ID Ecore_X_Picture;
3207
3208/* XFixes Extension Support */
3209typedef Ecore_X_ID Ecore_X_Region;
3210
3211typedef enum _Ecore_X_Region_Type
3212{
3213 ECORE_X_REGION_BOUNDING,
3214 ECORE_X_REGION_CLIP
3215} Ecore_X_Region_Type;
3216
3217EAPI Ecore_X_Region
3218ecore_x_region_new(Ecore_X_Rectangle *rects,
3219 int num);
3220EAPI Ecore_X_Region
3221 ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap);
3222EAPI Ecore_X_Region
3223 ecore_x_region_new_from_window(Ecore_X_Window win,
3224 Ecore_X_Region_Type type);
3225EAPI Ecore_X_Region
3226 ecore_x_region_new_from_gc(Ecore_X_GC gc);
3227EAPI Ecore_X_Region
3228 ecore_x_region_new_from_picture(Ecore_X_Picture picture);
3229EAPI void
3230 ecore_x_region_free(Ecore_X_Region region);
3231EAPI void
3232 ecore_x_region_set(Ecore_X_Region region,
3233 Ecore_X_Rectangle *rects,
3234 int num);
3235EAPI void
3236ecore_x_region_copy(Ecore_X_Region dest,
3237 Ecore_X_Region source);
3238EAPI void
3239ecore_x_region_combine(Ecore_X_Region dest,
3240 Ecore_X_Region source1,
3241 Ecore_X_Region source2);
3242EAPI void
3243ecore_x_region_intersect(Ecore_X_Region dest,
3244 Ecore_X_Region source1,
3245 Ecore_X_Region source2);
3246EAPI void
3247ecore_x_region_subtract(Ecore_X_Region dest,
3248 Ecore_X_Region source1,
3249 Ecore_X_Region source2);
3250EAPI void
3251ecore_x_region_invert(Ecore_X_Region dest,
3252 Ecore_X_Rectangle *bounds,
3253 Ecore_X_Region source);
3254EAPI void
3255ecore_x_region_translate(Ecore_X_Region region,
3256 int dx,
3257 int dy);
3258EAPI void
3259ecore_x_region_extents(Ecore_X_Region dest,
3260 Ecore_X_Region source);
3261EAPI Ecore_X_Rectangle *
3262ecore_x_region_fetch(Ecore_X_Region region,
3263 int *num,
3264 Ecore_X_Rectangle *bounds);
3265EAPI void
3266ecore_x_region_expand(Ecore_X_Region dest,
3267 Ecore_X_Region source,
3268 unsigned int left,
3269 unsigned int right,
3270 unsigned int top,
3271 unsigned int bottom);
3272EAPI void
3273ecore_x_region_gc_clip_set(Ecore_X_Region region,
3274 Ecore_X_GC gc,
3275 int x_origin,
3276 int y_origin);
3277EAPI void
3278ecore_x_region_window_shape_set(Ecore_X_Region region,
3279 Ecore_X_Window win,
3280 Ecore_X_Shape_Type type,
3281 int x_offset,
3282 int y_offset);
3283EAPI void
3284ecore_x_region_picture_clip_set(Ecore_X_Region region,
3285 Ecore_X_Picture picture,
3286 int x_origin,
3287 int y_origin);
3288
3289/**
3290 * xfixes selection notification request.
3291 *
3292 * This lets you choose which selections you want to get notifications for.
3293 * @param selection the selection atom.
3294 * @return EINA_TRUE on success, EINA_FALSE otherwise.
3295 * @since 1.1.0
3296 */
3297EAPI Eina_Bool
3298ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection);
3299
3300/* XComposite Extension Support */
3301EAPI Eina_Bool
3302 ecore_x_composite_query(void);
3303EAPI void
3304 ecore_x_composite_redirect_window(Ecore_X_Window win,
3305 Ecore_X_Composite_Update_Type type);
3306EAPI void
3307ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
3308 Ecore_X_Composite_Update_Type type);
3309EAPI void
3310ecore_x_composite_unredirect_window(Ecore_X_Window win,
3311 Ecore_X_Composite_Update_Type type);
3312EAPI void
3313ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
3314 Ecore_X_Composite_Update_Type type);
3315EAPI Ecore_X_Pixmap
3316 ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win);
3317EAPI void
3318 ecore_x_composite_window_events_disable(Ecore_X_Window win);
3319EAPI void
3320 ecore_x_composite_window_events_enable(Ecore_X_Window win);
3321EAPI Ecore_X_Window
3322 ecore_x_composite_render_window_enable(Ecore_X_Window root);
3323EAPI void
3324 ecore_x_composite_render_window_disable(Ecore_X_Window root);
3325
3326/* XDamage Extension Support */
3327typedef Ecore_X_ID Ecore_X_Damage;
3328
3329typedef enum _Ecore_X_Damage_Report_Level
3330{
3331 ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES,
3332 ECORE_X_DAMAGE_REPORT_DELTA_RECTANGLES,
3333 ECORE_X_DAMAGE_REPORT_BOUNDING_BOX,
3334 ECORE_X_DAMAGE_REPORT_NON_EMPTY
3335} Ecore_X_Damage_Report_Level;
3336
3337struct _Ecore_X_Event_Damage
3338{
3339 Ecore_X_Damage_Report_Level level;
3340 Ecore_X_Drawable drawable;
3341 Ecore_X_Damage damage;
3342 int more;
3343 Ecore_X_Time time;
3344 Ecore_X_Rectangle area;
3345 Ecore_X_Rectangle geometry;
3346};
3347
3348typedef struct _Ecore_X_Event_Damage Ecore_X_Event_Damage;
3349
3350EAPI Eina_Bool
3351 ecore_x_damage_query(void);
3352EAPI Ecore_X_Damage
3353 ecore_x_damage_new(Ecore_X_Drawable d,
3354 Ecore_X_Damage_Report_Level level);
3355EAPI void
3356 ecore_x_damage_free(Ecore_X_Damage damage);
3357EAPI void
3358 ecore_x_damage_subtract(Ecore_X_Damage damage,
3359 Ecore_X_Region repair,
3360 Ecore_X_Region parts);
3361
3362EAPI Eina_Bool
3363 ecore_x_screen_is_composited(int screen);
3364EAPI void
3365 ecore_x_screen_is_composited_set(int screen,
3366 Ecore_X_Window win);
3367
3368EAPI Eina_Bool
3369 ecore_x_dpms_query(void);
3370EAPI Eina_Bool
3371 ecore_x_dpms_capable_get(void);
3372EAPI Eina_Bool
3373 ecore_x_dpms_enabled_get(void);
3374EAPI void
3375 ecore_x_dpms_enabled_set(int enabled);
3376EAPI void
3377 ecore_x_dpms_timeouts_get(unsigned int *standby,
3378 unsigned int *suspend,
3379 unsigned int *off);
3380EAPI Eina_Bool
3381ecore_x_dpms_timeouts_set(unsigned int standby,
3382 unsigned int suspend,
3383 unsigned int off);
3384EAPI unsigned int
3385 ecore_x_dpms_timeout_standby_get(void);
3386EAPI unsigned int
3387 ecore_x_dpms_timeout_suspend_get(void);
3388EAPI unsigned int
3389 ecore_x_dpms_timeout_off_get(void);
3390EAPI void
3391 ecore_x_dpms_timeout_standby_set(unsigned int new_timeout);
3392EAPI void
3393 ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout);
3394EAPI void
3395 ecore_x_dpms_timeout_off_set(unsigned int new_timeout);
3396
3397EAPI Eina_Bool
3398 ecore_x_test_fake_key_down(const char *key);
3399EAPI Eina_Bool
3400 ecore_x_test_fake_key_up(const char *key);
3401EAPI Eina_Bool
3402 ecore_x_test_fake_key_press(const char *key);
3403EAPI const char *
3404 ecore_x_keysym_string_get(int keysym);
3405
3406typedef struct _Ecore_X_Image Ecore_X_Image;
3407
3408EAPI Ecore_X_Image *
3409ecore_x_image_new(int w,
3410 int h,
3411 Ecore_X_Visual vis,
3412 int depth);
3413EAPI void
3414 ecore_x_image_free(Ecore_X_Image *im);
3415EAPI Eina_Bool
3416 ecore_x_image_get(Ecore_X_Image *im,
3417 Ecore_X_Drawable draw,
3418 int x,
3419 int y,
3420 int sx,
3421 int sy,
3422 int w,
3423 int h);
3424EAPI void
3425ecore_x_image_put(Ecore_X_Image *im,
3426 Ecore_X_Drawable draw,
3427 Ecore_X_GC gc,
3428 int x,
3429 int y,
3430 int sx,
3431 int sy,
3432 int w,
3433 int h);
3434EAPI void *
3435ecore_x_image_data_get(Ecore_X_Image *im,
3436 int *bpl,
3437 int *rows,
3438 int *bpp);
3439EAPI Eina_Bool
3440ecore_x_image_is_argb32_get(Ecore_X_Image *im);
3441
3442EAPI Eina_Bool
3443ecore_x_image_to_argb_convert(void *src,
3444 int sbpp,
3445 int sbpl,
3446 Ecore_X_Colormap c,
3447 Ecore_X_Visual v,
3448 int x,
3449 int y,
3450 int w,
3451 int h,
3452 unsigned int *dst,
3453 int dbpl,
3454 int dx,
3455 int dy);
3456
3457EAPI Eina_Bool
3458ecore_x_input_multi_select(Ecore_X_Window win);
3459
3460EAPI Eina_Bool
3461ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win);
3462
3463typedef enum _Ecore_X_Gesture_Event_Mask
3464{
3465 ECORE_X_GESTURE_EVENT_MASK_NONE = 0L,
3466 ECORE_X_GESTURE_EVENT_MASK_FLICK = (1L << 0),
3467 ECORE_X_GESTURE_EVENT_MASK_PAN = (1L << 1),
3468 ECORE_X_GESTURE_EVENT_MASK_PINCHROTATION = (1L << 2),
3469 ECORE_X_GESTURE_EVENT_MASK_TAP = (1L << 3),
3470 ECORE_X_GESTURE_EVENT_MASK_TAPNHOLD = (1L << 4),
3471 ECORE_X_GESTURE_EVENT_MASK_HOLD = (1L << 5),
3472 ECORE_X_GESTURE_EVENT_MASK_GROUP = (1L << 6)
3473} Ecore_X_Gesture_Event_Mask;
3474
3475typedef enum _Ecore_X_Gesture_Event_Type
3476{
3477 ECORE_X_GESTURE_EVENT_FLICK,
3478 ECORE_X_GESTURE_EVENT_PAN,
3479 ECORE_X_GESTURE_EVENT_PINCHROTATION,
3480 ECORE_X_GESTURE_EVENT_TAP,
3481 ECORE_X_GESTURE_EVENT_TAPNHOLD,
3482 ECORE_X_GESTURE_EVENT_HOLD,
3483 ECORE_X_GESTURE_EVENT_GROUP
3484} Ecore_X_Gesture_Event_Type;
3485
3486typedef enum _Ecore_X_Gesture_Event_Subtype
3487{
3488 ECORE_X_GESTURE_END,
3489 ECORE_X_GESTURE_BEGIN,
3490 ECORE_X_GESTURE_UPDATE,
3491 ECORE_X_GESTURE_DONE
3492} Ecore_X_Gesture_Event_Subtype;
3493
3494typedef enum _Ecore_X_Gesture_Group_Subtype
3495{
3496 ECORE_X_GESTURE_GROUP_REMOVED,
3497 ECORE_X_GESTURE_GROUP_ADDED,
3498 ECORE_X_GESTURE_GROUP_CURRENT
3499} Ecore_X_Gesture_Group_Subtype;
3500
3501typedef enum _Ecore_X_Gesture_Direction
3502{
3503 ECORE_X_GESTURE_NORTHWARD,
3504 ECORE_X_GESTURE_NORTHEASTWARD,
3505 ECORE_X_GESTURE_EASTWARD,
3506 ECORE_X_GESTURE_SOUTHEASTWARD,
3507 ECORE_X_GESTURE_SOUTHWARD,
3508 ECORE_X_GESTURE_SOUTHWESTWARD,
3509 ECORE_X_GESTURE_WESTWARD,
3510 ECORE_X_GESTURE_NORTHWESTWARD
3511} Ecore_X_Gesture_Direction;
3512
3513struct _Ecore_X_Event_Gesture_Notify_Flick
3514{
3515 Ecore_X_Window win;
3516 Ecore_X_Time time;
3517 Ecore_X_Gesture_Event_Subtype subtype;
3518 int num_fingers;
3519 int distance;
3520 Ecore_X_Time duration;
3521 Ecore_X_Gesture_Direction direction;
3522 double angle;
3523};
3524
3525struct _Ecore_X_Event_Gesture_Notify_Pan
3526{
3527 Ecore_X_Window win;
3528 Ecore_X_Time time;
3529 Ecore_X_Gesture_Event_Subtype subtype;
3530 int num_fingers;
3531 int dx;
3532 int dy;
3533 int distance;
3534 Ecore_X_Time duration;
3535 Ecore_X_Gesture_Direction direction;
3536};
3537
3538struct _Ecore_X_Event_Gesture_Notify_PinchRotation
3539{
3540 Ecore_X_Window win;
3541 Ecore_X_Time time;
3542 Ecore_X_Gesture_Event_Subtype subtype;
3543 int num_fingers;
3544 int distance;
3545 int cx;
3546 int cy;
3547 double zoom;
3548 double angle;
3549};
3550
3551struct _Ecore_X_Event_Gesture_Notify_Tap
3552{
3553 Ecore_X_Window win;
3554 Ecore_X_Time time;
3555 Ecore_X_Gesture_Event_Subtype subtype;
3556 int num_fingers;
3557 int cx;
3558 int cy;
3559 int tap_repeat;
3560 Ecore_X_Time interval;
3561};
3562
3563struct _Ecore_X_Event_Gesture_Notify_TapNHold
3564{
3565 Ecore_X_Window win;
3566 Ecore_X_Time time;
3567 Ecore_X_Gesture_Event_Subtype subtype;
3568 int num_fingers;
3569 int cx;
3570 int cy;
3571 Ecore_X_Time interval;
3572 Ecore_X_Time hold_time;
3573};
3574
3575struct _Ecore_X_Event_Gesture_Notify_Hold
3576{
3577 Ecore_X_Window win;
3578 Ecore_X_Time time;
3579 Ecore_X_Gesture_Event_Subtype subtype;
3580 int num_fingers;
3581 int cx;
3582 int cy;
3583 Ecore_X_Time hold_time;
3584};
3585
3586struct _Ecore_X_Event_Gesture_Notify_Group
3587{
3588 Ecore_X_Window win;
3589 Ecore_X_Time time;
3590 Ecore_X_Gesture_Group_Subtype subtype;
3591 int num_groups;
3592 int group_id;
3593};
3594
3595EAPI Eina_Bool
3596ecore_x_gesture_supported(void);
3597
3598EAPI Eina_Bool
3599ecore_x_gesture_events_select(Ecore_X_Window win,
3600 Ecore_X_Gesture_Event_Mask mask);
3601
3602EAPI Ecore_X_Gesture_Event_Mask
3603ecore_x_gesture_events_selected_get(Ecore_X_Window win);
3604
3605EAPI Eina_Bool
3606ecore_x_gesture_event_grab(Ecore_X_Window win,
3607 Ecore_X_Gesture_Event_Type type,
3608 int num_fingers);
3609
3610EAPI Eina_Bool
3611ecore_x_gesture_event_ungrab(Ecore_X_Window win,
3612 Ecore_X_Gesture_Event_Type type,
3613 int num_fingers);
3614
3615#ifdef __cplusplus
3616}
3617#endif // ifdef __cplusplus
3618
3619#include <Ecore_X_Atoms.h>
3620#include <Ecore_X_Cursor.h>
3621
3622#endif // ifndef _ECORE_X_H
diff --git a/libraries/ecore/src/lib/ecore_x/Ecore_X_Atoms.h b/libraries/ecore/src/lib/ecore_x/Ecore_X_Atoms.h
new file mode 100644
index 0000000..6788a5e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/Ecore_X_Atoms.h
@@ -0,0 +1,255 @@
1#ifndef _ECORE_X_ATOMS_H
2#define _ECORE_X_ATOMS_H
3
4/**
5 * @file
6 * @brief Ecore X atoms
7 */
8
9/* generic atoms */
10EAPI extern Ecore_X_Atom ECORE_X_ATOM_ATOM;
11EAPI extern Ecore_X_Atom ECORE_X_ATOM_CARDINAL;
12EAPI extern Ecore_X_Atom ECORE_X_ATOM_COMPOUND_TEXT;
13EAPI extern Ecore_X_Atom ECORE_X_ATOM_FILE_NAME;
14EAPI extern Ecore_X_Atom ECORE_X_ATOM_STRING;
15EAPI extern Ecore_X_Atom ECORE_X_ATOM_TEXT;
16EAPI extern Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING;
17EAPI extern Ecore_X_Atom ECORE_X_ATOM_WINDOW;
18EAPI extern Ecore_X_Atom ECORE_X_ATOM_PIXMAP;
19EAPI extern Ecore_X_Atom ECORE_X_ATOM_VISUALID;
20
21/* dnd atoms */
22EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_XDND;
23EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_XDND;
24EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_AWARE;
25EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ENTER;
26EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_TYPE_LIST;
27EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_POSITION;
28EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_COPY;
29EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_MOVE;
30EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_PRIVATE;
31EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_ASK;
32EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_LIST;
33EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_LINK;
34EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_DESCRIPTION;
35EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_PROXY;
36EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_STATUS;
37EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_LEAVE;
38EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_DROP;
39EAPI extern Ecore_X_Atom ECORE_X_ATOM_XDND_FINISHED;
40
41/* dnd atoms that need to be exposed to the application interface */
42EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_COPY;
43EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_MOVE;
44EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_LINK;
45EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_ASK;
46EAPI extern Ecore_X_Atom ECORE_X_DND_ACTION_PRIVATE;
47
48/* old E atom */
49EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_FRAME_SIZE;
50
51/* old Gnome atom */
52EAPI extern Ecore_X_Atom ECORE_X_ATOM_WIN_LAYER;
53
54/* ICCCM: client properties */
55EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_NAME;
56EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_ICON_NAME;
57EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_NORMAL_HINTS;
58EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_SIZE_HINTS;
59EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_HINTS;
60EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_CLASS;
61EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_TRANSIENT_FOR;
62EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_PROTOCOLS;
63EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_COLORMAP_WINDOWS;
64EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_COMMAND;
65EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_CLIENT_MACHINE;
66
67/* ICCCM: window manager properties */
68EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_STATE;
69EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_ICON_SIZE;
70
71/* ICCCM: WM_STATEproperty */
72EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_CHANGE_STATE;
73
74/* ICCCM: WM_PROTOCOLS properties */
75EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_TAKE_FOCUS;
76EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_SAVE_YOURSELF;
77EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_DELETE_WINDOW;
78
79/* ICCCM: WM_COLORMAP properties */
80EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_COLORMAP_NOTIFY;
81
82/* ICCCM: session management properties */
83EAPI extern Ecore_X_Atom ECORE_X_ATOM_SM_CLIENT_ID;
84EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_CLIENT_LEADER;
85EAPI extern Ecore_X_Atom ECORE_X_ATOM_WM_WINDOW_ROLE;
86
87/* Motif WM atom */
88EAPI extern Ecore_X_Atom ECORE_X_ATOM_MOTIF_WM_HINTS;
89
90EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTED;
91EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST;
92EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST_STACKING;
93EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS;
94EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_GEOMETRY;
95EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_VIEWPORT;
96EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_CURRENT_DESKTOP;
97EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_NAMES;
98EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_ACTIVE_WINDOW;
99EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA;
100EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK;
101EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_VIRTUAL_ROOTS;
102EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_LAYOUT;
103EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_SHOWING_DESKTOP;
104
105/* pager */
106EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_CLOSE_WINDOW;
107EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW;
108EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE;
109EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW;
110
111EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS;
112EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_NAME;
113EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_NAME;
114EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_NAME;
115EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME;
116EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP;
117
118/* window type */
119EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE;
120EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
121EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
122EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
123EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
124EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
125EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
126EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
127EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
128EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
129EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
130EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
131EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
132EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
133EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
134
135/* state */
136EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE;
137EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MODAL;
138EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_STICKY;
139EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
140EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
141EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SHADED;
142EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
143EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
144EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
145EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
146EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_ABOVE;
147EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_BELOW;
148EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
149
150/* allowed actions */
151EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS;
152EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MOVE;
153EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
154EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
155EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_SHADE;
156EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_STICK;
157EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
158EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
159EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
160EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
161EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
162EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
163EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_BELOW;
164
165EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT;
166EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT_PARTIAL;
167EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY;
168EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON;
169EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID;
170EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS;
171EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME;
172EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_ID;
173EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS;
174EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_PING;
175EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
176EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER;
177EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY;
178EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_SHADOW;
179EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_SHADE;
180EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN;
181EAPI extern Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO;
182EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_TARGETS;
183EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PRIMARY;
184EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_SECONDARY;
185EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_CLIPBOARD;
186EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
187EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
188EAPI extern Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
189
190/* currently E specific virtual keyboard extension, aim to submit to netwm spec
191 * later */
192
193EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD;
194EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE;
195EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
196EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
197EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
198EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
199EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
200EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
201EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
202EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
203EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
204EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP;
205EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST;
206EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE;
207EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL;
208EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD;
209EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
210
211/* Illume specific atoms */
212EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE;
213EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE_LIST;
214EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CONFORMANT;
215EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE;
216EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_SINGLE;
217EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP;
218EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
219EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_BACK;
220EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD;
221EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_HOME;
222EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_NEW;
223EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_DEL;
224EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLOSE;
225EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG;
226EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED;
227EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_START;
228EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_END;
229EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY;
230EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY;
231EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY;
232EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL;
233EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE;
234EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE;
235EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON;
236EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
237EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR;
238EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR;
239EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE;
240EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE;
241
242EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_COUNTER;
243EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
244EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED;
245EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
246EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_END;
247EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_CANCEL;
248EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_FLUSH;
249EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_DUMP;
250EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_COMP_PIXMAP;
251
252EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_PARENT;
253EAPI extern Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_POSITION;
254
255#endif /* _ECORE_X_ATOMS_H */
diff --git a/libraries/ecore/src/lib/ecore_x/Ecore_X_Cursor.h b/libraries/ecore/src/lib/ecore_x/Ecore_X_Cursor.h
new file mode 100644
index 0000000..807541e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/Ecore_X_Cursor.h
@@ -0,0 +1,87 @@
1#ifndef _ECORE_X_CURSOR_H
2#define _ECORE_X_CURSOR_H
3
4/**
5 * @file
6 * @brief Defines the various cursor types for the X Windows system.
7 */
8
9#define ECORE_X_CURSOR_X 0
10#define ECORE_X_CURSOR_ARROW 2
11#define ECORE_X_CURSOR_BASED_ARROW_DOWN 4
12#define ECORE_X_CURSOR_UP 6
13#define ECORE_X_CURSOR_BOAT 8
14#define ECORE_X_CURSOR_BOGOSITY 10
15#define ECORE_X_CURSOR_BOTTOM_LEFT_CORNER 12
16#define ECORE_X_CURSOR_BOTTOM_RIGHT_CORNER 14
17#define ECORE_X_CURSOR_BOTTOM_SIDE 16
18#define ECORE_X_CURSOR_BOTTOM_TEE 18
19#define ECORE_X_CURSOR_BOX_SPIRAL 20
20#define ECORE_X_CURSOR_CENTER_PTR 22
21#define ECORE_X_CURSOR_CIRCLE 24
22#define ECORE_X_CURSOR_CLOCK 26
23#define ECORE_X_CURSOR_COFFEE_MUG 28
24#define ECORE_X_CURSOR_CROSS 30
25#define ECORE_X_CURSOR_CROSS_REVERSE 32
26#define ECORE_X_CURSOR_CROSSHAIR 34
27#define ECORE_X_CURSOR_DIAMOND_CROSS 36
28#define ECORE_X_CURSOR_DOT 38
29#define ECORE_X_CURSOR_DOT_BOX_MASK 40
30#define ECORE_X_CURSOR_DOUBLE_ARROW 42
31#define ECORE_X_CURSOR_DRAFT_LARGE 44
32#define ECORE_X_CURSOR_DRAFT_SMALL 46
33#define ECORE_X_CURSOR_DRAPED_BOX 48
34#define ECORE_X_CURSOR_EXCHANGE 50
35#define ECORE_X_CURSOR_FLEUR 52
36#define ECORE_X_CURSOR_GOBBLER 54
37#define ECORE_X_CURSOR_GUMBY 56
38#define ECORE_X_CURSOR_HAND1 58
39#define ECORE_X_CURSOR_HAND2 60
40#define ECORE_X_CURSOR_HEART 62
41#define ECORE_X_CURSOR_ICON 64
42#define ECORE_X_CURSOR_IRON_CROSS 66
43#define ECORE_X_CURSOR_LEFT_PTR 68
44#define ECORE_X_CURSOR_LEFT_SIDE 70
45#define ECORE_X_CURSOR_LEFT_TEE 72
46#define ECORE_X_CURSOR_LEFTBUTTON 74
47#define ECORE_X_CURSOR_LL_ANGLE 76
48#define ECORE_X_CURSOR_LR_ANGLE 78
49#define ECORE_X_CURSOR_MAN 80
50#define ECORE_X_CURSOR_MIDDLEBUTTON 82
51#define ECORE_X_CURSOR_MOUSE 84
52#define ECORE_X_CURSOR_PENCIL 86
53#define ECORE_X_CURSOR_PIRATE 88
54#define ECORE_X_CURSOR_PLUS 90
55#define ECORE_X_CURSOR_QUESTION_ARROW 92
56#define ECORE_X_CURSOR_RIGHT_PTR 94
57#define ECORE_X_CURSOR_RIGHT_SIDE 96
58#define ECORE_X_CURSOR_RIGHT_TEE 98
59#define ECORE_X_CURSOR_RIGHTBUTTON 100
60#define ECORE_X_CURSOR_RTL_LOGO 102
61#define ECORE_X_CURSOR_SAILBOAT 104
62#define ECORE_X_CURSOR_SB_DOWN_ARROW 106
63#define ECORE_X_CURSOR_SB_H_DOUBLE_ARROW 108
64#define ECORE_X_CURSOR_SB_LEFT_ARROW 110
65#define ECORE_X_CURSOR_SB_RIGHT_ARROW 112
66#define ECORE_X_CURSOR_SB_UP_ARROW 114
67#define ECORE_X_CURSOR_SB_V_DOUBLE_ARROW 116
68#define ECORE_X_CURSOR_SHUTTLE 118
69#define ECORE_X_CURSOR_SIZING 120
70#define ECORE_X_CURSOR_SPIDER 122
71#define ECORE_X_CURSOR_SPRAYCAN 124
72#define ECORE_X_CURSOR_STAR 126
73#define ECORE_X_CURSOR_TARGET 128
74#define ECORE_X_CURSOR_TCROSS 130
75#define ECORE_X_CURSOR_TOP_LEFT_ARROW 132
76#define ECORE_X_CURSOR_TOP_LEFT_CORNER 134
77#define ECORE_X_CURSOR_TOP_RIGHT_CORNER 136
78#define ECORE_X_CURSOR_TOP_SIDE 138
79#define ECORE_X_CURSOR_TOP_TEE 140
80#define ECORE_X_CURSOR_TREK 142
81#define ECORE_X_CURSOR_UL_ANGLE 144
82#define ECORE_X_CURSOR_UMBRELLA 146
83#define ECORE_X_CURSOR_UR_ANGLE 148
84#define ECORE_X_CURSOR_WATCH 150
85#define ECORE_X_CURSOR_XTERM 152
86
87#endif // ifndef _ECORE_X_CURSOR_H
diff --git a/libraries/ecore/src/lib/ecore_x/Makefile.am b/libraries/ecore/src/lib/ecore_x/Makefile.am
new file mode 100644
index 0000000..b14fc7d
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/Makefile.am
@@ -0,0 +1,30 @@
1MAINTAINERCLEANFILES = Makefile.in
2
3SUBDIRS = xlib xcb
4
5if BUILD_ECORE_X_XCB
6DEP = xcb/libecore_x_xcb.la
7else
8DEP = xlib/libecore_x_xlib.la
9endif
10
11AM_CPPFLAGS = \
12-I$(top_srcdir)/src/lib/ecore \
13-I$(top_builddir)/src/lib/ecore \
14@EINA_CFLAGS@
15
16lib_LTLIBRARIES = libecore_x.la
17
18libecore_x_la_SOURCES =
19
20libecore_x_la_LIBADD = $(DEP) @EINA_LIBS@
21libecore_x_la_LDFLAGS = -version-info @version_info@ @release_info@
22libecore_x_la_DEPENDENCIES = $(DEP)
23
24includes_HEADERS = \
25Ecore_X.h \
26Ecore_X_Atoms.h \
27Ecore_X_Cursor.h
28includesdir = $(includedir)/ecore-@VMAJ@
29
30EXTRA_DIST = ecore_x_atoms_decl.h
diff --git a/libraries/ecore/src/lib/ecore_x/Makefile.in b/libraries/ecore/src/lib/ecore_x/Makefile.in
new file mode 100644
index 0000000..d5f4247
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/Makefile.in
@@ -0,0 +1,934 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38subdir = src/lib/ecore_x
39DIST_COMMON = $(includes_HEADERS) $(srcdir)/Makefile.am \
40 $(srcdir)/Makefile.in
41ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
42am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
43 $(top_srcdir)/m4/ac_path_generic.m4 \
44 $(top_srcdir)/m4/check_x_extension.m4 \
45 $(top_srcdir)/m4/ecore_check_module.m4 \
46 $(top_srcdir)/m4/ecore_check_options.m4 \
47 $(top_srcdir)/m4/efl_compiler_flag.m4 \
48 $(top_srcdir)/m4/efl_doxygen.m4 \
49 $(top_srcdir)/m4/efl_examples.m4 \
50 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
51 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
52 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
53 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
54 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
55 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
56 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
57 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
58 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
59 $(top_srcdir)/configure.ac
60am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
61 $(ACLOCAL_M4)
62mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
63CONFIG_HEADER = $(top_builddir)/config.h
64CONFIG_CLEAN_FILES =
65CONFIG_CLEAN_VPATH_FILES =
66am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
67am__vpath_adj = case $$p in \
68 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
69 *) f=$$p;; \
70 esac;
71am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
72am__install_max = 40
73am__nobase_strip_setup = \
74 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
75am__nobase_strip = \
76 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
77am__nobase_list = $(am__nobase_strip_setup); \
78 for p in $$list; do echo "$$p $$p"; done | \
79 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
80 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
81 if (++n[$$2] == $(am__install_max)) \
82 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
83 END { for (dir in files) print dir, files[dir] }'
84am__base_list = \
85 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
86 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
87am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"
88LTLIBRARIES = $(lib_LTLIBRARIES)
89am_libecore_x_la_OBJECTS =
90libecore_x_la_OBJECTS = $(am_libecore_x_la_OBJECTS)
91AM_V_lt = $(am__v_lt_$(V))
92am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
93am__v_lt_0 = --silent
94libecore_x_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
95 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
96 $(libecore_x_la_LDFLAGS) $(LDFLAGS) -o $@
97DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
98COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
99 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
100LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
101 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
102 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
103 $(AM_CFLAGS) $(CFLAGS)
104AM_V_CC = $(am__v_CC_$(V))
105am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
106am__v_CC_0 = @echo " CC " $@;
107AM_V_at = $(am__v_at_$(V))
108am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
109am__v_at_0 = @
110CCLD = $(CC)
111LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
112 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
113 $(AM_LDFLAGS) $(LDFLAGS) -o $@
114AM_V_CCLD = $(am__v_CCLD_$(V))
115am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
116am__v_CCLD_0 = @echo " CCLD " $@;
117AM_V_GEN = $(am__v_GEN_$(V))
118am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
119am__v_GEN_0 = @echo " GEN " $@;
120SOURCES = $(libecore_x_la_SOURCES)
121DIST_SOURCES = $(libecore_x_la_SOURCES)
122RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
123 html-recursive info-recursive install-data-recursive \
124 install-dvi-recursive install-exec-recursive \
125 install-html-recursive install-info-recursive \
126 install-pdf-recursive install-ps-recursive install-recursive \
127 installcheck-recursive installdirs-recursive pdf-recursive \
128 ps-recursive uninstall-recursive
129HEADERS = $(includes_HEADERS)
130RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
131 distclean-recursive maintainer-clean-recursive
132AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
133 $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
134 distdir
135ETAGS = etags
136CTAGS = ctags
137DIST_SUBDIRS = $(SUBDIRS)
138DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
139am__relativize = \
140 dir0=`pwd`; \
141 sed_first='s,^\([^/]*\)/.*$$,\1,'; \
142 sed_rest='s,^[^/]*/*,,'; \
143 sed_last='s,^.*/\([^/]*\)$$,\1,'; \
144 sed_butlast='s,/*[^/]*$$,,'; \
145 while test -n "$$dir1"; do \
146 first=`echo "$$dir1" | sed -e "$$sed_first"`; \
147 if test "$$first" != "."; then \
148 if test "$$first" = ".."; then \
149 dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
150 dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
151 else \
152 first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
153 if test "$$first2" = "$$first"; then \
154 dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
155 else \
156 dir2="../$$dir2"; \
157 fi; \
158 dir0="$$dir0"/"$$first"; \
159 fi; \
160 fi; \
161 dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
162 done; \
163 reldir="$$dir2"
164ACLOCAL = @ACLOCAL@
165ALLOCA = @ALLOCA@
166AMTAR = @AMTAR@
167AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
168AR = @AR@
169AS = @AS@
170AUTOCONF = @AUTOCONF@
171AUTOHEADER = @AUTOHEADER@
172AUTOMAKE = @AUTOMAKE@
173AWK = @AWK@
174CARES_CFLAGS = @CARES_CFLAGS@
175CARES_LIBS = @CARES_LIBS@
176CC = @CC@
177CCDEPMODE = @CCDEPMODE@
178CFLAGS = @CFLAGS@
179CHECK_CFLAGS = @CHECK_CFLAGS@
180CHECK_LIBS = @CHECK_LIBS@
181CPP = @CPP@
182CPPFLAGS = @CPPFLAGS@
183CURL_CFLAGS = @CURL_CFLAGS@
184CURL_LIBS = @CURL_LIBS@
185CXX = @CXX@
186CXXCPP = @CXXCPP@
187CXXDEPMODE = @CXXDEPMODE@
188CXXFLAGS = @CXXFLAGS@
189CYGPATH_W = @CYGPATH_W@
190DEFS = @DEFS@
191DEPDIR = @DEPDIR@
192DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
193DIRECTFB_LIBS = @DIRECTFB_LIBS@
194DLLTOOL = @DLLTOOL@
195DSYMUTIL = @DSYMUTIL@
196DUMPBIN = @DUMPBIN@
197ECHO_C = @ECHO_C@
198ECHO_N = @ECHO_N@
199ECHO_T = @ECHO_T@
200ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
201ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
202EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
203EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
204EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
205EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
206EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
207EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
208EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
209EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
210EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
211EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
212EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
213EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
214EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
215EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
216EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
217EGREP = @EGREP@
218EINA_CFLAGS = @EINA_CFLAGS@
219EINA_LIBS = @EINA_LIBS@
220ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
221ESCAPE_LIBS = @ESCAPE_LIBS@
222EVAS_CFLAGS = @EVAS_CFLAGS@
223EVAS_LIBS = @EVAS_LIBS@
224EVIL_CFLAGS = @EVIL_CFLAGS@
225EVIL_LIBS = @EVIL_LIBS@
226EXEEXT = @EXEEXT@
227FGREP = @FGREP@
228GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
229GLIB_CFLAGS = @GLIB_CFLAGS@
230GLIB_LIBS = @GLIB_LIBS@
231GMSGFMT = @GMSGFMT@
232GMSGFMT_015 = @GMSGFMT_015@
233GREP = @GREP@
234INSTALL = @INSTALL@
235INSTALL_DATA = @INSTALL_DATA@
236INSTALL_PROGRAM = @INSTALL_PROGRAM@
237INSTALL_SCRIPT = @INSTALL_SCRIPT@
238INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
239INTLLIBS = @INTLLIBS@
240INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
241KEYSYMDEFS = @KEYSYMDEFS@
242LD = @LD@
243LDFLAGS = @LDFLAGS@
244LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
245LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
246LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
247LIBICONV = @LIBICONV@
248LIBINTL = @LIBINTL@
249LIBOBJS = @LIBOBJS@
250LIBS = @LIBS@
251LIBTOOL = @LIBTOOL@
252LIPO = @LIPO@
253LN_S = @LN_S@
254LTLIBICONV = @LTLIBICONV@
255LTLIBINTL = @LTLIBINTL@
256LTLIBOBJS = @LTLIBOBJS@
257MAKEINFO = @MAKEINFO@
258MKDIR_P = @MKDIR_P@
259MSGFMT = @MSGFMT@
260MSGFMT_015 = @MSGFMT_015@
261MSGMERGE = @MSGMERGE@
262NM = @NM@
263NMEDIT = @NMEDIT@
264OBJC = @OBJC@
265OBJCDEPMODE = @OBJCDEPMODE@
266OBJCFLAGS = @OBJCFLAGS@
267OBJDUMP = @OBJDUMP@
268OBJEXT = @OBJEXT@
269OTOOL = @OTOOL@
270OTOOL64 = @OTOOL64@
271PACKAGE = @PACKAGE@
272PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
273PACKAGE_NAME = @PACKAGE_NAME@
274PACKAGE_STRING = @PACKAGE_STRING@
275PACKAGE_TARNAME = @PACKAGE_TARNAME@
276PACKAGE_URL = @PACKAGE_URL@
277PACKAGE_VERSION = @PACKAGE_VERSION@
278PATH_SEPARATOR = @PATH_SEPARATOR@
279PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
280PIXMAN_LIBS = @PIXMAN_LIBS@
281PKG_CONFIG = @PKG_CONFIG@
282PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
283PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
284POSUB = @POSUB@
285RANLIB = @RANLIB@
286SDL_CFLAGS = @SDL_CFLAGS@
287SDL_CONFIG = @SDL_CONFIG@
288SDL_LIBS = @SDL_LIBS@
289SED = @SED@
290SET_MAKE = @SET_MAKE@
291SHELL = @SHELL@
292SSL_CFLAGS = @SSL_CFLAGS@
293SSL_LIBS = @SSL_LIBS@
294STRIP = @STRIP@
295TLS2_CFLAGS = @TLS2_CFLAGS@
296TLS2_LIBS = @TLS2_LIBS@
297TLS_CFLAGS = @TLS_CFLAGS@
298TLS_LIBS = @TLS_LIBS@
299TSLIB_CFLAGS = @TSLIB_CFLAGS@
300TSLIB_LIBS = @TSLIB_LIBS@
301USE_NLS = @USE_NLS@
302VERSION = @VERSION@
303VMAJ = @VMAJ@
304WIN32_CFLAGS = @WIN32_CFLAGS@
305WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
306WIN32_LIBS = @WIN32_LIBS@
307XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
308XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
309XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
310XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
311XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
312XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
313XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
314XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
315XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
316XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
317XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
318XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
319XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
320XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
321XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
322XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
323XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
324XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
325XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
326XCB_X11_LIBS = @XCB_X11_LIBS@
327XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
328XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
329XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
330XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
331XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
332XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
333XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
334XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
335XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
336XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
337XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
338XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
339XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
340XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
341XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
342XDAMAGE_LIBS = @XDAMAGE_LIBS@
343XDPMS_CFLAGS = @XDPMS_CFLAGS@
344XDPMS_LIBS = @XDPMS_LIBS@
345XFIXES_CFLAGS = @XFIXES_CFLAGS@
346XFIXES_LIBS = @XFIXES_LIBS@
347XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
348XGESTURE_LIBS = @XGESTURE_LIBS@
349XGETTEXT = @XGETTEXT@
350XGETTEXT_015 = @XGETTEXT_015@
351XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
352XI2_CFLAGS = @XI2_CFLAGS@
353XI2_LIBS = @XI2_LIBS@
354XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
355XINERAMA_LIBS = @XINERAMA_LIBS@
356XKB_CFLAGS = @XKB_CFLAGS@
357XKB_LIBS = @XKB_LIBS@
358XMKMF = @XMKMF@
359XPRINT_CFLAGS = @XPRINT_CFLAGS@
360XPRINT_LIBS = @XPRINT_LIBS@
361XRANDR_CFLAGS = @XRANDR_CFLAGS@
362XRANDR_LIBS = @XRANDR_LIBS@
363XRENDER_CFLAGS = @XRENDER_CFLAGS@
364XRENDER_LIBS = @XRENDER_LIBS@
365XSS_CFLAGS = @XSS_CFLAGS@
366XSS_LIBS = @XSS_LIBS@
367XTEST_CFLAGS = @XTEST_CFLAGS@
368XTEST_LIBS = @XTEST_LIBS@
369X_CFLAGS = @X_CFLAGS@
370X_EXTRA_LIBS = @X_EXTRA_LIBS@
371X_LIBS = @X_LIBS@
372X_PRE_LIBS = @X_PRE_LIBS@
373Xcursor_cflags = @Xcursor_cflags@
374Xcursor_libs = @Xcursor_libs@
375abs_builddir = @abs_builddir@
376abs_srcdir = @abs_srcdir@
377abs_top_builddir = @abs_top_builddir@
378abs_top_srcdir = @abs_top_srcdir@
379ac_ct_CC = @ac_ct_CC@
380ac_ct_CXX = @ac_ct_CXX@
381ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
382ac_ct_OBJC = @ac_ct_OBJC@
383am__include = @am__include@
384am__leading_dot = @am__leading_dot@
385am__quote = @am__quote@
386am__tar = @am__tar@
387am__untar = @am__untar@
388bindir = @bindir@
389build = @build@
390build_alias = @build_alias@
391build_cpu = @build_cpu@
392build_os = @build_os@
393build_vendor = @build_vendor@
394builddir = @builddir@
395cocoa_ldflags = @cocoa_ldflags@
396datadir = @datadir@
397datarootdir = @datarootdir@
398dlopen_libs = @dlopen_libs@
399docdir = @docdir@
400dvidir = @dvidir@
401ecore_cocoa_cflags = @ecore_cocoa_cflags@
402ecore_cocoa_libs = @ecore_cocoa_libs@
403ecore_con_cflags = @ecore_con_cflags@
404ecore_con_libs = @ecore_con_libs@
405ecore_directfb_cflags = @ecore_directfb_cflags@
406ecore_directfb_libs = @ecore_directfb_libs@
407ecore_evas_cflags = @ecore_evas_cflags@
408ecore_evas_libs = @ecore_evas_libs@
409ecore_fb_cflags = @ecore_fb_cflags@
410ecore_fb_libs = @ecore_fb_libs@
411ecore_file_cflags = @ecore_file_cflags@
412ecore_file_libs = @ecore_file_libs@
413ecore_imf_cflags = @ecore_imf_cflags@
414ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
415ecore_imf_evas_libs = @ecore_imf_evas_libs@
416ecore_imf_libs = @ecore_imf_libs@
417ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
418ecore_imf_xim_libs = @ecore_imf_xim_libs@
419ecore_input_cflags = @ecore_input_cflags@
420ecore_input_evas_cflags = @ecore_input_evas_cflags@
421ecore_input_evas_libs = @ecore_input_evas_libs@
422ecore_input_libs = @ecore_input_libs@
423ecore_ipc_cflags = @ecore_ipc_cflags@
424ecore_ipc_libs = @ecore_ipc_libs@
425ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
426ecore_psl1ght_libs = @ecore_psl1ght_libs@
427ecore_sdl_cflags = @ecore_sdl_cflags@
428ecore_sdl_libs = @ecore_sdl_libs@
429ecore_win32_cflags = @ecore_win32_cflags@
430ecore_win32_libs = @ecore_win32_libs@
431ecore_wince_cflags = @ecore_wince_cflags@
432ecore_wince_libs = @ecore_wince_libs@
433ecore_x_cflags = @ecore_x_cflags@
434ecore_x_libs = @ecore_x_libs@
435ecore_x_libs_private = @ecore_x_libs_private@
436efl_doxygen = @efl_doxygen@
437efl_have_doxygen = @efl_have_doxygen@
438exec_prefix = @exec_prefix@
439have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
440host = @host@
441host_alias = @host_alias@
442host_cpu = @host_cpu@
443host_os = @host_os@
444host_vendor = @host_vendor@
445htmldir = @htmldir@
446includedir = @includedir@
447infodir = @infodir@
448install_sh = @install_sh@
449libdir = @libdir@
450libexecdir = @libexecdir@
451localedir = @localedir@
452localstatedir = @localstatedir@
453lt_ECHO = @lt_ECHO@
454lt_enable_auto_import = @lt_enable_auto_import@
455mandir = @mandir@
456mkdir_p = @mkdir_p@
457oldincludedir = @oldincludedir@
458pdfdir = @pdfdir@
459pkgconfig_requires_private = @pkgconfig_requires_private@
460prefix = @prefix@
461program_transform_name = @program_transform_name@
462psdir = @psdir@
463release_info = @release_info@
464requirements_ecore = @requirements_ecore@
465requirements_ecore_cocoa = @requirements_ecore_cocoa@
466requirements_ecore_con = @requirements_ecore_con@
467requirements_ecore_directfb = @requirements_ecore_directfb@
468requirements_ecore_evas = @requirements_ecore_evas@
469requirements_ecore_fb = @requirements_ecore_fb@
470requirements_ecore_file = @requirements_ecore_file@
471requirements_ecore_imf = @requirements_ecore_imf@
472requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
473requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
474requirements_ecore_input = @requirements_ecore_input@
475requirements_ecore_input_evas = @requirements_ecore_input_evas@
476requirements_ecore_ipc = @requirements_ecore_ipc@
477requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
478requirements_ecore_sdl = @requirements_ecore_sdl@
479requirements_ecore_win32 = @requirements_ecore_win32@
480requirements_ecore_wince = @requirements_ecore_wince@
481requirements_ecore_x = @requirements_ecore_x@
482rt_libs = @rt_libs@
483sbindir = @sbindir@
484sharedstatedir = @sharedstatedir@
485srcdir = @srcdir@
486sysconfdir = @sysconfdir@
487target_alias = @target_alias@
488top_build_prefix = @top_build_prefix@
489top_builddir = @top_builddir@
490top_srcdir = @top_srcdir@
491version_info = @version_info@
492x_cflags = @x_cflags@
493x_includes = @x_includes@
494x_libs = @x_libs@
495MAINTAINERCLEANFILES = Makefile.in
496SUBDIRS = xlib xcb
497@BUILD_ECORE_X_XCB_FALSE@DEP = xlib/libecore_x_xlib.la
498@BUILD_ECORE_X_XCB_TRUE@DEP = xcb/libecore_x_xcb.la
499AM_CPPFLAGS = \
500-I$(top_srcdir)/src/lib/ecore \
501-I$(top_builddir)/src/lib/ecore \
502@EINA_CFLAGS@
503
504lib_LTLIBRARIES = libecore_x.la
505libecore_x_la_SOURCES =
506libecore_x_la_LIBADD = $(DEP) @EINA_LIBS@
507libecore_x_la_LDFLAGS = -version-info @version_info@ @release_info@
508libecore_x_la_DEPENDENCIES = $(DEP)
509includes_HEADERS = \
510Ecore_X.h \
511Ecore_X_Atoms.h \
512Ecore_X_Cursor.h
513
514includesdir = $(includedir)/ecore-@VMAJ@
515EXTRA_DIST = ecore_x_atoms_decl.h
516all: all-recursive
517
518.SUFFIXES:
519$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
520 @for dep in $?; do \
521 case '$(am__configure_deps)' in \
522 *$$dep*) \
523 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
524 && { if test -f $@; then exit 0; else break; fi; }; \
525 exit 1;; \
526 esac; \
527 done; \
528 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_x/Makefile'; \
529 $(am__cd) $(top_srcdir) && \
530 $(AUTOMAKE) --gnu src/lib/ecore_x/Makefile
531.PRECIOUS: Makefile
532Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
533 @case '$?' in \
534 *config.status*) \
535 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
536 *) \
537 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
538 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
539 esac;
540
541$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
542 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
543
544$(top_srcdir)/configure: $(am__configure_deps)
545 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
546$(ACLOCAL_M4): $(am__aclocal_m4_deps)
547 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
548$(am__aclocal_m4_deps):
549install-libLTLIBRARIES: $(lib_LTLIBRARIES)
550 @$(NORMAL_INSTALL)
551 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
552 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
553 list2=; for p in $$list; do \
554 if test -f $$p; then \
555 list2="$$list2 $$p"; \
556 else :; fi; \
557 done; \
558 test -z "$$list2" || { \
559 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
560 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
561 }
562
563uninstall-libLTLIBRARIES:
564 @$(NORMAL_UNINSTALL)
565 @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
566 for p in $$list; do \
567 $(am__strip_dir) \
568 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
569 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
570 done
571
572clean-libLTLIBRARIES:
573 -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
574 @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
575 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
576 test "$$dir" != "$$p" || dir=.; \
577 echo "rm -f \"$${dir}/so_locations\""; \
578 rm -f "$${dir}/so_locations"; \
579 done
580libecore_x.la: $(libecore_x_la_OBJECTS) $(libecore_x_la_DEPENDENCIES)
581 $(AM_V_CCLD)$(libecore_x_la_LINK) -rpath $(libdir) $(libecore_x_la_OBJECTS) $(libecore_x_la_LIBADD) $(LIBS)
582
583mostlyclean-compile:
584 -rm -f *.$(OBJEXT)
585
586distclean-compile:
587 -rm -f *.tab.c
588
589mostlyclean-libtool:
590 -rm -f *.lo
591
592clean-libtool:
593 -rm -rf .libs _libs
594install-includesHEADERS: $(includes_HEADERS)
595 @$(NORMAL_INSTALL)
596 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
597 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
598 for p in $$list; do \
599 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
600 echo "$$d$$p"; \
601 done | $(am__base_list) | \
602 while read files; do \
603 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
604 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
605 done
606
607uninstall-includesHEADERS:
608 @$(NORMAL_UNINSTALL)
609 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
610 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
611 test -n "$$files" || exit 0; \
612 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
613 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
614
615# This directory's subdirectories are mostly independent; you can cd
616# into them and run `make' without going through this Makefile.
617# To change the values of `make' variables: instead of editing Makefiles,
618# (1) if the variable is set in `config.status', edit `config.status'
619# (which will cause the Makefiles to be regenerated when you run `make');
620# (2) otherwise, pass the desired values on the `make' command line.
621$(RECURSIVE_TARGETS):
622 @fail= failcom='exit 1'; \
623 for f in x $$MAKEFLAGS; do \
624 case $$f in \
625 *=* | --[!k]*);; \
626 *k*) failcom='fail=yes';; \
627 esac; \
628 done; \
629 dot_seen=no; \
630 target=`echo $@ | sed s/-recursive//`; \
631 list='$(SUBDIRS)'; for subdir in $$list; do \
632 echo "Making $$target in $$subdir"; \
633 if test "$$subdir" = "."; then \
634 dot_seen=yes; \
635 local_target="$$target-am"; \
636 else \
637 local_target="$$target"; \
638 fi; \
639 ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
640 || eval $$failcom; \
641 done; \
642 if test "$$dot_seen" = "no"; then \
643 $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
644 fi; test -z "$$fail"
645
646$(RECURSIVE_CLEAN_TARGETS):
647 @fail= failcom='exit 1'; \
648 for f in x $$MAKEFLAGS; do \
649 case $$f in \
650 *=* | --[!k]*);; \
651 *k*) failcom='fail=yes';; \
652 esac; \
653 done; \
654 dot_seen=no; \
655 case "$@" in \
656 distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
657 *) list='$(SUBDIRS)' ;; \
658 esac; \
659 rev=''; for subdir in $$list; do \
660 if test "$$subdir" = "."; then :; else \
661 rev="$$subdir $$rev"; \
662 fi; \
663 done; \
664 rev="$$rev ."; \
665 target=`echo $@ | sed s/-recursive//`; \
666 for subdir in $$rev; do \
667 echo "Making $$target in $$subdir"; \
668 if test "$$subdir" = "."; then \
669 local_target="$$target-am"; \
670 else \
671 local_target="$$target"; \
672 fi; \
673 ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
674 || eval $$failcom; \
675 done && test -z "$$fail"
676tags-recursive:
677 list='$(SUBDIRS)'; for subdir in $$list; do \
678 test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
679 done
680ctags-recursive:
681 list='$(SUBDIRS)'; for subdir in $$list; do \
682 test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
683 done
684
685ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
686 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
687 unique=`for i in $$list; do \
688 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
689 done | \
690 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
691 END { if (nonempty) { for (i in files) print i; }; }'`; \
692 mkid -fID $$unique
693tags: TAGS
694
695TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
696 $(TAGS_FILES) $(LISP)
697 set x; \
698 here=`pwd`; \
699 if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
700 include_option=--etags-include; \
701 empty_fix=.; \
702 else \
703 include_option=--include; \
704 empty_fix=; \
705 fi; \
706 list='$(SUBDIRS)'; for subdir in $$list; do \
707 if test "$$subdir" = .; then :; else \
708 test ! -f $$subdir/TAGS || \
709 set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
710 fi; \
711 done; \
712 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
713 unique=`for i in $$list; do \
714 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
715 done | \
716 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
717 END { if (nonempty) { for (i in files) print i; }; }'`; \
718 shift; \
719 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
720 test -n "$$unique" || unique=$$empty_fix; \
721 if test $$# -gt 0; then \
722 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
723 "$$@" $$unique; \
724 else \
725 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
726 $$unique; \
727 fi; \
728 fi
729ctags: CTAGS
730CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
731 $(TAGS_FILES) $(LISP)
732 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
733 unique=`for i in $$list; do \
734 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
735 done | \
736 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
737 END { if (nonempty) { for (i in files) print i; }; }'`; \
738 test -z "$(CTAGS_ARGS)$$unique" \
739 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
740 $$unique
741
742GTAGS:
743 here=`$(am__cd) $(top_builddir) && pwd` \
744 && $(am__cd) $(top_srcdir) \
745 && gtags -i $(GTAGS_ARGS) "$$here"
746
747distclean-tags:
748 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
749
750distdir: $(DISTFILES)
751 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
752 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
753 list='$(DISTFILES)'; \
754 dist_files=`for file in $$list; do echo $$file; done | \
755 sed -e "s|^$$srcdirstrip/||;t" \
756 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
757 case $$dist_files in \
758 */*) $(MKDIR_P) `echo "$$dist_files" | \
759 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
760 sort -u` ;; \
761 esac; \
762 for file in $$dist_files; do \
763 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
764 if test -d $$d/$$file; then \
765 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
766 if test -d "$(distdir)/$$file"; then \
767 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
768 fi; \
769 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
770 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
771 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
772 fi; \
773 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
774 else \
775 test -f "$(distdir)/$$file" \
776 || cp -p $$d/$$file "$(distdir)/$$file" \
777 || exit 1; \
778 fi; \
779 done
780 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
781 if test "$$subdir" = .; then :; else \
782 test -d "$(distdir)/$$subdir" \
783 || $(MKDIR_P) "$(distdir)/$$subdir" \
784 || exit 1; \
785 fi; \
786 done
787 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
788 if test "$$subdir" = .; then :; else \
789 dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
790 $(am__relativize); \
791 new_distdir=$$reldir; \
792 dir1=$$subdir; dir2="$(top_distdir)"; \
793 $(am__relativize); \
794 new_top_distdir=$$reldir; \
795 echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
796 echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
797 ($(am__cd) $$subdir && \
798 $(MAKE) $(AM_MAKEFLAGS) \
799 top_distdir="$$new_top_distdir" \
800 distdir="$$new_distdir" \
801 am__remove_distdir=: \
802 am__skip_length_check=: \
803 am__skip_mode_fix=: \
804 distdir) \
805 || exit 1; \
806 fi; \
807 done
808check-am: all-am
809check: check-recursive
810all-am: Makefile $(LTLIBRARIES) $(HEADERS)
811installdirs: installdirs-recursive
812installdirs-am:
813 for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesdir)"; do \
814 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
815 done
816install: install-recursive
817install-exec: install-exec-recursive
818install-data: install-data-recursive
819uninstall: uninstall-recursive
820
821install-am: all-am
822 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
823
824installcheck: installcheck-recursive
825install-strip:
826 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
827 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
828 `test -z '$(STRIP)' || \
829 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
830mostlyclean-generic:
831
832clean-generic:
833
834distclean-generic:
835 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
836 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
837
838maintainer-clean-generic:
839 @echo "This command is intended for maintainers to use"
840 @echo "it deletes files that may require special tools to rebuild."
841 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
842clean: clean-recursive
843
844clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
845 mostlyclean-am
846
847distclean: distclean-recursive
848 -rm -f Makefile
849distclean-am: clean-am distclean-compile distclean-generic \
850 distclean-tags
851
852dvi: dvi-recursive
853
854dvi-am:
855
856html: html-recursive
857
858html-am:
859
860info: info-recursive
861
862info-am:
863
864install-data-am: install-includesHEADERS
865
866install-dvi: install-dvi-recursive
867
868install-dvi-am:
869
870install-exec-am: install-libLTLIBRARIES
871
872install-html: install-html-recursive
873
874install-html-am:
875
876install-info: install-info-recursive
877
878install-info-am:
879
880install-man:
881
882install-pdf: install-pdf-recursive
883
884install-pdf-am:
885
886install-ps: install-ps-recursive
887
888install-ps-am:
889
890installcheck-am:
891
892maintainer-clean: maintainer-clean-recursive
893 -rm -f Makefile
894maintainer-clean-am: distclean-am maintainer-clean-generic
895
896mostlyclean: mostlyclean-recursive
897
898mostlyclean-am: mostlyclean-compile mostlyclean-generic \
899 mostlyclean-libtool
900
901pdf: pdf-recursive
902
903pdf-am:
904
905ps: ps-recursive
906
907ps-am:
908
909uninstall-am: uninstall-includesHEADERS uninstall-libLTLIBRARIES
910
911.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
912 install-am install-strip tags-recursive
913
914.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
915 all all-am check check-am clean clean-generic \
916 clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \
917 distclean distclean-compile distclean-generic \
918 distclean-libtool distclean-tags distdir dvi dvi-am html \
919 html-am info info-am install install-am install-data \
920 install-data-am install-dvi install-dvi-am install-exec \
921 install-exec-am install-html install-html-am \
922 install-includesHEADERS install-info install-info-am \
923 install-libLTLIBRARIES install-man install-pdf install-pdf-am \
924 install-ps install-ps-am install-strip installcheck \
925 installcheck-am installdirs installdirs-am maintainer-clean \
926 maintainer-clean-generic mostlyclean mostlyclean-compile \
927 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
928 tags tags-recursive uninstall uninstall-am \
929 uninstall-includesHEADERS uninstall-libLTLIBRARIES
930
931
932# Tell versions [3.59,3.63) of GNU make to not export all variables.
933# Otherwise a system limit (for SysV at least) may be exceeded.
934.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_x/ecore_x_atoms_decl.h b/libraries/ecore/src/lib/ecore_x/ecore_x_atoms_decl.h
new file mode 100644
index 0000000..3f22356
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/ecore_x_atoms_decl.h
@@ -0,0 +1,281 @@
1/* generic atoms */
2EAPI Ecore_X_Atom ECORE_X_ATOM_ATOM = 0;
3EAPI Ecore_X_Atom ECORE_X_ATOM_CARDINAL = 0;
4EAPI Ecore_X_Atom ECORE_X_ATOM_COMPOUND_TEXT = 0;
5EAPI Ecore_X_Atom ECORE_X_ATOM_FILE_NAME = 0;
6EAPI Ecore_X_Atom ECORE_X_ATOM_STRING = 0;
7EAPI Ecore_X_Atom ECORE_X_ATOM_TEXT = 0;
8EAPI Ecore_X_Atom ECORE_X_ATOM_UTF8_STRING = 0;
9EAPI Ecore_X_Atom ECORE_X_ATOM_WINDOW = 0;
10EAPI Ecore_X_Atom ECORE_X_ATOM_PIXMAP = 0;
11EAPI Ecore_X_Atom ECORE_X_ATOM_VISUALID = 0;
12
13/* dnd atoms */
14EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_XDND = 0;
15EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_XDND = 0;
16EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_AWARE = 0;
17EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ENTER = 0;
18EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_TYPE_LIST = 0;
19EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_POSITION = 0;
20EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_COPY = 0;
21EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_MOVE = 0;
22EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_PRIVATE = 0;
23EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_ASK = 0;
24EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_LIST = 0;
25EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_LINK = 0;
26EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_ACTION_DESCRIPTION = 0;
27EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_PROXY = 0;
28EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_STATUS = 0;
29EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_LEAVE = 0;
30EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_DROP = 0;
31EAPI Ecore_X_Atom ECORE_X_ATOM_XDND_FINISHED = 0;
32
33/* dnd atoms that need to be exposed to the application interface */
34EAPI Ecore_X_Atom ECORE_X_DND_ACTION_COPY = 0;
35EAPI Ecore_X_Atom ECORE_X_DND_ACTION_MOVE = 0;
36EAPI Ecore_X_Atom ECORE_X_DND_ACTION_LINK = 0;
37EAPI Ecore_X_Atom ECORE_X_DND_ACTION_ASK = 0;
38EAPI Ecore_X_Atom ECORE_X_DND_ACTION_PRIVATE = 0;
39
40/* old E atom */
41EAPI Ecore_X_Atom ECORE_X_ATOM_E_FRAME_SIZE = 0;
42
43/* old Gnome atom */
44EAPI Ecore_X_Atom ECORE_X_ATOM_WIN_LAYER = 0;
45
46/* ICCCM atoms */
47
48/* ICCCM: client properties */
49EAPI Ecore_X_Atom ECORE_X_ATOM_WM_NAME = 0;
50EAPI Ecore_X_Atom ECORE_X_ATOM_WM_ICON_NAME = 0;
51EAPI Ecore_X_Atom ECORE_X_ATOM_WM_NORMAL_HINTS = 0;
52EAPI Ecore_X_Atom ECORE_X_ATOM_WM_SIZE_HINTS = 0;
53EAPI Ecore_X_Atom ECORE_X_ATOM_WM_HINTS = 0;
54EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CLASS = 0;
55EAPI Ecore_X_Atom ECORE_X_ATOM_WM_TRANSIENT_FOR = 0;
56EAPI Ecore_X_Atom ECORE_X_ATOM_WM_PROTOCOLS = 0;
57EAPI Ecore_X_Atom ECORE_X_ATOM_WM_COLORMAP_WINDOWS = 0;
58EAPI Ecore_X_Atom ECORE_X_ATOM_WM_COMMAND = 0; /* obsolete */
59EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CLIENT_MACHINE = 0; /* obsolete */
60
61/* ICCCM: window manager properties */
62EAPI Ecore_X_Atom ECORE_X_ATOM_WM_STATE = 0;
63EAPI Ecore_X_Atom ECORE_X_ATOM_WM_ICON_SIZE = 0;
64
65/* ICCCM: WM_STATE property */
66EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CHANGE_STATE = 0;
67
68/* ICCCM: WM_PROTOCOLS properties */
69EAPI Ecore_X_Atom ECORE_X_ATOM_WM_TAKE_FOCUS = 0;
70EAPI Ecore_X_Atom ECORE_X_ATOM_WM_SAVE_YOURSELF = 0;
71EAPI Ecore_X_Atom ECORE_X_ATOM_WM_DELETE_WINDOW = 0;
72
73/* ICCCM: WM_COLORMAP properties */
74EAPI Ecore_X_Atom ECORE_X_ATOM_WM_COLORMAP_NOTIFY = 0;
75
76/* ICCCM: session management properties */
77EAPI Ecore_X_Atom ECORE_X_ATOM_SM_CLIENT_ID = 0;
78EAPI Ecore_X_Atom ECORE_X_ATOM_WM_CLIENT_LEADER = 0;
79EAPI Ecore_X_Atom ECORE_X_ATOM_WM_WINDOW_ROLE = 0;
80
81/* Motif WM atom */
82EAPI Ecore_X_Atom ECORE_X_ATOM_MOTIF_WM_HINTS = 0;
83
84/* NetWM 1.3 atoms (http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html) */
85
86/*
87 * NetWM: Root Window Properties and related messages (complete)
88 */
89
90EAPI Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTED = 0;
91EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST = 0;
92EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CLIENT_LIST_STACKING = 0;
93EAPI Ecore_X_Atom ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS = 0;
94EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_GEOMETRY = 0;
95EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_VIEWPORT = 0;
96EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CURRENT_DESKTOP = 0;
97EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_NAMES = 0;
98EAPI Ecore_X_Atom ECORE_X_ATOM_NET_ACTIVE_WINDOW = 0;
99EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WORKAREA = 0;
100EAPI Ecore_X_Atom ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK = 0;
101EAPI Ecore_X_Atom ECORE_X_ATOM_NET_VIRTUAL_ROOTS = 0;
102EAPI Ecore_X_Atom ECORE_X_ATOM_NET_DESKTOP_LAYOUT = 0;
103EAPI Ecore_X_Atom ECORE_X_ATOM_NET_SHOWING_DESKTOP = 0;
104
105/*
106 * NetWM: Other Root Window Messages (complete)
107 */
108
109/* pager */
110EAPI Ecore_X_Atom ECORE_X_ATOM_NET_CLOSE_WINDOW = 0;
111EAPI Ecore_X_Atom ECORE_X_ATOM_NET_MOVERESIZE_WINDOW = 0;
112EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_MOVERESIZE = 0;
113EAPI Ecore_X_Atom ECORE_X_ATOM_NET_RESTACK_WINDOW = 0;
114
115EAPI Ecore_X_Atom ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS = 0;
116
117/*
118 * NetWM: Application Window Properties (complete)
119 */
120
121EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_NAME = 0;
122EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_NAME = 0;
123EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_NAME = 0;
124EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME = 0;
125EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_DESKTOP = 0;
126
127/* window type */
128EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE = 0;
129EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP = 0;
130EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK = 0;
131EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR = 0;
132EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU = 0;
133EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY = 0;
134EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH = 0;
135EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG = 0;
136EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL = 0;
137EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU = 0;
138EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU = 0;
139EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP = 0;
140EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION = 0;
141EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO = 0;
142EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND = 0;
143
144/* state */
145EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE = 0;
146EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MODAL = 0;
147EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_STICKY = 0;
148EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT = 0;
149EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ = 0;
150EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SHADED = 0;
151EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR = 0;
152EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER = 0;
153EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_HIDDEN = 0;
154EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN = 0;
155EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_ABOVE = 0;
156EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_BELOW = 0;
157EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION = 0;
158
159/* allowed actions */
160EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS = 0;
161EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MOVE = 0;
162EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_RESIZE = 0;
163EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE = 0;
164EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_SHADE = 0;
165EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_STICK = 0;
166EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ = 0;
167EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT = 0;
168EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN = 0;
169EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP = 0;
170EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_CLOSE = 0;
171EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_ABOVE = 0;
172EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ACTION_BELOW = 0;
173
174EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT = 0;
175EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_STRUT_PARTIAL = 0;
176EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON_GEOMETRY = 0;
177EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_ICON = 0;
178EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_PID = 0;
179EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_HANDLED_ICONS = 0;
180EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_USER_TIME = 0;
181EAPI Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_ID = 0;
182EAPI Ecore_X_Atom ECORE_X_ATOM_NET_FRAME_EXTENTS = 0;
183
184/*
185 * NetWM: Window Manager Protocols (complete)
186 */
187
188EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_PING = 0;
189EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST = 0;
190EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER = 0;
191
192/*
193 * NetWM: Not in the spec
194 */
195
196EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_OPACITY = 0;
197EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_SHADOW = 0;
198EAPI Ecore_X_Atom ECORE_X_ATOM_NET_WM_WINDOW_SHADE = 0;
199
200/*
201 * Startup Notification (http://standards.freedesktop.org/startup-notification-spec/startup-notification-0.1.txt)
202 */
203
204EAPI Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN = 0;
205EAPI Ecore_X_Atom ECORE_X_ATOM_NET_STARTUP_INFO = 0;
206
207/* selection atoms */
208EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_TARGETS = 0;
209EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PRIMARY = 0;
210EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_SECONDARY = 0;
211EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_CLIPBOARD = 0;
212EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_PRIMARY = 0;
213EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_SECONDARY = 0;
214EAPI Ecore_X_Atom ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD = 0;
215
216/* currently E specific virtual keyboard extension, aim to submit to netwm spec
217 * later */
218
219EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD = 0;
220EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE = 0;
221EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON = 0;
222EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF = 0;
223EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA = 0;
224EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC = 0;
225EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN = 0;
226EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER = 0;
227EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX = 0;
228EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL = 0;
229EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD = 0;
230EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP = 0;
231EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST = 0;
232EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE = 0;
233EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL = 0;
234EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD = 0;
235EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME = 0;
236
237/* currently E specific illume extension */
238EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE = 0;
239EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_ZONE_LIST = 0;
240EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CONFORMANT = 0;
241EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE = 0;
242EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_SINGLE = 0;
243EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP = 0;
244EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT = 0;
245EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_BACK = 0;
246EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD = 0;
247EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_FOCUS_HOME = 0;
248EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_CLOSE = 0;
249EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_NEW = 0;
250EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_HOME_DEL = 0;
251EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG = 0;
252EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED = 0;
253EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_START = 0;
254EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_DRAG_END = 0;
255EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY = 0;
256EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY = 0;
257EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY = 0;
258EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL = 0;
259EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE = 0;
260EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE = 0;
261EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON = 0;
262EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF = 0;
263EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR = 0;
264EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR = 0;
265EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE = 0;
266EAPI Ecore_X_Atom ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE = 0;
267
268EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_COUNTER = 0;
269EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE = 0;
270EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED = 0;
271EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_BEGIN = 0;
272EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_END = 0;
273EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_SYNC_CANCEL = 0;
274
275EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_FLUSH = 0;
276EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_DUMP = 0;
277EAPI Ecore_X_Atom ECORE_X_ATOM_E_COMP_PIXMAP = 0;
278
279/* currently Emotion and E17 specific extension */
280EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_PARENT = 0;
281EAPI Ecore_X_Atom ECORE_X_ATOM_E_VIDEO_POSITION = 0;
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/Makefile.am b/libraries/ecore/src/lib/ecore_x/xcb/Makefile.am
new file mode 100644
index 0000000..366ebfd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/Makefile.am
@@ -0,0 +1,99 @@
1
2MAINTAINERCLEANFILES = Makefile.in ecore_xcb_keysym_table.h
3
4if BUILD_ECORE_X_XCB
5
6AM_CPPFLAGS = \
7 @XCB_DAMAGE_CFLAGS@ \
8 @XCB_COMPOSITE_CFLAGS@ \
9 @XCB_DPMS_CFLAGS@ \
10 @XCB_RANDR_CFLAGS@ \
11 @XCB_RENDER_CFLAGS@ \
12 @XCB_SCREENSAVER_CFLAGS@ \
13 @XCB_SHAPE_CFLAGS@ \
14 @XCB_SYNC_CFLAGS@ \
15 @XCB_XFIXES_CFLAGS@ \
16 @XCB_XINERAMA_CFLAGS@ \
17 @XCB_XPRINT_CFLAGS@ \
18 @XCB_XTEST_CFLAGS@ \
19 @XCB_XINPUT_CFLAGS@ \
20 @XCB_XGESTURE_CFLAGS@ \
21 @XCB_CURSOR_CFLAGS@ \
22 @ECORE_XCB_CFLAGS@ \
23 @PIXMAN_CFLAGS@ \
24 -I$(top_srcdir)/src/lib/ecore \
25 -I$(top_srcdir)/src/lib/ecore_x \
26 -I$(top_srcdir)/src/lib/ecore_input \
27 -I$(top_builddir)/src/lib/ecore \
28 -I$(top_builddir)/src/lib/ecore_x \
29 -I$(top_builddir)/src/lib/ecore_input \
30 @EINA_CFLAGS@
31
32noinst_LTLIBRARIES = libecore_x_xcb.la
33
34libecore_x_xcb_la_SOURCES = \
35 ecore_xcb.c \
36 ecore_xcb_atoms.c \
37 ecore_xcb_extensions.c \
38 ecore_xcb_shape.c \
39 ecore_xcb_screensaver.c \
40 ecore_xcb_sync.c \
41 ecore_xcb_render.c \
42 ecore_xcb_randr.c \
43 ecore_xcb_xfixes.c \
44 ecore_xcb_composite.c \
45 ecore_xcb_cursor.c \
46 ecore_xcb_damage.c \
47 ecore_xcb_dnd.c \
48 ecore_xcb_dpms.c \
49 ecore_xcb_drawable.c \
50 ecore_xcb_e.c \
51 ecore_xcb_gc.c \
52 ecore_xcb_image.c \
53 ecore_xcb_input.c \
54 ecore_xcb_gesture.c \
55 ecore_xcb_mwm.c \
56 ecore_xcb_pixmap.c \
57 ecore_xcb_region.c \
58 ecore_xcb_selection.c \
59 ecore_xcb_textlist.c \
60 ecore_xcb_events.c \
61 ecore_xcb_keymap.c \
62 ecore_xcb_netwm.c \
63 ecore_xcb_icccm.c \
64 ecore_xcb_window.c \
65 ecore_xcb_window_prop.c \
66 ecore_xcb_window_shape.c \
67 ecore_xcb_window_shadow.c \
68 ecore_xcb_xinerama.c \
69 ecore_xcb_error.c \
70 ecore_xcb_xtest.c \
71 ecore_xcb_vsync.c \
72 ecore_xcb_xdefaults.c
73
74libecore_x_xcb_la_LIBADD = \
75 @XCB_DAMAGE_LIBS@ \
76 @XCB_COMPOSITE_LIBS@ \
77 @XCB_DPMS_LIBS@ \
78 @XCB_RANDR_LIBS@ \
79 @XCB_RENDER_LIBS@ \
80 @XCB_SCREENSAVER_LIBS@ \
81 @XCB_SHAPE_LIBS@ \
82 @XCB_SYNC_LIBS@ \
83 @XCB_XFIXES_LIBS@ \
84 @XCB_XINERAMA_LIBS@ \
85 @XCB_XPRINT_LIBS@ \
86 @XCB_XTEST_LIBS@ \
87 @XCB_XINPUT_LIBS@ \
88 @XCB_XGESTURE_LIBS@ \
89 @XCB_CURSOR_LIBS@ \
90 @ECORE_XCB_LIBS@ \
91 @PIXMAN_LIBS@ \
92 $(top_builddir)/src/lib/ecore/libecore.la \
93 $(top_builddir)/src/lib/ecore_input/libecore_input.la \
94 @EINA_LIBS@ \
95 @dlopen_libs@
96
97endif
98
99EXTRA_DIST = ecore_xcb_private.h
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/Makefile.in b/libraries/ecore/src/lib/ecore_x/xcb/Makefile.in
new file mode 100644
index 0000000..0213aea
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/Makefile.in
@@ -0,0 +1,891 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18VPATH = @srcdir@
19pkgdatadir = $(datadir)/@PACKAGE@
20pkgincludedir = $(includedir)/@PACKAGE@
21pkglibdir = $(libdir)/@PACKAGE@
22pkglibexecdir = $(libexecdir)/@PACKAGE@
23am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
24install_sh_DATA = $(install_sh) -c -m 644
25install_sh_PROGRAM = $(install_sh) -c
26install_sh_SCRIPT = $(install_sh) -c
27INSTALL_HEADER = $(INSTALL_DATA)
28transform = $(program_transform_name)
29NORMAL_INSTALL = :
30PRE_INSTALL = :
31POST_INSTALL = :
32NORMAL_UNINSTALL = :
33PRE_UNINSTALL = :
34POST_UNINSTALL = :
35build_triplet = @build@
36host_triplet = @host@
37subdir = src/lib/ecore_x/xcb
38DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
39ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
40am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
41 $(top_srcdir)/m4/ac_path_generic.m4 \
42 $(top_srcdir)/m4/check_x_extension.m4 \
43 $(top_srcdir)/m4/ecore_check_module.m4 \
44 $(top_srcdir)/m4/ecore_check_options.m4 \
45 $(top_srcdir)/m4/efl_compiler_flag.m4 \
46 $(top_srcdir)/m4/efl_doxygen.m4 \
47 $(top_srcdir)/m4/efl_examples.m4 \
48 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
49 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
50 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
51 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
52 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
53 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
54 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
55 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
56 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
57 $(top_srcdir)/configure.ac
58am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
59 $(ACLOCAL_M4)
60mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
61CONFIG_HEADER = $(top_builddir)/config.h
62CONFIG_CLEAN_FILES =
63CONFIG_CLEAN_VPATH_FILES =
64LTLIBRARIES = $(noinst_LTLIBRARIES)
65@BUILD_ECORE_X_XCB_TRUE@libecore_x_xcb_la_DEPENDENCIES = $(top_builddir)/src/lib/ecore/libecore.la \
66@BUILD_ECORE_X_XCB_TRUE@ $(top_builddir)/src/lib/ecore_input/libecore_input.la
67am__libecore_x_xcb_la_SOURCES_DIST = ecore_xcb.c ecore_xcb_atoms.c \
68 ecore_xcb_extensions.c ecore_xcb_shape.c \
69 ecore_xcb_screensaver.c ecore_xcb_sync.c ecore_xcb_render.c \
70 ecore_xcb_randr.c ecore_xcb_xfixes.c ecore_xcb_composite.c \
71 ecore_xcb_cursor.c ecore_xcb_damage.c ecore_xcb_dnd.c \
72 ecore_xcb_dpms.c ecore_xcb_drawable.c ecore_xcb_e.c \
73 ecore_xcb_gc.c ecore_xcb_image.c ecore_xcb_input.c \
74 ecore_xcb_gesture.c ecore_xcb_mwm.c ecore_xcb_pixmap.c \
75 ecore_xcb_region.c ecore_xcb_selection.c ecore_xcb_textlist.c \
76 ecore_xcb_events.c ecore_xcb_keymap.c ecore_xcb_netwm.c \
77 ecore_xcb_icccm.c ecore_xcb_window.c ecore_xcb_window_prop.c \
78 ecore_xcb_window_shape.c ecore_xcb_window_shadow.c \
79 ecore_xcb_xinerama.c ecore_xcb_error.c ecore_xcb_xtest.c \
80 ecore_xcb_vsync.c ecore_xcb_xdefaults.c
81@BUILD_ECORE_X_XCB_TRUE@am_libecore_x_xcb_la_OBJECTS = ecore_xcb.lo \
82@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_atoms.lo \
83@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_extensions.lo \
84@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_shape.lo \
85@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_screensaver.lo \
86@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_sync.lo ecore_xcb_render.lo \
87@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_randr.lo ecore_xcb_xfixes.lo \
88@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_composite.lo \
89@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_cursor.lo \
90@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_damage.lo ecore_xcb_dnd.lo \
91@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_dpms.lo \
92@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_drawable.lo ecore_xcb_e.lo \
93@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_gc.lo ecore_xcb_image.lo \
94@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_input.lo \
95@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_gesture.lo ecore_xcb_mwm.lo \
96@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_pixmap.lo \
97@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_region.lo \
98@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_selection.lo \
99@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_textlist.lo \
100@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_events.lo \
101@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_keymap.lo ecore_xcb_netwm.lo \
102@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_icccm.lo ecore_xcb_window.lo \
103@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window_prop.lo \
104@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window_shape.lo \
105@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window_shadow.lo \
106@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_xinerama.lo \
107@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_error.lo ecore_xcb_xtest.lo \
108@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_vsync.lo \
109@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_xdefaults.lo
110libecore_x_xcb_la_OBJECTS = $(am_libecore_x_xcb_la_OBJECTS)
111AM_V_lt = $(am__v_lt_$(V))
112am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
113am__v_lt_0 = --silent
114@BUILD_ECORE_X_XCB_TRUE@am_libecore_x_xcb_la_rpath =
115DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
116depcomp = $(SHELL) $(top_srcdir)/depcomp
117am__depfiles_maybe = depfiles
118am__mv = mv -f
119COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
120 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
121LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
122 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
123 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
124 $(AM_CFLAGS) $(CFLAGS)
125AM_V_CC = $(am__v_CC_$(V))
126am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
127am__v_CC_0 = @echo " CC " $@;
128AM_V_at = $(am__v_at_$(V))
129am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
130am__v_at_0 = @
131CCLD = $(CC)
132LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
133 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
134 $(AM_LDFLAGS) $(LDFLAGS) -o $@
135AM_V_CCLD = $(am__v_CCLD_$(V))
136am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
137am__v_CCLD_0 = @echo " CCLD " $@;
138AM_V_GEN = $(am__v_GEN_$(V))
139am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
140am__v_GEN_0 = @echo " GEN " $@;
141SOURCES = $(libecore_x_xcb_la_SOURCES)
142DIST_SOURCES = $(am__libecore_x_xcb_la_SOURCES_DIST)
143ETAGS = etags
144CTAGS = ctags
145DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
146ACLOCAL = @ACLOCAL@
147ALLOCA = @ALLOCA@
148AMTAR = @AMTAR@
149AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
150AR = @AR@
151AS = @AS@
152AUTOCONF = @AUTOCONF@
153AUTOHEADER = @AUTOHEADER@
154AUTOMAKE = @AUTOMAKE@
155AWK = @AWK@
156CARES_CFLAGS = @CARES_CFLAGS@
157CARES_LIBS = @CARES_LIBS@
158CC = @CC@
159CCDEPMODE = @CCDEPMODE@
160CFLAGS = @CFLAGS@
161CHECK_CFLAGS = @CHECK_CFLAGS@
162CHECK_LIBS = @CHECK_LIBS@
163CPP = @CPP@
164CPPFLAGS = @CPPFLAGS@
165CURL_CFLAGS = @CURL_CFLAGS@
166CURL_LIBS = @CURL_LIBS@
167CXX = @CXX@
168CXXCPP = @CXXCPP@
169CXXDEPMODE = @CXXDEPMODE@
170CXXFLAGS = @CXXFLAGS@
171CYGPATH_W = @CYGPATH_W@
172DEFS = @DEFS@
173DEPDIR = @DEPDIR@
174DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
175DIRECTFB_LIBS = @DIRECTFB_LIBS@
176DLLTOOL = @DLLTOOL@
177DSYMUTIL = @DSYMUTIL@
178DUMPBIN = @DUMPBIN@
179ECHO_C = @ECHO_C@
180ECHO_N = @ECHO_N@
181ECHO_T = @ECHO_T@
182ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
183ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
184EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
185EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
186EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
187EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
188EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
189EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
190EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
191EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
192EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
193EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
194EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
195EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
196EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
197EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
198EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
199EGREP = @EGREP@
200EINA_CFLAGS = @EINA_CFLAGS@
201EINA_LIBS = @EINA_LIBS@
202ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
203ESCAPE_LIBS = @ESCAPE_LIBS@
204EVAS_CFLAGS = @EVAS_CFLAGS@
205EVAS_LIBS = @EVAS_LIBS@
206EVIL_CFLAGS = @EVIL_CFLAGS@
207EVIL_LIBS = @EVIL_LIBS@
208EXEEXT = @EXEEXT@
209FGREP = @FGREP@
210GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
211GLIB_CFLAGS = @GLIB_CFLAGS@
212GLIB_LIBS = @GLIB_LIBS@
213GMSGFMT = @GMSGFMT@
214GMSGFMT_015 = @GMSGFMT_015@
215GREP = @GREP@
216INSTALL = @INSTALL@
217INSTALL_DATA = @INSTALL_DATA@
218INSTALL_PROGRAM = @INSTALL_PROGRAM@
219INSTALL_SCRIPT = @INSTALL_SCRIPT@
220INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
221INTLLIBS = @INTLLIBS@
222INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
223KEYSYMDEFS = @KEYSYMDEFS@
224LD = @LD@
225LDFLAGS = @LDFLAGS@
226LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
227LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
228LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
229LIBICONV = @LIBICONV@
230LIBINTL = @LIBINTL@
231LIBOBJS = @LIBOBJS@
232LIBS = @LIBS@
233LIBTOOL = @LIBTOOL@
234LIPO = @LIPO@
235LN_S = @LN_S@
236LTLIBICONV = @LTLIBICONV@
237LTLIBINTL = @LTLIBINTL@
238LTLIBOBJS = @LTLIBOBJS@
239MAKEINFO = @MAKEINFO@
240MKDIR_P = @MKDIR_P@
241MSGFMT = @MSGFMT@
242MSGFMT_015 = @MSGFMT_015@
243MSGMERGE = @MSGMERGE@
244NM = @NM@
245NMEDIT = @NMEDIT@
246OBJC = @OBJC@
247OBJCDEPMODE = @OBJCDEPMODE@
248OBJCFLAGS = @OBJCFLAGS@
249OBJDUMP = @OBJDUMP@
250OBJEXT = @OBJEXT@
251OTOOL = @OTOOL@
252OTOOL64 = @OTOOL64@
253PACKAGE = @PACKAGE@
254PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
255PACKAGE_NAME = @PACKAGE_NAME@
256PACKAGE_STRING = @PACKAGE_STRING@
257PACKAGE_TARNAME = @PACKAGE_TARNAME@
258PACKAGE_URL = @PACKAGE_URL@
259PACKAGE_VERSION = @PACKAGE_VERSION@
260PATH_SEPARATOR = @PATH_SEPARATOR@
261PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
262PIXMAN_LIBS = @PIXMAN_LIBS@
263PKG_CONFIG = @PKG_CONFIG@
264PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
265PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
266POSUB = @POSUB@
267RANLIB = @RANLIB@
268SDL_CFLAGS = @SDL_CFLAGS@
269SDL_CONFIG = @SDL_CONFIG@
270SDL_LIBS = @SDL_LIBS@
271SED = @SED@
272SET_MAKE = @SET_MAKE@
273SHELL = @SHELL@
274SSL_CFLAGS = @SSL_CFLAGS@
275SSL_LIBS = @SSL_LIBS@
276STRIP = @STRIP@
277TLS2_CFLAGS = @TLS2_CFLAGS@
278TLS2_LIBS = @TLS2_LIBS@
279TLS_CFLAGS = @TLS_CFLAGS@
280TLS_LIBS = @TLS_LIBS@
281TSLIB_CFLAGS = @TSLIB_CFLAGS@
282TSLIB_LIBS = @TSLIB_LIBS@
283USE_NLS = @USE_NLS@
284VERSION = @VERSION@
285VMAJ = @VMAJ@
286WIN32_CFLAGS = @WIN32_CFLAGS@
287WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
288WIN32_LIBS = @WIN32_LIBS@
289XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
290XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
291XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
292XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
293XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
294XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
295XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
296XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
297XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
298XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
299XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
300XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
301XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
302XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
303XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
304XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
305XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
306XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
307XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
308XCB_X11_LIBS = @XCB_X11_LIBS@
309XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
310XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
311XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
312XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
313XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
314XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
315XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
316XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
317XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
318XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
319XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
320XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
321XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
322XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
323XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
324XDAMAGE_LIBS = @XDAMAGE_LIBS@
325XDPMS_CFLAGS = @XDPMS_CFLAGS@
326XDPMS_LIBS = @XDPMS_LIBS@
327XFIXES_CFLAGS = @XFIXES_CFLAGS@
328XFIXES_LIBS = @XFIXES_LIBS@
329XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
330XGESTURE_LIBS = @XGESTURE_LIBS@
331XGETTEXT = @XGETTEXT@
332XGETTEXT_015 = @XGETTEXT_015@
333XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
334XI2_CFLAGS = @XI2_CFLAGS@
335XI2_LIBS = @XI2_LIBS@
336XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
337XINERAMA_LIBS = @XINERAMA_LIBS@
338XKB_CFLAGS = @XKB_CFLAGS@
339XKB_LIBS = @XKB_LIBS@
340XMKMF = @XMKMF@
341XPRINT_CFLAGS = @XPRINT_CFLAGS@
342XPRINT_LIBS = @XPRINT_LIBS@
343XRANDR_CFLAGS = @XRANDR_CFLAGS@
344XRANDR_LIBS = @XRANDR_LIBS@
345XRENDER_CFLAGS = @XRENDER_CFLAGS@
346XRENDER_LIBS = @XRENDER_LIBS@
347XSS_CFLAGS = @XSS_CFLAGS@
348XSS_LIBS = @XSS_LIBS@
349XTEST_CFLAGS = @XTEST_CFLAGS@
350XTEST_LIBS = @XTEST_LIBS@
351X_CFLAGS = @X_CFLAGS@
352X_EXTRA_LIBS = @X_EXTRA_LIBS@
353X_LIBS = @X_LIBS@
354X_PRE_LIBS = @X_PRE_LIBS@
355Xcursor_cflags = @Xcursor_cflags@
356Xcursor_libs = @Xcursor_libs@
357abs_builddir = @abs_builddir@
358abs_srcdir = @abs_srcdir@
359abs_top_builddir = @abs_top_builddir@
360abs_top_srcdir = @abs_top_srcdir@
361ac_ct_CC = @ac_ct_CC@
362ac_ct_CXX = @ac_ct_CXX@
363ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
364ac_ct_OBJC = @ac_ct_OBJC@
365am__include = @am__include@
366am__leading_dot = @am__leading_dot@
367am__quote = @am__quote@
368am__tar = @am__tar@
369am__untar = @am__untar@
370bindir = @bindir@
371build = @build@
372build_alias = @build_alias@
373build_cpu = @build_cpu@
374build_os = @build_os@
375build_vendor = @build_vendor@
376builddir = @builddir@
377cocoa_ldflags = @cocoa_ldflags@
378datadir = @datadir@
379datarootdir = @datarootdir@
380dlopen_libs = @dlopen_libs@
381docdir = @docdir@
382dvidir = @dvidir@
383ecore_cocoa_cflags = @ecore_cocoa_cflags@
384ecore_cocoa_libs = @ecore_cocoa_libs@
385ecore_con_cflags = @ecore_con_cflags@
386ecore_con_libs = @ecore_con_libs@
387ecore_directfb_cflags = @ecore_directfb_cflags@
388ecore_directfb_libs = @ecore_directfb_libs@
389ecore_evas_cflags = @ecore_evas_cflags@
390ecore_evas_libs = @ecore_evas_libs@
391ecore_fb_cflags = @ecore_fb_cflags@
392ecore_fb_libs = @ecore_fb_libs@
393ecore_file_cflags = @ecore_file_cflags@
394ecore_file_libs = @ecore_file_libs@
395ecore_imf_cflags = @ecore_imf_cflags@
396ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
397ecore_imf_evas_libs = @ecore_imf_evas_libs@
398ecore_imf_libs = @ecore_imf_libs@
399ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
400ecore_imf_xim_libs = @ecore_imf_xim_libs@
401ecore_input_cflags = @ecore_input_cflags@
402ecore_input_evas_cflags = @ecore_input_evas_cflags@
403ecore_input_evas_libs = @ecore_input_evas_libs@
404ecore_input_libs = @ecore_input_libs@
405ecore_ipc_cflags = @ecore_ipc_cflags@
406ecore_ipc_libs = @ecore_ipc_libs@
407ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
408ecore_psl1ght_libs = @ecore_psl1ght_libs@
409ecore_sdl_cflags = @ecore_sdl_cflags@
410ecore_sdl_libs = @ecore_sdl_libs@
411ecore_win32_cflags = @ecore_win32_cflags@
412ecore_win32_libs = @ecore_win32_libs@
413ecore_wince_cflags = @ecore_wince_cflags@
414ecore_wince_libs = @ecore_wince_libs@
415ecore_x_cflags = @ecore_x_cflags@
416ecore_x_libs = @ecore_x_libs@
417ecore_x_libs_private = @ecore_x_libs_private@
418efl_doxygen = @efl_doxygen@
419efl_have_doxygen = @efl_have_doxygen@
420exec_prefix = @exec_prefix@
421have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
422host = @host@
423host_alias = @host_alias@
424host_cpu = @host_cpu@
425host_os = @host_os@
426host_vendor = @host_vendor@
427htmldir = @htmldir@
428includedir = @includedir@
429infodir = @infodir@
430install_sh = @install_sh@
431libdir = @libdir@
432libexecdir = @libexecdir@
433localedir = @localedir@
434localstatedir = @localstatedir@
435lt_ECHO = @lt_ECHO@
436lt_enable_auto_import = @lt_enable_auto_import@
437mandir = @mandir@
438mkdir_p = @mkdir_p@
439oldincludedir = @oldincludedir@
440pdfdir = @pdfdir@
441pkgconfig_requires_private = @pkgconfig_requires_private@
442prefix = @prefix@
443program_transform_name = @program_transform_name@
444psdir = @psdir@
445release_info = @release_info@
446requirements_ecore = @requirements_ecore@
447requirements_ecore_cocoa = @requirements_ecore_cocoa@
448requirements_ecore_con = @requirements_ecore_con@
449requirements_ecore_directfb = @requirements_ecore_directfb@
450requirements_ecore_evas = @requirements_ecore_evas@
451requirements_ecore_fb = @requirements_ecore_fb@
452requirements_ecore_file = @requirements_ecore_file@
453requirements_ecore_imf = @requirements_ecore_imf@
454requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
455requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
456requirements_ecore_input = @requirements_ecore_input@
457requirements_ecore_input_evas = @requirements_ecore_input_evas@
458requirements_ecore_ipc = @requirements_ecore_ipc@
459requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
460requirements_ecore_sdl = @requirements_ecore_sdl@
461requirements_ecore_win32 = @requirements_ecore_win32@
462requirements_ecore_wince = @requirements_ecore_wince@
463requirements_ecore_x = @requirements_ecore_x@
464rt_libs = @rt_libs@
465sbindir = @sbindir@
466sharedstatedir = @sharedstatedir@
467srcdir = @srcdir@
468sysconfdir = @sysconfdir@
469target_alias = @target_alias@
470top_build_prefix = @top_build_prefix@
471top_builddir = @top_builddir@
472top_srcdir = @top_srcdir@
473version_info = @version_info@
474x_cflags = @x_cflags@
475x_includes = @x_includes@
476x_libs = @x_libs@
477MAINTAINERCLEANFILES = Makefile.in ecore_xcb_keysym_table.h
478@BUILD_ECORE_X_XCB_TRUE@AM_CPPFLAGS = \
479@BUILD_ECORE_X_XCB_TRUE@ @XCB_DAMAGE_CFLAGS@ \
480@BUILD_ECORE_X_XCB_TRUE@ @XCB_COMPOSITE_CFLAGS@ \
481@BUILD_ECORE_X_XCB_TRUE@ @XCB_DPMS_CFLAGS@ \
482@BUILD_ECORE_X_XCB_TRUE@ @XCB_RANDR_CFLAGS@ \
483@BUILD_ECORE_X_XCB_TRUE@ @XCB_RENDER_CFLAGS@ \
484@BUILD_ECORE_X_XCB_TRUE@ @XCB_SCREENSAVER_CFLAGS@ \
485@BUILD_ECORE_X_XCB_TRUE@ @XCB_SHAPE_CFLAGS@ \
486@BUILD_ECORE_X_XCB_TRUE@ @XCB_SYNC_CFLAGS@ \
487@BUILD_ECORE_X_XCB_TRUE@ @XCB_XFIXES_CFLAGS@ \
488@BUILD_ECORE_X_XCB_TRUE@ @XCB_XINERAMA_CFLAGS@ \
489@BUILD_ECORE_X_XCB_TRUE@ @XCB_XPRINT_CFLAGS@ \
490@BUILD_ECORE_X_XCB_TRUE@ @XCB_XTEST_CFLAGS@ \
491@BUILD_ECORE_X_XCB_TRUE@ @XCB_XINPUT_CFLAGS@ \
492@BUILD_ECORE_X_XCB_TRUE@ @XCB_XGESTURE_CFLAGS@ \
493@BUILD_ECORE_X_XCB_TRUE@ @XCB_CURSOR_CFLAGS@ \
494@BUILD_ECORE_X_XCB_TRUE@ @ECORE_XCB_CFLAGS@ \
495@BUILD_ECORE_X_XCB_TRUE@ @PIXMAN_CFLAGS@ \
496@BUILD_ECORE_X_XCB_TRUE@ -I$(top_srcdir)/src/lib/ecore \
497@BUILD_ECORE_X_XCB_TRUE@ -I$(top_srcdir)/src/lib/ecore_x \
498@BUILD_ECORE_X_XCB_TRUE@ -I$(top_srcdir)/src/lib/ecore_input \
499@BUILD_ECORE_X_XCB_TRUE@ -I$(top_builddir)/src/lib/ecore \
500@BUILD_ECORE_X_XCB_TRUE@ -I$(top_builddir)/src/lib/ecore_x \
501@BUILD_ECORE_X_XCB_TRUE@ -I$(top_builddir)/src/lib/ecore_input \
502@BUILD_ECORE_X_XCB_TRUE@ @EINA_CFLAGS@
503
504@BUILD_ECORE_X_XCB_TRUE@noinst_LTLIBRARIES = libecore_x_xcb.la
505@BUILD_ECORE_X_XCB_TRUE@libecore_x_xcb_la_SOURCES = \
506@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb.c \
507@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_atoms.c \
508@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_extensions.c \
509@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_shape.c \
510@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_screensaver.c \
511@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_sync.c \
512@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_render.c \
513@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_randr.c \
514@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_xfixes.c \
515@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_composite.c \
516@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_cursor.c \
517@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_damage.c \
518@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_dnd.c \
519@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_dpms.c \
520@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_drawable.c \
521@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_e.c \
522@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_gc.c \
523@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_image.c \
524@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_input.c \
525@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_gesture.c \
526@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_mwm.c \
527@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_pixmap.c \
528@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_region.c \
529@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_selection.c \
530@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_textlist.c \
531@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_events.c \
532@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_keymap.c \
533@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_netwm.c \
534@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_icccm.c \
535@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window.c \
536@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window_prop.c \
537@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window_shape.c \
538@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_window_shadow.c \
539@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_xinerama.c \
540@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_error.c \
541@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_xtest.c \
542@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_vsync.c \
543@BUILD_ECORE_X_XCB_TRUE@ ecore_xcb_xdefaults.c
544
545@BUILD_ECORE_X_XCB_TRUE@libecore_x_xcb_la_LIBADD = \
546@BUILD_ECORE_X_XCB_TRUE@ @XCB_DAMAGE_LIBS@ \
547@BUILD_ECORE_X_XCB_TRUE@ @XCB_COMPOSITE_LIBS@ \
548@BUILD_ECORE_X_XCB_TRUE@ @XCB_DPMS_LIBS@ \
549@BUILD_ECORE_X_XCB_TRUE@ @XCB_RANDR_LIBS@ \
550@BUILD_ECORE_X_XCB_TRUE@ @XCB_RENDER_LIBS@ \
551@BUILD_ECORE_X_XCB_TRUE@ @XCB_SCREENSAVER_LIBS@ \
552@BUILD_ECORE_X_XCB_TRUE@ @XCB_SHAPE_LIBS@ \
553@BUILD_ECORE_X_XCB_TRUE@ @XCB_SYNC_LIBS@ \
554@BUILD_ECORE_X_XCB_TRUE@ @XCB_XFIXES_LIBS@ \
555@BUILD_ECORE_X_XCB_TRUE@ @XCB_XINERAMA_LIBS@ \
556@BUILD_ECORE_X_XCB_TRUE@ @XCB_XPRINT_LIBS@ \
557@BUILD_ECORE_X_XCB_TRUE@ @XCB_XTEST_LIBS@ \
558@BUILD_ECORE_X_XCB_TRUE@ @XCB_XINPUT_LIBS@ \
559@BUILD_ECORE_X_XCB_TRUE@ @XCB_XGESTURE_LIBS@ \
560@BUILD_ECORE_X_XCB_TRUE@ @XCB_CURSOR_LIBS@ \
561@BUILD_ECORE_X_XCB_TRUE@ @ECORE_XCB_LIBS@ \
562@BUILD_ECORE_X_XCB_TRUE@ @PIXMAN_LIBS@ \
563@BUILD_ECORE_X_XCB_TRUE@ $(top_builddir)/src/lib/ecore/libecore.la \
564@BUILD_ECORE_X_XCB_TRUE@ $(top_builddir)/src/lib/ecore_input/libecore_input.la \
565@BUILD_ECORE_X_XCB_TRUE@ @EINA_LIBS@ \
566@BUILD_ECORE_X_XCB_TRUE@ @dlopen_libs@
567
568EXTRA_DIST = ecore_xcb_private.h
569all: all-am
570
571.SUFFIXES:
572.SUFFIXES: .c .lo .o .obj
573$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
574 @for dep in $?; do \
575 case '$(am__configure_deps)' in \
576 *$$dep*) \
577 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
578 && { if test -f $@; then exit 0; else break; fi; }; \
579 exit 1;; \
580 esac; \
581 done; \
582 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_x/xcb/Makefile'; \
583 $(am__cd) $(top_srcdir) && \
584 $(AUTOMAKE) --gnu src/lib/ecore_x/xcb/Makefile
585.PRECIOUS: Makefile
586Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
587 @case '$?' in \
588 *config.status*) \
589 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
590 *) \
591 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
592 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
593 esac;
594
595$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
596 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
597
598$(top_srcdir)/configure: $(am__configure_deps)
599 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
600$(ACLOCAL_M4): $(am__aclocal_m4_deps)
601 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
602$(am__aclocal_m4_deps):
603
604clean-noinstLTLIBRARIES:
605 -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
606 @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
607 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
608 test "$$dir" != "$$p" || dir=.; \
609 echo "rm -f \"$${dir}/so_locations\""; \
610 rm -f "$${dir}/so_locations"; \
611 done
612libecore_x_xcb.la: $(libecore_x_xcb_la_OBJECTS) $(libecore_x_xcb_la_DEPENDENCIES)
613 $(AM_V_CCLD)$(LINK) $(am_libecore_x_xcb_la_rpath) $(libecore_x_xcb_la_OBJECTS) $(libecore_x_xcb_la_LIBADD) $(LIBS)
614
615mostlyclean-compile:
616 -rm -f *.$(OBJEXT)
617
618distclean-compile:
619 -rm -f *.tab.c
620
621@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb.Plo@am__quote@
622@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_atoms.Plo@am__quote@
623@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_composite.Plo@am__quote@
624@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_cursor.Plo@am__quote@
625@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_damage.Plo@am__quote@
626@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_dnd.Plo@am__quote@
627@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_dpms.Plo@am__quote@
628@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_drawable.Plo@am__quote@
629@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_e.Plo@am__quote@
630@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_error.Plo@am__quote@
631@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_events.Plo@am__quote@
632@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_extensions.Plo@am__quote@
633@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_gc.Plo@am__quote@
634@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_gesture.Plo@am__quote@
635@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_icccm.Plo@am__quote@
636@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_image.Plo@am__quote@
637@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_input.Plo@am__quote@
638@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_keymap.Plo@am__quote@
639@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_mwm.Plo@am__quote@
640@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_netwm.Plo@am__quote@
641@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_pixmap.Plo@am__quote@
642@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_randr.Plo@am__quote@
643@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_region.Plo@am__quote@
644@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_render.Plo@am__quote@
645@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_screensaver.Plo@am__quote@
646@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_selection.Plo@am__quote@
647@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_shape.Plo@am__quote@
648@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_sync.Plo@am__quote@
649@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_textlist.Plo@am__quote@
650@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_vsync.Plo@am__quote@
651@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_window.Plo@am__quote@
652@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_window_prop.Plo@am__quote@
653@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_window_shadow.Plo@am__quote@
654@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_window_shape.Plo@am__quote@
655@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_xdefaults.Plo@am__quote@
656@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_xfixes.Plo@am__quote@
657@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_xinerama.Plo@am__quote@
658@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_xcb_xtest.Plo@am__quote@
659
660.c.o:
661@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
662@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
663@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
664@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
665@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
666@am__fastdepCC_FALSE@ $(COMPILE) -c $<
667
668.c.obj:
669@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
670@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
671@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
672@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
673@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
674@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
675
676.c.lo:
677@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
678@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
679@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
680@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
681@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
682@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
683
684mostlyclean-libtool:
685 -rm -f *.lo
686
687clean-libtool:
688 -rm -rf .libs _libs
689
690ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
691 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
692 unique=`for i in $$list; do \
693 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
694 done | \
695 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
696 END { if (nonempty) { for (i in files) print i; }; }'`; \
697 mkid -fID $$unique
698tags: TAGS
699
700TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
701 $(TAGS_FILES) $(LISP)
702 set x; \
703 here=`pwd`; \
704 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
705 unique=`for i in $$list; do \
706 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
707 done | \
708 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
709 END { if (nonempty) { for (i in files) print i; }; }'`; \
710 shift; \
711 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
712 test -n "$$unique" || unique=$$empty_fix; \
713 if test $$# -gt 0; then \
714 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
715 "$$@" $$unique; \
716 else \
717 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
718 $$unique; \
719 fi; \
720 fi
721ctags: CTAGS
722CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
723 $(TAGS_FILES) $(LISP)
724 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
725 unique=`for i in $$list; do \
726 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
727 done | \
728 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
729 END { if (nonempty) { for (i in files) print i; }; }'`; \
730 test -z "$(CTAGS_ARGS)$$unique" \
731 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
732 $$unique
733
734GTAGS:
735 here=`$(am__cd) $(top_builddir) && pwd` \
736 && $(am__cd) $(top_srcdir) \
737 && gtags -i $(GTAGS_ARGS) "$$here"
738
739distclean-tags:
740 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
741
742distdir: $(DISTFILES)
743 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
744 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
745 list='$(DISTFILES)'; \
746 dist_files=`for file in $$list; do echo $$file; done | \
747 sed -e "s|^$$srcdirstrip/||;t" \
748 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
749 case $$dist_files in \
750 */*) $(MKDIR_P) `echo "$$dist_files" | \
751 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
752 sort -u` ;; \
753 esac; \
754 for file in $$dist_files; do \
755 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
756 if test -d $$d/$$file; then \
757 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
758 if test -d "$(distdir)/$$file"; then \
759 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
760 fi; \
761 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
762 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
763 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
764 fi; \
765 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
766 else \
767 test -f "$(distdir)/$$file" \
768 || cp -p $$d/$$file "$(distdir)/$$file" \
769 || exit 1; \
770 fi; \
771 done
772check-am: all-am
773check: check-am
774all-am: Makefile $(LTLIBRARIES)
775installdirs:
776install: install-am
777install-exec: install-exec-am
778install-data: install-data-am
779uninstall: uninstall-am
780
781install-am: all-am
782 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
783
784installcheck: installcheck-am
785install-strip:
786 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
787 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
788 `test -z '$(STRIP)' || \
789 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
790mostlyclean-generic:
791
792clean-generic:
793
794distclean-generic:
795 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
796 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
797
798maintainer-clean-generic:
799 @echo "This command is intended for maintainers to use"
800 @echo "it deletes files that may require special tools to rebuild."
801 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
802clean: clean-am
803
804clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
805 mostlyclean-am
806
807distclean: distclean-am
808 -rm -rf ./$(DEPDIR)
809 -rm -f Makefile
810distclean-am: clean-am distclean-compile distclean-generic \
811 distclean-tags
812
813dvi: dvi-am
814
815dvi-am:
816
817html: html-am
818
819html-am:
820
821info: info-am
822
823info-am:
824
825install-data-am:
826
827install-dvi: install-dvi-am
828
829install-dvi-am:
830
831install-exec-am:
832
833install-html: install-html-am
834
835install-html-am:
836
837install-info: install-info-am
838
839install-info-am:
840
841install-man:
842
843install-pdf: install-pdf-am
844
845install-pdf-am:
846
847install-ps: install-ps-am
848
849install-ps-am:
850
851installcheck-am:
852
853maintainer-clean: maintainer-clean-am
854 -rm -rf ./$(DEPDIR)
855 -rm -f Makefile
856maintainer-clean-am: distclean-am maintainer-clean-generic
857
858mostlyclean: mostlyclean-am
859
860mostlyclean-am: mostlyclean-compile mostlyclean-generic \
861 mostlyclean-libtool
862
863pdf: pdf-am
864
865pdf-am:
866
867ps: ps-am
868
869ps-am:
870
871uninstall-am:
872
873.MAKE: install-am install-strip
874
875.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
876 clean-libtool clean-noinstLTLIBRARIES ctags distclean \
877 distclean-compile distclean-generic distclean-libtool \
878 distclean-tags distdir dvi dvi-am html html-am info info-am \
879 install install-am install-data install-data-am install-dvi \
880 install-dvi-am install-exec install-exec-am install-html \
881 install-html-am install-info install-info-am install-man \
882 install-pdf install-pdf-am install-ps install-ps-am \
883 install-strip installcheck installcheck-am installdirs \
884 maintainer-clean maintainer-clean-generic mostlyclean \
885 mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
886 pdf pdf-am ps ps-am tags uninstall uninstall-am
887
888
889# Tell versions [3.59,3.63) of GNU make to not export all variables.
890# Otherwise a system limit (for SysV at least) may be exceeded.
891.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb.c
new file mode 100644
index 0000000..ca7e798
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb.c
@@ -0,0 +1,1470 @@
1#include "ecore_xcb_private.h"
2#include <X11/Xlib-xcb.h>
3#include <dlfcn.h>
4
5/* local function prototypes */
6static int _ecore_xcb_shutdown(Eina_Bool close_display);
7static Eina_Bool _ecore_xcb_fd_handle(void *data, Ecore_Fd_Handler *hdlr __UNUSED__);
8static Eina_Bool _ecore_xcb_fd_handle_buff(void *data, Ecore_Fd_Handler *hdlr __UNUSED__);
9static Eina_Bool _ecore_xcb_idle_enter(void *data __UNUSED__);
10
11/* local variables */
12static int _ecore_xcb_init_count = 0;
13static int _ecore_xcb_grab_count = 0;
14static Ecore_Fd_Handler *_ecore_xcb_fd_handler = NULL;
15static xcb_generic_event_t *_ecore_xcb_event_buffered = NULL;
16static Ecore_Idle_Enterer *_ecore_xcb_idle_enterer = NULL;
17
18/* external variables */
19int _ecore_xcb_log_dom = -1;
20Ecore_X_Display *_ecore_xcb_display = NULL;
21Ecore_X_Connection *_ecore_xcb_conn = NULL;
22Ecore_X_Screen *_ecore_xcb_screen = NULL;
23Ecore_X_Atom _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_NUM];
24double _ecore_xcb_double_click_time = 0.25;
25
26/**
27 * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions
28 *
29 * Functions that start and shut down the Ecore X Library.
30 */
31
32/**
33 * Initialize the X display connection to the given display.
34 *
35 * @param name Display target name. If @c NULL, the default display is
36 * assumed.
37 * @return The number of times the library has been initialized without
38 * being shut down. 0 is returned if an error occurs.
39 * @ingroup Ecore_X_Init_Group
40 */
41EAPI int
42ecore_x_init(const char *name)
43{
44 char *gl = NULL;
45 uint32_t mask, list[1];
46
47 /* check if we have initialized already */
48 if (++_ecore_xcb_init_count != 1)
49 return _ecore_xcb_init_count;
50
51 LOGFN(__FILE__, __LINE__, __FUNCTION__);
52
53 /* try to initialize eina */
54 if (!eina_init()) return --_ecore_xcb_init_count;
55
56 /* setup ecore_xcb log domain */
57 _ecore_xcb_log_dom =
58 eina_log_domain_register("ecore_x", ECORE_XCB_DEFAULT_LOG_COLOR);
59 if (_ecore_xcb_log_dom < 0)
60 {
61 EINA_LOG_ERR("Cannot create Ecore Xcb log domain");
62 eina_shutdown();
63 return --_ecore_xcb_init_count;
64 }
65
66 /* try to initialize ecore */
67 if (!ecore_init())
68 {
69 /* unregister log domain */
70 eina_log_domain_unregister(_ecore_xcb_log_dom);
71 _ecore_xcb_log_dom = -1;
72 eina_shutdown();
73 return --_ecore_xcb_init_count;
74 }
75
76 /* try to initialize ecore_event */
77 if (!ecore_event_init())
78 {
79 /* unregister log domain */
80 eina_log_domain_unregister(_ecore_xcb_log_dom);
81 _ecore_xcb_log_dom = -1;
82 ecore_shutdown();
83 eina_shutdown();
84 return --_ecore_xcb_init_count;
85 }
86
87 /* NB: XLib has XInitThreads */
88
89 /* check for env var which says we are not going to use GL @ all
90 *
91 * NB: This is done because if someone wants a 'pure' xcb implementation
92 * of ecore_x, all they need do is export this variable in the environment
93 * and ecore_x will not use xlib stuff at all.
94 *
95 * The upside is you can get pure xcb-based ecore_x (w/ all the speed), but
96 * there is a down-side here in that you cannot get OpenGL without XLib :(
97 */
98 if ((gl = getenv("ECORE_X_NO_XLIB")))
99 {
100 /* we found the env var that says 'Yes, we are not ever gonna try
101 * OpenGL so it is safe to not use XLib at all' */
102
103 /* try to connect to the display server */
104 _ecore_xcb_conn = xcb_connect(name, NULL);
105 }
106 else
107 {
108 /* env var was not specified, so we will assume that the user
109 * may want opengl @ some point. connect this way for opengl to work */
110 void *libxcb, *libxlib;
111 Display *(*_real_display)(const char *display);
112 xcb_connection_t *(*_real_connection)(Display * dpy);
113 void (*_real_queue)(Display *dpy, enum XEventQueueOwner owner);
114 int (*_real_close)(Display *dpy);
115#ifdef EVAS_FRAME_QUEUING
116 Status (*_real_threads)(void);
117#endif
118
119 /* want to dlopen here to avoid actual library linkage */
120 libxlib = dlopen("libX11.so", (RTLD_LAZY | RTLD_GLOBAL));
121 if (!libxlib)
122 libxlib = dlopen("libX11.so.6", (RTLD_LAZY | RTLD_GLOBAL));
123 if (!libxlib)
124 libxlib = dlopen("libX11.so.6.3.0", (RTLD_LAZY | RTLD_GLOBAL));
125 if (!libxlib)
126 {
127 ERR("Could not dlsym to libX11");
128 /* unregister log domain */
129 eina_log_domain_unregister(_ecore_xcb_log_dom);
130 _ecore_xcb_log_dom = -1;
131 ecore_event_shutdown();
132 ecore_shutdown();
133 eina_shutdown();
134 return --_ecore_xcb_init_count;
135 }
136
137 libxcb = dlopen("libX11-xcb.so", (RTLD_LAZY | RTLD_GLOBAL));
138 if (!libxcb)
139 libxcb = dlopen("libX11-xcb.so.1", (RTLD_LAZY | RTLD_GLOBAL));
140 if (!libxcb)
141 libxcb = dlopen("libX11-xcb.so.1.0.0", (RTLD_LAZY | RTLD_GLOBAL));
142 if (!libxcb)
143 {
144 ERR("Could not dlsym to libX11-xcb");
145 /* unregister log domain */
146 eina_log_domain_unregister(_ecore_xcb_log_dom);
147 _ecore_xcb_log_dom = -1;
148 ecore_event_shutdown();
149 ecore_shutdown();
150 eina_shutdown();
151 return --_ecore_xcb_init_count;
152 }
153
154 _real_display = dlsym(libxlib, "XOpenDisplay");
155 _real_close = dlsym(libxlib, "XCloseDisplay");
156 _real_connection = dlsym(libxcb, "XGetXCBConnection");
157 _real_queue = dlsym(libxcb, "XSetEventQueueOwner");
158#ifdef EVAS_FRAME_QUEUING
159 _real_threads = dlsym(libxlib, "XInitThreads");
160#endif
161
162 if (_real_display)
163 {
164#ifdef EVAS_FRAME_QUEUING
165 if (_real_threads) _real_threads();
166#endif
167 _ecore_xcb_display = _real_display(name);
168 if (!_ecore_xcb_display)
169 {
170 ERR("Could not open Display via XLib");
171 /* unregister log domain */
172 eina_log_domain_unregister(_ecore_xcb_log_dom);
173 _ecore_xcb_log_dom = -1;
174 ecore_event_shutdown();
175 ecore_shutdown();
176 eina_shutdown();
177 return --_ecore_xcb_init_count;
178 }
179 if (_real_connection)
180 _ecore_xcb_conn = _real_connection(_ecore_xcb_display);
181 if (!_ecore_xcb_conn)
182 {
183 ERR("Could not get XCB Connection from XLib");
184
185 if (_real_close) _real_close(_ecore_xcb_display);
186
187 /* unregister log domain */
188 eina_log_domain_unregister(_ecore_xcb_log_dom);
189 _ecore_xcb_log_dom = -1;
190 ecore_event_shutdown();
191 ecore_shutdown();
192 eina_shutdown();
193 return --_ecore_xcb_init_count;
194 }
195 if (_real_queue)
196 _real_queue(_ecore_xcb_display, XCBOwnsEventQueue);
197 }
198 }
199
200 if (xcb_connection_has_error(_ecore_xcb_conn))
201 {
202 CRIT("XCB Connection has error");
203 eina_log_domain_unregister(_ecore_xcb_log_dom);
204 _ecore_xcb_log_dom = -1;
205 ecore_event_shutdown();
206 ecore_shutdown();
207 eina_shutdown();
208 return --_ecore_xcb_init_count;
209 }
210
211 /* grab the default screen */
212 _ecore_xcb_screen =
213 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
214
215 /* NB: This method of init/finalize extensions first, then atoms
216 * Does end up being 2 round trips to X, BUT if we do extensions init then
217 * atoms init first, and call the 'finalize' functions later, we end up
218 * being slower, so it's a trade-off. This current method clocks in
219 * around 0.003 for fetching atoms VS 0.010 for init both then finalize */
220
221 /* prefetch extension data */
222 _ecore_xcb_extensions_init();
223
224 /* finalize extensions */
225 _ecore_xcb_extensions_finalize();
226
227 /* set keyboard autorepeat */
228 mask = XCB_KB_AUTO_REPEAT_MODE;
229 list[0] = XCB_AUTO_REPEAT_MODE_ON;
230 xcb_change_keyboard_control(_ecore_xcb_conn, mask, list);
231
232 /* setup xcb events */
233 _ecore_xcb_events_init();
234
235 /* setup xcb keymasks */
236 _ecore_xcb_keymap_init();
237
238 /* finalize xcb keymasks */
239 _ecore_xcb_keymap_finalize();
240
241 /* setup ecore fd handler */
242 _ecore_xcb_fd_handler =
243 ecore_main_fd_handler_add(xcb_get_file_descriptor(_ecore_xcb_conn),
244 ECORE_FD_READ, _ecore_xcb_fd_handle,
245 _ecore_xcb_conn, _ecore_xcb_fd_handle_buff,
246 _ecore_xcb_conn);
247
248 if (!_ecore_xcb_fd_handler)
249 return _ecore_xcb_shutdown(EINA_TRUE);
250
251 /* prefetch atoms */
252 _ecore_xcb_atoms_init();
253
254 /* finalize atoms */
255 _ecore_xcb_atoms_finalize();
256
257 /* icccm_init: dummy function */
258 ecore_x_icccm_init();
259
260 /* setup netwm */
261 ecore_x_netwm_init();
262
263 /* old e hints init: dummy function */
264 ecore_x_e_init();
265
266 _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] =
267 ECORE_X_ATOM_WM_DELETE_WINDOW;
268 _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] =
269 ECORE_X_ATOM_WM_TAKE_FOCUS;
270 _ecore_xcb_atoms_wm_protocol[ECORE_X_NET_WM_PROTOCOL_PING] =
271 ECORE_X_ATOM_NET_WM_PING;
272 _ecore_xcb_atoms_wm_protocol[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] =
273 ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
274
275 /* setup selection */
276 _ecore_xcb_selection_init();
277
278 /* setup dnd */
279 _ecore_xcb_dnd_init();
280
281 _ecore_xcb_idle_enterer =
282 ecore_idle_enterer_add(_ecore_xcb_idle_enter, NULL);
283
284 return _ecore_xcb_init_count;
285}
286
287/**
288 * Shuts down the Ecore X library.
289 *
290 * In shutting down the library, the X display connection is terminated
291 * and any event handlers for it are removed.
292 *
293 * @return The number of times the library has been initialized without
294 * being shut down.
295 * @ingroup Ecore_X_Init_Group
296 */
297EAPI int
298ecore_x_shutdown(void)
299{
300 return _ecore_xcb_shutdown(EINA_TRUE);
301}
302
303/**
304 * Shuts down the Ecore X library.
305 *
306 * As ecore_x_shutdown, except do not close Display, only connection.
307 *
308 * @ingroup Ecore_X_Init_Group
309 */
310EAPI int
311ecore_x_disconnect(void)
312{
313 return _ecore_xcb_shutdown(EINA_FALSE);
314}
315
316/**
317 * @defgroup Ecore_X_Flush_Group X Synchronization Functions
318 *
319 * Functions that ensure that all commands that have been issued by the
320 * Ecore X library have been sent to the server.
321 */
322
323/**
324 * Sends all X commands in the X Display buffer.
325 * @ingroup Ecore_X_Flush_Group
326 */
327EAPI void
328ecore_x_flush(void)
329{
330// LOGFN(__FILE__, __LINE__, __FUNCTION__);
331
332 CHECK_XCB_CONN;
333 xcb_flush(_ecore_xcb_conn);
334}
335
336/**
337 * Retrieves the Ecore_X_Screen handle used for the current X connection.
338 * @return The current default screen.
339 * @ingroup Ecore_X_Display_Attr_Group
340 */
341EAPI Ecore_X_Screen *
342ecore_x_default_screen_get(void)
343{
344 LOGFN(__FILE__, __LINE__, __FUNCTION__);
345
346 return (Ecore_X_Screen *)_ecore_xcb_screen;
347}
348
349EAPI Ecore_X_Connection *
350ecore_x_connection_get(void)
351{
352 LOGFN(__FILE__, __LINE__, __FUNCTION__);
353
354 CHECK_XCB_CONN;
355 return (Ecore_X_Connection *)_ecore_xcb_conn;
356}
357
358/**
359 * Return the last event time
360 */
361EAPI Ecore_X_Time
362ecore_x_current_time_get(void)
363{
364 return _ecore_xcb_events_last_time_get();
365}
366
367/**
368 * Flushes the command buffer and waits until all requests have been
369 * processed by the server.
370 * @ingroup Ecore_X_Flush_Group
371 */
372EAPI void
373ecore_x_sync(void)
374{
375 LOGFN(__FILE__, __LINE__, __FUNCTION__);
376
377 CHECK_XCB_CONN;
378 free(xcb_get_input_focus_reply(_ecore_xcb_conn,
379 xcb_get_input_focus_unchecked(_ecore_xcb_conn),
380 NULL));
381}
382
383EAPI void
384ecore_x_grab(void)
385{
386 LOGFN(__FILE__, __LINE__, __FUNCTION__);
387
388 CHECK_XCB_CONN;
389 _ecore_xcb_grab_count++;
390 if (_ecore_xcb_grab_count == 1)
391 xcb_grab_server(_ecore_xcb_conn);
392}
393
394EAPI void
395ecore_x_ungrab(void)
396{
397 LOGFN(__FILE__, __LINE__, __FUNCTION__);
398
399 CHECK_XCB_CONN;
400 _ecore_xcb_grab_count--;
401 if (_ecore_xcb_grab_count < 0) _ecore_xcb_grab_count = 0;
402 if (_ecore_xcb_grab_count == 0)
403 xcb_ungrab_server(_ecore_xcb_conn);
404}
405
406/**
407 * Send client message with given type and format 32.
408 *
409 * @param win The window the message is sent to.
410 * @param type The client message type.
411 * @param d0 The client message data item 1
412 * @param d1 The client message data item 2
413 * @param d2 The client message data item 3
414 * @param d3 The client message data item 4
415 * @param d4 The client message data item 5
416 *
417 * @return EINA_TRUE on success EINA_FALSE otherwise.
418 */
419EAPI Eina_Bool
420ecore_x_client_message32_send(Ecore_X_Window win, Ecore_X_Atom type,
421 Ecore_X_Event_Mask mask,
422 long d0, long d1, long d2, long d3, long d4)
423{
424 xcb_client_message_event_t ev;
425 xcb_void_cookie_t cookie;
426 xcb_generic_error_t *err;
427
428 LOGFN(__FILE__, __LINE__, __FUNCTION__);
429 CHECK_XCB_CONN;
430
431 memset(&ev, 0, sizeof(xcb_client_message_event_t));
432
433 ev.response_type = XCB_CLIENT_MESSAGE;
434 ev.format = 32;
435 ev.window = win;
436 ev.type = type;
437 ev.data.data32[0] = (uint32_t)d0;
438 ev.data.data32[1] = (uint32_t)d1;
439 ev.data.data32[2] = (uint32_t)d2;
440 ev.data.data32[3] = (uint32_t)d3;
441 ev.data.data32[4] = (uint32_t)d4;
442
443 cookie = xcb_send_event(_ecore_xcb_conn, 0, win, mask, (const char *)&ev);
444
445 err = xcb_request_check(_ecore_xcb_conn, cookie);
446 if (err)
447 {
448 DBG("Problem Sending Event");
449 DBG("\tType: %d", type);
450 DBG("\tWin: %d", win);
451 _ecore_xcb_error_handle(err);
452 free(err);
453 return EINA_FALSE;
454 }
455
456 return EINA_TRUE;
457}
458
459/**
460 * Send client message with given type and format 8.
461 *
462 * @param win The window the message is sent to.
463 * @param type The client message type.
464 * @param data Data to be sent.
465 * @param len Number of data bytes, max 20.
466 *
467 * @return EINA_TRUE on success EINA_FALSE otherwise.
468 */
469EAPI Eina_Bool
470ecore_x_client_message8_send(Ecore_X_Window win, Ecore_X_Atom type,
471 const void *data, int len)
472{
473 xcb_client_message_event_t ev;
474 xcb_void_cookie_t cookie;
475 xcb_generic_error_t *err;
476
477 LOGFN(__FILE__, __LINE__, __FUNCTION__);
478 CHECK_XCB_CONN;
479
480 memset(&ev, 0, sizeof(xcb_client_message_event_t));
481
482 ev.response_type = XCB_CLIENT_MESSAGE;
483 ev.format = 8;
484 ev.window = win;
485 ev.type = type;
486 if (len > 20) len = 20;
487 memcpy(ev.data.data8, data, len);
488 memset(ev.data.data8 + len, 0, 20 - len);
489
490 cookie = xcb_send_event(_ecore_xcb_conn, 0, win,
491 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
492
493 err = xcb_request_check(_ecore_xcb_conn, cookie);
494 if (err)
495 {
496 DBG("Problem Sending Event");
497 DBG("\tType: %d", type);
498 DBG("\tWin: %d", win);
499 _ecore_xcb_error_handle(err);
500 free(err);
501 return EINA_FALSE;
502 }
503
504 return EINA_TRUE;
505}
506
507EAPI Eina_Bool
508ecore_x_mouse_down_send(Ecore_X_Window win, int x, int y, int b)
509{
510 xcb_translate_coordinates_cookie_t cookie;
511 xcb_translate_coordinates_reply_t *reply;
512 xcb_button_press_event_t ev;
513 xcb_void_cookie_t vcookie;
514 xcb_generic_error_t *err;
515 Ecore_X_Window root = 0;
516
517 LOGFN(__FILE__, __LINE__, __FUNCTION__);
518 CHECK_XCB_CONN;
519
520 root = ecore_x_window_root_get(win);
521 cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
522 reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
523 if (!reply) return EINA_FALSE;
524
525 memset(&ev, 0, sizeof(xcb_button_press_event_t));
526
527 ev.response_type = XCB_BUTTON_PRESS;
528 ev.event = win;
529 ev.child = win;
530 ev.root = root;
531 ev.event_x = x;
532 ev.event_y = y;
533 ev.same_screen = 1;
534 ev.state = 1 << b;
535 ev.detail = b; // xcb uses detail for button
536 ev.root_x = reply->dst_x;
537 ev.root_y = reply->dst_y;
538 ev.time = ecore_x_current_time_get();
539 free(reply);
540
541 vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
542 XCB_EVENT_MASK_BUTTON_PRESS, (const char *)&ev);
543
544 err = xcb_request_check(_ecore_xcb_conn, vcookie);
545 if (err)
546 {
547 _ecore_xcb_error_handle(err);
548 free(err);
549 return EINA_FALSE;
550 }
551
552 return EINA_TRUE;
553}
554
555EAPI Eina_Bool
556ecore_x_mouse_up_send(Ecore_X_Window win, int x, int y, int b)
557{
558 xcb_translate_coordinates_cookie_t cookie;
559 xcb_translate_coordinates_reply_t *reply;
560 xcb_button_release_event_t ev;
561 xcb_void_cookie_t vcookie;
562 xcb_generic_error_t *err;
563 Ecore_X_Window root = 0;
564
565 LOGFN(__FILE__, __LINE__, __FUNCTION__);
566 CHECK_XCB_CONN;
567
568 root = ecore_x_window_root_get(win);
569 cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
570 reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
571 if (!reply) return EINA_FALSE;
572
573 memset(&ev, 0, sizeof(xcb_button_release_event_t));
574
575 ev.response_type = XCB_BUTTON_RELEASE;
576 ev.event = win;
577 ev.child = win;
578 ev.root = root;
579 ev.event_x = x;
580 ev.event_y = y;
581 ev.same_screen = 1;
582 ev.state = 0;
583 ev.root_x = reply->dst_x;
584 ev.root_y = reply->dst_y;
585 ev.detail = b; // xcb uses detail for button
586 ev.time = ecore_x_current_time_get();
587 free(reply);
588
589 vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
590 XCB_EVENT_MASK_BUTTON_RELEASE, (const char *)&ev);
591
592 err = xcb_request_check(_ecore_xcb_conn, vcookie);
593 if (err)
594 {
595 _ecore_xcb_error_handle(err);
596 free(err);
597 return EINA_FALSE;
598 }
599
600 return EINA_TRUE;
601}
602
603EAPI Eina_Bool
604ecore_x_mouse_move_send(Ecore_X_Window win, int x, int y)
605{
606 xcb_translate_coordinates_cookie_t cookie;
607 xcb_translate_coordinates_reply_t *reply;
608 xcb_motion_notify_event_t ev;
609 xcb_void_cookie_t vcookie;
610 xcb_generic_error_t *err;
611 Ecore_X_Window root = 0;
612
613 LOGFN(__FILE__, __LINE__, __FUNCTION__);
614 CHECK_XCB_CONN;
615
616 root = ecore_x_window_root_get(win);
617 cookie = xcb_translate_coordinates(_ecore_xcb_conn, win, root, x, y);
618 reply = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
619 if (!reply) return EINA_FALSE;
620
621 memset(&ev, 0, sizeof(xcb_motion_notify_event_t));
622
623 ev.response_type = XCB_MOTION_NOTIFY;
624 ev.event = win;
625 ev.child = win;
626 ev.root = root;
627 ev.event_x = x;
628 ev.event_y = y;
629 ev.same_screen = 1;
630 ev.state = 0;
631 ev.detail = 0; // xcb uses 'detail' for is_hint
632 ev.root_x = reply->dst_x;
633 ev.root_y = reply->dst_y;
634 ev.time = ecore_x_current_time_get();
635 free(reply);
636
637 vcookie = xcb_send_event(_ecore_xcb_conn, 1, win,
638 XCB_EVENT_MASK_POINTER_MOTION, (const char *)&ev);
639
640 err = xcb_request_check(_ecore_xcb_conn, vcookie);
641 if (err)
642 {
643 _ecore_xcb_error_handle(err);
644 free(err);
645 return EINA_FALSE;
646 }
647
648 return EINA_TRUE;
649}
650
651EAPI Eina_Bool
652ecore_x_keyboard_grab(Ecore_X_Window win)
653{
654 xcb_grab_keyboard_cookie_t cookie;
655 xcb_grab_keyboard_reply_t *reply;
656
657 LOGFN(__FILE__, __LINE__, __FUNCTION__);
658 CHECK_XCB_CONN;
659
660 cookie =
661 xcb_grab_keyboard_unchecked(_ecore_xcb_conn, 0, win, XCB_CURRENT_TIME,
662 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
663 reply = xcb_grab_keyboard_reply(_ecore_xcb_conn, cookie, NULL);
664 if (!reply) return EINA_FALSE;
665 free(reply);
666 return EINA_TRUE;
667}
668
669EAPI void
670ecore_x_keyboard_ungrab(void)
671{
672 LOGFN(__FILE__, __LINE__, __FUNCTION__);
673 CHECK_XCB_CONN;
674
675 xcb_ungrab_keyboard(_ecore_xcb_conn, XCB_CURRENT_TIME);
676}
677
678EAPI void
679ecore_x_pointer_xy_get(Ecore_X_Window win, int *x, int *y)
680{
681 xcb_query_pointer_cookie_t cookie;
682 xcb_query_pointer_reply_t *reply;
683
684// LOGFN(__FILE__, __LINE__, __FUNCTION__);
685 CHECK_XCB_CONN;
686
687// if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
688
689 if (x) *x = -1;
690 if (y) *y = -1;
691
692 cookie = xcb_query_pointer_unchecked(_ecore_xcb_conn, win);
693 reply = xcb_query_pointer_reply(_ecore_xcb_conn, cookie, NULL);
694 if (!reply) return;
695 if (x) *x = reply->win_x;
696 if (y) *y = reply->win_y;
697 free(reply);
698}
699
700EAPI Eina_Bool
701ecore_x_pointer_control_set(int accel_num, int accel_denom, int threshold)
702{
703 xcb_void_cookie_t vcookie;
704 xcb_generic_error_t *err;
705
706 LOGFN(__FILE__, __LINE__, __FUNCTION__);
707 CHECK_XCB_CONN;
708
709 vcookie =
710 xcb_change_pointer_control(_ecore_xcb_conn,
711 accel_num, accel_denom, threshold, 1, 1);
712 err = xcb_request_check(_ecore_xcb_conn, vcookie);
713 if (err)
714 {
715 _ecore_xcb_error_handle(err);
716 free(err);
717 return EINA_FALSE;
718 }
719
720 return EINA_TRUE;
721}
722
723EAPI Eina_Bool
724ecore_x_pointer_control_get(int *accel_num, int *accel_denom, int *threshold)
725{
726 xcb_get_pointer_control_cookie_t cookie;
727 xcb_get_pointer_control_reply_t *reply;
728
729 LOGFN(__FILE__, __LINE__, __FUNCTION__);
730 CHECK_XCB_CONN;
731
732 if (accel_num) *accel_num = 0;
733 if (accel_denom) *accel_denom = 0;
734 if (threshold) *threshold = 0;
735
736 cookie = xcb_get_pointer_control_unchecked(_ecore_xcb_conn);
737 reply = xcb_get_pointer_control_reply(_ecore_xcb_conn, cookie, NULL);
738 if (!reply) return EINA_FALSE;
739
740 if (accel_num) *accel_num = reply->acceleration_numerator;
741 if (accel_denom) *accel_denom = reply->acceleration_denominator;
742 if (threshold) *threshold = reply->threshold;
743 free(reply);
744
745 return EINA_TRUE;
746}
747
748EAPI Eina_Bool
749ecore_x_pointer_mapping_set(unsigned char *map, int nmap)
750{
751 xcb_set_pointer_mapping_cookie_t cookie;
752 xcb_set_pointer_mapping_reply_t *reply;
753 Eina_Bool ret = EINA_FALSE;
754
755 LOGFN(__FILE__, __LINE__, __FUNCTION__);
756 CHECK_XCB_CONN;
757
758 cookie = xcb_set_pointer_mapping_unchecked(_ecore_xcb_conn, nmap, map);
759 reply = xcb_set_pointer_mapping_reply(_ecore_xcb_conn, cookie, NULL);
760 if (!reply) return EINA_FALSE;
761 ret =
762 (reply->status == XCB_MAPPING_STATUS_SUCCESS) ? EINA_TRUE : EINA_FALSE;
763
764 free(reply);
765 return ret;
766}
767
768EAPI Eina_Bool
769ecore_x_pointer_mapping_get(unsigned char *map, int nmap)
770{
771 xcb_get_pointer_mapping_cookie_t cookie;
772 xcb_get_pointer_mapping_reply_t *reply;
773
774 LOGFN(__FILE__, __LINE__, __FUNCTION__);
775 CHECK_XCB_CONN;
776
777 if (map) *map = 0;
778 nmap = 0;
779
780 cookie = xcb_get_pointer_mapping_unchecked(_ecore_xcb_conn);
781 reply = xcb_get_pointer_mapping_reply(_ecore_xcb_conn, cookie, NULL);
782 if (!reply) return EINA_FALSE;
783
784 nmap = xcb_get_pointer_mapping_map_length(reply);
785 if (nmap <= 0)
786 {
787 free(reply);
788 return EINA_FALSE;
789 }
790
791 if (map)
792 {
793 uint8_t *tmp;
794 int i = 0;
795
796 tmp = xcb_get_pointer_mapping_map(reply);
797 for (i = 0; i < nmap; i++)
798 map[i] = tmp[i];
799 }
800
801 free(reply);
802 return EINA_TRUE;
803}
804
805EAPI Eina_Bool
806ecore_x_pointer_grab(Ecore_X_Window win)
807{
808 xcb_grab_pointer_cookie_t cookie;
809 xcb_grab_pointer_reply_t *reply;
810 uint16_t mask;
811 Eina_Bool ret = EINA_FALSE;
812
813 LOGFN(__FILE__, __LINE__, __FUNCTION__);
814 CHECK_XCB_CONN;
815
816 mask = (XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
817 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
818 XCB_EVENT_MASK_POINTER_MOTION);
819
820 cookie = xcb_grab_pointer_unchecked(_ecore_xcb_conn, 0, win, mask,
821 XCB_GRAB_MODE_ASYNC,
822 XCB_GRAB_MODE_ASYNC,
823 XCB_NONE, XCB_NONE, XCB_CURRENT_TIME);
824 reply = xcb_grab_pointer_reply(_ecore_xcb_conn, cookie, NULL);
825 if (!reply) return EINA_FALSE;
826
827 ret = (reply->status == XCB_GRAB_STATUS_SUCCESS) ? EINA_TRUE : EINA_FALSE;
828
829 free(reply);
830 return ret;
831}
832
833EAPI Eina_Bool
834ecore_x_pointer_confine_grab(Ecore_X_Window win)
835{
836 xcb_grab_pointer_cookie_t cookie;
837 xcb_grab_pointer_reply_t *reply;
838 uint16_t mask;
839 Eina_Bool ret = EINA_FALSE;
840
841 LOGFN(__FILE__, __LINE__, __FUNCTION__);
842 CHECK_XCB_CONN;
843
844 mask = (XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE |
845 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
846 XCB_EVENT_MASK_POINTER_MOTION);
847
848 cookie = xcb_grab_pointer_unchecked(_ecore_xcb_conn, 0, win, mask,
849 XCB_GRAB_MODE_ASYNC,
850 XCB_GRAB_MODE_ASYNC,
851 win, XCB_NONE, XCB_CURRENT_TIME);
852 reply = xcb_grab_pointer_reply(_ecore_xcb_conn, cookie, NULL);
853 if (!reply) return EINA_FALSE;
854
855 ret = (reply->status == XCB_GRAB_STATUS_SUCCESS) ? EINA_TRUE : EINA_FALSE;
856
857 free(reply);
858 return ret;
859}
860
861EAPI void
862ecore_x_pointer_ungrab(void)
863{
864 LOGFN(__FILE__, __LINE__, __FUNCTION__);
865 CHECK_XCB_CONN;
866
867 xcb_ungrab_pointer(_ecore_xcb_conn, XCB_CURRENT_TIME);
868}
869
870EAPI Eina_Bool
871ecore_x_pointer_warp(Ecore_X_Window win, int x, int y)
872{
873 xcb_void_cookie_t vcookie;
874 xcb_generic_error_t *err;
875
876 LOGFN(__FILE__, __LINE__, __FUNCTION__);
877 CHECK_XCB_CONN;
878
879 vcookie =
880 xcb_warp_pointer_checked(_ecore_xcb_conn, XCB_NONE, win, 0, 0, 0, 0, x, y);
881 err = xcb_request_check(_ecore_xcb_conn, vcookie);
882 if (err)
883 {
884 _ecore_xcb_error_handle(err);
885 free(err);
886 return EINA_FALSE;
887 }
888
889 return EINA_TRUE;
890}
891
892/**
893 * Invoke the standard system beep to alert users
894 *
895 * @param percent The volume at which the bell rings. Must be in the range
896 * [-100,+100]. If percent >= 0, the final volume will be:
897 * base - [(base * percent) / 100] + percent
898 * Otherwise, it's calculated as:
899 * base + [(base * percent) / 100]
900 * where @c base is the bell's base volume as set by XChangeKeyboardControl(3).
901 *
902 * @returns EINA_TRUE on success, EINA_FALSE otherwise.
903 */
904EAPI Eina_Bool
905ecore_x_bell(int percent)
906{
907 xcb_void_cookie_t cookie;
908 xcb_generic_error_t *err;
909
910 CHECK_XCB_CONN;
911
912 // FIXME: Use unchecked version after development is ironed out
913 cookie = xcb_bell_checked(_ecore_xcb_conn, percent);
914 err = xcb_request_check(_ecore_xcb_conn, cookie);
915 if (err)
916 {
917 _ecore_xcb_error_handle(err);
918 free(err);
919 return EINA_FALSE;
920 }
921
922 return EINA_TRUE;
923}
924
925EAPI void
926ecore_x_display_size_get(Ecore_X_Display *dsp __UNUSED__, int *w, int *h)
927{
928 xcb_screen_t *screen;
929
930 LOGFN(__FILE__, __LINE__, __FUNCTION__);
931 CHECK_XCB_CONN;
932
933 /* grab the default screen */
934 screen = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
935 if (w) *w = screen->width_in_pixels;
936 if (h) *h = screen->height_in_pixels;
937}
938
939EAPI unsigned long
940ecore_x_display_black_pixel_get(Ecore_X_Display *dsp __UNUSED__)
941{
942 xcb_screen_t *screen;
943
944 LOGFN(__FILE__, __LINE__, __FUNCTION__);
945 CHECK_XCB_CONN;
946
947 /* grab the default screen */
948 screen = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
949 return screen->black_pixel;
950}
951
952EAPI unsigned long
953ecore_x_display_white_pixel_get(Ecore_X_Display *dsp __UNUSED__)
954{
955 xcb_screen_t *screen;
956
957 LOGFN(__FILE__, __LINE__, __FUNCTION__);
958 CHECK_XCB_CONN;
959
960 /* grab the default screen */
961 screen = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).data;
962 return screen->white_pixel;
963}
964
965EAPI void
966ecore_x_pointer_last_xy_get(int *x, int *y)
967{
968 LOGFN(__FILE__, __LINE__, __FUNCTION__);
969
970 if (x) *x = _ecore_xcb_event_last_root_x;
971 if (y) *y = _ecore_xcb_event_last_root_y;
972}
973
974EAPI void
975ecore_x_focus_reset(void)
976{
977 LOGFN(__FILE__, __LINE__, __FUNCTION__);
978 CHECK_XCB_CONN;
979
980 xcb_set_input_focus(_ecore_xcb_conn, XCB_INPUT_FOCUS_POINTER_ROOT,
981 ((xcb_screen_t *)_ecore_xcb_screen)->root,
982 XCB_CURRENT_TIME);
983// ecore_x_flush();
984}
985
986EAPI void
987ecore_x_events_allow_all(void)
988{
989 LOGFN(__FILE__, __LINE__, __FUNCTION__);
990 CHECK_XCB_CONN;
991
992 xcb_allow_events(_ecore_xcb_conn, XCB_ALLOW_ASYNC_BOTH, XCB_CURRENT_TIME);
993// ecore_x_flush();
994}
995
996/**
997 * Kill a specific client
998 *
999 * You can kill a specific client owning window @p win
1000 *
1001 * @param win Window of the client to be killed
1002 */
1003EAPI void
1004ecore_x_kill(Ecore_X_Window win)
1005{
1006 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1007 CHECK_XCB_CONN;
1008
1009 xcb_kill_client(_ecore_xcb_conn, win);
1010// ecore_x_flush();
1011}
1012
1013/**
1014 * Kill all clients with subwindows under a given window.
1015 *
1016 * You can kill all clients connected to the X server by using
1017 * @ref ecore_x_window_root_list to get a list of root windows, and
1018 * then passing each root window to this function.
1019 *
1020 * @param root The window whose children will be killed.
1021 */
1022EAPI void
1023ecore_x_killall(Ecore_X_Window root)
1024{
1025 int screens = 0, i = 0;
1026
1027 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1028 CHECK_XCB_CONN;
1029
1030 ecore_x_grab();
1031
1032 screens = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem;
1033
1034 /* Traverse window tree starting from root, and drag each
1035 * before the firing squad */
1036 for (i = 0; i < screens; ++i)
1037 {
1038 xcb_query_tree_cookie_t cookie;
1039 xcb_query_tree_reply_t *reply;
1040
1041 cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, root);
1042 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
1043 if (reply)
1044 {
1045 xcb_window_t *wins = NULL;
1046 int tree_c_len, j = 0;
1047
1048 wins = xcb_query_tree_children(reply);
1049 tree_c_len = xcb_query_tree_children_length(reply);
1050 for (j = 0; j < tree_c_len; j++)
1051 xcb_kill_client(_ecore_xcb_conn, wins[j]);
1052 free(reply);
1053 }
1054 }
1055
1056 ecore_x_ungrab();
1057 ecore_x_sync(); // needed
1058}
1059
1060/**
1061 * Return the screen DPI
1062 *
1063 * This is a simplistic call to get DPI. It does not account for differing
1064 * DPI in the x amd y axes nor does it account for multihead or xinerama and
1065 * xrander where different parts of the screen may have differen DPI etc.
1066 *
1067 * @return the general screen DPI (dots/pixels per inch).
1068 */
1069EAPI int
1070ecore_x_dpi_get(void)
1071{
1072 uint16_t mw = 0, w = 0;
1073
1074 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1075
1076 mw = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_millimeters;
1077 if (mw <= 0) return 75;
1078 w = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
1079 return (((w * 254) / mw) + 5) / 10;
1080}
1081
1082/**
1083 * @defgroup Ecore_X_Display_Attr_Group X Display Attributes
1084 *
1085 * Functions that set and retrieve X display attributes.
1086 */
1087
1088/**
1089 * Retrieves the Ecore_X_Display handle used for the current X connection.
1090 * @return The current X display.
1091 * @ingroup Ecore_X_Display_Attr_Group
1092 */
1093EAPI Ecore_X_Display *
1094ecore_x_display_get(void)
1095{
1096 char *gl = NULL;
1097
1098 CHECK_XCB_CONN;
1099
1100 /* if we have the 'dont use xlib' env var, then we are not using
1101 * XLib and thus cannot return a real XDisplay.
1102 *
1103 * NB: This may break EFL in some places and needs lots of testing !!! */
1104 if ((gl = getenv("ECORE_X_NO_XLIB")))
1105 return (Ecore_X_Display *)_ecore_xcb_conn;
1106 else /* we can safely return an XDisplay var */
1107 return (Ecore_X_Display *)_ecore_xcb_display;
1108}
1109
1110/**
1111 * Retrieves the X display file descriptor.
1112 * @return The current X display file descriptor.
1113 * @ingroup Ecore_X_Display_Attr_Group
1114 */
1115EAPI int
1116ecore_x_fd_get(void)
1117{
1118 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1119 CHECK_XCB_CONN;
1120 return xcb_get_file_descriptor(_ecore_xcb_conn);
1121}
1122
1123EAPI void
1124ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data, int type, void *event),
1125 void *data)
1126{
1127 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1128
1129 _ecore_xcb_window_grab_replay_func = func;
1130 _ecore_xcb_window_grab_replay_data = data;
1131}
1132
1133/**
1134 * Retrieves the size of an Ecore_X_Screen.
1135 * @param screen the handle to the screen to query.
1136 * @param w where to return the width. May be NULL. Returns 0 on errors.
1137 * @param h where to return the height. May be NULL. Returns 0 on errors.
1138 * @ingroup Ecore_X_Display_Attr_Group
1139 * @see ecore_x_default_screen_get()
1140 *
1141 * @since 1.1
1142 */
1143EAPI void
1144ecore_x_screen_size_get(const Ecore_X_Screen *screen, int *w, int *h)
1145{
1146 xcb_screen_t *s;
1147
1148 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1149
1150 if (w) *w = 0;
1151 if (h) *h = 0;
1152 if (!(s = (xcb_screen_t *)screen)) return;
1153 if (w) *w = s->width_in_pixels;
1154 if (h) *h = s->height_in_pixels;
1155}
1156
1157/**
1158 * Retrieves the count of screens.
1159 *
1160 * @return The count of screens.
1161 * @ingroup Ecore_X_Display_Attr_Group
1162 *
1163 * @since 1.1
1164 */
1165EAPI int
1166ecore_x_screen_count_get(void)
1167{
1168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1169 CHECK_XCB_CONN;
1170
1171 return xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
1172}
1173
1174/**
1175 * Retrieves the index number of the given screen.
1176 *
1177 * @return The index number of the screen.
1178 * @ingroup Ecore_X_Display_Attr_Group
1179 *
1180 * @since 1.1
1181 */
1182EAPI int
1183ecore_x_screen_index_get(const Ecore_X_Screen *screen)
1184{
1185 xcb_screen_iterator_t iter;
1186 int i = 0;
1187
1188 CHECK_XCB_CONN;
1189
1190 iter =
1191 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1192 for (; iter.rem; xcb_screen_next(&iter))
1193 {
1194 if (iter.data == (xcb_screen_t *)screen)
1195 return i;
1196 i++;
1197 }
1198
1199 return 0;
1200}
1201
1202/**
1203 * Retrieves the screen based on index number.
1204 *
1205 * @return The Ecore_X_Screen at this index.
1206 * @ingroup Ecore_X_Display_Attr_Group
1207 *
1208 * @since 1.1
1209 */
1210EAPI Ecore_X_Screen *
1211ecore_x_screen_get(int index)
1212{
1213 xcb_screen_iterator_t iter;
1214 int i = 0;
1215
1216 CHECK_XCB_CONN;
1217
1218 iter =
1219 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1220 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1221 if (i == index) return iter.data;
1222
1223 return NULL;
1224}
1225
1226EAPI unsigned int
1227ecore_x_visual_id_get(Ecore_X_Visual visual)
1228{
1229 return ((xcb_visualtype_t *)visual)->visual_id;
1230}
1231
1232/**
1233 * Retrieve the default Visual.
1234 *
1235 * @param disp The Display to get the Default Visual from
1236 * @param screen The Screen.
1237 *
1238 * @return The default visual.
1239 * @since 1.1.0
1240 */
1241EAPI Ecore_X_Visual
1242ecore_x_default_visual_get(Ecore_X_Display *disp __UNUSED__, Ecore_X_Screen *screen)
1243{
1244 xcb_screen_t *s;
1245 xcb_depth_iterator_t diter;
1246 xcb_visualtype_iterator_t viter;
1247
1248 CHECK_XCB_CONN;
1249
1250 s = (xcb_screen_t *)screen;
1251 diter = xcb_screen_allowed_depths_iterator(s);
1252 for (; diter.rem; xcb_depth_next(&diter))
1253 {
1254 viter = xcb_depth_visuals_iterator(diter.data);
1255 for (; viter.rem; xcb_visualtype_next(&viter))
1256 {
1257 if (viter.data->visual_id == s->root_visual)
1258 return viter.data;
1259 }
1260 }
1261 return 0;
1262}
1263
1264/**
1265 * Retrieve the default Colormap.
1266 *
1267 * @param disp The Display to get the Default Colormap from
1268 * @param screen The Screen.
1269 *
1270 * @return The default colormap.
1271 * @since 1.1.0
1272 */
1273EAPI Ecore_X_Colormap
1274ecore_x_default_colormap_get(Ecore_X_Display *disp __UNUSED__, Ecore_X_Screen *screen)
1275{
1276 xcb_screen_t *s;
1277
1278 s = (xcb_screen_t *)screen;
1279 return s->default_colormap;
1280}
1281
1282/**
1283 * Retrieve the default depth.
1284 *
1285 * @param disp The Display to get the Default Depth from
1286 * @param screen The Screen.
1287 *
1288 * @return The default depth.
1289 * @since 1.1.0
1290 */
1291EAPI int
1292ecore_x_default_depth_get(Ecore_X_Display *disp __UNUSED__, Ecore_X_Screen *screen)
1293{
1294 xcb_screen_t *s;
1295
1296 s = (xcb_screen_t *)screen;
1297 return s->root_depth;
1298}
1299
1300/**
1301 * Sets the timeout for a double and triple clicks to be flagged.
1302 *
1303 * This sets the time between clicks before the double_click flag is
1304 * set in a button down event. If 3 clicks occur within double this
1305 * time, the triple_click flag is also set.
1306 *
1307 * @param t The time in seconds
1308 * @ingroup Ecore_X_Display_Attr_Group
1309 */
1310EAPI void
1311ecore_x_double_click_time_set(double t)
1312{
1313 if (t < 0.0) t = 0.0;
1314 _ecore_xcb_double_click_time = t;
1315}
1316
1317/**
1318 * Retrieves the double and triple click flag timeout.
1319 *
1320 * See @ref ecore_x_double_click_time_set for more information.
1321 *
1322 * @return The timeout for double clicks in seconds.
1323 * @ingroup Ecore_X_Display_Attr_Group
1324 */
1325EAPI double
1326ecore_x_double_click_time_get(void)
1327{
1328 return _ecore_xcb_double_click_time;
1329}
1330
1331/* local function prototypes */
1332static int
1333_ecore_xcb_shutdown(Eina_Bool close_display)
1334{
1335 if (--_ecore_xcb_init_count != 0)
1336 return _ecore_xcb_init_count;
1337
1338 if (!_ecore_xcb_conn)
1339 return _ecore_xcb_init_count;
1340
1341 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1342 CHECK_XCB_CONN;
1343
1344 ecore_idle_enterer_del(_ecore_xcb_idle_enterer);
1345 _ecore_xcb_idle_enterer = NULL;
1346
1347 if (_ecore_xcb_fd_handler)
1348 ecore_main_fd_handler_del(_ecore_xcb_fd_handler);
1349
1350 /* disconnect from display server */
1351 if (close_display)
1352 xcb_disconnect(_ecore_xcb_conn);
1353 else
1354 {
1355 close(xcb_get_file_descriptor(_ecore_xcb_conn));
1356 _ecore_xcb_conn = NULL;
1357 }
1358
1359 /* shutdown events */
1360 _ecore_xcb_events_shutdown();
1361
1362 /* shutdown input extension */
1363 _ecore_xcb_input_shutdown();
1364
1365 /* shutdown gesture extension */
1366 _ecore_xcb_gesture_shutdown();
1367
1368 /* shutdown selection */
1369 _ecore_xcb_selection_shutdown();
1370
1371 /* shutdown dnd */
1372 _ecore_xcb_dnd_shutdown();
1373
1374 /* shutdown netwm */
1375 ecore_x_netwm_shutdown();
1376
1377 /* shutdown keymap */
1378 _ecore_xcb_keymap_shutdown();
1379
1380 /* shutdown ecore_event */
1381 ecore_event_shutdown();
1382
1383 /* shutdown ecore */
1384 ecore_shutdown();
1385
1386 /* unregister log domain */
1387 eina_log_domain_unregister(_ecore_xcb_log_dom);
1388 _ecore_xcb_log_dom = -1;
1389
1390 /* shutdown eina */
1391 eina_shutdown();
1392
1393 return _ecore_xcb_init_count;
1394}
1395
1396static Eina_Bool
1397_ecore_xcb_fd_handle(void *data, Ecore_Fd_Handler *hdlr __UNUSED__)
1398{
1399 xcb_connection_t *conn;
1400 xcb_generic_event_t *ev = NULL;
1401
1402 conn = (xcb_connection_t *)data;
1403
1404 if (_ecore_xcb_event_buffered)
1405 {
1406 _ecore_xcb_events_handle(_ecore_xcb_event_buffered);
1407 free(_ecore_xcb_event_buffered);
1408 _ecore_xcb_event_buffered = NULL;
1409 }
1410
1411// xcb_flush(conn);
1412
1413 while ((ev = xcb_poll_for_event(conn)))
1414 {
1415 /* NB: Ecore Xlib uses filterevent for xim, but xcb does not support
1416 * xim, so no need for it here */
1417
1418 /* check for errors first */
1419 if (xcb_connection_has_error(conn))
1420 {
1421 xcb_generic_error_t *err;
1422
1423 err = (xcb_generic_error_t *)ev;
1424 _ecore_xcb_io_error_handle(err);
1425 }
1426 else
1427 {
1428 /* FIXME: Filter event for XIM */
1429 _ecore_xcb_events_handle(ev);
1430 free(ev);
1431 }
1432 }
1433
1434 return ECORE_CALLBACK_RENEW;
1435}
1436
1437static Eina_Bool
1438_ecore_xcb_fd_handle_buff(void *data, Ecore_Fd_Handler *hdlr __UNUSED__)
1439{
1440 xcb_connection_t *conn;
1441 xcb_generic_event_t *ev = NULL;
1442
1443 conn = (xcb_connection_t *)data;
1444 ev = xcb_poll_for_event(conn);
1445 if (ev)
1446 {
1447 /* check for errors first */
1448 if (xcb_connection_has_error(conn))
1449 {
1450 xcb_generic_error_t *err;
1451
1452 err = (xcb_generic_error_t *)ev;
1453 _ecore_xcb_io_error_handle(err);
1454 return ECORE_CALLBACK_CANCEL;
1455 }
1456 _ecore_xcb_event_buffered = ev;
1457 return ECORE_CALLBACK_RENEW;
1458 }
1459 return ECORE_CALLBACK_CANCEL;
1460}
1461
1462static Eina_Bool
1463_ecore_xcb_idle_enter(void *data __UNUSED__)
1464{
1465 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1466 CHECK_XCB_CONN;
1467
1468 xcb_flush(_ecore_xcb_conn);
1469 return ECORE_CALLBACK_RENEW;
1470}
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_atoms.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_atoms.c
new file mode 100644
index 0000000..769ffac
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_atoms.c
@@ -0,0 +1,408 @@
1#include "ecore_xcb_private.h"
2#include "ecore_x_atoms_decl.h"
3
4/* NB: Increment if you add new atoms */
5#define ECORE_X_ATOMS_COUNT 199
6
7typedef struct _Xcb_Atom Xcb_Atom;
8struct _Xcb_Atom
9{
10 const char *name;
11 Ecore_X_Atom *atom;
12};
13
14/* local function prototypes */
15
16/* local variables */
17static xcb_intern_atom_cookie_t cookies[ECORE_X_ATOMS_COUNT];
18static Xcb_Atom atoms[] =
19{
20 { "ATOM", &ECORE_X_ATOM_ATOM },
21 { "CARDINAL", &ECORE_X_ATOM_CARDINAL },
22 { "COMPOUND_TEXT", &ECORE_X_ATOM_COMPOUND_TEXT },
23 { "FILE_NAME", &ECORE_X_ATOM_FILE_NAME },
24 { "STRING", &ECORE_X_ATOM_STRING },
25 { "TEXT", &ECORE_X_ATOM_TEXT },
26 { "UTF8_STRING", &ECORE_X_ATOM_UTF8_STRING },
27 { "WINDOW", &ECORE_X_ATOM_WINDOW },
28 { "PIXMAP", &ECORE_X_ATOM_PIXMAP },
29 { "VISUALID", &ECORE_X_ATOM_VISUALID },
30
31 { "JXSelectionWindowProperty", &ECORE_X_ATOM_SELECTION_PROP_XDND },
32 { "XdndSelection", &ECORE_X_ATOM_SELECTION_XDND },
33 { "XdndAware", &ECORE_X_ATOM_XDND_AWARE },
34 { "XdndEnter", &ECORE_X_ATOM_XDND_ENTER },
35 { "XdndTypeList", &ECORE_X_ATOM_XDND_TYPE_LIST },
36 { "XdndPosition", &ECORE_X_ATOM_XDND_POSITION },
37 { "XdndActionCopy", &ECORE_X_ATOM_XDND_ACTION_COPY },
38 { "XdndActionMove", &ECORE_X_ATOM_XDND_ACTION_MOVE },
39 { "XdndActionPrivate", &ECORE_X_ATOM_XDND_ACTION_PRIVATE },
40 { "XdndActionAsk", &ECORE_X_ATOM_XDND_ACTION_ASK },
41 { "XdndActionList", &ECORE_X_ATOM_XDND_ACTION_LIST },
42 { "XdndActionLink", &ECORE_X_ATOM_XDND_ACTION_LINK },
43 { "XdndActionDescription", &ECORE_X_ATOM_XDND_ACTION_DESCRIPTION },
44 { "XdndProxy", &ECORE_X_ATOM_XDND_PROXY },
45 { "XdndStatus", &ECORE_X_ATOM_XDND_STATUS },
46 { "XdndLeave", &ECORE_X_ATOM_XDND_LEAVE },
47 { "XdndDrop", &ECORE_X_ATOM_XDND_DROP },
48 { "XdndFinished", &ECORE_X_ATOM_XDND_FINISHED },
49
50 { "XdndActionCopy", &ECORE_X_DND_ACTION_COPY },
51 { "XdndActionMove", &ECORE_X_DND_ACTION_MOVE },
52 { "XdndActionLink", &ECORE_X_DND_ACTION_LINK },
53 { "XdndActionAsk", &ECORE_X_DND_ACTION_ASK },
54 { "XdndActionPrivate", &ECORE_X_DND_ACTION_PRIVATE },
55
56 { "_E_FRAME_SIZE", &ECORE_X_ATOM_E_FRAME_SIZE },
57
58 { "_WIN_LAYER", &ECORE_X_ATOM_WIN_LAYER },
59
60 { "WM_NAME", &ECORE_X_ATOM_WM_NAME },
61 { "WM_ICON_NAME", &ECORE_X_ATOM_WM_ICON_NAME },
62 { "WM_NORMAL_HINTS", &ECORE_X_ATOM_WM_NORMAL_HINTS },
63 { "WM_SIZE_HINTS", &ECORE_X_ATOM_WM_SIZE_HINTS },
64 { "WM_HINTS", &ECORE_X_ATOM_WM_HINTS },
65 { "WM_CLASS", &ECORE_X_ATOM_WM_CLASS },
66 { "WM_TRANSIENT_FOR", &ECORE_X_ATOM_WM_TRANSIENT_FOR },
67 { "WM_PROTOCOLS", &ECORE_X_ATOM_WM_PROTOCOLS },
68 { "WM_COLORMAP_WINDOWS", &ECORE_X_ATOM_WM_COLORMAP_WINDOWS },
69 { "WM_COMMAND", &ECORE_X_ATOM_WM_COMMAND },
70 { "WM_CLIENT_MACHINE", &ECORE_X_ATOM_WM_CLIENT_MACHINE },
71
72 { "WM_STATE", &ECORE_X_ATOM_WM_STATE },
73 { "WM_ICON_SIZE", &ECORE_X_ATOM_WM_ICON_SIZE },
74
75 { "WM_CHANGE_STATE", &ECORE_X_ATOM_WM_CHANGE_STATE },
76
77 { "WM_TAKE_FOCUS", &ECORE_X_ATOM_WM_TAKE_FOCUS },
78 { "WM_SAVE_YOURSELF", &ECORE_X_ATOM_WM_SAVE_YOURSELF },
79 { "WM_DELETE_WINDOW", &ECORE_X_ATOM_WM_DELETE_WINDOW },
80
81 { "WM_COLORMAP_NOTIFY", &ECORE_X_ATOM_WM_COLORMAP_NOTIFY },
82
83 { "SM_CLIENT_ID", &ECORE_X_ATOM_SM_CLIENT_ID },
84 { "WM_CLIENT_LEADER", &ECORE_X_ATOM_WM_CLIENT_LEADER },
85 { "WM_WINDOW_ROLE", &ECORE_X_ATOM_WM_WINDOW_ROLE },
86
87 { "_MOTIF_WM_HINTS", &ECORE_X_ATOM_MOTIF_WM_HINTS },
88
89 { "_NET_SUPPORTED", &ECORE_X_ATOM_NET_SUPPORTED },
90 { "_NET_CLIENT_LIST", &ECORE_X_ATOM_NET_CLIENT_LIST },
91 { "_NET_CLIENT_LIST_STACKING", &ECORE_X_ATOM_NET_CLIENT_LIST_STACKING },
92 { "_NET_NUMBER_OF_DESKTOPS", &ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS },
93 { "_NET_DESKTOP_GEOMETRY", &ECORE_X_ATOM_NET_DESKTOP_GEOMETRY },
94 { "_NET_DESKTOP_VIEWPORT", &ECORE_X_ATOM_NET_DESKTOP_VIEWPORT },
95 { "_NET_CURRENT_DESKTOP", &ECORE_X_ATOM_NET_CURRENT_DESKTOP },
96 { "_NET_DESKTOP_NAMES", &ECORE_X_ATOM_NET_DESKTOP_NAMES },
97 { "_NET_ACTIVE_WINDOW", &ECORE_X_ATOM_NET_ACTIVE_WINDOW },
98 { "_NET_WORKAREA", &ECORE_X_ATOM_NET_WORKAREA },
99 { "_NET_SUPPORTING_WM_CHECK", &ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK },
100 { "_NET_VIRTUAL_ROOTS", &ECORE_X_ATOM_NET_VIRTUAL_ROOTS },
101 { "_NET_DESKTOP_LAYOUT", &ECORE_X_ATOM_NET_DESKTOP_LAYOUT },
102 { "_NET_SHOWING_DESKTOP", &ECORE_X_ATOM_NET_SHOWING_DESKTOP },
103
104 { "_NET_CLOSE_WINDOW", &ECORE_X_ATOM_NET_CLOSE_WINDOW },
105 { "_NET_MOVERESIZE_WINDOW", &ECORE_X_ATOM_NET_MOVERESIZE_WINDOW },
106 { "_NET_WM_MOVERESIZE", &ECORE_X_ATOM_NET_WM_MOVERESIZE },
107 { "_NET_RESTACK_WINDOW", &ECORE_X_ATOM_NET_RESTACK_WINDOW },
108
109 { "_NET_REQUEST_FRAME_EXTENTS", &ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS },
110
111 { "_NET_WM_NAME", &ECORE_X_ATOM_NET_WM_NAME },
112 { "_NET_WM_VISIBLE_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_NAME },
113 { "_NET_WM_ICON_NAME", &ECORE_X_ATOM_NET_WM_ICON_NAME },
114 { "_NET_WM_VISIBLE_ICON_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME },
115 { "_NET_WM_DESKTOP", &ECORE_X_ATOM_NET_WM_DESKTOP },
116
117 { "_NET_WM_WINDOW_TYPE", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE },
118 { "_NET_WM_WINDOW_TYPE_DESKTOP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP },
119 { "_NET_WM_WINDOW_TYPE_DOCK", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK },
120 { "_NET_WM_WINDOW_TYPE_TOOLBAR", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR },
121 { "_NET_WM_WINDOW_TYPE_MENU", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU },
122 { "_NET_WM_WINDOW_TYPE_UTILITY", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY },
123 { "_NET_WM_WINDOW_TYPE_SPLASH", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH },
124 { "_NET_WM_WINDOW_TYPE_DIALOG", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG },
125 { "_NET_WM_WINDOW_TYPE_NORMAL", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL },
126 { "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU",
127 &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU },
128 { "_NET_WM_WINDOW_TYPE_POPUP_MENU",
129 &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU },
130 { "_NET_WM_WINDOW_TYPE_TOOLTIP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP },
131 { "_NET_WM_WINDOW_TYPE_NOTIFICATION",
132 &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION },
133 { "_NET_WM_WINDOW_TYPE_COMBO", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO },
134 { "_NET_WM_WINDOW_TYPE_DND", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND },
135
136 { "_NET_WM_STATE", &ECORE_X_ATOM_NET_WM_STATE },
137 { "_NET_WM_STATE_MODAL", &ECORE_X_ATOM_NET_WM_STATE_MODAL },
138 { "_NET_WM_STATE_STICKY", &ECORE_X_ATOM_NET_WM_STATE_STICKY },
139 { "_NET_WM_STATE_MAXIMIZED_VERT",
140 &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT },
141 { "_NET_WM_STATE_MAXIMIZED_HORZ",
142 &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ },
143 { "_NET_WM_STATE_SHADED", &ECORE_X_ATOM_NET_WM_STATE_SHADED },
144 { "_NET_WM_STATE_SKIP_TASKBAR", &ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR },
145 { "_NET_WM_STATE_SKIP_PAGER", &ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER },
146 { "_NET_WM_STATE_HIDDEN", &ECORE_X_ATOM_NET_WM_STATE_HIDDEN },
147 { "_NET_WM_STATE_FULLSCREEN", &ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN },
148 { "_NET_WM_STATE_ABOVE", &ECORE_X_ATOM_NET_WM_STATE_ABOVE },
149 { "_NET_WM_STATE_BELOW", &ECORE_X_ATOM_NET_WM_STATE_BELOW },
150 { "_NET_WM_STATE_DEMANDS_ATTENTION",
151 &ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION },
152
153 { "_NET_WM_ALLOWED_ACTIONS", &ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS },
154 { "_NET_WM_ACTION_MOVE", &ECORE_X_ATOM_NET_WM_ACTION_MOVE },
155 { "_NET_WM_ACTION_RESIZE", &ECORE_X_ATOM_NET_WM_ACTION_RESIZE },
156 { "_NET_WM_ACTION_MINIMIZE", &ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE },
157 { "_NET_WM_ACTION_SHADE", &ECORE_X_ATOM_NET_WM_ACTION_SHADE },
158 { "_NET_WM_ACTION_STICK", &ECORE_X_ATOM_NET_WM_ACTION_STICK },
159 { "_NET_WM_ACTION_MAXIMIZE_HORZ",
160 &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ },
161 { "_NET_WM_ACTION_MAXIMIZE_VERT",
162 &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT },
163 { "_NET_WM_ACTION_FULLSCREEN", &ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN },
164 { "_NET_WM_ACTION_CHANGE_DESKTOP",
165 &ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP },
166 { "_NET_WM_ACTION_CLOSE", &ECORE_X_ATOM_NET_WM_ACTION_CLOSE },
167 { "_NET_WM_ACTION_ABOVE", &ECORE_X_ATOM_NET_WM_ACTION_ABOVE },
168 { "_NET_WM_ACTION_BELOW", &ECORE_X_ATOM_NET_WM_ACTION_BELOW },
169
170 { "_NET_WM_STRUT", &ECORE_X_ATOM_NET_WM_STRUT },
171 { "_NET_WM_STRUT_PARTIAL", &ECORE_X_ATOM_NET_WM_STRUT_PARTIAL },
172 { "_NET_WM_ICON_GEOMETRY", &ECORE_X_ATOM_NET_WM_ICON_GEOMETRY },
173 { "_NET_WM_ICON", &ECORE_X_ATOM_NET_WM_ICON },
174 { "_NET_WM_PID", &ECORE_X_ATOM_NET_WM_PID },
175 { "_NET_WM_HANDLED_ICONS", &ECORE_X_ATOM_NET_WM_HANDLED_ICONS },
176 { "_NET_WM_USER_TIME", &ECORE_X_ATOM_NET_WM_USER_TIME },
177 { "_NET_STARTUP_ID", &ECORE_X_ATOM_NET_STARTUP_ID },
178 { "_NET_FRAME_EXTENTS", &ECORE_X_ATOM_NET_FRAME_EXTENTS },
179
180 { "_NET_WM_PING", &ECORE_X_ATOM_NET_WM_PING },
181 { "_NET_WM_SYNC_REQUEST", &ECORE_X_ATOM_NET_WM_SYNC_REQUEST },
182 { "_NET_WM_SYNC_REQUEST_COUNTER",
183 &ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER },
184
185 { "_NET_WM_WINDOW_OPACITY", &ECORE_X_ATOM_NET_WM_WINDOW_OPACITY },
186 { "_NET_WM_WINDOW_SHADOW", &ECORE_X_ATOM_NET_WM_WINDOW_SHADOW },
187 { "_NET_WM_WINDOW_SHADE", &ECORE_X_ATOM_NET_WM_WINDOW_SHADE },
188
189 { "TARGETS", &ECORE_X_ATOM_SELECTION_TARGETS },
190 { "CLIPBOARD", &ECORE_X_ATOM_SELECTION_CLIPBOARD },
191 { "PRIMARY", &ECORE_X_ATOM_SELECTION_PRIMARY },
192 { "SECONDARY", &ECORE_X_ATOM_SELECTION_SECONDARY },
193 { "_ECORE_SELECTION_PRIMARY", &ECORE_X_ATOM_SELECTION_PROP_PRIMARY },
194 { "_ECORE_SELECTION_SECONDARY", &ECORE_X_ATOM_SELECTION_PROP_SECONDARY },
195 { "_ECORE_SELECTION_CLIPBOARD", &ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD },
196
197 { "_E_VIRTUAL_KEYBOARD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD },
198 { "_E_VIRTUAL_KEYBOARD_STATE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE },
199 { "_E_VIRTUAL_KEYBOARD_ON", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON },
200 { "_E_VIRTUAL_KEYBOARD_OFF", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF },
201 { "_E_VIRTUAL_KEYBOARD_ALPHA", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA },
202 { "_E_VIRTUAL_KEYBOARD_NUMERIC", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC },
203 { "_E_VIRTUAL_KEYBOARD_PIN", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN },
204 { "_E_VIRTUAL_KEYBOARD_PHONE_NUMBER",
205 &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER },
206 { "_E_VIRTUAL_KEYBOARD_HEX", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX },
207 { "_E_VIRTUAL_KEYBOARD_TERMINAL",
208 &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL },
209 { "_E_VIRTUAL_KEYBOARD_PASSWORD",
210 &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD },
211 { "_E_VIRTUAL_KEYBOARD_IP", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP },
212 { "_E_VIRTUAL_KEYBOARD_HOST", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST },
213 { "_E_VIRTUAL_KEYBOARD_FILE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE },
214 { "_E_VIRTUAL_KEYBOARD_URL", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL },
215 { "_E_VIRTUAL_KEYBOARD_KEYPAD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD },
216 { "_E_VIRTUAL_KEYBOARD_J2ME", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME },
217
218 { "_E_ILLUME_ZONE", &ECORE_X_ATOM_E_ILLUME_ZONE },
219 { "_E_ILLUME_ZONE_LIST", &ECORE_X_ATOM_E_ILLUME_ZONE_LIST },
220 { "_E_ILLUME_CONFORMANT", &ECORE_X_ATOM_E_ILLUME_CONFORMANT },
221 { "_E_ILLUME_MODE", &ECORE_X_ATOM_E_ILLUME_MODE },
222 { "_E_ILLUME_MODE_SINGLE", &ECORE_X_ATOM_E_ILLUME_MODE_SINGLE },
223 { "_E_ILLUME_MODE_DUAL_TOP", &ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP },
224 { "_E_ILLUME_MODE_DUAL_LEFT", &ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT },
225 { "_E_ILLUME_FOCUS_BACK", &ECORE_X_ATOM_E_ILLUME_FOCUS_BACK },
226 { "_E_ILLUME_FOCUS_FORWARD", &ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD },
227 { "_E_ILLUME_FOCUS_HOME", &ECORE_X_ATOM_E_ILLUME_FOCUS_HOME },
228 { "_E_ILLUME_CLOSE", &ECORE_X_ATOM_E_ILLUME_CLOSE },
229 { "_E_ILLUME_HOME_NEW", &ECORE_X_ATOM_E_ILLUME_HOME_NEW },
230 { "_E_ILLUME_HOME_DEL", &ECORE_X_ATOM_E_ILLUME_HOME_DEL },
231 { "_E_ILLUME_DRAG", &ECORE_X_ATOM_E_ILLUME_DRAG },
232 { "_E_ILLUME_DRAG_LOCKED", &ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED },
233 { "_E_ILLUME_DRAG_START", &ECORE_X_ATOM_E_ILLUME_DRAG_START },
234 { "_E_ILLUME_DRAG_END", &ECORE_X_ATOM_E_ILLUME_DRAG_END },
235 { "_E_ILLUME_INDICATOR_GEOMETRY",
236 &ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY },
237 { "_E_ILLUME_SOFTKEY_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY },
238 { "_E_ILLUME_KEYBOARD_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY },
239 { "_E_ILLUME_QUICKPANEL", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL },
240 { "_E_ILLUME_QUICKPANEL_STATE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE },
241 { "_E_ILLUME_QUICKPANEL_STATE_TOGGLE",
242 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE },
243 { "_E_ILLUME_QUICKPANEL_ON", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON },
244 { "_E_ILLUME_QUICKPANEL_OFF", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF },
245 { "_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR",
246 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR },
247 { "_E_ILLUME_QUICKPANEL_PRIORITY_MINOR",
248 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR },
249 { "_E_ILLUME_QUICKPANEL_ZONE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE },
250 { "_E_ILLUME_QUICKPANEL_POSITION_UPDATE",
251 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE },
252
253 { "_E_COMP_SYNC_COUNTER", &ECORE_X_ATOM_E_COMP_SYNC_COUNTER },
254 { "_E_COMP_SYNC_DRAW_DONE", &ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE },
255 { "_E_COMP_SYNC_SUPPORTED", &ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED },
256 { "_E_COMP_SYNC_BEGIN", &ECORE_X_ATOM_E_COMP_SYNC_BEGIN },
257 { "_E_COMP_SYNC_END", &ECORE_X_ATOM_E_COMP_SYNC_END },
258 { "_E_COMP_SYNC_CANCEL", &ECORE_X_ATOM_E_COMP_SYNC_CANCEL },
259
260 { "_E_COMP_FLUSH", &ECORE_X_ATOM_E_COMP_FLUSH },
261 { "_E_COMP_DUMP", &ECORE_X_ATOM_E_COMP_DUMP },
262 { "_E_COMP_PIXMAP", &ECORE_X_ATOM_E_COMP_PIXMAP },
263 { "_E_VIDEO_PARENT", &ECORE_X_ATOM_E_VIDEO_PARENT },
264 { "_E_VIDEO_POSITION", &ECORE_X_ATOM_E_VIDEO_POSITION }
265};
266
267void
268_ecore_xcb_atoms_init(void)
269{
270 int i = 0, num = 0;
271
272 LOGFN(__FILE__, __LINE__, __FUNCTION__);
273 CHECK_XCB_CONN;
274
275 num = (sizeof(atoms) / sizeof(Xcb_Atom));
276 for (i = 0; i < num; i++)
277 {
278 cookies[i] =
279 xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
280 strlen(atoms[i].name), atoms[i].name);
281 }
282}
283
284void
285_ecore_xcb_atoms_finalize(void)
286{
287 int i = 0, num = 0;
288
289 LOGFN(__FILE__, __LINE__, __FUNCTION__);
290 CHECK_XCB_CONN;
291
292 num = (sizeof(atoms) / sizeof(Xcb_Atom));
293 for (i = 0; i < num; i++)
294 {
295 xcb_intern_atom_reply_t *reply = NULL;
296
297 if (!(reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookies[i], 0)))
298 continue;
299 *(atoms[i].atom) = reply->atom;
300 free(reply);
301 }
302}
303
304/**
305 * @defgroup Ecore_X_Atom_Group XCB Atom Functions
306 *
307 * Functions that operate on atoms
308 */
309
310/**
311 * Retrieves the atom value associated to a name.
312 *
313 * @param name Unused.
314 * @return Associated atom value.
315 *
316 * Retrieves the atom value associated to a name. The reply is the
317 * returned value of the function ecore_xcb_intern_atom_reply(). If
318 * @p reply is @c NULL, the NULL atom is returned. Otherwise, the atom
319 * associated to the name is returned.
320 *
321 * To use this function, you must call before, and in order,
322 * ecore_x_atom_get_prefetch(), which sends the InternAtom request,
323 * then ecore_x_atom_get_fetch(), which gets the reply.
324 *
325 * @ingroup Ecore_X_Atom_Group
326 */
327EAPI Ecore_X_Atom
328ecore_x_atom_get(const char *name)
329{
330 xcb_intern_atom_cookie_t cookie;
331 xcb_intern_atom_reply_t *reply;
332 Ecore_X_Atom a;
333
334 LOGFN(__FILE__, __LINE__, __FUNCTION__);
335 CHECK_XCB_CONN;
336
337 cookie = xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(name), name);
338 reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookie, NULL);
339 if (!reply) return XCB_ATOM_NONE;
340 a = reply->atom;
341 free(reply);
342 return a;
343}
344
345/**
346 * Retrieves the name of the given atom.
347 *
348 * @param atom
349 * @return The name of the atom.
350 *
351 * @ingroup Ecore_X_Atom_Group
352 */
353EAPI char *
354ecore_x_atom_name_get(Ecore_X_Atom atom)
355{
356 xcb_get_atom_name_cookie_t cookie;
357 xcb_get_atom_name_reply_t *reply;
358 char *name;
359 int len = 0;
360
361 LOGFN(__FILE__, __LINE__, __FUNCTION__);
362 CHECK_XCB_CONN;
363
364 cookie = xcb_get_atom_name_unchecked(_ecore_xcb_conn, atom);
365 reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookie, NULL);
366 if (!reply) return NULL;
367 len = xcb_get_atom_name_name_length(reply);
368 name = (char *)malloc(sizeof(char) * (len + 1));
369 if (!name)
370 {
371 free(reply);
372 return NULL;
373 }
374 memcpy(name, xcb_get_atom_name_name(reply), len);
375 name[len] = '\0';
376
377 free(reply);
378 return name;
379}
380
381EAPI void
382ecore_x_atoms_get(const char **names,
383 int num,
384 Ecore_X_Atom *atoms)
385{
386 xcb_intern_atom_cookie_t cookies[num];
387 int i = 0;
388
389 LOGFN(__FILE__, __LINE__, __FUNCTION__);
390 CHECK_XCB_CONN;
391
392 for (i = 0; i < num; i++)
393 {
394 cookies[i] =
395 xcb_intern_atom_unchecked(_ecore_xcb_conn, 0,
396 strlen(names[i]), names[i]);
397 }
398 for (i = 0; i < num; i++)
399 {
400 xcb_intern_atom_reply_t *reply = NULL;
401
402 if (!(reply = xcb_intern_atom_reply(_ecore_xcb_conn, cookies[i], 0)))
403 continue;
404 atoms[i] = reply->atom;
405 free(reply);
406 }
407}
408
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_composite.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_composite.c
new file mode 100644
index 0000000..f247b34
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_composite.c
@@ -0,0 +1,289 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_COMPOSITE
3# include <xcb/composite.h>
4#endif
5
6/* local variables */
7static Eina_Bool _composite_avail = EINA_FALSE;
8
9void
10_ecore_xcb_composite_init(void)
11{
12 LOGFN(__FILE__, __LINE__, __FUNCTION__);
13
14#ifdef ECORE_XCB_COMPOSITE
15 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_composite_id);
16#endif
17}
18
19void
20_ecore_xcb_composite_finalize(void)
21{
22#ifdef ECORE_XCB_COMPOSITE
23 const xcb_query_extension_reply_t *ext_reply;
24#endif
25
26 LOGFN(__FILE__, __LINE__, __FUNCTION__);
27
28#ifdef ECORE_XCB_COMPOSITE
29 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_composite_id);
30 if ((ext_reply) && (ext_reply->present))
31 {
32 xcb_composite_query_version_cookie_t cookie;
33 xcb_composite_query_version_reply_t *reply;
34
35 cookie =
36 xcb_composite_query_version_unchecked(_ecore_xcb_conn,
37 XCB_COMPOSITE_MAJOR_VERSION,
38 XCB_COMPOSITE_MINOR_VERSION);
39 reply =
40 xcb_composite_query_version_reply(_ecore_xcb_conn, cookie, NULL);
41 if (reply)
42 {
43// if ((reply->major_version >= XCB_COMPOSITE_MAJOR_VERSION) &&
44 if (reply->minor_version >= XCB_COMPOSITE_MINOR_VERSION)
45 {
46# ifdef ECORE_XCB_RENDER
47 if (_ecore_xcb_render_avail_get())
48 {
49# ifdef ECORE_XCB_XFIXES
50 if (_ecore_xcb_xfixes_avail_get())
51 _composite_avail = EINA_TRUE;
52# endif
53 }
54# endif
55 }
56
57 free(reply);
58 }
59 }
60#endif
61}
62
63/**
64 * @defgroup Ecore_X_Composite_Group X Composite Extension Functions
65 *
66 * Functions related to the X Composite Extension
67 */
68
69/**
70 * Return whether the Composite Extension is available
71 *
72 * @return EINA_TRUE is the Composite Extension is available, EINA_FALSE if not
73 *
74 * @ingroup Ecore_X_Composite_Group
75 */
76EAPI Eina_Bool
77ecore_x_composite_query(void)
78{
79 LOGFN(__FILE__, __LINE__, __FUNCTION__);
80 return _composite_avail;
81}
82
83EAPI void
84ecore_x_composite_redirect_window(Ecore_X_Window win,
85 Ecore_X_Composite_Update_Type type)
86{
87 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 CHECK_XCB_CONN;
89
90 if (!_composite_avail) return;
91
92#ifdef ECORE_XCB_COMPOSITE
93 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
94
95 switch (type)
96 {
97 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
98 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
99 break;
100
101 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
102 update = XCB_COMPOSITE_REDIRECT_MANUAL;
103 break;
104 }
105 xcb_composite_redirect_window(_ecore_xcb_conn, win, update);
106// ecore_x_flush();
107#endif
108}
109
110EAPI void
111ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
112 Ecore_X_Composite_Update_Type type)
113{
114 LOGFN(__FILE__, __LINE__, __FUNCTION__);
115 CHECK_XCB_CONN;
116
117 if (!_composite_avail) return;
118
119#ifdef ECORE_XCB_COMPOSITE
120 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
121
122 switch (type)
123 {
124 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
125 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
126 break;
127
128 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
129 update = XCB_COMPOSITE_REDIRECT_MANUAL;
130 break;
131 }
132 xcb_composite_redirect_subwindows(_ecore_xcb_conn, win, update);
133// ecore_x_flush();
134#endif
135}
136
137EAPI void
138ecore_x_composite_unredirect_window(Ecore_X_Window win,
139 Ecore_X_Composite_Update_Type type)
140{
141 LOGFN(__FILE__, __LINE__, __FUNCTION__);
142 CHECK_XCB_CONN;
143
144 if (!_composite_avail) return;
145
146#ifdef ECORE_XCB_COMPOSITE
147 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
148
149 switch (type)
150 {
151 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
152 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
153 break;
154
155 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
156 update = XCB_COMPOSITE_REDIRECT_MANUAL;
157 break;
158 }
159 xcb_composite_unredirect_window(_ecore_xcb_conn, win, update);
160// ecore_x_flush();
161#endif
162}
163
164EAPI void
165ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
166 Ecore_X_Composite_Update_Type type)
167{
168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
169 CHECK_XCB_CONN;
170
171 if (!_composite_avail) return;
172
173#ifdef ECORE_XCB_COMPOSITE
174 uint8_t update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
175
176 switch (type)
177 {
178 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
179 update = XCB_COMPOSITE_REDIRECT_AUTOMATIC;
180 break;
181
182 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
183 update = XCB_COMPOSITE_REDIRECT_MANUAL;
184 break;
185 }
186 xcb_composite_unredirect_subwindows(_ecore_xcb_conn, win, update);
187// ecore_x_flush();
188#endif
189}
190
191EAPI Ecore_X_Pixmap
192ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
193{
194#ifdef ECORE_XCB_COMPOSITE
195 Ecore_X_Pixmap pmap = XCB_NONE;
196#endif
197
198 LOGFN(__FILE__, __LINE__, __FUNCTION__);
199 CHECK_XCB_CONN;
200
201 if (!_composite_avail) return XCB_NONE;
202
203#ifdef ECORE_XCB_COMPOSITE
204 pmap = xcb_generate_id(_ecore_xcb_conn);
205 xcb_composite_name_window_pixmap(_ecore_xcb_conn, win, pmap);
206// ecore_x_flush();
207#endif
208
209 return pmap;
210}
211
212EAPI void
213ecore_x_composite_window_events_disable(Ecore_X_Window win)
214{
215 LOGFN(__FILE__, __LINE__, __FUNCTION__);
216 CHECK_XCB_CONN;
217
218 if (!_composite_avail) return;
219
220#ifdef ECORE_XCB_SHAPE
221 ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
222// ecore_x_flush();
223#else
224 return;
225 win = 0;
226#endif
227}
228
229EAPI void
230ecore_x_composite_window_events_enable(Ecore_X_Window win)
231{
232 LOGFN(__FILE__, __LINE__, __FUNCTION__);
233 CHECK_XCB_CONN;
234
235 if (!_composite_avail) return;
236
237#ifdef ECORE_XCB_SHAPE
238 ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
239// ecore_x_flush();
240#else
241 return;
242 win = 0;
243#endif
244}
245
246EAPI Ecore_X_Window
247ecore_x_composite_render_window_enable(Ecore_X_Window root)
248{
249 Ecore_X_Window win = 0;
250#ifdef ECORE_XCB_COMPOSITE
251 xcb_composite_get_overlay_window_cookie_t cookie;
252 xcb_composite_get_overlay_window_reply_t *reply;
253#endif
254
255 LOGFN(__FILE__, __LINE__, __FUNCTION__);
256 CHECK_XCB_CONN;
257
258 if (!_composite_avail) return 0;
259
260#ifdef ECORE_XCB_COMPOSITE
261 cookie = xcb_composite_get_overlay_window_unchecked(_ecore_xcb_conn, root);
262 reply =
263 xcb_composite_get_overlay_window_reply(_ecore_xcb_conn, cookie, NULL);
264 if (!reply) return win;
265
266 win = reply->overlay_win;
267 free(reply);
268
269 ecore_x_composite_window_events_disable(win);
270// ecore_x_flush();
271#endif
272
273 return win;
274}
275
276EAPI void
277ecore_x_composite_render_window_disable(Ecore_X_Window win)
278{
279 LOGFN(__FILE__, __LINE__, __FUNCTION__);
280 CHECK_XCB_CONN;
281
282 if (!_composite_avail) return;
283
284#ifdef ECORE_XCB_COMPOSITE
285 xcb_composite_release_overlay_window(_ecore_xcb_conn, win);
286// ecore_x_flush();
287#endif
288}
289
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_cursor.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_cursor.c
new file mode 100644
index 0000000..755df04
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_cursor.c
@@ -0,0 +1,400 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_CURSOR
3# include <xcb/render.h>
4# include <xcb/xcb_renderutil.h>
5#endif
6
7/* local function prototypes */
8#ifdef ECORE_XCB_CURSOR
9static xcb_render_pictforminfo_t *_ecore_xcb_cursor_format_get(void);
10#endif
11static void _ecore_xcb_cursor_default_size_get(void);
12static void _ecore_xcb_cursor_dpi_size_get(void);
13static void _ecore_xcb_cursor_guess_size(void);
14#ifdef ECORE_XCB_CURSOR
15static Ecore_X_Cursor _ecore_xcb_cursor_image_load_cursor(xcb_image_t *img,
16 int hot_x,
17 int hot_y);
18#endif
19static void _ecore_xcb_cursor_image_destroy(xcb_image_t *img);
20
21/* local variables */
22static int _ecore_xcb_cursor_size = 0;
23static Eina_Bool _ecore_xcb_cursor = EINA_FALSE;
24#ifdef ECORE_XCB_CURSOR
25static uint32_t _ecore_xcb_cursor_format_id = 0;
26// static xcb_render_pictforminfo_t *_ecore_xcb_cursor_format = NULL;
27#endif
28
29void
30_ecore_xcb_cursor_init(void)
31{
32 LOGFN(__FILE__, __LINE__, __FUNCTION__);
33 /* NB: No-op */
34}
35
36void
37_ecore_xcb_cursor_finalize(void)
38{
39 LOGFN(__FILE__, __LINE__, __FUNCTION__);
40
41#ifdef ECORE_XCB_CURSOR
42 _ecore_xcb_cursor = _ecore_xcb_render_argb_get();
43
44 /* find render pict format */
45 if (_ecore_xcb_cursor_format_id <= 0)
46 _ecore_xcb_cursor_format_id = _ecore_xcb_cursor_format_get()->id;
47#endif
48
49 /* try to grab cursor size from XDefaults */
50 _ecore_xcb_cursor_default_size_get();
51
52 /* if that failed, try to get it from Xft Dpi setting */
53 if (_ecore_xcb_cursor_size == 0)
54 _ecore_xcb_cursor_dpi_size_get();
55
56 /* if that failed, try to guess from display size */
57 if (_ecore_xcb_cursor_size == 0)
58 _ecore_xcb_cursor_guess_size();
59
60 /* NB: Would normally add theme stuff here, but E cursor does not support
61 * xcursor themes. Delay parsing that stuff out until such time if/when the
62 * user selects to use X Cursor, rather than E cursor */
63}
64
65EAPI Eina_Bool
66ecore_x_cursor_color_supported_get(void)
67{
68 LOGFN(__FILE__, __LINE__, __FUNCTION__);
69
70 return _ecore_xcb_cursor;
71}
72
73EAPI Ecore_X_Cursor
74ecore_x_cursor_new(Ecore_X_Window win,
75 int *pixels,
76 int w,
77 int h,
78 int hot_x,
79 int hot_y)
80{
81 Ecore_X_Cursor cursor = 0;
82 xcb_image_t *img;
83
84// LOGFN(__FILE__, __LINE__, __FUNCTION__);
85 CHECK_XCB_CONN;
86
87#ifdef ECORE_XCB_CURSOR
88 if (_ecore_xcb_cursor)
89 {
90 img = _ecore_xcb_image_create_native(w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
91 32, NULL, (w * h * sizeof(int)),
92 (uint8_t *)pixels);
93 cursor = _ecore_xcb_cursor_image_load_cursor(img, hot_x, hot_y);
94 _ecore_xcb_cursor_image_destroy(img);
95 return cursor;
96 }
97 else
98#endif
99 {
100 Ecore_X_GC gc;
101 xcb_pixmap_t pmap, mask;
102 uint32_t *pix;
103 uint8_t fr = 0x00, fg = 0x00, fb = 0x00;
104 uint8_t br = 0xff, bg = 0xff, bb = 0xff;
105 uint32_t brightest = 0, darkest = 255 * 3;
106 uint16_t x, y;
107 const uint32_t dither[2][2] =
108 {
109 {0, 2},
110 {3, 1}
111 };
112
113 img = _ecore_xcb_image_create_native(w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
114 1, NULL, ~0, NULL);
115 if (img->data) free(img->data);
116 img->data = malloc(img->size);
117
118 pmap = xcb_generate_id(_ecore_xcb_conn);
119 xcb_create_pixmap(_ecore_xcb_conn, 1, pmap, win, w, h);
120 mask = xcb_generate_id(_ecore_xcb_conn);
121 xcb_create_pixmap(_ecore_xcb_conn, 1, mask, win, w, h);
122
123 pix = (uint32_t *)pixels;
124 for (y = 0; y < h; y++)
125 {
126 for (x = 0; x < w; x++)
127 {
128 uint8_t r, g, b, a;
129
130 a = (pix[0] >> 24) & 0xff;
131 r = (pix[0] >> 16) & 0xff;
132 g = (pix[0] >> 8) & 0xff;
133 b = (pix[0]) & 0xff;
134 if (a > 0)
135 {
136 if ((uint32_t)(r + g + b) > brightest)
137 {
138 brightest = r + g + b;
139 br = r;
140 bg = g;
141 bb = b;
142 }
143
144 if ((uint32_t)(r + g + b) < darkest)
145 {
146 darkest = r + g + b;
147 fr = r;
148 fg = g;
149 fb = b;
150 }
151 }
152 pix++;
153 }
154 }
155
156 pix = (uint32_t *)pixels;
157 for (y = 0; y < h; y++)
158 {
159 for (x = 0; x < w; x++)
160 {
161 uint32_t v;
162 uint8_t r, g, b;
163 int32_t d1, d2;
164
165 r = (pix[0] >> 16) & 0xff;
166 g = (pix[0] >> 8) & 0xff;
167 b = (pix[0]) & 0xff;
168 d1 =
169 ((r - fr) * (r - fr)) +
170 ((g - fg) * (g - fg)) +
171 ((b - fb) * (b - fb));
172 d2 =
173 ((r - br) * (r - br)) +
174 ((g - bg) * (g - bg)) +
175 ((b - bb) * (b - bb));
176 if (d1 + d2)
177 {
178 v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
179 if (v > dither[x & 0x1][y & 0x1])
180 v = 1;
181 else
182 v = 0;
183 }
184 else
185 v = 0;
186
187 xcb_image_put_pixel(img, x, y, v);
188 pix++;
189 }
190 }
191
192 gc = ecore_x_gc_new(pmap, 0, NULL);
193 xcb_put_image(_ecore_xcb_conn, img->format, pmap, gc, w, h,
194 0, 0, 0, img->depth, img->size, img->data);
195 ecore_x_gc_free(gc);
196
197 pix = (uint32_t *)pixels;
198 for (y = 0; y < h; y++)
199 {
200 for (x = 0; x < w; x++)
201 {
202 uint32_t v;
203
204 v = (((pix[0] >> 24) & 0xff) * 5) / 256;
205 if (v > dither[x & 0x1][y & 0x1])
206 v = 1;
207 else
208 v = 0;
209
210 xcb_image_put_pixel(img, x, y, v);
211 pix++;
212 }
213 }
214
215 gc = ecore_x_gc_new(mask, 0, NULL);
216 xcb_put_image(_ecore_xcb_conn, img->format, mask, gc, w, h,
217 0, 0, 0, img->depth, img->size, img->data);
218 ecore_x_gc_free(gc);
219
220 if (img->data) free(img->data);
221 _ecore_xcb_cursor_image_destroy(img);
222
223 cursor = xcb_generate_id(_ecore_xcb_conn);
224 xcb_create_cursor(_ecore_xcb_conn, cursor, pmap, mask,
225 fr << 8 | fr, fg << 8 | fg, fb << 8 | fb,
226 br << 8 | br, bg << 8 | bg, bb << 8 | bb,
227 hot_x, hot_y);
228
229 xcb_free_pixmap(_ecore_xcb_conn, pmap);
230 xcb_free_pixmap(_ecore_xcb_conn, mask);
231
232 return cursor;
233 }
234
235 return 0;
236}
237
238EAPI void
239ecore_x_cursor_free(Ecore_X_Cursor c)
240{
241// LOGFN(__FILE__, __LINE__, __FUNCTION__);
242 CHECK_XCB_CONN;
243
244 xcb_free_cursor(_ecore_xcb_conn, c);
245}
246
247/*
248 * Returns the cursor for the given shape.
249 * Note that the return value must not be freed with
250 * ecore_x_cursor_free()!
251 */
252EAPI Ecore_X_Cursor
253ecore_x_cursor_shape_get(int shape)
254{
255 Ecore_X_Cursor cursor = 0;
256 xcb_font_t font;
257
258 LOGFN(__FILE__, __LINE__, __FUNCTION__);
259 CHECK_XCB_CONN;
260
261 font = xcb_generate_id(_ecore_xcb_conn);
262 xcb_open_font(_ecore_xcb_conn, font, strlen("cursor"), "cursor");
263
264 cursor = xcb_generate_id(_ecore_xcb_conn);
265 /* FIXME: Add request check ?? */
266 xcb_create_glyph_cursor(_ecore_xcb_conn, cursor, font, font,
267 shape, shape + 1, 0, 0, 0, 65535, 65535, 65535);
268
269 xcb_close_font(_ecore_xcb_conn, font);
270 return cursor;
271}
272
273EAPI void
274ecore_x_cursor_size_set(int size)
275{
276 LOGFN(__FILE__, __LINE__, __FUNCTION__);
277
278 _ecore_xcb_cursor_size = size;
279 /* NB: May need to adjust size of current cursors here */
280}
281
282EAPI int
283ecore_x_cursor_size_get(void)
284{
285 LOGFN(__FILE__, __LINE__, __FUNCTION__);
286
287 return _ecore_xcb_cursor_size;
288}
289
290/* local functions */
291#ifdef ECORE_XCB_CURSOR
292static xcb_render_pictforminfo_t *
293_ecore_xcb_cursor_format_get(void)
294{
295 const xcb_render_query_pict_formats_reply_t *reply;
296 xcb_render_pictforminfo_t *ret = NULL;
297
298 CHECK_XCB_CONN;
299
300 reply = xcb_render_util_query_formats(_ecore_xcb_conn);
301 if (reply)
302 ret = xcb_render_util_find_standard_format(reply,
303 XCB_PICT_STANDARD_ARGB_32);
304
305 return ret;
306}
307
308#endif
309
310static void
311_ecore_xcb_cursor_default_size_get(void)
312{
313 char *s = NULL;
314 int v = 0;
315
316 LOGFN(__FILE__, __LINE__, __FUNCTION__);
317
318 s = getenv("XCURSOR_SIZE");
319 if (!s)
320 {
321 _ecore_xcb_xdefaults_init();
322 v = _ecore_xcb_xdefaults_int_get("Xcursor", "size");
323 _ecore_xcb_xdefaults_shutdown();
324 }
325 else
326 v = atoi(s);
327 if (v) _ecore_xcb_cursor_size = ((v * 16) / 72);
328}
329
330static void
331_ecore_xcb_cursor_dpi_size_get(void)
332{
333 int v = 0;
334
335 LOGFN(__FILE__, __LINE__, __FUNCTION__);
336
337 _ecore_xcb_xdefaults_init();
338 v = _ecore_xcb_xdefaults_int_get("Xft", "dpi");
339 if (v) _ecore_xcb_cursor_size = ((v * 16) / 72);
340 _ecore_xcb_xdefaults_shutdown();
341}
342
343static void
344_ecore_xcb_cursor_guess_size(void)
345{
346 int w = 0, h = 0, s = 0;
347
348 LOGFN(__FILE__, __LINE__, __FUNCTION__);
349
350 ecore_x_screen_size_get(_ecore_xcb_screen, &w, &h);
351 if (h < w) s = h;
352 else s = w;
353 _ecore_xcb_cursor_size = (s / 48);
354}
355
356#ifdef ECORE_XCB_CURSOR
357static Ecore_X_Cursor
358_ecore_xcb_cursor_image_load_cursor(xcb_image_t *img,
359 int hot_x,
360 int hot_y)
361{
362 Ecore_X_Cursor cursor = 0;
363 Ecore_X_GC gc;
364 xcb_pixmap_t pmap;
365 xcb_render_picture_t pict;
366
367 CHECK_XCB_CONN;
368
369 pmap = xcb_generate_id(_ecore_xcb_conn);
370 xcb_create_pixmap(_ecore_xcb_conn, img->depth, pmap,
371 ((xcb_screen_t *)_ecore_xcb_screen)->root,
372 img->width, img->height);
373
374 gc = ecore_x_gc_new(pmap, 0, NULL);
375 xcb_put_image(_ecore_xcb_conn, img->format, pmap, gc,
376 img->width, img->height, 0, 0, 0, img->depth,
377 img->size, img->data);
378 ecore_x_gc_free(gc);
379
380 pict = xcb_generate_id(_ecore_xcb_conn);
381 xcb_render_create_picture(_ecore_xcb_conn, pict, pmap,
382 _ecore_xcb_cursor_format_id, 0, NULL);
383 xcb_free_pixmap(_ecore_xcb_conn, pmap);
384
385 cursor = xcb_generate_id(_ecore_xcb_conn);
386 xcb_render_create_cursor(_ecore_xcb_conn, cursor, pict, hot_x, hot_y);
387 xcb_render_free_picture(_ecore_xcb_conn, pict);
388
389 return cursor;
390}
391
392#endif
393
394static void
395_ecore_xcb_cursor_image_destroy(xcb_image_t *img)
396{
397 CHECK_XCB_CONN;
398 if (img) xcb_image_destroy(img);
399}
400
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_damage.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_damage.c
new file mode 100644
index 0000000..d0ffde1
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_damage.c
@@ -0,0 +1,155 @@
1#include "ecore_xcb_private.h"
2# ifdef ECORE_XCB_DAMAGE
3# include <xcb/damage.h>
4# endif
5
6/* local variables */
7static Eina_Bool _damage_avail = EINA_FALSE;
8
9/* external variables */
10int _ecore_xcb_event_damage = -1;
11
12void
13_ecore_xcb_damage_init(void)
14{
15 LOGFN(__FILE__, __LINE__, __FUNCTION__);
16
17#ifdef ECORE_XCB_DAMAGE
18 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_damage_id);
19#endif
20}
21
22void
23_ecore_xcb_damage_finalize(void)
24{
25#ifdef ECORE_XCB_DAMAGE
26 const xcb_query_extension_reply_t *ext_reply;
27#endif
28
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
30
31#ifdef ECORE_XCB_DAMAGE
32 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_damage_id);
33 if ((ext_reply) && (ext_reply->present))
34 {
35 xcb_damage_query_version_cookie_t cookie;
36 xcb_damage_query_version_reply_t *reply;
37
38 cookie =
39 xcb_damage_query_version_unchecked(_ecore_xcb_conn,
40 XCB_DAMAGE_MAJOR_VERSION,
41 XCB_DAMAGE_MINOR_VERSION);
42 reply = xcb_damage_query_version_reply(_ecore_xcb_conn, cookie, NULL);
43 if (reply)
44 {
45 _damage_avail = EINA_TRUE;
46 free(reply);
47 }
48
49 if (_damage_avail)
50 _ecore_xcb_event_damage = ext_reply->first_event;
51 }
52#endif
53}
54
55/**
56 * @defgroup Ecore_X_Damage_Group X Damage Extension Functions
57 *
58 * Functions related to the X Damage Extension.
59 */
60
61EAPI Eina_Bool
62ecore_x_damage_query(void)
63{
64 return _damage_avail;
65}
66
67/**
68 * Create a damage object
69 *
70 * @param drawable The drawable to monitor
71 * @param level The level of the damage report
72 * @return The damage object
73 *
74 * Creates a damage object to monitor changes to @p drawable,
75 * with the level @p level.
76 *
77 * @ingroup Ecore_X_Damage_Group
78 */
79EAPI Ecore_X_Damage
80ecore_x_damage_new(Ecore_X_Drawable drawable,
81 Ecore_X_Damage_Report_Level level)
82{
83 Ecore_X_Damage damage = 0;
84
85 LOGFN(__FILE__, __LINE__, __FUNCTION__);
86 CHECK_XCB_CONN;
87
88 if (!_damage_avail) return 0;
89
90#ifdef ECORE_XCB_DAMAGE
91 damage = xcb_generate_id(_ecore_xcb_conn);
92 xcb_damage_create(_ecore_xcb_conn, damage, drawable, level);
93// ecore_x_flush();
94#endif
95
96 return damage;
97}
98
99/**
100 * Destroy a damage object
101 *
102 * @param The damage object to destroy
103 *
104 * Destroys the damage object @p damage
105 *
106 * @ingroup Ecore_X_Damage_Group
107 */
108EAPI void
109ecore_x_damage_free(Ecore_X_Damage damage)
110{
111 LOGFN(__FILE__, __LINE__, __FUNCTION__);
112 CHECK_XCB_CONN;
113
114 if (!_damage_avail) return;
115
116#ifdef ECORE_XCB_DAMAGE
117 xcb_damage_destroy(_ecore_xcb_conn, damage);
118// ecore_x_flush();
119#endif
120}
121
122/**
123 * Synchronously modifies the region
124 *
125 * @param damage The damage object to destroy
126 * @param repair The repair region
127 * @param parts The parts region
128 *
129 * Synchronously modifies the regions in the following manner:
130 * If @p repair is @c XCB_NONE:
131 * 1) parts = damage
132 * 2) damage = <empty>
133 * Otherwise:
134 * 1) parts = damage INTERSECT repair
135 * 2) damage = damage - parts
136 * 3) Generate DamageNotify for remaining damage areas
137 *
138 * @ingroup Ecore_X_Damage_Group
139 */
140EAPI void
141ecore_x_damage_subtract(Ecore_X_Damage damage,
142 Ecore_X_Region repair,
143 Ecore_X_Region parts)
144{
145 LOGFN(__FILE__, __LINE__, __FUNCTION__);
146 CHECK_XCB_CONN;
147
148 if (!_damage_avail) return;
149
150#ifdef ECORE_XCB_DAMAGE
151 xcb_damage_subtract(_ecore_xcb_conn, damage, repair, parts);
152// ecore_x_flush();
153#endif
154}
155
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dnd.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dnd.c
new file mode 100644
index 0000000..677de38
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dnd.c
@@ -0,0 +1,689 @@
1#include "ecore_xcb_private.h"
2
3#ifndef MIN
4# define MIN(a, b) (((a) < (b)) ? (a) : (b))
5#endif
6
7/* local structures */
8typedef struct _Version_Cache_Item
9{
10 Ecore_X_Window win;
11 int ver;
12} Version_Cache_Item;
13
14/* local function prototypes */
15static Eina_Bool _ecore_xcb_dnd_converter_copy(char *target __UNUSED__,
16 void *data,
17 int size,
18 void **data_ret,
19 int *size_ret,
20 Ecore_X_Atom *tprop __UNUSED__,
21 int *count __UNUSED__);
22
23/* local variables */
24static int _ecore_xcb_dnd_init_count = 0;
25static Ecore_X_DND_Source *_source = NULL;
26static Ecore_X_DND_Target *_target = NULL;
27static Version_Cache_Item *_version_cache = NULL;
28static int _version_cache_num = 0, _version_cache_alloc = 0;
29static void (*_posupdatecb)(void *,
30 Ecore_X_Xdnd_Position *);
31static void *_posupdatedata;
32
33/* external variables */
34EAPI int ECORE_X_EVENT_XDND_ENTER = 0;
35EAPI int ECORE_X_EVENT_XDND_POSITION = 0;
36EAPI int ECORE_X_EVENT_XDND_STATUS = 0;
37EAPI int ECORE_X_EVENT_XDND_LEAVE = 0;
38EAPI int ECORE_X_EVENT_XDND_DROP = 0;
39EAPI int ECORE_X_EVENT_XDND_FINISHED = 0;
40
41void
42_ecore_xcb_dnd_init(void)
43{
44 LOGFN(__FILE__, __LINE__, __FUNCTION__);
45
46 if (!_ecore_xcb_dnd_init_count)
47 {
48 _source = calloc(1, sizeof(Ecore_X_DND_Source));
49 if (!_source) return;
50 _source->version = ECORE_X_DND_VERSION;
51 _source->win = XCB_NONE;
52 _source->dest = XCB_NONE;
53 _source->state = ECORE_X_DND_SOURCE_IDLE;
54 _source->prev.window = 0;
55
56 _target = calloc(1, sizeof(Ecore_X_DND_Target));
57 if (!_target)
58 {
59 free(_source);
60 _source = NULL;
61 return;
62 }
63 _target->win = XCB_NONE;
64 _target->source = XCB_NONE;
65 _target->state = ECORE_X_DND_TARGET_IDLE;
66
67 ECORE_X_EVENT_XDND_ENTER = ecore_event_type_new();
68 ECORE_X_EVENT_XDND_POSITION = ecore_event_type_new();
69 ECORE_X_EVENT_XDND_STATUS = ecore_event_type_new();
70 ECORE_X_EVENT_XDND_LEAVE = ecore_event_type_new();
71 ECORE_X_EVENT_XDND_DROP = ecore_event_type_new();
72 ECORE_X_EVENT_XDND_FINISHED = ecore_event_type_new();
73 }
74 _ecore_xcb_dnd_init_count++;
75}
76
77void
78_ecore_xcb_dnd_shutdown(void)
79{
80 LOGFN(__FILE__, __LINE__, __FUNCTION__);
81
82 _ecore_xcb_dnd_init_count--;
83 if (_ecore_xcb_dnd_init_count > 0) return;
84 if (_source) free(_source);
85 _source = NULL;
86 if (_target) free(_target);
87 _target = NULL;
88 _ecore_xcb_dnd_init_count = 0;
89}
90
91EAPI void
92ecore_x_dnd_send_status(Eina_Bool will_accept,
93 Eina_Bool suppress,
94 Ecore_X_Rectangle rect,
95 Ecore_X_Atom action)
96{
97 xcb_client_message_event_t ev;
98
99 LOGFN(__FILE__, __LINE__, __FUNCTION__);
100 CHECK_XCB_CONN;
101
102 if (_target->state == ECORE_X_DND_TARGET_IDLE) return;
103
104 memset(&ev, 0, sizeof(xcb_client_message_event_t));
105
106 _target->will_accept = will_accept;
107
108 ev.response_type = XCB_CLIENT_MESSAGE;
109 ev.type = ECORE_X_ATOM_XDND_STATUS;
110 ev.format = 32;
111 ev.window = _target->source;
112 ev.data.data32[0] = _target->win;
113 ev.data.data32[1] = 0;
114 if (will_accept) ev.data.data32[1] |= 0x1UL;
115 if (!suppress) ev.data.data32[1] |= 0x2UL;
116
117 ev.data.data32[2] = rect.x;
118 ev.data.data32[2] <<= 16;
119 ev.data.data32[2] |= rect.y;
120 ev.data.data32[3] = rect.width;
121 ev.data.data32[3] <<= 16;
122 ev.data.data32[3] |= rect.height;
123
124 if (will_accept)
125 ev.data.data32[4] = action;
126 else
127 ev.data.data32[4] = XCB_NONE;
128 _target->accepted_action = action;
129
130 xcb_send_event(_ecore_xcb_conn, 0, _target->source,
131 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
132// ecore_x_flush();
133}
134
135EAPI Eina_Bool
136ecore_x_dnd_drop(void)
137{
138 xcb_client_message_event_t ev;
139 Eina_Bool status = EINA_FALSE;
140
141 LOGFN(__FILE__, __LINE__, __FUNCTION__);
142 CHECK_XCB_CONN;
143
144 memset(&ev, 0, sizeof(xcb_client_message_event_t));
145
146 if (_source->dest)
147 {
148 ev.response_type = XCB_CLIENT_MESSAGE;
149 ev.format = 32;
150 ev.window = _source->dest;
151
152 if (_source->will_accept)
153 {
154 ev.type = ECORE_X_ATOM_XDND_DROP;
155 ev.data.data32[0] = _source->win;
156 ev.data.data32[1] = 0;
157 ev.data.data32[2] = _source->time;
158
159 xcb_send_event(_ecore_xcb_conn, 0, _source->dest,
160 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
161// ecore_x_flush();
162 _source->state = ECORE_X_DND_SOURCE_DROPPED;
163 status = EINA_TRUE;
164 }
165 else
166 {
167 ev.type = ECORE_X_ATOM_XDND_LEAVE;
168 ev.data.data32[0] = _source->win;
169 ev.data.data32[1] = 0;
170
171 xcb_send_event(_ecore_xcb_conn, 0, _source->dest,
172 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
173// ecore_x_flush();
174 _source->state = ECORE_X_DND_SOURCE_IDLE;
175 }
176 }
177 else
178 {
179 ecore_x_selection_xdnd_clear();
180 _source->state = ECORE_X_DND_SOURCE_IDLE;
181 }
182
183 ecore_x_window_ignore_set(_source->win, 0);
184 _source->prev.window = 0;
185
186 return status;
187}
188
189EAPI void
190ecore_x_dnd_aware_set(Ecore_X_Window win,
191 Eina_Bool on)
192{
193 Ecore_X_Atom prop_data = ECORE_X_DND_VERSION;
194
195 LOGFN(__FILE__, __LINE__, __FUNCTION__);
196
197 if (on)
198 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_AWARE,
199 ECORE_X_ATOM_ATOM, 32, &prop_data, 1);
200 else
201 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_AWARE);
202}
203
204EAPI int
205ecore_x_dnd_version_get(Ecore_X_Window win)
206{
207 unsigned char *data;
208 int num = 0;
209 Version_Cache_Item *t;
210
211 LOGFN(__FILE__, __LINE__, __FUNCTION__);
212
213 if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
214 {
215 if (_version_cache)
216 {
217 int i = 0;
218
219 for (i = 0; i < _version_cache_num; i++)
220 {
221 if (_version_cache[i].win == win)
222 return _version_cache[i].ver;
223 }
224 }
225 }
226
227 if (ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_AWARE,
228 ECORE_X_ATOM_ATOM, 32, &data, &num))
229 {
230 int version = 0;
231
232 version = (int)*data;
233 free(data);
234 if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
235 {
236 _version_cache_num++;
237 if (_version_cache_num > _version_cache_alloc)
238 _version_cache_alloc += 16;
239 t = realloc(_version_cache,
240 _version_cache_alloc * sizeof(Version_Cache_Item));
241 if (!t) return 0;
242 _version_cache = t;
243 _version_cache[_version_cache_num - 1].win = win;
244 _version_cache[_version_cache_num - 1].ver = version;
245 }
246 return version;
247 }
248
249 if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
250 {
251 _version_cache_num++;
252 if (_version_cache_num > _version_cache_alloc)
253 _version_cache_alloc += 16;
254 t = realloc(_version_cache,
255 _version_cache_alloc * sizeof(Version_Cache_Item));
256 if (!t) return 0;
257 _version_cache = t;
258 _version_cache[_version_cache_num - 1].win = win;
259 _version_cache[_version_cache_num - 1].ver = 0;
260 }
261
262 return 0;
263}
264
265EAPI Eina_Bool
266ecore_x_dnd_type_isset(Ecore_X_Window win,
267 const char *type)
268{
269 int num = 0, i = 0;
270 Eina_Bool ret = EINA_FALSE;
271 unsigned char *data;
272 Ecore_X_Atom *atoms, atom;
273
274 LOGFN(__FILE__, __LINE__, __FUNCTION__);
275 CHECK_XCB_CONN;
276
277 if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
278 ECORE_X_ATOM_ATOM, 32, &data, &num))
279 return ret;
280
281 atom = ecore_x_atom_get(type);
282 atoms = (Ecore_X_Atom *)data;
283 for (i = 0; i < num; ++i)
284 {
285 if (atom == atoms[i])
286 {
287 ret = EINA_TRUE;
288 break;
289 }
290 }
291
292 free(data);
293 return ret;
294}
295
296EAPI void
297ecore_x_dnd_type_set(Ecore_X_Window win,
298 const char *type,
299 Eina_Bool on)
300{
301 Ecore_X_Atom atom, *oldset = NULL, *newset = NULL;
302 int i = 0, j = 0, num = 0;
303 unsigned char *data = NULL, *old_data = NULL;
304
305 LOGFN(__FILE__, __LINE__, __FUNCTION__);
306 CHECK_XCB_CONN;
307
308 atom = ecore_x_atom_get(type);
309 ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
310 ECORE_X_ATOM_ATOM, 32, &old_data, &num);
311 oldset = (Ecore_X_Atom *)old_data;
312 if (on)
313 {
314 if (ecore_x_dnd_type_isset(win, type))
315 {
316 free(old_data);
317 return;
318 }
319 newset = calloc(num + 1, sizeof(Ecore_X_Atom));
320 if (!newset) return;
321 data = (unsigned char *)newset;
322 for (i = 0; i < num; i++)
323 newset[i + 1] = oldset[i];
324 newset[0] = atom;
325 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
326 ECORE_X_ATOM_ATOM, 32, data, num + 1);
327 }
328 else
329 {
330 if (!ecore_x_dnd_type_isset(win, type))
331 {
332 free(old_data);
333 return;
334 }
335 newset = calloc(num - 1, sizeof(Ecore_X_Atom));
336 if (!newset)
337 {
338 free(old_data);
339 return;
340 }
341 data = (unsigned char *)newset;
342 for (i = 0; i < num; i++)
343 if (oldset[i] != atom)
344 newset[j++] = oldset[i];
345 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
346 ECORE_X_ATOM_ATOM, 32, data, num - 1);
347 }
348 free(oldset);
349 free(newset);
350}
351
352EAPI void
353ecore_x_dnd_types_set(Ecore_X_Window win,
354 const char **types,
355 unsigned int num_types)
356{
357 Ecore_X_Atom *newset = NULL;
358 unsigned int i;
359 unsigned char *data = NULL;
360
361 LOGFN(__FILE__, __LINE__, __FUNCTION__);
362 CHECK_XCB_CONN;
363
364 if (!num_types)
365 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_TYPE_LIST);
366 else
367 {
368 newset = calloc(num_types, sizeof(Ecore_X_Atom));
369 if (!newset) return;
370
371 data = (unsigned char *)newset;
372 for (i = 0; i < num_types; i++)
373 {
374 newset[i] = ecore_x_atom_get(types[i]);
375 ecore_x_selection_converter_atom_add(newset[i],
376 _ecore_xcb_dnd_converter_copy);
377 }
378 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
379 ECORE_X_ATOM_ATOM, 32, data,
380 num_types);
381 free(newset);
382 }
383}
384
385EAPI void
386ecore_x_dnd_actions_set(Ecore_X_Window win,
387 Ecore_X_Atom *actions,
388 unsigned int num_actions)
389{
390 unsigned int i;
391 unsigned char *data = NULL;
392
393 LOGFN(__FILE__, __LINE__, __FUNCTION__);
394 CHECK_XCB_CONN;
395
396 if (!num_actions)
397 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_ACTION_LIST);
398 else
399 {
400 data = (unsigned char *)actions;
401 for (i = 0; i < num_actions; i++)
402 ecore_x_selection_converter_atom_add(actions[i],
403 _ecore_xcb_dnd_converter_copy);
404 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_ACTION_LIST,
405 ECORE_X_ATOM_ATOM, 32, data,
406 num_actions);
407 }
408}
409
410/**
411 * The DND position update cb is called Ecore_X sends a DND position to a
412 * client.
413 *
414 * It essentially mirrors some of the data sent in the position message.
415 * Generally this cb should be set just before position update is called.
416 * Please note well you need to look after your own data pointer if someone
417 * trashes you position update cb set.
418 *
419 * It is considered good form to clear this when the dnd event finishes.
420 *
421 * @param cb Callback to updated each time ecore_x sends a position update.
422 * @param data User data.
423 */
424EAPI void
425ecore_x_dnd_callback_pos_update_set(void (*cb)(void *,
426 Ecore_X_Xdnd_Position *data),
427 const void *data)
428{
429 _posupdatecb = cb;
430 _posupdatedata = (void *)data;
431}
432
433EAPI Eina_Bool
434ecore_x_dnd_begin(Ecore_X_Window source,
435 unsigned char *data,
436 int size)
437{
438 LOGFN(__FILE__, __LINE__, __FUNCTION__);
439
440 if (!ecore_x_dnd_version_get(source)) return EINA_FALSE;
441
442 /* Take ownership of XdndSelection */
443 if (!ecore_x_selection_xdnd_set(source, data, size)) return EINA_FALSE;
444
445 if (_version_cache)
446 {
447 free(_version_cache);
448 _version_cache = NULL;
449 _version_cache_num = 0;
450 _version_cache_alloc = 0;
451 }
452
453 ecore_x_window_shadow_tree_flush();
454
455 _source->win = source;
456 ecore_x_window_ignore_set(_source->win, 1);
457 _source->state = ECORE_X_DND_SOURCE_DRAGGING;
458 _source->time = _ecore_xcb_events_last_time_get();
459 _source->prev.window = 0;
460
461 /* Default Accepted Action: move */
462 _source->action = ECORE_X_ATOM_XDND_ACTION_MOVE;
463 _source->accepted_action = XCB_NONE;
464 _source->dest = XCB_NONE;
465
466 return EINA_TRUE;
467}
468
469EAPI void
470ecore_x_dnd_send_finished(void)
471{
472 xcb_client_message_event_t ev;
473
474 LOGFN(__FILE__, __LINE__, __FUNCTION__);
475 CHECK_XCB_CONN;
476
477 if (_target->state == ECORE_X_DND_TARGET_IDLE) return;
478
479 memset(&ev, 0, sizeof(xcb_client_message_event_t));
480
481 ev.response_type = XCB_CLIENT_MESSAGE;
482 ev.format = 32;
483 ev.type = ECORE_X_ATOM_XDND_FINISHED;
484 ev.window = _target->source;
485 ev.data.data32[0] = _target->win;
486 ev.data.data32[1] = 0;
487 ev.data.data32[2] = 0;
488 if (_target->will_accept)
489 {
490 ev.data.data32[1] |= 0x1UL;
491 ev.data.data32[2] = _target->accepted_action;
492 }
493
494 xcb_send_event(_ecore_xcb_conn, 0, _target->source,
495 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
496// ecore_x_flush();
497 _target->state = ECORE_X_DND_TARGET_IDLE;
498}
499
500EAPI void
501ecore_x_dnd_source_action_set(Ecore_X_Atom action)
502{
503 LOGFN(__FILE__, __LINE__, __FUNCTION__);
504
505 _source->action = action;
506 if (_source->prev.window)
507 _ecore_xcb_dnd_drag(_source->prev.window,
508 _source->prev.x, _source->prev.y);
509}
510
511Ecore_X_DND_Source *
512_ecore_xcb_dnd_source_get(void)
513{
514 return _source;
515}
516
517Ecore_X_DND_Target *
518_ecore_xcb_dnd_target_get(void)
519{
520 return _target;
521}
522
523void
524_ecore_xcb_dnd_drag(Ecore_X_Window root,
525 int x,
526 int y)
527{
528 xcb_client_message_event_t ev;
529 Ecore_X_Window win, *skip;
530 Ecore_X_Xdnd_Position pos;
531 int num = 0;
532
533 if (_source->state != ECORE_X_DND_SOURCE_DRAGGING) return;
534
535 LOGFN(__FILE__, __LINE__, __FUNCTION__);
536 CHECK_XCB_CONN;
537
538 memset(&ev, 0, sizeof(xcb_client_message_event_t));
539
540 ev.response_type = XCB_CLIENT_MESSAGE;
541 ev.format = 32;
542
543 skip = ecore_x_window_ignore_list(&num);
544 win = ecore_x_window_shadow_tree_at_xy_with_skip_get(root, x, y, skip, num);
545 while ((win) && !(ecore_x_dnd_version_get(win)))
546 win = ecore_x_window_shadow_parent_get(root, win);
547
548 if ((_source->dest) && (win != _source->dest))
549 {
550 ev.window = _source->dest;
551 ev.type = ECORE_X_ATOM_XDND_LEAVE;
552 ev.data.data32[0] = _source->win;
553 ev.data.data32[1] = 0;
554
555 xcb_send_event(_ecore_xcb_conn, 0, _source->dest,
556 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
557// ecore_x_flush();
558 _source->suppress = 0;
559 }
560
561 if (win)
562 {
563 int x1, x2, y1, y2;
564
565 _source->version = MIN(ECORE_X_DND_VERSION,
566 ecore_x_dnd_version_get(win));
567 if (win != _source->dest)
568 {
569 int i = 0;
570 unsigned char *data;
571 Ecore_X_Atom *types;
572
573 ecore_x_window_prop_property_get(_source->win,
574 ECORE_X_ATOM_XDND_TYPE_LIST,
575 ECORE_X_ATOM_ATOM, 32,
576 &data, &num);
577 types = (Ecore_X_Atom *)data;
578 ev.window = win;
579 ev.type = ECORE_X_ATOM_XDND_ENTER;
580 ev.data.data32[0] = _source->win;
581 ev.data.data32[1] = 0;
582 if (num > 3)
583 ev.data.data32[1] |= 0x1UL;
584 else
585 ev.data.data32[1] &= 0xfffffffeUL;
586 ev.data.data32[1] |= ((unsigned long)_source->version) << 24;
587
588 for (i = 2; i < 5; i++)
589 ev.data.data32[i] = 0;
590 for (i = 0; i < MIN(num, 3); ++i)
591 ev.data.data32[i + 2] = types[i];
592 free(data);
593
594 xcb_send_event(_ecore_xcb_conn, 0, win,
595 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
596// ecore_x_flush();
597 _source->await_status = 0;
598 _source->will_accept = 0;
599 }
600
601 x1 = _source->rectangle.x;
602 x2 = _source->rectangle.x + _source->rectangle.width;
603 y1 = _source->rectangle.y;
604 y2 = _source->rectangle.y + _source->rectangle.height;
605
606 if ((!_source->await_status) || (!_source->suppress) ||
607 ((x < x1) || (x > x2) || (y < y1) || (y > y2)))
608 {
609 ev.window = win;
610 ev.type = ECORE_X_ATOM_XDND_POSITION;
611 ev.data.data32[0] = _source->win;
612 ev.data.data32[1] = 0;
613 ev.data.data32[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
614 ev.data.data32[3] = _source->time;
615 ev.data.data32[4] = _source->action;
616
617 xcb_send_event(_ecore_xcb_conn, 0, win,
618 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
619// ecore_x_flush();
620 _source->await_status = 1;
621 }
622 }
623
624 if (_posupdatecb)
625 {
626 pos.position.x = x;
627 pos.position.y = y;
628 pos.win = win;
629 pos.prev = _source->dest;
630 _posupdatecb(_posupdatedata, &pos);
631 }
632
633 _source->prev.x = x;
634 _source->prev.y = y;
635 _source->prev.window = root;
636 _source->dest = win;
637}
638
639EAPI Ecore_X_Atom
640ecore_x_dnd_source_action_get(void)
641{
642 return _source->action;
643}
644
645/* local functions */
646static Eina_Bool
647_ecore_xcb_dnd_converter_copy(char *target __UNUSED__,
648 void *data,
649 int size,
650 void **data_ret,
651 int *size_ret,
652 Ecore_X_Atom *tprop __UNUSED__,
653 int *count __UNUSED__)
654{
655 Ecore_Xcb_Textproperty text_prop;
656 Ecore_Xcb_Encoding_Style style = XcbTextStyle;
657 char *mystr;
658
659 LOGFN(__FILE__, __LINE__, __FUNCTION__);
660
661 if ((!data) || (!size)) return EINA_FALSE;
662
663 mystr = calloc(1, size + 1);
664 if (!mystr) return EINA_FALSE;
665
666 memcpy(mystr, data, size);
667 if (_ecore_xcb_mb_textlist_to_textproperty(&mystr, 1, style, &text_prop))
668 {
669 int len;
670
671 len = strlen((char *)text_prop.value) + 1;
672 if (!(*data_ret = malloc(len)))
673 {
674 free(mystr);
675 return EINA_FALSE;
676 }
677 memcpy(*data_ret, text_prop.value, len);
678 *size_ret = len;
679 free(text_prop.value);
680 free(mystr);
681 return EINA_TRUE;
682 }
683 else
684 {
685 free(mystr);
686 return EINA_FALSE;
687 }
688}
689
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dpms.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dpms.c
new file mode 100644
index 0000000..63b7f1e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_dpms.c
@@ -0,0 +1,318 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_DAMAGE
3# include <xcb/dpms.h>
4#endif
5
6/* local variables */
7static Eina_Bool _dpms_avail = EINA_FALSE;
8
9void
10_ecore_xcb_dpms_init(void)
11{
12 LOGFN(__FILE__, __LINE__, __FUNCTION__);
13
14#ifdef ECORE_XCB_DPMS
15 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_dpms_id);
16#endif
17}
18
19void
20_ecore_xcb_dpms_finalize(void)
21{
22#ifdef ECORE_XCB_DPMS
23 const xcb_query_extension_reply_t *ext_reply;
24#endif
25
26 LOGFN(__FILE__, __LINE__, __FUNCTION__);
27
28#ifdef ECORE_XCB_DPMS
29 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_dpms_id);
30 if ((ext_reply) && (ext_reply->present))
31 {
32 xcb_dpms_get_version_cookie_t cookie;
33 xcb_dpms_get_version_reply_t *reply;
34
35 cookie =
36 xcb_dpms_get_version_unchecked(_ecore_xcb_conn,
37 XCB_DPMS_MAJOR_VERSION,
38 XCB_DPMS_MINOR_VERSION);
39 reply = xcb_dpms_get_version_reply(_ecore_xcb_conn, cookie, NULL);
40 if (reply)
41 {
42 if (reply->server_major_version >= 1)
43 _dpms_avail = EINA_TRUE;
44 free(reply);
45 }
46 }
47#endif
48}
49
50/**
51 * @defgroup Ecore_X_DPMS_Group X DPMS Extension Functions
52 *
53 * Functions related to the X DPMS Extension
54 */
55
56/**
57 * Checks if the DPMS extension is available or not.
58 *
59 * @return @c EINA_TRUE if the DPMS extension is available,
60 * @c EINA_FALSE otherwise.
61 *
62 * Return EINA_TRUE if the X server supports the DPMS Extension version 1.0,
63 * EINA_FALSE otherwise.
64 *
65 * @ingroup Ecore_X_DPMS_Group
66 */
67EAPI Eina_Bool
68ecore_x_dpms_query(void)
69{
70// LOGFN(__FILE__, __LINE__, __FUNCTION__);
71
72 return _dpms_avail;
73}
74
75/**
76 * Checks if the X server is capable of DPMS.
77 * @return @c 1 if the X server is capable of DPMS, @c 0 otherwise.
78 * @ingroup Ecore_X_DPMS_Group
79 */
80EAPI Eina_Bool
81ecore_x_dpms_capable_get(void)
82{
83 Eina_Bool ret = EINA_FALSE;
84#ifdef ECORE_XCB_DPMS
85 xcb_dpms_capable_cookie_t cookie;
86 xcb_dpms_capable_reply_t *reply;
87#endif
88
89 LOGFN(__FILE__, __LINE__, __FUNCTION__);
90 CHECK_XCB_CONN;
91
92 if (!_dpms_avail) return EINA_FALSE;
93
94#ifdef ECORE_XCB_DPMS
95 cookie = xcb_dpms_capable_unchecked(_ecore_xcb_conn);
96 reply = xcb_dpms_capable_reply(_ecore_xcb_conn, cookie, NULL);
97 if (reply)
98 {
99 ret = reply->capable;
100 free(reply);
101 }
102#endif
103
104 return ret;
105}
106
107/**
108 * Checks the DPMS state of the display.
109 * @return @c EINA_TRUE if DPMS is enabled, @c EINA_FALSE otherwise.
110 * @ingroup Ecore_X_DPMS_Group
111 */
112EAPI Eina_Bool
113ecore_x_dpms_enabled_get(void)
114{
115 Eina_Bool ret = EINA_FALSE;
116#ifdef ECORE_XCB_DPMS
117 xcb_dpms_info_cookie_t cookie;
118 xcb_dpms_info_reply_t *reply;
119#endif
120
121 LOGFN(__FILE__, __LINE__, __FUNCTION__);
122 CHECK_XCB_CONN;
123
124 if (!_dpms_avail) return EINA_FALSE;
125
126#ifdef ECORE_XCB_DPMS
127 cookie = xcb_dpms_info_unchecked(_ecore_xcb_conn);
128 reply = xcb_dpms_info_reply(_ecore_xcb_conn, cookie, NULL);
129 if (!reply) return EINA_FALSE;
130 if (reply->state) ret = EINA_TRUE;
131 free(reply);
132#endif
133
134 return ret;
135}
136
137/**
138 * Sets the DPMS state of the display.
139 * @param enabled @c 0 to disable DPMS characteristics of the server, enable it otherwise.
140 * @ingroup Ecore_X_DPMS_Group
141 */
142EAPI void
143ecore_x_dpms_enabled_set(int enabled)
144{
145 LOGFN(__FILE__, __LINE__, __FUNCTION__);
146 CHECK_XCB_CONN;
147
148 if (!_dpms_avail) return;
149
150#ifdef ECORE_XCB_DPMS
151 if (enabled)
152 xcb_dpms_enable(_ecore_xcb_conn);
153 else
154 xcb_dpms_disable(_ecore_xcb_conn);
155#endif
156}
157
158/**
159 * Gets the timeouts. The values are in unit of seconds.
160 * @param standby Amount of time of inactivity before standby mode will be invoked.
161 * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
162 * @param off Amount of time of inactivity before the monitor is shut off.
163 * @ingroup Ecore_X_DPMS_Group
164 */
165EAPI void
166ecore_x_dpms_timeouts_get(unsigned int *standby,
167 unsigned int *suspend,
168 unsigned int *off)
169{
170#ifdef ECORE_XCB_DPMS
171 xcb_dpms_get_timeouts_cookie_t cookie;
172 xcb_dpms_get_timeouts_reply_t *reply;
173#endif
174
175 LOGFN(__FILE__, __LINE__, __FUNCTION__);
176 CHECK_XCB_CONN;
177
178 if (standby) *standby = 0;
179 if (suspend) *suspend = 0;
180 if (off) *off = 0;
181
182 if (!_dpms_avail) return;
183
184#ifdef ECORE_XCB_DPMS
185 cookie = xcb_dpms_get_timeouts_unchecked(_ecore_xcb_conn);
186 reply = xcb_dpms_get_timeouts_reply(_ecore_xcb_conn, cookie, NULL);
187 if (!reply) return;
188 if (standby) *standby = reply->standby_timeout;
189 if (suspend) *suspend = reply->suspend_timeout;
190 if (off) *off = reply->off_timeout;
191 free(reply);
192#endif
193}
194
195/**
196 * Sets the timeouts. The values are in unit of seconds.
197 * @param standby Amount of time of inactivity before standby mode will be invoked.
198 * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
199 * @param off Amount of time of inactivity before the monitor is shut off.
200 * @ingroup Ecore_X_DPMS_Group
201 */
202EAPI Eina_Bool
203ecore_x_dpms_timeouts_set(unsigned int standby,
204 unsigned int suspend,
205 unsigned int off)
206{
207 LOGFN(__FILE__, __LINE__, __FUNCTION__);
208 CHECK_XCB_CONN;
209
210 if (!_dpms_avail) return EINA_FALSE;
211
212#ifdef ECORE_XCB_DPMS
213 // FIXME: Add request check
214 xcb_dpms_set_timeouts(_ecore_xcb_conn, standby, suspend, off);
215 return EINA_TRUE;
216#endif
217
218 return EINA_FALSE;
219}
220
221/**
222 * Returns the amount of time of inactivity before standby mode is invoked.
223 * @return The standby timeout value.
224 * @ingroup Ecore_X_DPMS_Group
225 */
226EAPI unsigned int
227ecore_x_dpms_timeout_standby_get(void)
228{
229 unsigned int standby = 0;
230
231 LOGFN(__FILE__, __LINE__, __FUNCTION__);
232
233 ecore_x_dpms_timeouts_get(&standby, NULL, NULL);
234 return standby;
235}
236
237/**
238 * Returns the amount of time of inactivity before the second level of
239 * power saving is invoked.
240 * @return The suspend timeout value.
241 * @ingroup Ecore_X_DPMS_Group
242 */
243EAPI unsigned int
244ecore_x_dpms_timeout_suspend_get(void)
245{
246 unsigned int suspend = 0;
247
248 LOGFN(__FILE__, __LINE__, __FUNCTION__);
249
250 ecore_x_dpms_timeouts_get(NULL, &suspend, NULL);
251 return suspend;
252}
253
254/**
255 * Returns the amount of time of inactivity before the third and final
256 * level of power saving is invoked.
257 * @return The off timeout value.
258 * @ingroup Ecore_X_DPMS_Group
259 */
260EAPI unsigned int
261ecore_x_dpms_timeout_off_get(void)
262{
263 unsigned int off = 0;
264
265 LOGFN(__FILE__, __LINE__, __FUNCTION__);
266
267 ecore_x_dpms_timeouts_get(NULL, NULL, &off);
268 return off;
269}
270
271/**
272 * Sets the standby timeout (in unit of seconds).
273 * @param new_standby Amount of time of inactivity before standby mode will be invoked.
274 * @ingroup Ecore_X_DPMS_Group
275 */
276EAPI void
277ecore_x_dpms_timeout_standby_set(unsigned int new_timeout)
278{
279 unsigned int standby = 0, suspend = 0, off = 0;
280
281 LOGFN(__FILE__, __LINE__, __FUNCTION__);
282
283 ecore_x_dpms_timeouts_get(&standby, &suspend, &off);
284 ecore_x_dpms_timeouts_set(new_timeout, suspend, off);
285}
286
287/**
288 * Sets the suspend timeout (in unit of seconds).
289 * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
290 * @ingroup Ecore_X_DPMS_Group
291 */
292EAPI void
293ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout)
294{
295 unsigned int standby = 0, suspend = 0, off = 0;
296
297 LOGFN(__FILE__, __LINE__, __FUNCTION__);
298
299 ecore_x_dpms_timeouts_get(&standby, &suspend, &off);
300 ecore_x_dpms_timeouts_set(standby, new_timeout, off);
301}
302
303/**
304 * Sets the off timeout (in unit of seconds).
305 * @param off Amount of time of inactivity before the monitor is shut off.
306 * @ingroup Ecore_X_DPMS_Group
307 */
308EAPI void
309ecore_x_dpms_timeout_off_set(unsigned int new_timeout)
310{
311 unsigned int standby = 0, suspend = 0, off = 0;
312
313 LOGFN(__FILE__, __LINE__, __FUNCTION__);
314
315 ecore_x_dpms_timeouts_get(&standby, &suspend, &off);
316 ecore_x_dpms_timeouts_set(standby, suspend, new_timeout);
317}
318
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_drawable.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_drawable.c
new file mode 100644
index 0000000..4e9a356
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_drawable.c
@@ -0,0 +1,123 @@
1#include "ecore_xcb_private.h"
2
3/**
4 * @defgroup Ecore_X_Drawable_Group X Drawable Functions
5 *
6 * Functions that operate on drawables.
7 */
8
9/**
10 * Fill the specified rectangle on a drawable.
11 * @param d The given drawable.
12 * @param gc The graphic context that controls the fill rules.
13 * @param x The X coordinate of the top-left corner of the rectangle.
14 * @param y The Y coordinate of the top-left corner of the rectangle.
15 * @param width The width of the rectangle.
16 * @param height The height of the rectangle.
17 */
18EAPI void
19ecore_x_drawable_rectangle_fill(Ecore_X_Drawable draw,
20 Ecore_X_GC gc,
21 int x,
22 int y,
23 int w,
24 int h)
25{
26 xcb_rectangle_t rect;
27
28 LOGFN(__FILE__, __LINE__, __FUNCTION__);
29 CHECK_XCB_CONN;
30
31 rect.x = x;
32 rect.y = y;
33 rect.width = w;
34 rect.height = h;
35 xcb_poly_fill_rectangle(_ecore_xcb_conn, draw, gc, 1,
36 (const xcb_rectangle_t *)&rect);
37// ecore_x_flush();
38}
39
40/**
41 * Retrieves the geometry of the given drawable.
42 * @param d The given drawable.
43 * @param x Pointer to an integer into which the X position is to be stored.
44 * @param y Pointer to an integer into which the Y position is to be stored.
45 * @param w Pointer to an integer into which the width is to be stored.
46 * @param h Pointer to an integer into which the height is to be stored.
47 * @ingroup Ecore_X_Drawable_Group
48 */
49EAPI void
50ecore_x_drawable_geometry_get(Ecore_X_Drawable draw,
51 int *x,
52 int *y,
53 int *w,
54 int *h)
55{
56 xcb_get_geometry_cookie_t cookie;
57 xcb_get_geometry_reply_t *reply;
58
59 LOGFN(__FILE__, __LINE__, __FUNCTION__);
60 CHECK_XCB_CONN;
61
62 if (x) *x = 0;
63 if (y) *y = 0;
64 if (w) *w = 0;
65 if (h) *h = 0;
66 cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, draw);
67 reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
68 if (!reply) return;
69 if (x) *x = reply->x;
70 if (y) *y = reply->y;
71 if (w) *w = (int)reply->width;
72 if (h) *h = (int)reply->height;
73 free(reply);
74}
75
76/**
77 * Retrieves the width of the border of the given drawable.
78 * @param d The given drawable.
79 * @return The border width of the given drawable.
80 * @ingroup Ecore_X_Drawable_Group
81 */
82EAPI int
83ecore_x_drawable_border_width_get(Ecore_X_Drawable d)
84{
85 xcb_get_geometry_cookie_t cookie;
86 xcb_get_geometry_reply_t *reply;
87 int ret = 0;
88
89 LOGFN(__FILE__, __LINE__, __FUNCTION__);
90 CHECK_XCB_CONN;
91
92 cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, d);
93 reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
94 if (!reply) return 0;
95 ret = (int)reply->border_width;
96 free(reply);
97 return ret;
98}
99
100/**
101 * Retrieves the depth of the given drawable.
102 * @param d The given drawable.
103 * @return The depth of the given drawable.
104 * @ingroup Ecore_X_Drawable_Group
105 */
106EAPI int
107ecore_x_drawable_depth_get(Ecore_X_Drawable d)
108{
109 xcb_get_geometry_cookie_t cookie;
110 xcb_get_geometry_reply_t *reply;
111 int ret = 0;
112
113 LOGFN(__FILE__, __LINE__, __FUNCTION__);
114 CHECK_XCB_CONN;
115
116 cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, d);
117 reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
118 if (!reply) return 0;
119 ret = (int)reply->depth;
120 free(reply);
121 return ret;
122}
123
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_e.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_e.c
new file mode 100644
index 0000000..c868f5e
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_e.c
@@ -0,0 +1,1071 @@
1#include "ecore_xcb_private.h"
2
3/* local function prototypes */
4static Ecore_X_Atom _ecore_xcb_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state);
5static Ecore_X_Virtual_Keyboard_State _ecore_xcb_e_vkbd_state_get(Ecore_X_Atom atom);
6static Ecore_X_Atom _ecore_xcb_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state);
7static Ecore_X_Illume_Quickpanel_State _ecore_xcb_e_quickpanel_state_get(Ecore_X_Atom atom);
8static Ecore_X_Atom _ecore_xcb_e_illume_atom_get(Ecore_X_Illume_Mode mode);
9static Ecore_X_Illume_Mode _ecore_xcb_e_illume_mode_get(Ecore_X_Atom atom);
10
11EAPI void
12ecore_x_e_init(void)
13{
14}
15
16EAPI void
17ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window root,
18 Ecore_X_Window win)
19{
20 xcb_client_message_event_t ev;
21
22 LOGFN(__FILE__, __LINE__, __FUNCTION__);
23 CHECK_XCB_CONN;
24
25 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
26
27 memset(&ev, 0, sizeof(xcb_client_message_event_t));
28
29 ev.response_type = XCB_CLIENT_MESSAGE;
30 ev.format = 32;
31 ev.window = win;
32 ev.type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
33 ev.data.data32[0] = win;
34 ev.data.data32[1] = 0;
35 ev.data.data32[2] = 0;
36 ev.data.data32[3] = 0;
37 ev.data.data32[4] = 0;
38
39 xcb_send_event(_ecore_xcb_conn, 0, root,
40 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
41 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
42// ecore_x_flush();
43}
44
45EAPI void
46ecore_x_e_comp_sync_draw_size_done_send(Ecore_X_Window root,
47 Ecore_X_Window win,
48 int w,
49 int h)
50{
51 xcb_client_message_event_t ev;
52
53 LOGFN(__FILE__, __LINE__, __FUNCTION__);
54 CHECK_XCB_CONN;
55
56 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
57
58 memset(&ev, 0, sizeof(xcb_client_message_event_t));
59
60 ev.response_type = XCB_CLIENT_MESSAGE;
61 ev.format = 32;
62 ev.window = win;
63 ev.type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
64 ev.data.data32[0] = win;
65 ev.data.data32[1] = 1;
66 ev.data.data32[2] = w;
67 ev.data.data32[3] = h;
68 ev.data.data32[4] = 0;
69
70 xcb_send_event(_ecore_xcb_conn, 0, root,
71 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
72 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
73// ecore_x_flush();
74}
75
76EAPI void
77ecore_x_e_comp_sync_counter_set(Ecore_X_Window win,
78 Ecore_X_Sync_Counter counter)
79{
80 LOGFN(__FILE__, __LINE__, __FUNCTION__);
81
82 if (counter)
83 ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
84 ECORE_X_ATOM_CARDINAL, &counter, 1);
85 else
86 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER);
87}
88
89EAPI Ecore_X_Sync_Counter
90ecore_x_e_comp_sync_counter_get(Ecore_X_Window win)
91{
92 Ecore_X_Sync_Counter counter = 0;
93 int ret = 0;
94
95 LOGFN(__FILE__, __LINE__, __FUNCTION__);
96
97 ret = ecore_x_window_prop_xid_get(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
98 ECORE_X_ATOM_CARDINAL, &counter, 1);
99 if (ret != 1) return 0;
100 return counter;
101}
102
103EAPI Eina_Bool
104ecore_x_e_comp_sync_supported_get(Ecore_X_Window root)
105{
106 Ecore_X_Window win, win2;
107 int ret = 0;
108
109 LOGFN(__FILE__, __LINE__, __FUNCTION__);
110
111 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
112 ret =
113 ecore_x_window_prop_xid_get(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
114 ECORE_X_ATOM_WINDOW, &win, 1);
115 if ((ret == 1) && (win))
116 {
117 ret =
118 ecore_x_window_prop_xid_get(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
119 ECORE_X_ATOM_WINDOW, &win2, 1);
120 if ((ret == 1) && (win2 == win))
121 return EINA_TRUE;
122 }
123 return EINA_FALSE;
124}
125
126EAPI void
127ecore_x_e_comp_sync_supported_set(Ecore_X_Window root,
128 Eina_Bool enabled)
129{
130 Ecore_X_Window win;
131
132 LOGFN(__FILE__, __LINE__, __FUNCTION__);
133
134 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
135 if (enabled)
136 {
137 win = ecore_x_window_new(root, 1, 2, 3, 4);
138 ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
139 ECORE_X_ATOM_WINDOW, &win, 1);
140 ecore_x_window_prop_xid_set(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
141 ECORE_X_ATOM_WINDOW, &win, 1);
142 }
143 else
144 {
145 int ret = 0;
146
147 ret = ecore_x_window_prop_xid_get(root,
148 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
149 ECORE_X_ATOM_WINDOW, &win, 1);
150 if ((ret == 1) && (win))
151 {
152 ecore_x_window_prop_property_del(root,
153 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED);
154 ecore_x_window_free(win);
155 }
156 }
157}
158
159EAPI void
160ecore_x_e_comp_sync_begin_send(Ecore_X_Window win)
161{
162 xcb_client_message_event_t ev;
163
164 LOGFN(__FILE__, __LINE__, __FUNCTION__);
165 CHECK_XCB_CONN;
166
167 memset(&ev, 0, sizeof(xcb_client_message_event_t));
168
169 ev.response_type = XCB_CLIENT_MESSAGE;
170 ev.format = 32;
171 ev.window = win;
172 ev.type = ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
173 ev.data.data32[0] = win;
174 ev.data.data32[1] = 0;
175 ev.data.data32[2] = 0;
176 ev.data.data32[3] = 0;
177 ev.data.data32[4] = 0;
178
179 xcb_send_event(_ecore_xcb_conn, 0, win,
180 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
181// ecore_x_flush();
182}
183
184EAPI void
185ecore_x_e_comp_sync_end_send(Ecore_X_Window win)
186{
187 xcb_client_message_event_t ev;
188
189 LOGFN(__FILE__, __LINE__, __FUNCTION__);
190 CHECK_XCB_CONN;
191
192 memset(&ev, 0, sizeof(xcb_client_message_event_t));
193
194 ev.response_type = XCB_CLIENT_MESSAGE;
195 ev.format = 32;
196 ev.window = win;
197 ev.type = ECORE_X_ATOM_E_COMP_SYNC_END;
198 ev.data.data32[0] = win;
199 ev.data.data32[1] = 0;
200 ev.data.data32[2] = 0;
201 ev.data.data32[3] = 0;
202 ev.data.data32[4] = 0;
203
204 xcb_send_event(_ecore_xcb_conn, 0, win,
205 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
206// ecore_x_flush();
207}
208
209EAPI void
210ecore_x_e_comp_sync_cancel_send(Ecore_X_Window win)
211{
212 xcb_client_message_event_t ev;
213
214 LOGFN(__FILE__, __LINE__, __FUNCTION__);
215 CHECK_XCB_CONN;
216
217 memset(&ev, 0, sizeof(xcb_client_message_event_t));
218
219 ev.response_type = XCB_CLIENT_MESSAGE;
220 ev.format = 32;
221 ev.window = win;
222 ev.type = ECORE_X_ATOM_E_COMP_SYNC_CANCEL;
223 ev.data.data32[0] = win;
224 ev.data.data32[1] = 0;
225 ev.data.data32[2] = 0;
226 ev.data.data32[3] = 0;
227 ev.data.data32[4] = 0;
228
229 xcb_send_event(_ecore_xcb_conn, 0, win,
230 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
231// ecore_x_flush();
232}
233
234EAPI void
235ecore_x_e_comp_flush_send(Ecore_X_Window win)
236{
237 xcb_client_message_event_t ev;
238
239 LOGFN(__FILE__, __LINE__, __FUNCTION__);
240 CHECK_XCB_CONN;
241
242 memset(&ev, 0, sizeof(xcb_client_message_event_t));
243
244 ev.response_type = XCB_CLIENT_MESSAGE;
245 ev.format = 32;
246 ev.window = win;
247 ev.type = ECORE_X_ATOM_E_COMP_FLUSH;
248 ev.data.data32[0] = win;
249 ev.data.data32[1] = 0;
250 ev.data.data32[2] = 0;
251 ev.data.data32[3] = 0;
252 ev.data.data32[4] = 0;
253
254 xcb_send_event(_ecore_xcb_conn, 0, win,
255 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
256// ecore_x_flush();
257}
258
259EAPI void
260ecore_x_e_comp_dump_send(Ecore_X_Window win)
261{
262 xcb_client_message_event_t ev;
263
264 LOGFN(__FILE__, __LINE__, __FUNCTION__);
265 CHECK_XCB_CONN;
266
267 memset(&ev, 0, sizeof(xcb_client_message_event_t));
268
269 ev.response_type = XCB_CLIENT_MESSAGE;
270 ev.format = 32;
271 ev.window = win;
272 ev.type = ECORE_X_ATOM_E_COMP_DUMP;
273 ev.data.data32[0] = win;
274 ev.data.data32[1] = 0;
275 ev.data.data32[2] = 0;
276 ev.data.data32[3] = 0;
277 ev.data.data32[4] = 0;
278
279 xcb_send_event(_ecore_xcb_conn, 0, win,
280 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
281// ecore_x_flush();
282}
283
284EAPI void
285ecore_x_e_comp_pixmap_set(Ecore_X_Window win,
286 Ecore_X_Pixmap pixmap)
287{
288 LOGFN(__FILE__, __LINE__, __FUNCTION__);
289
290 if (pixmap)
291 ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_PIXMAP,
292 ECORE_X_ATOM_PIXMAP, &pixmap, 1);
293 else
294 ecore_x_window_prop_property_del(win, pixmap);
295}
296
297EAPI Ecore_X_Pixmap
298ecore_x_e_comp_pixmap_get(Ecore_X_Window win)
299{
300 Ecore_X_Pixmap pixmap = 0;
301 int ret = 0;
302
303 LOGFN(__FILE__, __LINE__, __FUNCTION__);
304
305 ret = ecore_x_window_prop_xid_get(win, ECORE_X_ATOM_E_COMP_PIXMAP,
306 ECORE_X_ATOM_PIXMAP, &pixmap, 1);
307 if (ret != 1) return 0;
308 return pixmap;
309}
310
311EAPI void
312ecore_x_e_frame_size_set(Ecore_X_Window win,
313 int fl,
314 int fr,
315 int ft,
316 int fb)
317{
318 uint32_t frames[4];
319
320 LOGFN(__FILE__, __LINE__, __FUNCTION__);
321
322 frames[0] = fl;
323 frames[1] = fr;
324 frames[2] = ft;
325 frames[3] = fb;
326 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_FRAME_SIZE, frames, 4);
327}
328
329EAPI Ecore_X_Virtual_Keyboard_State
330ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win)
331{
332 Ecore_X_Atom atom = 0;
333
334 LOGFN(__FILE__, __LINE__, __FUNCTION__);
335
336 if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
337 &atom, 1))
338 return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
339
340 return _ecore_xcb_e_vkbd_state_get(atom);
341}
342
343EAPI void
344ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win,
345 Ecore_X_Virtual_Keyboard_State state)
346{
347 Ecore_X_Atom atom = 0;
348
349 LOGFN(__FILE__, __LINE__, __FUNCTION__);
350
351 atom = _ecore_xcb_e_vkbd_atom_get(state);
352 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
353 &atom, 1);
354}
355
356EAPI void
357ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win,
358 Ecore_X_Virtual_Keyboard_State state)
359{
360 LOGFN(__FILE__, __LINE__, __FUNCTION__);
361
362 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
363 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
364 _ecore_xcb_e_vkbd_atom_get(state),
365 0, 0, 0, 0);
366}
367
368EAPI void
369ecore_x_e_virtual_keyboard_set(Ecore_X_Window win,
370 unsigned int is_keyboard)
371{
372 LOGFN(__FILE__, __LINE__, __FUNCTION__);
373
374 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
375 &is_keyboard, 1);
376}
377
378EAPI Eina_Bool
379ecore_x_e_virtual_keyboard_get(Ecore_X_Window win)
380{
381 unsigned int val = 0;
382
383 LOGFN(__FILE__, __LINE__, __FUNCTION__);
384
385 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
386 &val, 1))
387 return EINA_FALSE;
388
389 return val ? EINA_TRUE : EINA_FALSE;
390}
391
392EAPI int
393ecore_x_e_illume_quickpanel_priority_major_get(Ecore_X_Window win)
394{
395 unsigned int val = 0;
396
397 LOGFN(__FILE__, __LINE__, __FUNCTION__);
398
399 if (!ecore_x_window_prop_card32_get(win,
400 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
401 &val, 1))
402 return 0;
403
404 return val;
405}
406
407EAPI void
408ecore_x_e_illume_quickpanel_priority_major_set(Ecore_X_Window win,
409 unsigned int priority)
410{
411 LOGFN(__FILE__, __LINE__, __FUNCTION__);
412
413 ecore_x_window_prop_card32_set(win,
414 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
415 &priority, 1);
416}
417
418EAPI int
419ecore_x_e_illume_quickpanel_priority_minor_get(Ecore_X_Window win)
420{
421 unsigned int val = 0;
422
423 LOGFN(__FILE__, __LINE__, __FUNCTION__);
424
425 if (!ecore_x_window_prop_card32_get(win,
426 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
427 &val, 1))
428 return 0;
429
430 return val;
431}
432
433EAPI void
434ecore_x_e_illume_quickpanel_priority_minor_set(Ecore_X_Window win,
435 unsigned int priority)
436{
437 LOGFN(__FILE__, __LINE__, __FUNCTION__);
438
439 ecore_x_window_prop_card32_set(win,
440 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
441 &priority, 1);
442}
443
444EAPI void
445ecore_x_e_illume_quickpanel_zone_set(Ecore_X_Window win,
446 unsigned int zone)
447{
448 LOGFN(__FILE__, __LINE__, __FUNCTION__);
449
450 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
451 &zone, 1);
452}
453
454EAPI int
455ecore_x_e_illume_quickpanel_zone_get(Ecore_X_Window win)
456{
457 unsigned int val = 0;
458
459 LOGFN(__FILE__, __LINE__, __FUNCTION__);
460
461 if (!ecore_x_window_prop_card32_get(win,
462 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
463 &val, 1))
464 return 0;
465
466 return val;
467}
468
469EAPI void
470ecore_x_e_illume_quickpanel_position_update_send(Ecore_X_Window win)
471{
472 LOGFN(__FILE__, __LINE__, __FUNCTION__);
473
474 ecore_x_client_message32_send(win,
475 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE,
476 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
477 1, 0, 0, 0, 0);
478}
479
480EAPI Eina_Bool
481ecore_x_e_illume_conformant_get(Ecore_X_Window win)
482{
483 unsigned int val = 0;
484
485 LOGFN(__FILE__, __LINE__, __FUNCTION__);
486
487 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
488 &val, 1))
489 return EINA_FALSE;
490
491 return val ? EINA_TRUE : EINA_FALSE;
492}
493
494EAPI void
495ecore_x_e_illume_conformant_set(Ecore_X_Window win,
496 unsigned int is_conformant)
497{
498 LOGFN(__FILE__, __LINE__, __FUNCTION__);
499
500 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
501 &is_conformant, 1);
502}
503
504EAPI void
505ecore_x_e_illume_softkey_geometry_set(Ecore_X_Window win,
506 int x,
507 int y,
508 int w,
509 int h)
510{
511 unsigned int geom[4];
512
513 LOGFN(__FILE__, __LINE__, __FUNCTION__);
514
515 geom[0] = x;
516 geom[1] = y;
517 geom[2] = w;
518 geom[3] = h;
519 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
520 geom, 4);
521}
522
523EAPI Eina_Bool
524ecore_x_e_illume_softkey_geometry_get(Ecore_X_Window win,
525 int *x,
526 int *y,
527 int *w,
528 int *h)
529{
530 unsigned int geom[4];
531
532 LOGFN(__FILE__, __LINE__, __FUNCTION__);
533
534 if (x) *x = 0;
535 if (y) *y = 0;
536 if (w) *w = 0;
537 if (h) *h = 0;
538
539 if (ecore_x_window_prop_card32_get(win,
540 ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
541 geom, 4) != 4)
542 return EINA_FALSE;
543
544 if (x) *x = geom[0];
545 if (y) *y = geom[1];
546 if (w) *w = geom[2];
547 if (h) *h = geom[3];
548
549 return EINA_TRUE;
550}
551
552EAPI void
553ecore_x_e_illume_indicator_geometry_set(Ecore_X_Window win,
554 int x,
555 int y,
556 int w,
557 int h)
558{
559 unsigned int geom[4];
560
561 LOGFN(__FILE__, __LINE__, __FUNCTION__);
562
563 geom[0] = x;
564 geom[1] = y;
565 geom[2] = w;
566 geom[3] = h;
567 ecore_x_window_prop_card32_set(win,
568 ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
569 geom, 4);
570}
571
572EAPI Eina_Bool
573ecore_x_e_illume_indicator_geometry_get(Ecore_X_Window win,
574 int *x,
575 int *y,
576 int *w,
577 int *h)
578{
579 unsigned int geom[4];
580
581 LOGFN(__FILE__, __LINE__, __FUNCTION__);
582
583 if (x) *x = 0;
584 if (y) *y = 0;
585 if (w) *w = 0;
586 if (h) *h = 0;
587
588 if (ecore_x_window_prop_card32_get(win,
589 ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
590 geom, 4) != 4)
591 return EINA_FALSE;
592
593 if (x) *x = geom[0];
594 if (y) *y = geom[1];
595 if (w) *w = geom[2];
596 if (h) *h = geom[3];
597
598 return EINA_TRUE;
599}
600
601EAPI void
602ecore_x_e_illume_keyboard_geometry_set(Ecore_X_Window win,
603 int x,
604 int y,
605 int w,
606 int h)
607{
608 unsigned int geom[4];
609
610 LOGFN(__FILE__, __LINE__, __FUNCTION__);
611
612 geom[0] = x;
613 geom[1] = y;
614 geom[2] = w;
615 geom[3] = h;
616 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
617 geom, 4);
618}
619
620EAPI Eina_Bool
621ecore_x_e_illume_keyboard_geometry_get(Ecore_X_Window win,
622 int *x,
623 int *y,
624 int *w,
625 int *h)
626{
627 unsigned int geom[4];
628
629 LOGFN(__FILE__, __LINE__, __FUNCTION__);
630
631 if (x) *x = 0;
632 if (y) *y = 0;
633 if (w) *w = 0;
634 if (h) *h = 0;
635
636 if (ecore_x_window_prop_card32_get(win,
637 ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
638 geom, 4) != 4)
639 return EINA_FALSE;
640
641 if (x) *x = geom[0];
642 if (y) *y = geom[1];
643 if (w) *w = geom[2];
644 if (h) *h = geom[3];
645
646 return EINA_TRUE;
647}
648
649EAPI void
650ecore_x_e_illume_quickpanel_set(Ecore_X_Window win,
651 unsigned int is_quickpanel)
652{
653 LOGFN(__FILE__, __LINE__, __FUNCTION__);
654
655 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
656 &is_quickpanel, 1);
657}
658
659EAPI Eina_Bool
660ecore_x_e_illume_quickpanel_get(Ecore_X_Window win)
661{
662 unsigned int val = 0;
663
664 LOGFN(__FILE__, __LINE__, __FUNCTION__);
665
666 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
667 &val, 1))
668 return EINA_FALSE;
669
670 return val ? EINA_TRUE : EINA_FALSE;
671}
672
673EAPI void
674ecore_x_e_illume_quickpanel_state_set(Ecore_X_Window win,
675 Ecore_X_Illume_Quickpanel_State state)
676{
677 Ecore_X_Atom atom = 0;
678
679 LOGFN(__FILE__, __LINE__, __FUNCTION__);
680
681 atom = _ecore_xcb_e_quickpanel_atom_get(state);
682 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
683 &atom, 1);
684}
685
686EAPI Ecore_X_Illume_Quickpanel_State
687ecore_x_e_illume_quickpanel_state_get(Ecore_X_Window win)
688{
689 Ecore_X_Atom atom = 0;
690
691 LOGFN(__FILE__, __LINE__, __FUNCTION__);
692
693 if (!ecore_x_window_prop_atom_get(win,
694 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
695 &atom, 1))
696 return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
697
698 return _ecore_xcb_e_quickpanel_state_get(atom);
699}
700
701EAPI void
702ecore_x_e_illume_quickpanel_state_send(Ecore_X_Window win,
703 Ecore_X_Illume_Quickpanel_State state)
704{
705 LOGFN(__FILE__, __LINE__, __FUNCTION__);
706 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
707 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
708 _ecore_xcb_e_quickpanel_atom_get(state),
709 0, 0, 0, 0);
710}
711
712EAPI void
713ecore_x_e_illume_quickpanel_state_toggle(Ecore_X_Window win)
714{
715 LOGFN(__FILE__, __LINE__, __FUNCTION__);
716 ecore_x_client_message32_send(win,
717 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE,
718 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
719 0, 0, 0, 0, 0);
720}
721
722EAPI void
723ecore_x_e_illume_mode_set(Ecore_X_Window win,
724 Ecore_X_Illume_Mode mode)
725{
726 Ecore_X_Atom atom = 0;
727
728 LOGFN(__FILE__, __LINE__, __FUNCTION__);
729
730 atom = _ecore_xcb_e_illume_atom_get(mode);
731 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_MODE, &atom, 1);
732}
733
734EAPI Ecore_X_Illume_Mode
735ecore_x_e_illume_mode_get(Ecore_X_Window win)
736{
737 Ecore_X_Atom atom = 0;
738
739 LOGFN(__FILE__, __LINE__, __FUNCTION__);
740
741 if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_ILLUME_MODE, &atom, 1))
742 return ECORE_X_ILLUME_MODE_UNKNOWN;
743
744 return _ecore_xcb_e_illume_mode_get(atom);
745}
746
747EAPI void
748ecore_x_e_illume_mode_send(Ecore_X_Window win,
749 Ecore_X_Illume_Mode mode)
750{
751 LOGFN(__FILE__, __LINE__, __FUNCTION__);
752
753 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_MODE,
754 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
755 _ecore_xcb_e_illume_atom_get(mode),
756 0, 0, 0, 0);
757}
758
759EAPI void
760ecore_x_e_illume_focus_back_send(Ecore_X_Window win)
761{
762 LOGFN(__FILE__, __LINE__, __FUNCTION__);
763
764 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_BACK,
765 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
766 1, 0, 0, 0, 0);
767}
768
769EAPI void
770ecore_x_e_illume_focus_forward_send(Ecore_X_Window win)
771{
772 LOGFN(__FILE__, __LINE__, __FUNCTION__);
773
774 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD,
775 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
776 1, 0, 0, 0, 0);
777}
778
779EAPI void
780ecore_x_e_illume_focus_home_send(Ecore_X_Window win)
781{
782 LOGFN(__FILE__, __LINE__, __FUNCTION__);
783
784 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_HOME,
785 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
786 1, 0, 0, 0, 0);
787}
788
789EAPI void
790ecore_x_e_illume_close_send(Ecore_X_Window win)
791{
792 LOGFN(__FILE__, __LINE__, __FUNCTION__);
793
794 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_CLOSE,
795 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
796 1, 0, 0, 0, 0);
797}
798
799EAPI void
800ecore_x_e_illume_home_new_send(Ecore_X_Window win)
801{
802 LOGFN(__FILE__, __LINE__, __FUNCTION__);
803
804 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_NEW,
805 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
806 1, 0, 0, 0, 0);
807}
808
809EAPI void
810ecore_x_e_illume_home_del_send(Ecore_X_Window win)
811{
812 LOGFN(__FILE__, __LINE__, __FUNCTION__);
813
814 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_DEL,
815 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
816 1, 0, 0, 0, 0);
817}
818
819EAPI void
820ecore_x_e_illume_drag_set(Ecore_X_Window win,
821 unsigned int drag)
822{
823 LOGFN(__FILE__, __LINE__, __FUNCTION__);
824
825 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG, &drag, 1);
826}
827
828EAPI void
829ecore_x_e_illume_drag_locked_set(Ecore_X_Window win,
830 unsigned int is_locked)
831{
832 LOGFN(__FILE__, __LINE__, __FUNCTION__);
833
834 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
835 &is_locked, 1);
836}
837
838EAPI Eina_Bool
839ecore_x_e_illume_drag_locked_get(Ecore_X_Window win)
840{
841 unsigned int val = 0;
842
843 LOGFN(__FILE__, __LINE__, __FUNCTION__);
844
845 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
846 &val, 1))
847 return EINA_FALSE;
848
849 return val ? EINA_TRUE : EINA_FALSE;
850}
851
852EAPI Eina_Bool
853ecore_x_e_illume_drag_get(Ecore_X_Window win)
854{
855 unsigned int val = 0;
856
857 LOGFN(__FILE__, __LINE__, __FUNCTION__);
858
859 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG, &val, 1))
860 return EINA_FALSE;
861
862 return val ? EINA_TRUE : EINA_FALSE;
863}
864
865EAPI void
866ecore_x_e_illume_drag_start_send(Ecore_X_Window win)
867{
868 LOGFN(__FILE__, __LINE__, __FUNCTION__);
869 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_START,
870 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
871 1, 0, 0, 0, 0);
872}
873
874EAPI void
875ecore_x_e_illume_drag_end_send(Ecore_X_Window win)
876{
877 LOGFN(__FILE__, __LINE__, __FUNCTION__);
878 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_END,
879 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
880 1, 0, 0, 0, 0);
881}
882
883EAPI void
884ecore_x_e_illume_zone_set(Ecore_X_Window win,
885 Ecore_X_Window zone)
886{
887 LOGFN(__FILE__, __LINE__, __FUNCTION__);
888
889 ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE, &zone, 1);
890}
891
892EAPI Ecore_X_Window
893ecore_x_e_illume_zone_get(Ecore_X_Window win)
894{
895 Ecore_X_Window zone;
896
897 LOGFN(__FILE__, __LINE__, __FUNCTION__);
898
899 if (!ecore_x_window_prop_window_get(win, ECORE_X_ATOM_E_ILLUME_ZONE,
900 &zone, 1))
901 return 0;
902
903 return zone;
904}
905
906EAPI void
907ecore_x_e_illume_zone_list_set(Ecore_X_Window win,
908 Ecore_X_Window *zones,
909 unsigned int num)
910{
911 LOGFN(__FILE__, __LINE__, __FUNCTION__);
912
913 ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE_LIST,
914 zones, num);
915}
916
917/* local functions */
918static Ecore_X_Atom
919_ecore_xcb_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state)
920{
921 switch (state)
922 {
923 case ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF:
924 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
925
926 case ECORE_X_VIRTUAL_KEYBOARD_STATE_ON:
927 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
928
929 case ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA:
930 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
931
932 case ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC:
933 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
934
935 case ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN:
936 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
937
938 case ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER:
939 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
940
941 case ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX:
942 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
943
944 case ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL:
945 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
946
947 case ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD:
948 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
949
950 case ECORE_X_VIRTUAL_KEYBOARD_STATE_IP:
951 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP;
952
953 case ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST:
954 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST;
955
956 case ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE:
957 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE;
958
959 case ECORE_X_VIRTUAL_KEYBOARD_STATE_URL:
960 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL;
961
962 case ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD:
963 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD;
964
965 case ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME:
966 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
967
968 default:
969 break;
970 }
971 return 0;
972}
973
974static Ecore_X_Virtual_Keyboard_State
975_ecore_xcb_e_vkbd_state_get(Ecore_X_Atom atom)
976{
977 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON)
978 return ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
979 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF)
980 return ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
981 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA)
982 return ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
983 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC)
984 return ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
985 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN)
986 return ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
987 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER)
988 return ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
989 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX)
990 return ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
991 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL)
992 return ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
993 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD)
994 return ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
995 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP)
996 return ECORE_X_VIRTUAL_KEYBOARD_STATE_IP;
997 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST)
998 return ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST;
999 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE)
1000 return ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE;
1001 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL)
1002 return ECORE_X_VIRTUAL_KEYBOARD_STATE_URL;
1003 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD)
1004 return ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD;
1005 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME)
1006 return ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME;
1007
1008 return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
1009}
1010
1011static Ecore_X_Atom
1012_ecore_xcb_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state)
1013{
1014 switch (state)
1015 {
1016 case ECORE_X_ILLUME_QUICKPANEL_STATE_ON:
1017 return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON;
1018
1019 case ECORE_X_ILLUME_QUICKPANEL_STATE_OFF:
1020 return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
1021
1022 default:
1023 break;
1024 }
1025 return 0;
1026}
1027
1028static Ecore_X_Illume_Quickpanel_State
1029_ecore_xcb_e_quickpanel_state_get(Ecore_X_Atom atom)
1030{
1031 if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON)
1032 return ECORE_X_ILLUME_QUICKPANEL_STATE_ON;
1033 if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF)
1034 return ECORE_X_ILLUME_QUICKPANEL_STATE_OFF;
1035
1036 return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
1037}
1038
1039static Ecore_X_Atom
1040_ecore_xcb_e_illume_atom_get(Ecore_X_Illume_Mode mode)
1041{
1042 switch (mode)
1043 {
1044 case ECORE_X_ILLUME_MODE_SINGLE:
1045 return ECORE_X_ATOM_E_ILLUME_MODE_SINGLE;
1046
1047 case ECORE_X_ILLUME_MODE_DUAL_TOP:
1048 return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP;
1049
1050 case ECORE_X_ILLUME_MODE_DUAL_LEFT:
1051 return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
1052
1053 default:
1054 break;
1055 }
1056 return ECORE_X_ILLUME_MODE_UNKNOWN;
1057}
1058
1059static Ecore_X_Illume_Mode
1060_ecore_xcb_e_illume_mode_get(Ecore_X_Atom atom)
1061{
1062 if (atom == ECORE_X_ATOM_E_ILLUME_MODE_SINGLE)
1063 return ECORE_X_ILLUME_MODE_SINGLE;
1064 if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP)
1065 return ECORE_X_ILLUME_MODE_DUAL_TOP;
1066 if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT)
1067 return ECORE_X_ILLUME_MODE_DUAL_LEFT;
1068
1069 return ECORE_X_ILLUME_MODE_UNKNOWN;
1070}
1071
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_error.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_error.c
new file mode 100644
index 0000000..bbd9c2a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_error.c
@@ -0,0 +1,109 @@
1#include "ecore_xcb_private.h"
2#include <xcb/xcb_event.h>
3
4/* local variables */
5static void (*_error_func)(void *data) = NULL;
6static void *_error_data = NULL;
7static void (*_io_error_func)(void *data) = NULL;
8static void *_io_error_data = NULL;
9static int _error_request_code = 0;
10static int _error_code = 0;
11
12/**
13 * Set the error handler.
14 * @param func The error handler function
15 * @param data The data to be passed to the handler function
16 *
17 * Set the X error handler function
18 */
19EAPI void
20ecore_x_error_handler_set(void (*func)(void *data),
21 const void *data)
22{
23 _error_func = func;
24 _error_data = (void *)data;
25}
26
27/**
28 * Set the I/O error handler.
29 * @param func The I/O error handler function
30 * @param data The data to be passed to the handler function
31 *
32 * Set the X I/O error handler function
33 */
34EAPI void
35ecore_x_io_error_handler_set(void (*func)(void *data),
36 const void *data)
37{
38 _io_error_func = func;
39 _io_error_data = (void *)data;
40}
41
42/**
43 * Get the request code that caused the error.
44 * @return The request code causing the X error
45 *
46 * Return the X request code that caused the last X error
47 */
48EAPI int
49ecore_x_error_request_get(void)
50{
51 return _error_request_code;
52}
53
54/**
55 * Get the error code from the error.
56 * @return The error code from the X error
57 *
58 * Return the error code from the last X error
59 */
60EAPI int
61ecore_x_error_code_get(void)
62{
63 return _error_code;
64}
65
66int
67_ecore_xcb_error_handle(xcb_generic_error_t *err)
68{
69 WRN("Got Error:");
70 WRN("\tEvent: %s", xcb_event_get_request_label(err->major_code));
71 WRN("\tError: %s", xcb_event_get_error_label(err->error_code));
72
73#ifdef OLD_XCB_VERSION
74 if (err->error_code == XCB_EVENT_ERROR_BAD_VALUE)
75 WRN("\tBad Value: %d", ((xcb_value_error_t *)err)->bad_value);
76 else if (err->error_code == XCB_EVENT_ERROR_BAD_WINDOW)
77 WRN("\tBad Window: %d", ((xcb_window_error_t *)err)->bad_value);
78#else
79 if (err->error_code == XCB_VALUE)
80 WRN("\tBad Value: %d", ((xcb_value_error_t *)err)->bad_value);
81 else if (err->error_code == XCB_WINDOW)
82 WRN("\tBad Window: %d", ((xcb_window_error_t *)err)->bad_value);
83#endif
84
85 _error_request_code = err->sequence;
86 _error_code = err->error_code;
87 if (_error_func)
88 _error_func(_error_data);
89
90 return 0;
91}
92
93int
94_ecore_xcb_io_error_handle(xcb_generic_error_t *err)
95{
96 CRIT("IO Error:");
97 if (err)
98 {
99 CRIT("\tRequest: %d", err->sequence);
100 CRIT("\tCode: %d", err->error_code);
101 }
102 if (_io_error_func)
103 _io_error_func(_io_error_data);
104 else
105 exit(-1);
106
107 return 0;
108}
109
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c
new file mode 100644
index 0000000..8a18140
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_events.c
@@ -0,0 +1,2805 @@
1#include "ecore_xcb_private.h"
2//#include "Ecore_X_Atoms.h"
3#include <langinfo.h>
4#include <xcb/xcb_icccm.h>
5#include <xcb/xcb_event.h>
6# ifdef ECORE_XCB_DAMAGE
7# include <xcb/damage.h>
8# endif
9# ifdef ECORE_XCB_RANDR
10# include <xcb/randr.h>
11# endif
12# ifdef ECORE_XCB_SCREENSAVER
13# include <xcb/screensaver.h>
14# endif
15# ifdef ECORE_XCB_SYNC
16# include <xcb/sync.h>
17# endif
18# ifdef ECORE_XCB_XFIXES
19# include <xcb/xfixes.h>
20# endif
21# ifdef ECORE_XCB_XGESTURE
22# include <xcb/gesture.h>
23# endif
24
25#ifndef CODESET
26# define CODESET "INVALID"
27#endif
28
29typedef struct _Ecore_X_Mouse_Down_Info
30{
31 EINA_INLIST;
32 int dev;
33 Ecore_X_Time last_time;
34 Ecore_X_Time last_last_time;
35 Ecore_X_Window last_win;
36 Ecore_X_Window last_last_win;
37 Ecore_X_Window last_event_win;
38 Ecore_X_Window last_last_event_win;
39 Eina_Bool did_double : 1;
40 Eina_Bool did_triple : 1;
41} Ecore_X_Mouse_Down_Info;
42
43/* local function prototypes */
44static void _ecore_xcb_event_handle_any_event(xcb_generic_event_t *event);
45static void _ecore_xcb_event_handle_key_press(xcb_generic_event_t *event);
46static void _ecore_xcb_event_handle_key_release(xcb_generic_event_t *event);
47static void _ecore_xcb_event_handle_button_press(xcb_generic_event_t *event);
48static void _ecore_xcb_event_handle_button_release(xcb_generic_event_t *event);
49static void _ecore_xcb_event_handle_motion_notify(xcb_generic_event_t *event);
50static void _ecore_xcb_event_handle_enter_notify(xcb_generic_event_t *event);
51static void _ecore_xcb_event_handle_leave_notify(xcb_generic_event_t *event);
52static void _ecore_xcb_event_handle_keymap_notify(xcb_generic_event_t *event);
53static void _ecore_xcb_event_handle_focus_in(xcb_generic_event_t *event);
54static void _ecore_xcb_event_handle_focus_out(xcb_generic_event_t *event);
55static void _ecore_xcb_event_handle_expose(xcb_generic_event_t *event);
56static void _ecore_xcb_event_handle_graphics_exposure(xcb_generic_event_t *event);
57static void _ecore_xcb_event_handle_visibility_notify(xcb_generic_event_t *event);
58static void _ecore_xcb_event_handle_create_notify(xcb_generic_event_t *event);
59static void _ecore_xcb_event_handle_destroy_notify(xcb_generic_event_t *event);
60static void _ecore_xcb_event_handle_map_notify(xcb_generic_event_t *event);
61static void _ecore_xcb_event_handle_unmap_notify(xcb_generic_event_t *event);
62static void _ecore_xcb_event_handle_map_request(xcb_generic_event_t *event);
63static void _ecore_xcb_event_handle_reparent_notify(xcb_generic_event_t *event);
64static void _ecore_xcb_event_handle_configure_notify(xcb_generic_event_t *event);
65static void _ecore_xcb_event_handle_configure_request(xcb_generic_event_t *event);
66static void _ecore_xcb_event_handle_gravity_notify(xcb_generic_event_t *event);
67static void _ecore_xcb_event_handle_resize_request(xcb_generic_event_t *event);
68static void _ecore_xcb_event_handle_circulate_notify(xcb_generic_event_t *event);
69static void _ecore_xcb_event_handle_circulate_request(xcb_generic_event_t *event);
70static void _ecore_xcb_event_handle_property_notify(xcb_generic_event_t *event);
71static void _ecore_xcb_event_handle_selection_clear(xcb_generic_event_t *event);
72static void _ecore_xcb_event_handle_selection_request(xcb_generic_event_t *event);
73static void _ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event);
74static void _ecore_xcb_event_handle_colormap_notify(xcb_generic_event_t *event);
75static void _ecore_xcb_event_handle_client_message(xcb_generic_event_t *event);
76static void _ecore_xcb_event_handle_mapping_notify(xcb_generic_event_t *event);
77static void _ecore_xcb_event_handle_damage_notify(xcb_generic_event_t *event);
78static void _ecore_xcb_event_handle_randr_change(xcb_generic_event_t *event);
79static void _ecore_xcb_event_handle_randr_notify(xcb_generic_event_t *event);
80static void _ecore_xcb_event_handle_randr_crtc_change(xcb_generic_event_t *event);
81static void _ecore_xcb_event_handle_randr_output_change(xcb_generic_event_t *event);
82static void _ecore_xcb_event_handle_randr_output_property_change(xcb_generic_event_t *event);
83static void _ecore_xcb_event_handle_screensaver_notify(xcb_generic_event_t *event);
84#ifdef ECORE_XCB_XGESTURE
85static void _ecore_xcb_event_handle_gesture_notify_flick(xcb_generic_event_t *event);
86static void _ecore_xcb_event_handle_gesture_notify_pan(xcb_generic_event_t *event);
87static void _ecore_xcb_event_handle_gesture_notify_pinchrotation(xcb_generic_event_t *event);
88static void _ecore_xcb_event_handle_gesture_notify_tap(xcb_generic_event_t *event);
89static void _ecore_xcb_event_handle_gesture_notify_tapnhold(xcb_generic_event_t *event);
90static void _ecore_xcb_event_handle_gesture_notify_hold(xcb_generic_event_t *event);
91static void _ecore_xcb_event_handle_gesture_notify_group(xcb_generic_event_t *event);
92#endif
93#ifdef ECORE_XCB_SHAPE
94static void _ecore_xcb_event_handle_shape_change(xcb_generic_event_t *event);
95#endif
96static void _ecore_xcb_event_handle_sync_counter(xcb_generic_event_t *event);
97static void _ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event);
98static void _ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event __UNUSED__);
99static void _ecore_xcb_event_handle_xfixes_cursor_notify(xcb_generic_event_t *event);
100static void _ecore_xcb_event_handle_generic_event(xcb_generic_event_t *event);
101static void _ecore_xcb_event_handle_input_event(xcb_generic_event_t *event);
102
103static void _ecore_xcb_event_key_press(xcb_generic_event_t *event);
104static void _ecore_xcb_event_key_release(xcb_generic_event_t *event);
105static void _ecore_xcb_event_mouse_move_free(void *data __UNUSED__,
106 void *event);
107static Ecore_X_Event_Mode _ecore_xcb_event_mode_get(uint8_t mode);
108static Ecore_X_Event_Detail _ecore_xcb_event_detail_get(uint8_t detail);
109static void _ecore_xcb_event_xdnd_enter_free(void *data __UNUSED__,
110 void *event);
111static void _ecore_xcb_event_selection_notify_free(void *data __UNUSED__,
112 void *event);
113static void _ecore_xcb_event_generic_event_free(void *data,
114 void *event);
115static void _ecore_xcb_event_mouse_down_info_clear(void);
116static Ecore_X_Mouse_Down_Info *_ecore_xcb_event_mouse_down_info_get(int dev);
117
118/* local variables */
119static Eina_Bool _ecore_xcb_event_last_mouse_move = EINA_FALSE;
120//static Ecore_Event *_ecore_xcb_event_last_mouse_move_event = NULL;
121static Eina_Inlist *_ecore_xcb_mouse_down_info_list = NULL;
122static Ecore_X_Time _ecore_xcb_event_last_time;
123static Ecore_X_Window _ecore_xcb_event_last_window = 0;
124
125/* public variables */
126int16_t _ecore_xcb_event_last_root_x = 0;
127int16_t _ecore_xcb_event_last_root_y = 0;
128
129EAPI int ECORE_X_EVENT_ANY = 0;
130EAPI int ECORE_X_EVENT_MOUSE_IN = 0;
131EAPI int ECORE_X_EVENT_MOUSE_OUT = 0;
132EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0;
133EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT = 0;
134EAPI int ECORE_X_EVENT_WINDOW_KEYMAP = 0;
135EAPI int ECORE_X_EVENT_WINDOW_DAMAGE = 0;
136EAPI int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = 0;
137EAPI int ECORE_X_EVENT_WINDOW_CREATE = 0;
138EAPI int ECORE_X_EVENT_WINDOW_DESTROY = 0;
139EAPI int ECORE_X_EVENT_WINDOW_HIDE = 0;
140EAPI int ECORE_X_EVENT_WINDOW_SHOW = 0;
141EAPI int ECORE_X_EVENT_WINDOW_SHOW_REQUEST = 0;
142EAPI int ECORE_X_EVENT_WINDOW_REPARENT = 0;
143EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE = 0;
144EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = 0;
145EAPI int ECORE_X_EVENT_WINDOW_GRAVITY = 0;
146EAPI int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = 0;
147EAPI int ECORE_X_EVENT_WINDOW_STACK = 0;
148EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0;
149EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0;
150EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0;
151EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0;
152EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
153EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
154EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
155EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0;
156EAPI int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = 0;
157EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0;
158EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
159EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
160EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = 0;
161EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PAN = 0;
162EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = 0;
163EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAP = 0;
164EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = 0;
165EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = 0;
166EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = 0;
167EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0;
168EAPI int ECORE_X_EVENT_SYNC_ALARM = 0;
169EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0;
170EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0;
171EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0;
172EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0;
173EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0;
174EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0;
175EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0;
176EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0;
177EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0;
178EAPI int ECORE_X_EVENT_PING = 0;
179EAPI int ECORE_X_EVENT_DESKTOP_CHANGE = 0;
180EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = 0;
181EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0;
182EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0;
183EAPI int ECORE_X_EVENT_GENERIC = 0;
184
185void
186_ecore_xcb_events_init(void)
187{
188 LOGFN(__FILE__, __LINE__, __FUNCTION__);
189
190 if (!ECORE_X_EVENT_ANY)
191 {
192 ECORE_X_EVENT_ANY = ecore_event_type_new();
193 ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new();
194 ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new();
195 ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
196 ECORE_X_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
197 ECORE_X_EVENT_WINDOW_KEYMAP = ecore_event_type_new();
198 ECORE_X_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
199 ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
200 ECORE_X_EVENT_WINDOW_CREATE = ecore_event_type_new();
201 ECORE_X_EVENT_WINDOW_DESTROY = ecore_event_type_new();
202 ECORE_X_EVENT_WINDOW_HIDE = ecore_event_type_new();
203 ECORE_X_EVENT_WINDOW_SHOW = ecore_event_type_new();
204 ECORE_X_EVENT_WINDOW_SHOW_REQUEST = ecore_event_type_new();
205 ECORE_X_EVENT_WINDOW_REPARENT = ecore_event_type_new();
206 ECORE_X_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
207 ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
208 ECORE_X_EVENT_WINDOW_GRAVITY = ecore_event_type_new();
209 ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = ecore_event_type_new();
210 ECORE_X_EVENT_WINDOW_STACK = ecore_event_type_new();
211 ECORE_X_EVENT_WINDOW_STACK_REQUEST = ecore_event_type_new();
212 ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new();
213 ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new();
214 ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new();
215 ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new();
216 ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new();
217 ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new();
218 ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new();
219 ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
220 ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new();
221 ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new();
222 ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new();
223 ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = ecore_event_type_new();
224 ECORE_X_EVENT_GESTURE_NOTIFY_PAN = ecore_event_type_new();
225 ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = ecore_event_type_new();
226 ECORE_X_EVENT_GESTURE_NOTIFY_TAP = ecore_event_type_new();
227 ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = ecore_event_type_new();
228 ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = ecore_event_type_new();
229 ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = ecore_event_type_new();
230 ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new();
231 ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new();
232 ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new();
233 ECORE_X_EVENT_RANDR_CRTC_CHANGE = ecore_event_type_new();
234 ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = ecore_event_type_new();
235 ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = ecore_event_type_new();
236 ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new();
237 ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
238 ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new();
239 ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
240 ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new();
241 ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = ecore_event_type_new();
242 ECORE_X_EVENT_PING = ecore_event_type_new();
243 ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = ecore_event_type_new();
244 ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = ecore_event_type_new();
245 ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = ecore_event_type_new();
246 ECORE_X_EVENT_GENERIC = ecore_event_type_new();
247 }
248}
249
250void
251_ecore_xcb_events_shutdown(void)
252{
253 LOGFN(__FILE__, __LINE__, __FUNCTION__);
254
255 _ecore_xcb_event_mouse_down_info_clear();
256
257 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
258// if (_ecore_xcb_event_last_mouse_move_event)
259// {
260// ecore_event_del(_ecore_xcb_event_last_mouse_move_event);
261// _ecore_xcb_event_last_mouse_move_event = NULL;
262// }
263}
264
265void
266_ecore_xcb_events_handle(xcb_generic_event_t *ev)
267{
268 uint8_t response = 0;
269
270// LOGFN(__FILE__, __LINE__, __FUNCTION__);
271 CHECK_XCB_CONN;
272
273 /* strip highest bit (set if event is generated) */
274 response = (ev->response_type & ~0x80);
275 if (response == 0)
276 {
277 xcb_generic_error_t *err;
278
279 err = (xcb_generic_error_t *)ev;
280
281 /* NB: There is no way to check access of destroyed windows,
282 * so trap those cases and ignore. We also ignore BadValue from
283 * xcb_grab/ungrab_button (happens when we are using any_mod)
284 * and a few others */
285#ifdef OLD_XCB_VERSION
286 if (err->error_code == XCB_EVENT_ERROR_BAD_WINDOW) return;
287 else if (err->error_code == XCB_EVENT_ERROR_BAD_MATCH)
288 {
289 if ((err->major_code == XCB_SET_INPUT_FOCUS) ||
290 (err->major_code == XCB_CONFIGURE_WINDOW))
291 return;
292 }
293 else if (err->error_code == XCB_EVENT_ERROR_BAD_VALUE)
294 {
295 if ((err->major_code == XCB_KILL_CLIENT) ||
296 (err->major_code == XCB_GRAB_BUTTON) ||
297 (err->major_code == XCB_UNGRAB_BUTTON))
298 return;
299 }
300#else
301 if (err->error_code == XCB_WINDOW) return;
302 else if (err->error_code == XCB_MATCH)
303 {
304 if ((err->major_code == XCB_SET_INPUT_FOCUS) ||
305 (err->major_code == XCB_CONFIGURE_WINDOW))
306 return;
307 }
308 else if (err->error_code == XCB_VALUE)
309 {
310 if ((err->major_code == XCB_KILL_CLIENT) ||
311 (err->major_code == XCB_GRAB_BUTTON) ||
312 (err->major_code == XCB_UNGRAB_BUTTON))
313 return;
314 }
315#endif
316 WRN("Got Event Error:");
317 WRN("\tMajor Code: %d", err->major_code);
318 WRN("\tMinor Code: %d", err->minor_code);
319 WRN("\tRequest: %s", xcb_event_get_request_label(err->major_code));
320 WRN("\tError: %s", xcb_event_get_error_label(err->error_code));
321 if (err->error_code == 2) // bad value
322 WRN("\tValue: %d", ((xcb_value_error_t *)err)->bad_value);
323 else if (err->error_code == 8) // bad match
324 WRN("\tMatch: %d", ((xcb_match_error_t *)err)->bad_value);
325
326 if (err->major_code == XCB_SEND_EVENT)
327 {
328 WRN("\tSend Event Error");
329 WRN("\t\tSeq: %d", ev->sequence);
330 WRN("\t\tFull Seq: %d", ev->full_sequence);
331 WRN("\t\tType: %d", ev->response_type);
332 }
333 /* if (err->major_code == 148) */
334 /* { */
335 /* printf("GOT 148 Error\n"); */
336 /* } */
337 return;
338 }
339
340 /* FIXME: Filter event for xim when xcb supports xim */
341
342 _ecore_xcb_event_handle_any_event(ev);
343
344 if (response == XCB_KEY_PRESS)
345 _ecore_xcb_event_handle_key_press(ev);
346 else if (response == XCB_KEY_RELEASE)
347 _ecore_xcb_event_handle_key_release(ev);
348 else if (response == XCB_BUTTON_PRESS)
349 _ecore_xcb_event_handle_button_press(ev);
350 else if (response == XCB_BUTTON_RELEASE)
351 _ecore_xcb_event_handle_button_release(ev);
352 else if (response == XCB_MOTION_NOTIFY)
353 _ecore_xcb_event_handle_motion_notify(ev);
354 else if (response == XCB_ENTER_NOTIFY)
355 _ecore_xcb_event_handle_enter_notify(ev);
356 else if (response == XCB_LEAVE_NOTIFY)
357 _ecore_xcb_event_handle_leave_notify(ev);
358 else if (response == XCB_KEYMAP_NOTIFY)
359 _ecore_xcb_event_handle_keymap_notify(ev);
360 else if (response == XCB_FOCUS_IN)
361 _ecore_xcb_event_handle_focus_in(ev);
362 else if (response == XCB_FOCUS_OUT)
363 _ecore_xcb_event_handle_focus_out(ev);
364 else if (response == XCB_EXPOSE)
365 _ecore_xcb_event_handle_expose(ev);
366 else if (response == XCB_GRAPHICS_EXPOSURE)
367 _ecore_xcb_event_handle_graphics_exposure(ev);
368 else if (response == XCB_VISIBILITY_NOTIFY)
369 _ecore_xcb_event_handle_visibility_notify(ev);
370 else if (response == XCB_CREATE_NOTIFY)
371 _ecore_xcb_event_handle_create_notify(ev);
372 else if (response == XCB_DESTROY_NOTIFY)
373 _ecore_xcb_event_handle_destroy_notify(ev);
374 else if (response == XCB_MAP_NOTIFY)
375 _ecore_xcb_event_handle_map_notify(ev);
376 else if (response == XCB_UNMAP_NOTIFY)
377 _ecore_xcb_event_handle_unmap_notify(ev);
378 else if (response == XCB_MAP_REQUEST)
379 _ecore_xcb_event_handle_map_request(ev);
380 else if (response == XCB_REPARENT_NOTIFY)
381 _ecore_xcb_event_handle_reparent_notify(ev);
382 else if (response == XCB_CONFIGURE_NOTIFY)
383 _ecore_xcb_event_handle_configure_notify(ev);
384 else if (response == XCB_CONFIGURE_REQUEST)
385 _ecore_xcb_event_handle_configure_request(ev);
386 else if (response == XCB_GRAVITY_NOTIFY)
387 _ecore_xcb_event_handle_gravity_notify(ev);
388 else if (response == XCB_RESIZE_REQUEST)
389 _ecore_xcb_event_handle_resize_request(ev);
390 else if (response == XCB_CIRCULATE_NOTIFY)
391 _ecore_xcb_event_handle_circulate_notify(ev);
392 else if (response == XCB_CIRCULATE_REQUEST)
393 _ecore_xcb_event_handle_circulate_request(ev);
394 else if (response == XCB_PROPERTY_NOTIFY)
395 _ecore_xcb_event_handle_property_notify(ev);
396 else if (response == XCB_SELECTION_CLEAR)
397 _ecore_xcb_event_handle_selection_clear(ev);
398 else if (response == XCB_SELECTION_REQUEST)
399 _ecore_xcb_event_handle_selection_request(ev);
400 else if (response == XCB_SELECTION_NOTIFY)
401 _ecore_xcb_event_handle_selection_notify(ev);
402 else if (response == XCB_COLORMAP_NOTIFY)
403 _ecore_xcb_event_handle_colormap_notify(ev);
404 else if (response == XCB_CLIENT_MESSAGE)
405 _ecore_xcb_event_handle_client_message(ev);
406 else if (response == XCB_MAPPING_NOTIFY)
407 _ecore_xcb_event_handle_mapping_notify(ev);
408 else if (response == 35) /* GenericEvent == 35 */
409 _ecore_xcb_event_handle_generic_event(ev);
410#ifdef ECORE_XCB_DAMAGE
411 else if ((_ecore_xcb_event_damage >= 0) &&
412 (response == (_ecore_xcb_event_damage + XCB_DAMAGE_NOTIFY)))
413 _ecore_xcb_event_handle_damage_notify(ev);
414#endif
415#ifdef ECORE_XCB_RANDR
416 else if ((_ecore_xcb_event_randr >= 0) &&
417 (response ==
418 _ecore_xcb_event_randr + XCB_RANDR_SCREEN_CHANGE_NOTIFY))
419 _ecore_xcb_event_handle_randr_change(ev);
420 else if ((_ecore_xcb_event_randr >= 0) &&
421 (response == (_ecore_xcb_event_randr + XCB_RANDR_NOTIFY)))
422 _ecore_xcb_event_handle_randr_notify(ev);
423#endif
424#ifdef ECORE_XCB_SCREENSAVER
425 else if ((_ecore_xcb_event_screensaver >= 0) &&
426 (response ==
427 _ecore_xcb_event_screensaver + XCB_SCREENSAVER_NOTIFY))
428 _ecore_xcb_event_handle_screensaver_notify(ev);
429#endif
430#ifdef ECORE_XCB_XGESTURE
431 else if ((_ecore_xcb_event_gesture >= 0) &&
432 (response ==
433 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_FLICK))
434 _ecore_xcb_event_handle_gesture_notify_flick(ev);
435 else if ((_ecore_xcb_event_gesture >= 0) &&
436 (response ==
437 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_PAN))
438 _ecore_xcb_event_handle_gesture_notify_pan(ev);
439 else if ((_ecore_xcb_event_gesture >= 0) &&
440 (response ==
441 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_PINCH_ROTATION))
442 _ecore_xcb_event_handle_gesture_notify_pinchrotation(ev);
443 else if ((_ecore_xcb_event_gesture >= 0) &&
444 (response ==
445 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_TAP))
446 _ecore_xcb_event_handle_gesture_notify_tap(ev);
447 else if ((_ecore_xcb_event_gesture >= 0) &&
448 (response ==
449 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_TAP_N_HOLD))
450 _ecore_xcb_event_handle_gesture_notify_tapnhold(ev);
451 else if ((_ecore_xcb_event_gesture >= 0) &&
452 (response ==
453 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_HOLD))
454 _ecore_xcb_event_handle_gesture_notify_hold(ev);
455 else if ((_ecore_xcb_event_gesture >= 0) &&
456 (response ==
457 _ecore_xcb_event_gesture + XCB_GESTURE_NOTIFY_GROUP))
458 _ecore_xcb_event_handle_gesture_notify_group(ev);
459#endif
460#ifdef ECORE_XCB_SHAPE
461 else if ((_ecore_xcb_event_shape >= 0) &&
462 (response == (_ecore_xcb_event_shape + XCB_SHAPE_NOTIFY)))
463 _ecore_xcb_event_handle_shape_change(ev);
464#endif
465#ifdef ECORE_XCB_SYNC
466 else if ((_ecore_xcb_event_sync >= 0) &&
467 (response == (_ecore_xcb_event_sync + XCB_SYNC_COUNTER_NOTIFY)))
468 _ecore_xcb_event_handle_sync_counter(ev);
469 else if ((_ecore_xcb_event_sync >= 0) &&
470 (response == (_ecore_xcb_event_sync + XCB_SYNC_ALARM_NOTIFY)))
471 _ecore_xcb_event_handle_sync_alarm(ev);
472#endif
473#ifdef ECORE_XCB_XFIXES
474 else if ((_ecore_xcb_event_xfixes >= 0) &&
475 (response ==
476 _ecore_xcb_event_xfixes + XCB_XFIXES_SELECTION_NOTIFY))
477 _ecore_xcb_event_handle_xfixes_selection_notify(ev);
478 else if ((_ecore_xcb_event_xfixes >= 0) &&
479 (response == (_ecore_xcb_event_xfixes + XCB_XFIXES_CURSOR_NOTIFY)))
480 _ecore_xcb_event_handle_xfixes_cursor_notify(ev);
481#endif
482}
483
484Ecore_X_Time
485_ecore_xcb_events_last_time_get(void)
486{
487 LOGFN(__FILE__, __LINE__, __FUNCTION__);
488
489 return _ecore_xcb_event_last_time;
490}
491
492EAPI void
493ecore_x_event_mask_set(Ecore_X_Window win,
494 Ecore_X_Event_Mask mask)
495{
496 xcb_get_window_attributes_cookie_t cookie;
497 xcb_get_window_attributes_reply_t *reply;
498 uint32_t list;
499
500 LOGFN(__FILE__, __LINE__, __FUNCTION__);
501 CHECK_XCB_CONN;
502
503 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
504 cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
505 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
506 if (!reply) return;
507
508 list = (mask | reply->your_event_mask);
509 free(reply);
510 xcb_change_window_attributes(_ecore_xcb_conn, win,
511 XCB_CW_EVENT_MASK, &list);
512// ecore_x_flush();
513}
514
515EAPI void
516ecore_x_event_mask_unset(Ecore_X_Window win,
517 Ecore_X_Event_Mask mask)
518{
519 xcb_get_window_attributes_cookie_t cookie;
520 xcb_get_window_attributes_reply_t *reply;
521 uint32_t list;
522
523 LOGFN(__FILE__, __LINE__, __FUNCTION__);
524 CHECK_XCB_CONN;
525
526 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
527 cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
528 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
529 if (!reply) return;
530
531 list = (reply->your_event_mask & ~mask);
532 free(reply);
533 xcb_change_window_attributes(_ecore_xcb_conn, win,
534 XCB_CW_EVENT_MASK, &list);
535// ecore_x_flush();
536}
537
538unsigned int
539_ecore_xcb_events_modifiers_get(unsigned int state)
540{
541 unsigned int modifiers = 0;
542
543 LOGFN(__FILE__, __LINE__, __FUNCTION__);
544
545 if (state & ECORE_X_MODIFIER_SHIFT)
546 modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
547 if (state & ECORE_X_MODIFIER_CTRL)
548 modifiers |= ECORE_EVENT_MODIFIER_CTRL;
549 if (state & ECORE_X_MODIFIER_ALT)
550 modifiers |= ECORE_EVENT_MODIFIER_ALT;
551 if (state & ECORE_X_MODIFIER_WIN)
552 modifiers |= ECORE_EVENT_MODIFIER_WIN;
553 if (state & ECORE_X_LOCK_SCROLL)
554 modifiers |= ECORE_EVENT_LOCK_SCROLL;
555 if (state & ECORE_X_LOCK_CAPS)
556 modifiers |= ECORE_EVENT_LOCK_CAPS;
557 if (state & ECORE_X_LOCK_NUM)
558 modifiers |= ECORE_EVENT_LOCK_NUM;
559 if (state & ECORE_X_LOCK_SHIFT)
560 modifiers |= ECORE_EVENT_LOCK_SHIFT;
561
562 return modifiers;
563}
564
565/* local functions */
566static void
567_ecore_xcb_event_handle_any_event(xcb_generic_event_t *event)
568{
569 xcb_generic_event_t *ev;
570
571// LOGFN(__FILE__, __LINE__, __FUNCTION__);
572
573 ev = malloc(sizeof(xcb_generic_event_t));
574 if (!ev) return;
575
576 memcpy(ev, event, sizeof(xcb_generic_event_t));
577 ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
578}
579
580static void
581_ecore_xcb_event_handle_key_press(xcb_generic_event_t *event)
582{
583 _ecore_xcb_event_key_press(event);
584}
585
586static void
587_ecore_xcb_event_handle_key_release(xcb_generic_event_t *event)
588{
589 _ecore_xcb_event_key_release(event);
590}
591
592static void
593_ecore_xcb_event_handle_button_press(xcb_generic_event_t *event)
594{
595 xcb_button_press_event_t *ev;
596
597 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
598
599 ev = (xcb_button_press_event_t *)event;
600 if ((ev->detail > 3) && (ev->detail < 8))
601 {
602 Ecore_Event_Mouse_Wheel *e;
603
604 if (!(e = malloc(sizeof(Ecore_Event_Mouse_Wheel)))) return;
605
606 e->timestamp = ev->time;
607 e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
608 switch (ev->detail)
609 {
610 case 4:
611 e->direction = 0;
612 e->z = -1;
613 break;
614
615 case 5:
616 e->direction = 0;
617 e->z = 1;
618 break;
619
620 case 6:
621 e->direction = 1;
622 e->z = -1;
623 break;
624
625 case 7:
626 e->direction = 1;
627 e->z = 1;
628 break;
629
630 default:
631 e->direction = 0;
632 e->z = 0;
633 break;
634 }
635 e->x = ev->event_x;
636 e->y = ev->event_y;
637 e->root.x = ev->root_x;
638 e->root.y = ev->root_y;
639 if (ev->child)
640 e->window = ev->child;
641 else
642 e->window = ev->event;
643
644 e->event_window = ev->event;
645 e->same_screen = ev->same_screen;
646 e->root_window = ev->root;
647
648 _ecore_xcb_event_last_time = e->timestamp;
649 _ecore_xcb_event_last_window = e->window;
650 _ecore_xcb_event_last_root_x = e->root.x;
651 _ecore_xcb_event_last_root_y = e->root.y;
652
653 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
654
655 _ecore_xcb_window_grab_allow_events(ev->event, ev->child,
656 ECORE_EVENT_MOUSE_WHEEL,
657 e, ev->time);
658 }
659 else
660 {
661 Ecore_Event_Mouse_Button *e;
662 unsigned int child_win = 0;
663
664 child_win = (ev->child ? ev->child : ev->event);
665
666 _ecore_xcb_event_mouse_move(ev->time, ev->state,
667 ev->event_x, ev->event_y,
668 ev->root_x, ev->root_y,
669 ev->event, child_win,
670 ev->root, ev->same_screen,
671 0, 1, 1, 1.0, 0.0,
672 ev->event_x, ev->event_y,
673 ev->root_x, ev->root_y);
674
675 e = _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
676 ev->time,
677 ev->state, ev->detail,
678 ev->event_x, ev->event_y,
679 ev->root_x, ev->root_y, ev->event,
680 child_win,
681 ev->root, ev->same_screen,
682 0, 1, 1, 1.0, 0.0,
683 ev->event_x, ev->event_y,
684 ev->root_x, ev->root_y);
685 if (e)
686 _ecore_xcb_window_grab_allow_events(ev->event, ev->child,
687 ECORE_EVENT_MOUSE_BUTTON_DOWN,
688 e, ev->time);
689 }
690}
691
692static void
693_ecore_xcb_event_handle_button_release(xcb_generic_event_t *event)
694{
695 xcb_button_release_event_t *ev;
696
697 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
698 ev = (xcb_button_release_event_t *)event;
699 if ((ev->detail <= 3) || (ev->detail > 7))
700 {
701 _ecore_xcb_event_mouse_move(ev->time, ev->state,
702 ev->event_x, ev->event_y,
703 ev->root_x, ev->root_y,
704 ev->event,
705 (ev->child ? ev->child : ev->event),
706 ev->root, ev->same_screen,
707 0, 1, 1, 1.0, 0.0,
708 ev->event_x, ev->event_y,
709 ev->root_x, ev->root_y);
710
711 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP, ev->time,
712 ev->state, ev->detail,
713 ev->event_x, ev->event_y, ev->root_x,
714 ev->root_y, ev->event,
715 (ev->child ? ev->child : ev->event),
716 ev->root, ev->same_screen,
717 0, 1, 1, 1.0, 0.0,
718 ev->event_x, ev->event_y,
719 ev->root_x, ev->root_y);
720 }
721}
722
723static void
724_ecore_xcb_event_handle_motion_notify(xcb_generic_event_t *event)
725{
726 xcb_motion_notify_event_t *ev;
727
728 ev = (xcb_motion_notify_event_t *)event;
729
730 /* if (_ecore_xcb_event_last_mouse_move_event) */
731 /* { */
732 /* ecore_event_del(_ecore_xcb_event_last_mouse_move_event); */
733 /* _ecore_xcb_event_last_mouse_move = EINA_FALSE; */
734 /* _ecore_xcb_event_last_mouse_move_event = NULL; */
735 /* } */
736
737 _ecore_xcb_event_mouse_move(ev->time, ev->state,
738 ev->event_x, ev->event_y,
739 ev->root_x, ev->root_y,
740 ev->event,
741 (ev->child ? ev->child : ev->event),
742 ev->root, ev->same_screen,
743 0, 1, 1, 1.0, 0.0,
744 ev->event_x, ev->event_y,
745 ev->root_x, ev->root_y);
746 _ecore_xcb_event_last_mouse_move = EINA_TRUE;
747
748 _ecore_xcb_dnd_drag(ev->root, ev->root_x, ev->root_y);
749}
750
751static void
752_ecore_xcb_event_handle_enter_notify(xcb_generic_event_t *event)
753{
754 xcb_enter_notify_event_t *ev;
755 Ecore_X_Event_Mouse_In *e;
756
757 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
758 ev = (xcb_enter_notify_event_t *)event;
759
760 _ecore_xcb_event_mouse_move(ev->time, ev->state,
761 ev->event_x, ev->event_y,
762 ev->root_x, ev->root_y,
763 ev->event,
764 (ev->child ? ev->child : ev->event),
765 ev->root, ev->same_screen_focus,
766 0, 1, 1, 1.0, 0.0,
767 ev->event_x, ev->event_y,
768 ev->root_x, ev->root_y);
769
770 if (!(e = calloc(1, sizeof(Ecore_X_Event_Mouse_In)))) return;
771
772 e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
773 e->x = ev->event_x;
774 e->y = ev->event_y;
775 e->root.x = ev->root_x;
776 e->root.y = ev->root_y;
777 if (ev->child)
778 e->win = ev->child;
779 else
780 e->win = ev->event;
781 e->event_win = ev->event;
782 e->same_screen = ev->same_screen_focus;
783 e->root_win = ev->root;
784 e->mode = _ecore_xcb_event_mode_get(ev->mode);
785 e->detail = _ecore_xcb_event_detail_get(ev->detail);
786 e->time = ev->time;
787 _ecore_xcb_event_last_time = e->time;
788
789 ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
790}
791
792static void
793_ecore_xcb_event_handle_leave_notify(xcb_generic_event_t *event)
794{
795 xcb_leave_notify_event_t *ev;
796 Ecore_X_Event_Mouse_Out *e;
797
798 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
799 ev = (xcb_enter_notify_event_t *)event;
800
801 _ecore_xcb_event_mouse_move(ev->time, ev->state,
802 ev->event_x, ev->event_y,
803 ev->root_x, ev->root_y,
804 ev->event,
805 (ev->child ? ev->child : ev->event),
806 ev->root, ev->same_screen_focus,
807 0, 1, 1, 1.0, 0.0,
808 ev->event_x, ev->event_y,
809 ev->root_x, ev->root_y);
810
811 if (!(e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out)))) return;
812
813 e->modifiers = _ecore_xcb_events_modifiers_get(ev->state);
814 e->x = ev->event_x;
815 e->y = ev->event_y;
816 e->root.x = ev->root_x;
817 e->root.y = ev->root_y;
818 if (ev->child)
819 e->win = ev->child;
820 else
821 e->win = ev->event;
822 e->event_win = ev->event;
823 e->same_screen = ev->same_screen_focus;
824 e->root_win = ev->root;
825 e->mode = _ecore_xcb_event_mode_get(ev->mode);
826 e->detail = _ecore_xcb_event_detail_get(ev->detail);
827
828 e->time = ev->time;
829 _ecore_xcb_event_last_time = e->time;
830 _ecore_xcb_event_last_window = e->win;
831 _ecore_xcb_event_last_root_x = e->root.x;
832 _ecore_xcb_event_last_root_y = e->root.y;
833
834 ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
835}
836
837static void
838_ecore_xcb_event_handle_keymap_notify(xcb_generic_event_t *event __UNUSED__)
839{
840// LOGFN(__FILE__, __LINE__, __FUNCTION__);
841
842 // FIXME: handle this event type
843 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
844}
845
846static void
847_ecore_xcb_event_handle_focus_in(xcb_generic_event_t *event)
848{
849 xcb_focus_in_event_t *ev;
850 Ecore_X_Event_Window_Focus_In *e;
851
852 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
853 ev = (xcb_focus_in_event_t *)event;
854 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In)))) return;
855
856 e->win = ev->event;
857 e->mode = _ecore_xcb_event_mode_get(ev->mode);
858 e->detail = _ecore_xcb_event_detail_get(ev->detail);
859
860 e->time = _ecore_xcb_event_last_time;
861 _ecore_xcb_event_last_time = e->time;
862
863 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
864}
865
866static void
867_ecore_xcb_event_handle_focus_out(xcb_generic_event_t *event)
868{
869 xcb_focus_out_event_t *ev;
870 Ecore_X_Event_Window_Focus_Out *e;
871
872 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
873 ev = (xcb_focus_out_event_t *)event;
874 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out)))) return;
875
876 e->win = ev->event;
877 e->mode = _ecore_xcb_event_mode_get(ev->mode);
878 e->detail = _ecore_xcb_event_detail_get(ev->detail);
879
880 e->time = _ecore_xcb_event_last_time;
881 _ecore_xcb_event_last_time = e->time;
882
883 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
884}
885
886static void
887_ecore_xcb_event_handle_expose(xcb_generic_event_t *event)
888{
889 xcb_expose_event_t *ev;
890 Ecore_X_Event_Window_Damage *e;
891
892 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
893 ev = (xcb_expose_event_t *)event;
894 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Damage)))) return;
895
896 e->win = ev->window;
897 e->time = _ecore_xcb_event_last_time;
898 e->x = ev->x;
899 e->y = ev->y;
900 e->w = ev->width;
901 e->h = ev->height;
902 e->count = ev->count;
903
904 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
905}
906
907static void
908_ecore_xcb_event_handle_graphics_exposure(xcb_generic_event_t *event)
909{
910 xcb_graphics_exposure_event_t *ev;
911 Ecore_X_Event_Window_Damage *e;
912
913 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
914 ev = (xcb_graphics_exposure_event_t *)event;
915 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Damage)))) return;
916
917 e->win = ev->drawable;
918 e->x = ev->x;
919 e->y = ev->y;
920 e->w = ev->width;
921 e->h = ev->height;
922 e->count = ev->count;
923 e->time = _ecore_xcb_event_last_time;
924
925 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
926}
927
928static void
929_ecore_xcb_event_handle_visibility_notify(xcb_generic_event_t *event)
930{
931 xcb_visibility_notify_event_t *ev;
932 Ecore_X_Event_Window_Visibility_Change *e;
933
934 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
935 ev = (xcb_visibility_notify_event_t *)event;
936 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change))))
937 return;
938
939 e->win = ev->window;
940 e->time = _ecore_xcb_event_last_time;
941 if (ev->state == XCB_VISIBILITY_FULLY_OBSCURED)
942 e->fully_obscured = 1;
943 else
944 e->fully_obscured = 0;
945
946 ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
947}
948
949static void
950_ecore_xcb_event_handle_create_notify(xcb_generic_event_t *event)
951{
952 xcb_create_notify_event_t *ev;
953 Ecore_X_Event_Window_Create *e;
954
955 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
956 ev = (xcb_create_notify_event_t *)event;
957 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Create)))) return;
958
959 e->win = ev->window;
960 e->parent = ev->parent;
961 if (ev->override_redirect)
962 e->override = 1;
963 else
964 e->override = 0;
965 e->x = ev->x;
966 e->y = ev->y;
967 e->w = ev->width;
968 e->h = ev->height;
969 e->border = ev->border_width;
970 e->time = _ecore_xcb_event_last_time;
971
972 ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
973}
974
975static void
976_ecore_xcb_event_handle_destroy_notify(xcb_generic_event_t *event)
977{
978 xcb_destroy_notify_event_t *ev;
979 Ecore_X_Event_Window_Destroy *e;
980
981 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
982 ev = (xcb_destroy_notify_event_t *)event;
983 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy)))) return;
984
985 e->win = ev->window;
986 e->event_win = ev->event;
987 if (e->win == _ecore_xcb_event_last_window)
988 _ecore_xcb_event_last_window = 0;
989 e->time = _ecore_xcb_event_last_time;
990
991 ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
992}
993
994static void
995_ecore_xcb_event_handle_map_notify(xcb_generic_event_t *event)
996{
997 xcb_map_notify_event_t *ev;
998 Ecore_X_Event_Window_Show *e;
999
1000 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1001 ev = (xcb_map_notify_event_t *)event;
1002 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Show)))) return;
1003
1004 e->win = ev->window;
1005 e->event_win = ev->event;
1006 e->time = _ecore_xcb_event_last_time;
1007
1008 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
1009}
1010
1011static void
1012_ecore_xcb_event_handle_unmap_notify(xcb_generic_event_t *event)
1013{
1014 xcb_unmap_notify_event_t *ev;
1015 Ecore_X_Event_Window_Hide *e;
1016
1017 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1018 ev = (xcb_unmap_notify_event_t *)event;
1019 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Hide)))) return;
1020
1021 e->win = ev->window;
1022 e->event_win = ev->event;
1023 e->time = _ecore_xcb_event_last_time;
1024
1025 ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
1026}
1027
1028static void
1029_ecore_xcb_event_handle_map_request(xcb_generic_event_t *event)
1030{
1031 xcb_map_request_event_t *ev;
1032 Ecore_X_Event_Window_Show_Request *e;
1033
1034 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1035 ev = (xcb_map_request_event_t *)event;
1036 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request)))) return;
1037
1038 e->win = ev->window;
1039 e->parent = ev->parent;
1040 e->time = _ecore_xcb_event_last_time;
1041
1042 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
1043}
1044
1045static void
1046_ecore_xcb_event_handle_reparent_notify(xcb_generic_event_t *event)
1047{
1048 xcb_reparent_notify_event_t *ev;
1049 Ecore_X_Event_Window_Reparent *e;
1050
1051 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1052 ev = (xcb_reparent_notify_event_t *)event;
1053 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent)))) return;
1054
1055 e->win = ev->window;
1056 e->event_win = ev->event;
1057 e->parent = ev->parent;
1058 e->time = _ecore_xcb_event_last_time;
1059
1060 ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
1061}
1062
1063static void
1064_ecore_xcb_event_handle_configure_notify(xcb_generic_event_t *event)
1065{
1066 xcb_configure_notify_event_t *ev;
1067 Ecore_X_Event_Window_Configure *e;
1068
1069 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1070 ev = (xcb_configure_notify_event_t *)event;
1071 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Configure)))) return;
1072
1073 e->win = ev->window;
1074 e->event_win = ev->event;
1075 e->abovewin = ev->above_sibling;
1076 e->x = ev->x;
1077 e->y = ev->y;
1078 e->w = ev->width;
1079 e->h = ev->height;
1080 e->border = ev->border_width;
1081 e->override = ev->override_redirect;
1082 /* send_event is bit 7 (0x80) of response_type */
1083 e->from_wm = ((ev->response_type & 0x80) ? 1 : 0);
1084 e->time = _ecore_xcb_event_last_time;
1085
1086 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
1087}
1088
1089static void
1090_ecore_xcb_event_handle_configure_request(xcb_generic_event_t *event)
1091{
1092 xcb_configure_request_event_t *ev;
1093 Ecore_X_Event_Window_Configure_Request *e;
1094
1095 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1096 ev = (xcb_configure_request_event_t *)event;
1097 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request))))
1098 return;
1099
1100 e->win = ev->window;
1101 e->parent_win = ev->parent;
1102 e->abovewin = ev->sibling;
1103 e->x = ev->x;
1104 e->y = ev->y;
1105 e->w = ev->width;
1106 e->h = ev->height;
1107 e->border = ev->border_width;
1108 e->value_mask = ev->value_mask;
1109 switch (ev->stack_mode)
1110 {
1111 case XCB_STACK_MODE_ABOVE:
1112 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1113 break;
1114
1115 case XCB_STACK_MODE_BELOW:
1116 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1117 break;
1118
1119 case XCB_STACK_MODE_TOP_IF:
1120 e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
1121 break;
1122
1123 case XCB_STACK_MODE_BOTTOM_IF:
1124 e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
1125 break;
1126
1127 case XCB_STACK_MODE_OPPOSITE:
1128 e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
1129 break;
1130 }
1131 e->time = _ecore_xcb_event_last_time;
1132
1133 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
1134}
1135
1136static void
1137_ecore_xcb_event_handle_gravity_notify(xcb_generic_event_t *event __UNUSED__)
1138{
1139/*
1140 xcb_gravity_notify_event_t *ev;
1141 Ecore_X_Event_Window_Gravity *e;
1142
1143 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1144 ev = (xcb_gravity_notify_event_t *)event;
1145 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Gravity)))) return;
1146
1147 e->win = ev->window;
1148 e->event_win = ev->event;
1149 e->time = _ecore_xcb_event_last_time;
1150
1151 ecore_event_add(ECORE_X_EVENT_WINDOW_GRAVITY, e, NULL, NULL);
1152 */
1153}
1154
1155static void
1156_ecore_xcb_event_handle_resize_request(xcb_generic_event_t *event)
1157{
1158 xcb_resize_request_event_t *ev;
1159 Ecore_X_Event_Window_Resize_Request *e;
1160
1161 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1162 ev = (xcb_resize_request_event_t *)event;
1163 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request)))) return;
1164
1165 e->win = ev->window;
1166 e->w = ev->width;
1167 e->h = ev->height;
1168 e->time = _ecore_xcb_event_last_time;
1169
1170 ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
1171}
1172
1173static void
1174_ecore_xcb_event_handle_circulate_notify(xcb_generic_event_t *event)
1175{
1176 xcb_circulate_notify_event_t *ev;
1177 Ecore_X_Event_Window_Stack *e;
1178
1179 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1180 ev = (xcb_circulate_notify_event_t *)event;
1181 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Stack)))) return;
1182
1183 e->win = ev->window;
1184 e->event_win = ev->event;
1185 if (ev->place == XCB_PLACE_ON_TOP)
1186 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1187 else
1188 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1189 e->time = _ecore_xcb_event_last_time;
1190
1191 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
1192}
1193
1194static void
1195_ecore_xcb_event_handle_circulate_request(xcb_generic_event_t *event)
1196{
1197 xcb_circulate_request_event_t *ev;
1198 Ecore_X_Event_Window_Stack_Request *e;
1199
1200 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1201 ev = (xcb_circulate_request_event_t *)event;
1202 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request)))) return;
1203
1204 e->win = ev->window;
1205 e->parent = ev->event;
1206 if (ev->place == XCB_PLACE_ON_TOP)
1207 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1208 else
1209 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1210 e->time = _ecore_xcb_event_last_time;
1211
1212 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
1213}
1214
1215static void
1216_ecore_xcb_event_handle_property_notify(xcb_generic_event_t *event)
1217{
1218 xcb_property_notify_event_t *ev;
1219 Ecore_X_Event_Window_Property *e;
1220
1221 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1222 ev = (xcb_property_notify_event_t *)event;
1223 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Property)))) return;
1224
1225 e->win = ev->window;
1226 e->atom = ev->atom;
1227 e->time = ev->time;
1228 _ecore_xcb_event_last_time = e->time;
1229
1230 ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
1231}
1232
1233static void
1234_ecore_xcb_event_handle_selection_clear(xcb_generic_event_t *event)
1235{
1236 xcb_selection_clear_event_t *ev;
1237 Ecore_X_Event_Selection_Clear *e;
1238 Ecore_X_Atom sel;
1239
1240 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1241
1242 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1243 ev = (xcb_selection_clear_event_t *)event;
1244 if (!(e = malloc(sizeof(Ecore_X_Event_Selection_Clear)))) return;
1245
1246 e->win = ev->owner;
1247 e->atom = sel = ev->selection;
1248 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
1249 e->selection = ECORE_X_SELECTION_PRIMARY;
1250 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
1251 e->selection = ECORE_X_SELECTION_SECONDARY;
1252 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1253 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1254 else
1255 e->selection = ECORE_X_SELECTION_OTHER;
1256 e->time = ev->time;
1257
1258 ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
1259}
1260
1261static void
1262_ecore_xcb_event_handle_selection_request(xcb_generic_event_t *event)
1263{
1264 xcb_selection_request_event_t *ev;
1265 Ecore_X_Event_Selection_Request *e;
1266 Ecore_X_Selection_Intern *sd;
1267
1268 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1269
1270 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1271 ev = (xcb_selection_request_event_t *)event;
1272 if (!(e = malloc(sizeof(Ecore_X_Event_Selection_Request)))) return;
1273
1274 e->owner = ev->owner;
1275 e->requestor = ev->requestor;
1276 e->selection = ev->selection;
1277 e->target = ev->target;
1278 e->property = ev->property;
1279 e->time = ev->time;
1280
1281 ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
1282
1283 if ((sd = _ecore_xcb_selection_get(ev->selection)) &&
1284 (sd->win == ev->owner))
1285 {
1286 Ecore_X_Selection_Intern *si;
1287
1288 si = _ecore_xcb_selection_get(ev->selection);
1289 if (si->data)
1290 {
1291 Ecore_X_Atom property = XCB_NONE, type;
1292 void *data = NULL;
1293 int len = 0, typesize = 0;
1294
1295 type = ev->target;
1296 typesize = 8;
1297 len = sd->length;
1298
1299 if (!ecore_x_selection_convert(ev->selection, ev->target,
1300 &data, &len, &type, &typesize))
1301 property = XCB_NONE;
1302 else if (data)
1303 {
1304 ecore_x_window_prop_property_set(ev->requestor, ev->property,
1305 type, typesize, data, len);
1306 property = ev->property;
1307 free(data);
1308 }
1309 ecore_x_selection_notify_send(ev->requestor, ev->selection,
1310 ev->target, property, ev->time);
1311 }
1312 }
1313}
1314
1315static void
1316_ecore_xcb_event_handle_selection_notify(xcb_generic_event_t *event)
1317{
1318 xcb_selection_notify_event_t *ev;
1319 Ecore_X_Event_Selection_Notify *e;
1320 unsigned char *data = NULL;
1321 Ecore_X_Atom selection;
1322 int num = 0, format = 0;
1323
1324 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1325
1326 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1327 ev = (xcb_selection_notify_event_t *)event;
1328 selection = ev->selection;
1329 if (ev->target == ECORE_X_ATOM_SELECTION_TARGETS)
1330 {
1331 format =
1332 ecore_x_window_prop_property_get(ev->requestor, ev->property,
1333 XCB_ATOM_ATOM, 32, &data, &num);
1334 if (!format) return;
1335 }
1336 else
1337 {
1338 format =
1339 ecore_x_window_prop_property_get(ev->requestor, ev->property,
1340 XCB_GET_PROPERTY_TYPE_ANY, 8,
1341 &data, &num);
1342 if (!format) return;
1343 }
1344
1345 e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
1346 if (!e) return;
1347 e->win = ev->requestor;
1348 e->time = ev->time;
1349 e->atom = selection;
1350 e->target = _ecore_xcb_selection_target_get(ev->target);
1351
1352 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
1353 e->selection = ECORE_X_SELECTION_PRIMARY;
1354 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
1355 e->selection = ECORE_X_SELECTION_SECONDARY;
1356 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
1357 e->selection = ECORE_X_SELECTION_XDND;
1358 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1359 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1360 else
1361 e->selection = ECORE_X_SELECTION_OTHER;
1362
1363 e->data = _ecore_xcb_selection_parse(e->target, data, num, format);
1364
1365 ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
1366 _ecore_xcb_event_selection_notify_free, NULL);
1367}
1368
1369static void
1370_ecore_xcb_event_handle_colormap_notify(xcb_generic_event_t *event)
1371{
1372 xcb_colormap_notify_event_t *ev;
1373 Ecore_X_Event_Window_Colormap *e;
1374
1375 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1376 ev = (xcb_colormap_notify_event_t *)event;
1377 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Colormap)))) return;
1378
1379 e->win = ev->window;
1380 e->cmap = ev->colormap;
1381 if (ev->state == XCB_COLORMAP_STATE_INSTALLED)
1382 e->installed = 1;
1383 else
1384 e->installed = 0;
1385 e->time = _ecore_xcb_event_last_time;
1386
1387 ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
1388}
1389
1390static void
1391_ecore_xcb_event_handle_client_message(xcb_generic_event_t *event)
1392{
1393 xcb_client_message_event_t *ev;
1394
1395 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1396 ev = (xcb_client_message_event_t *)event;
1397
1398 /* Special client message event handling here. need to put LOTS of if */
1399 /* checks here and generate synthetic events per special message known */
1400 /* otherwise generate generic client message event. this would handle*/
1401 /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
1402
1403 if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) && (ev->format == 32) &&
1404 (ev->data.data32[0] == ECORE_X_ATOM_WM_DELETE_WINDOW))
1405 {
1406 Ecore_X_Event_Window_Delete_Request *e;
1407
1408 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request))))
1409 return;
1410 e->win = ev->window;
1411 e->time = _ecore_xcb_event_last_time;
1412 ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1413 }
1414 else if ((ev->type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
1415 (ev->format == 32) && (ev->data.data32[2] < 9))
1416 {
1417 Ecore_X_Event_Window_Move_Resize_Request *e;
1418
1419 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request))))
1420 return;
1421 e->win = ev->window;
1422 e->x = ev->data.data32[0];
1423 e->y = ev->data.data32[1];
1424 e->direction = ev->data.data32[2];
1425 e->button = ev->data.data32[3];
1426 e->source = ev->data.data32[4];
1427 ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
1428 }
1429 else if (ev->type == ECORE_X_ATOM_XDND_ENTER)
1430 {
1431 Ecore_X_Event_Xdnd_Enter *e;
1432 Ecore_X_DND_Target *target;
1433
1434 DBG("Got Xdnd Enter Event");
1435 if (!(e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter)))) return;
1436 target = _ecore_xcb_dnd_target_get();
1437 target->state = ECORE_X_DND_TARGET_ENTERED;
1438 target->source = ev->data.data32[0];
1439 target->win = ev->window;
1440 target->version = (int)(ev->data.data32[1] >> 24);
1441 if (target->version > ECORE_X_DND_VERSION)
1442 {
1443 WRN("DND: Requested version %d but we only support up to %d",
1444 target->version, ECORE_X_DND_VERSION);
1445 free(e);
1446 return;
1447 }
1448 if (ev->data.data32[1] & 0x1UL)
1449 {
1450 unsigned char *data;
1451 Ecore_X_Atom *types;
1452 int num_ret = 0;
1453
1454 if (!ecore_x_window_prop_property_get(target->source,
1455 ECORE_X_ATOM_XDND_TYPE_LIST,
1456 ECORE_X_ATOM_ATOM, 32,
1457 &data, &num_ret))
1458 {
1459 WRN("DND: Could not fetch data type list from source window");
1460 free(e);
1461 return;
1462 }
1463 types = (Ecore_X_Atom *)data;
1464 e->types = calloc(num_ret, sizeof(char *));
1465 if (e->types)
1466 {
1467 int i = 0;
1468
1469 for (i = 0; i < num_ret; i++)
1470 e->types[i] = ecore_x_atom_name_get(types[i]);
1471 }
1472 e->num_types = num_ret;
1473 }
1474 else
1475 {
1476 int i = 0;
1477
1478 e->types = calloc(3, sizeof(char *));
1479 if (e->types)
1480 {
1481 while ((i < 3) && (ev->data.data32[i + 2]))
1482 {
1483 e->types[i] =
1484 ecore_x_atom_name_get(ev->data.data32[i + 2]);
1485 i++;
1486 }
1487 }
1488 e->num_types = i;
1489 }
1490
1491 e->win = target->win;
1492 e->source = target->source;
1493 ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
1494 _ecore_xcb_event_xdnd_enter_free, NULL);
1495 }
1496 else if (ev->type == ECORE_X_ATOM_XDND_POSITION)
1497 {
1498 Ecore_X_Event_Xdnd_Position *e;
1499 Ecore_X_DND_Target *target;
1500
1501 DBG("Got Xdnd Position Event");
1502 target = _ecore_xcb_dnd_target_get();
1503 if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
1504 (target->win != ev->window)) return;
1505 target->pos.x = ev->data.data32[2] >> 16;
1506 target->pos.y = ev->data.data32[2] & 0xFFFFUL;
1507 target->action = ev->data.data32[4];
1508 target->time = (target->version >= 1) ?
1509 (Ecore_X_Time)ev->data.data32[3] : XCB_CURRENT_TIME;
1510
1511 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
1512 if (!e) return;
1513 e->win = target->win;
1514 e->source = target->source;
1515 e->position.x = target->pos.x;
1516 e->position.y = target->pos.y;
1517 e->action = target->action;
1518 ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
1519 }
1520 else if (ev->type == ECORE_X_ATOM_XDND_STATUS)
1521 {
1522 Ecore_X_Event_Xdnd_Status *e;
1523 Ecore_X_DND_Source *source;
1524
1525 DBG("Got Xdnd Status Event");
1526 source = _ecore_xcb_dnd_source_get();
1527 if ((source->win != ev->window) ||
1528 (source->dest != (Ecore_X_Window)ev->data.data32[0]))
1529 return;
1530
1531 source->await_status = 0;
1532 source->will_accept = ev->data.data32[1] & 0x1UL;
1533 source->suppress = (ev->data.data32[1] & 0x2UL) ? 0 : 1;
1534 source->rectangle.x = ev->data.data32[2] >> 16;
1535 source->rectangle.y = ev->data.data32[2] & 0xFFFFUL;
1536 source->rectangle.width = ev->data.data32[3] >> 16;
1537 source->rectangle.height = ev->data.data32[3] & 0xFFFFUL;
1538 source->accepted_action = ev->data.data32[4];
1539
1540 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
1541 if (!e) return;
1542 e->win = source->win;
1543 e->target = source->dest;
1544 e->will_accept = source->will_accept;
1545 e->rectangle.x = source->rectangle.x;
1546 e->rectangle.y = source->rectangle.y;
1547 e->rectangle.width = source->rectangle.width;
1548 e->rectangle.height = source->rectangle.height;
1549 e->action = source->accepted_action;
1550
1551 ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
1552 }
1553 else if (ev->type == ECORE_X_ATOM_XDND_LEAVE)
1554 {
1555 Ecore_X_Event_Xdnd_Leave *e;
1556 Ecore_X_DND_Target *target;
1557
1558 DBG("Got Xdnd Leave Event");
1559 target = _ecore_xcb_dnd_target_get();
1560 if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
1561 (target->win != ev->window))
1562 return;
1563 target->state = ECORE_X_DND_TARGET_IDLE;
1564 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
1565 if (!e) return;
1566 e->win = ev->window;
1567 e->source = (Ecore_X_Window)ev->data.data32[0];
1568 ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
1569 }
1570 else if (ev->type == ECORE_X_ATOM_XDND_DROP)
1571 {
1572 Ecore_X_Event_Xdnd_Drop *e;
1573 Ecore_X_DND_Target *target;
1574
1575 DBG("Got Xdnd Drop Event");
1576 target = _ecore_xcb_dnd_target_get();
1577 if ((target->source != (Ecore_X_Window)ev->data.data32[0]) ||
1578 (target->win != ev->window))
1579 return;
1580 target->time = (target->version >= 1) ?
1581 (Ecore_X_Time)ev->data.data32[2] : _ecore_xcb_event_last_time;
1582
1583 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
1584 if (!e) return;
1585 e->win = target->win;
1586 e->source = target->source;
1587 e->action = target->action;
1588 e->position.x = target->pos.x;
1589 e->position.y = target->pos.y;
1590 ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
1591 }
1592 else if (ev->type == ECORE_X_ATOM_XDND_FINISHED)
1593 {
1594 Ecore_X_Event_Xdnd_Finished *e;
1595 Ecore_X_DND_Source *source;
1596 Eina_Bool completed = EINA_TRUE;
1597
1598 DBG("Got Xdnd Finished Event");
1599 source = _ecore_xcb_dnd_source_get();
1600 if ((source->win != ev->window) ||
1601 (source->dest != (Ecore_X_Window)ev->data.data32[0]))
1602 return;
1603 if ((source->version < 5) || (ev->data.data32[1] & 0x1UL))
1604 {
1605 ecore_x_selection_xdnd_clear();
1606 source->state = ECORE_X_DND_SOURCE_IDLE;
1607 }
1608 else if (source->version >= 5)
1609 {
1610 completed = EINA_FALSE;
1611 source->state = ECORE_X_DND_SOURCE_CONVERTING;
1612 /* FIXME: Probably need to add a timer to switch back to idle
1613 * and discard the selection data */
1614 }
1615
1616 if (!(e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished))))
1617 return;
1618 e->win = source->win;
1619 e->target = source->dest;
1620 e->completed = completed;
1621 if (source->version >= 5)
1622 {
1623 source->accepted_action = ev->data.data32[2];
1624 e->action = source->accepted_action;
1625 }
1626 else
1627 {
1628 source->accepted_action = 0;
1629 e->action = source->action;
1630 }
1631 ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
1632 }
1633 else if (ev->type == ECORE_X_ATOM_NET_WM_STATE)
1634 {
1635 Ecore_X_Event_Window_State_Request *e;
1636
1637 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request))))
1638 return;
1639 e->win = ev->window;
1640 if (ev->data.data32[0] == 0)
1641 e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
1642 else if (ev->data.data32[0] == 1)
1643 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1644 else if (ev->data.data32[0] == 2)
1645 e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
1646 else
1647 {
1648 free(e);
1649 return;
1650 }
1651 e->state[0] = _ecore_xcb_netwm_window_state_get(ev->data.data32[1]);
1652 if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
1653 {
1654 /* FIXME */
1655 }
1656 e->state[1] = _ecore_xcb_netwm_window_state_get(ev->data.data32[2]);
1657 if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
1658 {
1659 /* FIXME */
1660 }
1661 e->source = ev->data.data32[3];
1662 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1663 }
1664#ifdef OLD_XCB_VERSION
1665 else if ((ev->type == ECORE_X_ATOM_WM_CHANGE_STATE) &&
1666 (ev->format == 32) && (ev->data.data32[0] == XCB_WM_STATE_ICONIC))
1667#else
1668 else if ((ev->type == ECORE_X_ATOM_WM_CHANGE_STATE) && (ev->format == 32) &&
1669 (ev->data.data32[0] == XCB_ICCCM_WM_STATE_ICONIC))
1670#endif
1671 {
1672 Ecore_X_Event_Window_State_Request *e;
1673
1674 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request))))
1675 return;
1676 e->win = ev->window;
1677 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1678 e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
1679 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1680 }
1681 else if ((ev->type == ECORE_X_ATOM_NET_WM_DESKTOP) && (ev->format == 32))
1682 {
1683 Ecore_X_Event_Desktop_Change *e;
1684
1685 if (!(e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change))))
1686 return;
1687 e->win = ev->window;
1688 e->desk = ev->data.data32[0];
1689 e->source = ev->data.data32[1];
1690 ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
1691 }
1692 else if (ev->type == ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS)
1693 {
1694 Ecore_X_Event_Frame_Extents_Request *e;
1695
1696 if (!(e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request))))
1697 return;
1698 e->win = ev->window;
1699 ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
1700 }
1701 else if ((ev->type == ECORE_X_ATOM_WM_PROTOCOLS) &&
1702 ((Ecore_X_Atom)ev->data.data32[0] == ECORE_X_ATOM_NET_WM_PING) &&
1703 (ev->format == 32))
1704 {
1705 Ecore_X_Event_Ping *e;
1706 Ecore_X_Window root = 0;
1707 int count = 0;
1708
1709 if (!(e = calloc(1, sizeof(Ecore_X_Event_Ping)))) return;
1710 e->win = ev->window;
1711 e->time = ev->data.data32[1];
1712 e->event_win = ev->data.data32[2];
1713 ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
1714
1715 CHECK_XCB_CONN;
1716
1717 count = xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
1718 if (count > 1)
1719 root = ecore_x_window_root_get(e->win);
1720 else
1721 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1722
1723 if (ev->window != root)
1724 {
1725 ev->window = root;
1726 xcb_send_event(_ecore_xcb_conn, 0, root,
1727 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
1728 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY),
1729 (const char *)&ev);
1730// ecore_x_flush();
1731 }
1732 }
1733 else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
1734 (ev->format == 8))
1735 {
1736 _ecore_xcb_netwm_startup_info_begin(ev->window, ev->data.data8[0]);
1737 }
1738 else if ((ev->type == ECORE_X_ATOM_NET_STARTUP_INFO) && (ev->format == 8))
1739 {
1740 _ecore_xcb_netwm_startup_info(ev->window, ev->data.data8[0]);
1741 }
1742 else if ((ev->type == 27777) && (ev->data.data32[0] == 0x7162534) &&
1743 (ev->format == 32)) // && (ev->window = _private_window))
1744 {
1745 if (ev->data.data32[1] == 0x10000001)
1746 _ecore_xcb_window_button_grab_remove(ev->data.data32[2]);
1747 else if (ev->data.data32[1] == 0x10000002)
1748 _ecore_xcb_window_key_grab_remove(ev->data.data32[2]);
1749 }
1750 else
1751 {
1752 Ecore_X_Event_Client_Message *e;
1753 int i = 0;
1754
1755 if (!(e = calloc(1, sizeof(Ecore_X_Event_Client_Message))))
1756 return;
1757
1758 e->win = ev->window;
1759 e->message_type = ev->type;
1760 e->format = ev->format;
1761 for (i = 0; i < 5; i++)
1762 e->data.l[i] = ev->data.data32[i];
1763 ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
1764 }
1765}
1766
1767static void
1768_ecore_xcb_event_handle_mapping_notify(xcb_generic_event_t *event)
1769{
1770 xcb_mapping_notify_event_t *ev;
1771 Ecore_X_Event_Mapping_Change *e;
1772
1773 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1774
1775 ev = (xcb_mapping_notify_event_t *)event;
1776 if (!(e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change)))) return;
1777
1778 _ecore_xcb_keymap_refresh(ev);
1779 _ecore_xcb_modifiers_get();
1780
1781 switch (ev->request)
1782 {
1783 case XCB_MAPPING_MODIFIER:
1784 e->type = ECORE_X_MAPPING_MODIFIER;
1785 break;
1786
1787 case XCB_MAPPING_KEYBOARD:
1788 e->type = ECORE_X_MAPPING_KEYBOARD;
1789 break;
1790
1791 case XCB_MAPPING_POINTER:
1792 default:
1793 e->type = ECORE_X_MAPPING_MOUSE;
1794 break;
1795 }
1796 e->keycode = ev->first_keycode;
1797 e->num = ev->count;
1798
1799 ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL);
1800}
1801
1802static void
1803_ecore_xcb_event_handle_damage_notify(xcb_generic_event_t *event)
1804{
1805#ifdef ECORE_XCB_DAMAGE
1806 xcb_damage_notify_event_t *ev;
1807 Ecore_X_Event_Damage *e;
1808#endif
1809
1810 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1811
1812 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1813#ifdef ECORE_XCB_DAMAGE
1814 ev = (xcb_damage_notify_event_t *)event;
1815 if (!(e = calloc(1, sizeof(Ecore_X_Event_Damage)))) return;
1816
1817 e->level = ev->level;
1818 e->drawable = ev->drawable;
1819 e->damage = ev->damage;
1820 e->time = ev->timestamp;
1821 e->area.x = ev->area.x;
1822 e->area.y = ev->area.y;
1823 e->area.width = ev->area.width;
1824 e->area.height = ev->area.height;
1825 e->geometry.x = ev->geometry.x;
1826 e->geometry.y = ev->geometry.y;
1827 e->geometry.width = ev->geometry.width;
1828 e->geometry.height = ev->geometry.height;
1829
1830 ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
1831#endif
1832}
1833
1834static void
1835_ecore_xcb_event_handle_randr_change(xcb_generic_event_t *event)
1836{
1837#ifdef ECORE_XCB_RANDR
1838 xcb_randr_screen_change_notify_event_t *ev;
1839 Ecore_X_Event_Screen_Change *e;
1840#endif
1841
1842 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1843#ifdef ECORE_XCB_RANDR
1844 ev = (xcb_randr_screen_change_notify_event_t *)event;
1845 if (!(e = calloc(1, sizeof(Ecore_X_Event_Screen_Change)))) return;
1846
1847 e->win = ev->request_window;
1848 e->root = ev->root;
1849 e->size.width = ev->width;
1850 e->size.height = ev->height;
1851 e->time = ev->timestamp;
1852 e->config_time = ev->config_timestamp;
1853 e->size.width_mm = ev->mwidth;
1854 e->size.height_mm = ev->mheight;
1855 e->orientation = ev->rotation;
1856 e->subpixel_order = ev->subpixel_order;
1857
1858 ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
1859#endif
1860}
1861
1862static void
1863_ecore_xcb_event_handle_randr_notify(xcb_generic_event_t *event)
1864{
1865#ifdef ECORE_XCB_RANDR
1866 xcb_randr_notify_event_t *ev;
1867#endif
1868
1869 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1870#ifdef ECORE_XCB_RANDR
1871 ev = (xcb_randr_notify_event_t *)event;
1872 switch (ev->subCode)
1873 {
1874 case XCB_RANDR_NOTIFY_CRTC_CHANGE:
1875 _ecore_xcb_event_handle_randr_crtc_change(event);
1876 break;
1877
1878 case XCB_RANDR_NOTIFY_OUTPUT_CHANGE:
1879 _ecore_xcb_event_handle_randr_output_change(event);
1880 break;
1881
1882 case XCB_RANDR_NOTIFY_OUTPUT_PROPERTY:
1883 _ecore_xcb_event_handle_randr_output_property_change(event);
1884 break;
1885
1886 default:
1887 break;
1888 }
1889#endif
1890}
1891
1892static void
1893_ecore_xcb_event_handle_randr_crtc_change(xcb_generic_event_t *event)
1894{
1895#ifdef ECORE_XCB_RANDR
1896 xcb_randr_notify_event_t *ev;
1897 Ecore_X_Event_Randr_Crtc_Change *e;
1898#endif
1899
1900#ifdef ECORE_XCB_RANDR
1901 ev = (xcb_randr_notify_event_t *)event;
1902 if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change))))
1903 return;
1904
1905 e->win = ev->u.cc.window;
1906 e->crtc = ev->u.cc.crtc;
1907 e->mode = ev->u.cc.mode;
1908 e->orientation = ev->u.cc.rotation;
1909 e->geo.x = ev->u.cc.x;
1910 e->geo.y = ev->u.cc.y;
1911 e->geo.w = ev->u.cc.width;
1912 e->geo.h = ev->u.cc.height;
1913
1914 ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
1915#endif
1916}
1917
1918static void
1919_ecore_xcb_event_handle_randr_output_change(xcb_generic_event_t *event)
1920{
1921#ifdef ECORE_XCB_RANDR
1922 xcb_randr_notify_event_t *ev;
1923 Ecore_X_Event_Randr_Output_Change *e;
1924#endif
1925
1926#ifdef ECORE_XCB_RANDR
1927 ev = (xcb_randr_notify_event_t *)event;
1928 if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change))))
1929 return;
1930
1931 e->win = ev->u.oc.window;
1932 e->output = ev->u.oc.output;
1933 e->crtc = ev->u.oc.crtc;
1934 e->mode = ev->u.oc.mode;
1935 e->orientation = ev->u.oc.rotation;
1936 e->connection = ev->u.oc.connection;
1937 e->subpixel_order = ev->u.oc.subpixel_order;
1938
1939 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
1940#endif
1941}
1942
1943static void
1944_ecore_xcb_event_handle_randr_output_property_change(xcb_generic_event_t *event)
1945{
1946#ifdef ECORE_XCB_RANDR
1947 xcb_randr_notify_event_t *ev;
1948 Ecore_X_Event_Randr_Output_Property_Notify *e;
1949#endif
1950
1951#ifdef ECORE_XCB_RANDR
1952 ev = (xcb_randr_notify_event_t *)event;
1953 if (!(e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify))))
1954 return;
1955
1956 e->win = ev->u.op.window;
1957 e->output = ev->u.op.output;
1958 e->property = ev->u.op.atom;
1959 e->time = ev->u.op.timestamp;
1960 if (ev->u.op.status == XCB_PROPERTY_NEW_VALUE)
1961 e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD;
1962 else
1963 e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL;
1964
1965 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
1966#endif
1967}
1968
1969static void
1970_ecore_xcb_event_handle_screensaver_notify(xcb_generic_event_t *event)
1971{
1972#ifdef ECORE_XCB_SCREENSAVER
1973 xcb_screensaver_notify_event_t *ev;
1974 Ecore_X_Event_Screensaver_Notify *e;
1975#endif
1976
1977 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
1978#ifdef ECORE_XCB_SCREENSAVER
1979 ev = (xcb_screensaver_notify_event_t *)event;
1980 if (!(e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify)))) return;
1981
1982 e->win = ev->window;
1983 e->on = EINA_FALSE;
1984 if (ev->state == XCB_SCREENSAVER_STATE_ON) e->on = EINA_TRUE;
1985 e->time = ev->time;
1986
1987 ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
1988#endif
1989}
1990
1991#ifdef ECORE_XCB_XGESTURE
1992static void
1993_ecore_xcb_event_handle_gesture_notify_flick(xcb_generic_event_t *event)
1994{
1995 xcb_gesture_notify_flick_event_t *ev;
1996 Ecore_X_Event_Gesture_Notify_Flick *e;
1997
1998 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1999 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2000 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2001
2002 ev = (xcb_gesture_notify_flick_event_t *)event;
2003 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Flick)))) return;
2004
2005 e->win = ev->window;
2006 e->time = ev->time;
2007 e->subtype = ev->kind;
2008 e->num_fingers = ev->num_finger;
2009 e->distance = ev->distance;
2010 e->duration = ev->duration;
2011 e->direction = ev->direction;
2012 e->angle = XFixedToDouble(ev->angle);
2013
2014 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_FLICK, e, NULL, NULL);
2015}
2016
2017static void
2018_ecore_xcb_event_handle_gesture_notify_pan(xcb_generic_event_t *event)
2019{
2020 xcb_gesture_notify_pan_event_t *ev;
2021 Ecore_X_Event_Gesture_Notify_Pan *e;
2022
2023 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2024 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2025 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2026
2027 ev = (xcb_gesture_notify_pan_event_t *)event;
2028 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Pan)))) return;
2029
2030 e->win = ev->window;
2031 e->time = ev->time;
2032 e->subtype = ev->kind;
2033 e->num_fingers = ev->num_finger;
2034 e->dx = ev->dx;
2035 e->dy = ev->dy;
2036 e->distance = ev->distance;
2037 e->duration = ev->duration;
2038 e->direction = ev->direction;
2039
2040 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PAN, e, NULL, NULL);
2041}
2042
2043static void
2044_ecore_xcb_event_handle_gesture_notify_pinchrotation(xcb_generic_event_t *event)
2045{
2046 xcb_gesture_notify_pinch_rotation_event_t *ev;
2047 Ecore_X_Event_Gesture_Notify_PinchRotation *e;
2048
2049 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2050 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2051 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2052
2053 ev = (xcb_gesture_notify_pinch_rotation_event_t *)event;
2054 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_PinchRotation)))) return;
2055
2056 e->win = ev->window;
2057 e->time = ev->time;
2058 e->subtype = ev->kind;
2059 e->num_fingers = ev->num_finger;
2060 e->distance = ev->distance;
2061 e->cx = ev->cx;
2062 e->cy = ev->cy;
2063 e->zoom = XFixedToDouble(ev->zoom);
2064 e->angle = XFixedToDouble(ev->angle);
2065
2066 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION, e, NULL, NULL);
2067}
2068
2069static void
2070_ecore_xcb_event_handle_gesture_notify_tap(xcb_generic_event_t *event)
2071{
2072 xcb_gesture_notify_tap_event_t *ev;
2073 Ecore_X_Event_Gesture_Notify_Tap *e;
2074
2075 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2076 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2077 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2078
2079 ev = (xcb_gesture_notify_tap_event_t *)event;
2080 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Tap)))) return;
2081
2082 e->win = ev->window;
2083 e->time = ev->time;
2084 e->subtype = ev->kind;
2085 e->num_fingers = ev->num_finger;
2086 e->cx = ev->cx;
2087 e->cy = ev->cy;
2088 e->tap_repeat = ev->tap_repeat;
2089 e->interval = ev->interval;
2090
2091 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAP, e, NULL, NULL);
2092}
2093
2094static void
2095_ecore_xcb_event_handle_gesture_notify_tapnhold(xcb_generic_event_t *event)
2096{
2097 xcb_gesture_notify_tap_n_hold_event_t *ev;
2098 Ecore_X_Event_Gesture_Notify_TapNHold *e;
2099
2100 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2101 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2102 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2103
2104 ev = (xcb_gesture_notify_tap_n_hold_event_t *)event;
2105 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_TapNHold)))) return;
2106
2107 e->win = ev->window;
2108 e->time = ev->time;
2109 e->subtype = ev->kind;
2110 e->num_fingers = ev->num_finger;
2111 e->cx = ev->cx;
2112 e->cy = ev->cy;
2113 e->interval = ev->interval;
2114 e->hold_time = ev->holdtime;
2115
2116 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD, e, NULL, NULL);
2117}
2118
2119static void
2120 _ecore_xcb_event_handle_gesture_notify_hold(xcb_generic_event_t *event)
2121{
2122 xcb_gesture_notify_hold_event_t *ev;
2123 Ecore_X_Event_Gesture_Notify_Hold *e;
2124
2125 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2126 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2127 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2128
2129 ev = (xcb_gesture_notify_hold_event_t *)event;
2130 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Hold)))) return;
2131
2132 e->win = ev->window;
2133 e->time = ev->time;
2134 e->subtype = ev->kind;
2135 e->num_fingers = ev->num_finger;
2136 e->cx = ev->cx;
2137 e->cy = ev->cy;
2138 e->hold_time = ev->holdtime;
2139
2140 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_HOLD, e, NULL, NULL);
2141}
2142
2143static void
2144 _ecore_xcb_event_handle_gesture_notify_group(xcb_generic_event_t *event)
2145{
2146 xcb_gesture_notify_group_event_t *ev;
2147 Ecore_X_Event_Gesture_Notify_Group *e;
2148
2149 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2150 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2151 fprintf(stderr, "[ECORE_XCB][%s]...\n", __FUNCTION__);
2152
2153 ev = (xcb_gesture_notify_group_event_t *)event;
2154 if (!(e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Group)))) return;
2155
2156 e->win = ev->window;
2157 e->time = ev->time;
2158 e->subtype = ev->kind;
2159 e->num_groups = ev->num_group;
2160 e->group_id = ev->groupid;
2161
2162 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_GROUP, e, NULL, NULL);
2163}
2164#endif
2165
2166#ifdef ECORE_XCB_SHAPE
2167static void
2168_ecore_xcb_event_handle_shape_change(xcb_generic_event_t *event)
2169{
2170 xcb_shape_notify_event_t *ev;
2171 Ecore_X_Event_Window_Shape *e;
2172
2173 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2174 ev = (xcb_shape_notify_event_t *)event;
2175 if (!(e = calloc(1, sizeof(Ecore_X_Event_Window_Shape)))) return;
2176
2177 e->win = ev->affected_window;
2178 e->time = ev->server_time;
2179 switch (ev->shape_kind)
2180 {
2181 case XCB_SHAPE_SK_BOUNDING:
2182 e->type = ECORE_X_SHAPE_BOUNDING;
2183 break;
2184
2185 case XCB_SHAPE_SK_CLIP:
2186 e->type = ECORE_X_SHAPE_CLIP;
2187 break;
2188
2189 case XCB_SHAPE_SK_INPUT:
2190 e->type = ECORE_X_SHAPE_INPUT;
2191 break;
2192
2193 default:
2194 break;
2195 }
2196 e->x = ev->extents_x;
2197 e->y = ev->extents_y;
2198 e->w = ev->extents_width;
2199 e->h = ev->extents_height;
2200 e->shaped = ev->shaped;
2201
2202 ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
2203}
2204
2205#endif
2206
2207static void
2208_ecore_xcb_event_handle_sync_counter(xcb_generic_event_t *event)
2209{
2210#ifdef ECORE_XCB_SYNC
2211 xcb_sync_counter_notify_event_t *ev;
2212 Ecore_X_Event_Sync_Counter *e;
2213#endif
2214
2215 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2216
2217#ifdef ECORE_XCB_SYNC
2218 ev = (xcb_sync_counter_notify_event_t *)event;
2219 if (!(e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter)))) return;
2220
2221 e->time = ev->timestamp;
2222
2223 ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
2224#endif
2225}
2226
2227static void
2228_ecore_xcb_event_handle_sync_alarm(xcb_generic_event_t *event)
2229{
2230#ifdef ECORE_XCB_SYNC
2231 xcb_sync_alarm_notify_event_t *ev;
2232 Ecore_X_Event_Sync_Alarm *e;
2233#endif
2234
2235 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2236#ifdef ECORE_XCB_SYNC
2237 ev = (xcb_sync_alarm_notify_event_t *)event;
2238 if (!(e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm)))) return;
2239
2240 e->time = ev->timestamp;
2241 e->alarm = ev->alarm;
2242
2243 ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
2244#endif
2245}
2246
2247static void
2248_ecore_xcb_event_handle_xfixes_selection_notify(xcb_generic_event_t *event)
2249{
2250#ifdef ECORE_XCB_XFIXES
2251 Ecore_X_Event_Fixes_Selection_Notify *e;
2252 Ecore_X_Atom sel;
2253 xcb_xfixes_selection_notify_event_t *ev;
2254#endif
2255
2256 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2257#ifdef ECORE_XCB_XFIXES
2258 ev = (xcb_xfixes_selection_notify_event_t *)event;
2259
2260 if (!(e = calloc(1, sizeof(*e)))) return;
2261
2262 e->win = ev->window;
2263 e->owner = ev->owner;
2264 e->time = ev->timestamp;
2265 e->selection_time = ev->selection_timestamp;
2266 e->atom = sel = ev->selection;
2267 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
2268 e->selection = ECORE_X_SELECTION_PRIMARY;
2269 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
2270 e->selection = ECORE_X_SELECTION_SECONDARY;
2271 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
2272 e->selection = ECORE_X_SELECTION_CLIPBOARD;
2273 else
2274 e->selection = ECORE_X_SELECTION_OTHER;
2275 e->reason = ev->subtype;
2276
2277 ecore_event_add(ECORE_X_EVENT_FIXES_SELECTION_NOTIFY, e, NULL, NULL);
2278#endif
2279}
2280
2281static void
2282_ecore_xcb_event_handle_xfixes_cursor_notify(xcb_generic_event_t *event __UNUSED__)
2283{
2284 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2285// FIXME: TBD
2286}
2287
2288static void
2289_ecore_xcb_event_handle_generic_event(xcb_generic_event_t *event)
2290{
2291 xcb_ge_event_t *ev;
2292 Ecore_X_Event_Generic *e;
2293
2294 ev = (xcb_ge_event_t *)event;
2295
2296 /* pad0 *IS* extension - bug in xcb */
2297 if (ev->pad0 == _ecore_xcb_event_input)
2298 {
2299 _ecore_xcb_event_handle_input_event(event);
2300// FIXME: should we generate generic events as WELL as input events?
2301// return;
2302 }
2303
2304 if (!(e = calloc(1, sizeof(Ecore_X_Event_Generic))))
2305 return;
2306
2307 DBG("Handle Generic Event: %d", ev->event_type);
2308
2309 e->cookie = ev->sequence;
2310 /* NB: These are bugs in xcb ge_event structure. The struct should have a
2311 * field for extension & data, but does not.
2312 *
2313 * XCB people have been notified of this issue */
2314 e->extension = ev->pad0;
2315 /* e->data = ev->pad1; */
2316 if (ev->length > 0)
2317 {
2318 int len = ev->length * sizeof(int);
2319 e->data = malloc(len);
2320 if (e->data) memcpy(e->data, &(event[1]), len);
2321 }
2322
2323 e->evtype = ev->event_type;
2324
2325 ecore_event_add(ECORE_X_EVENT_GENERIC, e,
2326 _ecore_xcb_event_generic_event_free, e->data);
2327}
2328
2329static void
2330_ecore_xcb_event_handle_input_event(xcb_generic_event_t *event)
2331{
2332 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2333
2334 _ecore_xcb_input_handle_event(event);
2335}
2336
2337static void
2338_ecore_xcb_event_key_press(xcb_generic_event_t *event)
2339{
2340 Ecore_Event_Key *e;
2341 xcb_keysym_t sym = XCB_NO_SYMBOL;
2342 xcb_keycode_t keycode = 0;
2343 xcb_key_press_event_t *xevent;
2344 char *keyname = NULL, *key = NULL;
2345 char *compose = NULL;
2346 char compose_buffer[256];
2347 int val = 0;
2348
2349 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2350
2351 xevent = (xcb_key_press_event_t *)event;
2352 keycode = xevent->detail;
2353
2354 sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, xevent->state);
2355 keyname = _ecore_xcb_keymap_keysym_to_string(sym);
2356 if (!keyname)
2357 {
2358 char buff[256];
2359
2360 snprintf(buff, sizeof(buff), "Keycode-%i", keycode);
2361 keyname = buff;
2362 }
2363
2364 val =
2365 _ecore_xcb_keymap_lookup_string(keycode, xevent->state, compose_buffer,
2366 sizeof(compose_buffer), &sym);
2367 if (val > 0)
2368 {
2369 compose_buffer[val] = 0;
2370 compose =
2371 eina_str_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
2372 if (!compose)
2373 ERR("Ecore_X cannot convert input key string '%s' to UTF-8. "
2374 "Is Eina built with iconv support?", compose_buffer);
2375 }
2376
2377 key = _ecore_xcb_keymap_keysym_to_string(sym);
2378 if (!key) key = keyname;
2379
2380 e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
2381 (compose ? strlen(compose) : 0) + 3);
2382 if (e)
2383 {
2384 e->keyname = (char *)(e + 1);
2385 e->key = e->keyname + strlen(keyname) + 1;
2386
2387 e->compose = NULL;
2388 if (compose) e->compose = (e->key + strlen(key) + 1);
2389 e->string = e->compose;
2390
2391 strcpy((char *)e->keyname, keyname);
2392 strcpy((char *)e->key, key);
2393 if (compose) strcpy((char *)e->compose, compose);
2394
2395 e->modifiers = _ecore_xcb_events_modifiers_get(xevent->state);
2396 e->timestamp = xevent->time;
2397 e->window = xevent->child ? xevent->child : xevent->event;
2398 e->event_window = xevent->event;
2399 e->same_screen = xevent->same_screen;
2400 e->root_window = xevent->root;
2401
2402 DBG("Sending Key Down Event: %s", e->keyname);
2403 ecore_event_add(ECORE_EVENT_KEY_DOWN, e, NULL, NULL);
2404 }
2405 _ecore_xcb_event_last_time = xevent->time;
2406}
2407
2408static void
2409_ecore_xcb_event_key_release(xcb_generic_event_t *event)
2410{
2411 Ecore_Event_Key *e;
2412 xcb_keysym_t sym = XCB_NO_SYMBOL;
2413 xcb_keycode_t keycode = 0;
2414 xcb_key_release_event_t *xevent;
2415 char *keyname = NULL, *key = NULL;
2416 char *compose = NULL;
2417 char compose_buffer[256];
2418 int val = 0;
2419
2420 _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2421
2422 xevent = (xcb_key_release_event_t *)event;
2423 keycode = xevent->detail;
2424
2425 sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, xevent->state);
2426 keyname = _ecore_xcb_keymap_keysym_to_string(sym);
2427 if (!keyname)
2428 {
2429 char buff[256];
2430
2431 snprintf(buff, sizeof(buff), "Keycode-%i", keycode);
2432 keyname = buff;
2433 }
2434
2435 val =
2436 _ecore_xcb_keymap_lookup_string(keycode, xevent->state, compose_buffer,
2437 sizeof(compose_buffer), &sym);
2438 if (val > 0)
2439 {
2440 compose_buffer[val] = 0;
2441 compose =
2442 eina_str_convert(nl_langinfo(CODESET), "UTF-8", compose_buffer);
2443// tmp = compose;
2444 }
2445
2446 key = _ecore_xcb_keymap_keysym_to_string(sym);
2447 if (!key) key = keyname;
2448
2449 e = malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
2450 (compose ? strlen(compose) : 0) + 3);
2451 if (e)
2452 {
2453 e->keyname = (char *)(e + 1);
2454 e->key = e->keyname + strlen(keyname) + 1;
2455
2456 e->compose = NULL;
2457 if (compose) e->compose = (e->key + strlen(key) + 1);
2458 e->string = e->compose;
2459
2460 strcpy((char *)e->keyname, keyname);
2461 strcpy((char *)e->key, key);
2462 if (compose) strcpy((char *)e->compose, compose);
2463
2464 e->modifiers = _ecore_xcb_events_modifiers_get(xevent->state);
2465 e->timestamp = xevent->time;
2466 e->window = xevent->child ? xevent->child : xevent->event;
2467 e->event_window = xevent->event;
2468 e->same_screen = xevent->same_screen;
2469 e->root_window = xevent->root;
2470
2471 ecore_event_add(ECORE_EVENT_KEY_UP, e, NULL, NULL);
2472 }
2473 _ecore_xcb_event_last_time = xevent->time;
2474}
2475
2476void
2477_ecore_xcb_event_mouse_move(uint16_t timestamp,
2478 uint16_t modifiers,
2479 int16_t x,
2480 int16_t y,
2481 int16_t root_x,
2482 int16_t root_y,
2483 xcb_window_t event_win,
2484 xcb_window_t win,
2485 xcb_window_t root_win,
2486 uint8_t same_screen,
2487 int dev,
2488 double radx,
2489 double rady,
2490 double pressure,
2491 double angle,
2492 int16_t mx,
2493 int16_t my,
2494 int16_t mrx,
2495 int16_t mry)
2496{
2497 Ecore_Event_Mouse_Move *e;
2498 Ecore_Event *event;
2499
2500 if (!(e = malloc(sizeof(Ecore_Event_Mouse_Move)))) return;
2501
2502 e->window = win;
2503 e->root_window = root_win;
2504 e->timestamp = timestamp;
2505 e->same_screen = same_screen;
2506 e->event_window = event_win;
2507 e->modifiers = _ecore_xcb_events_modifiers_get(modifiers);
2508 e->x = x;
2509 e->y = y;
2510 e->root.x = root_x;
2511 e->root.y = root_y;
2512 e->multi.device = dev;
2513 e->multi.radius = ((radx + rady) / 2);
2514 e->multi.radius_x = radx;
2515 e->multi.radius_y = rady;
2516 e->multi.pressure = pressure;
2517 e->multi.angle = angle;
2518 e->multi.x = mx;
2519 e->multi.y = my;
2520 e->multi.root.x = mrx;
2521 e->multi.root.y = mry;
2522
2523 event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE, e,
2524 _ecore_xcb_event_mouse_move_free, NULL);
2525
2526 _ecore_xcb_event_last_time = e->timestamp;
2527 _ecore_xcb_event_last_window = e->window;
2528 _ecore_xcb_event_last_root_x = root_x;
2529 _ecore_xcb_event_last_root_y = root_y;
2530// _ecore_xcb_event_last_mouse_move_event = event;
2531}
2532
2533static void
2534_ecore_xcb_event_mouse_move_free(void *data __UNUSED__,
2535 void *event)
2536{
2537 Ecore_Event_Mouse_Move *ev;
2538
2539 ev = event;
2540// if (_ecore_xcb_event_last_mouse_move_event)
2541// {
2542// _ecore_xcb_event_last_mouse_move = EINA_FALSE;
2543// _ecore_xcb_event_last_mouse_move_event = NULL;
2544// }
2545 if (ev) free(ev);
2546}
2547
2548Ecore_Event_Mouse_Button *
2549_ecore_xcb_event_mouse_button(int event,
2550 uint16_t timestamp,
2551 uint16_t modifiers,
2552 xcb_button_t buttons,
2553 int16_t x,
2554 int16_t y,
2555 int16_t root_x,
2556 int16_t root_y,
2557 xcb_window_t event_win,
2558 xcb_window_t win,
2559 xcb_window_t root_win,
2560 uint8_t same_screen,
2561 int dev,
2562 double radx,
2563 double rady,
2564 double pressure,
2565 double angle,
2566 int16_t mx,
2567 int16_t my,
2568 int16_t mrx,
2569 int16_t mry)
2570{
2571 Ecore_Event_Mouse_Button *e;
2572 Ecore_X_Mouse_Down_Info *info = NULL;
2573
2574 if (!(e = malloc(sizeof(Ecore_Event_Mouse_Button)))) return NULL;
2575
2576 e->window = win;
2577 e->root_window = root_win;
2578 e->timestamp = timestamp;
2579 e->same_screen = same_screen;
2580 e->event_window = event_win;
2581 e->buttons = buttons;
2582 e->modifiers = _ecore_xcb_events_modifiers_get(modifiers);
2583 e->double_click = 0;
2584 e->triple_click = 0;
2585 e->x = x;
2586 e->y = y;
2587 e->root.x = root_x;
2588 e->root.y = root_y;
2589
2590 if ((info = _ecore_xcb_event_mouse_down_info_get(dev)))
2591 {
2592 if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
2593 (info->did_triple))
2594 {
2595 info->last_win = 0;
2596 info->last_last_win = 0;
2597 info->last_event_win = 0;
2598 info->last_time = 0;
2599 info->last_last_time = 0;
2600 }
2601 if (event_win == win)
2602 {
2603 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
2604 {
2605 if (((int)(timestamp - info->last_time) <=
2606 (int)(1000 * _ecore_xcb_double_click_time)) &&
2607 (win == info->last_win) &&
2608 (event_win == info->last_event_win))
2609 {
2610 e->double_click = 1;
2611 info->did_double = EINA_TRUE;
2612 }
2613 else
2614 {
2615 info->did_double = EINA_FALSE;
2616 info->did_triple = EINA_FALSE;
2617 }
2618 if (((int)(timestamp - info->last_last_time) <=
2619 (int)(2 * 1000 * _ecore_xcb_double_click_time)) &&
2620 (win == info->last_win) &&
2621 (win == info->last_last_win) &&
2622 (event_win == info->last_event_win) &&
2623 (event_win == info->last_last_event_win))
2624 {
2625 e->triple_click = 1;
2626 info->did_triple = EINA_TRUE;
2627 }
2628 else
2629 info->did_triple = EINA_FALSE;
2630 }
2631 else
2632 {
2633 if (info->did_double) e->double_click = 1;
2634 if (info->did_triple) e->triple_click = 1;
2635 }
2636 }
2637 }
2638
2639 /* NB: Comment out right now because _ecore_xcb_mouse_up_count is
2640 * only used here...nowhere else in the code */
2641
2642 /* if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) && */
2643 /* (!e->double_click) && (!e->triple_click)) */
2644 /* _ecore_xcb_mouse_up_count = 0; */
2645
2646 e->multi.device = dev;
2647 e->multi.radius = ((radx + rady) / 2);
2648 e->multi.radius_x = radx;
2649 e->multi.radius_y = rady;
2650 e->multi.pressure = pressure;
2651 e->multi.angle = angle;
2652 e->multi.x = mx;
2653 e->multi.y = my;
2654 e->multi.root.x = mrx;
2655 e->multi.root.y = mry;
2656
2657 _ecore_xcb_event_last_time = e->timestamp;
2658 _ecore_xcb_event_last_window = e->window;
2659 _ecore_xcb_event_last_root_x = root_x;
2660 _ecore_xcb_event_last_root_y = root_y;
2661
2662 ecore_event_add(event, e, NULL, NULL);
2663
2664 if ((info) && (event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
2665 (win == event_win) && (!info->did_triple))
2666 {
2667 info->last_last_win = info->last_win;
2668 info->last_win = win;
2669 info->last_last_event_win = info->last_event_win;
2670 info->last_event_win = event_win;
2671 info->last_last_time = info->last_time;
2672 info->last_time = timestamp;
2673 }
2674
2675 return e;
2676}
2677
2678static Ecore_X_Event_Mode
2679_ecore_xcb_event_mode_get(uint8_t mode)
2680{
2681 switch (mode)
2682 {
2683 case XCB_NOTIFY_MODE_NORMAL:
2684 return ECORE_X_EVENT_MODE_NORMAL;
2685
2686 case XCB_NOTIFY_MODE_WHILE_GRABBED:
2687 return ECORE_X_EVENT_MODE_WHILE_GRABBED;
2688
2689 case XCB_NOTIFY_MODE_GRAB:
2690 return ECORE_X_EVENT_MODE_GRAB;
2691
2692 case XCB_NOTIFY_MODE_UNGRAB:
2693 return ECORE_X_EVENT_MODE_UNGRAB;
2694
2695 default:
2696 return ECORE_X_EVENT_MODE_NORMAL;
2697 }
2698}
2699
2700static Ecore_X_Event_Detail
2701_ecore_xcb_event_detail_get(uint8_t detail)
2702{
2703 switch (detail)
2704 {
2705 case XCB_NOTIFY_DETAIL_ANCESTOR:
2706 return ECORE_X_EVENT_DETAIL_ANCESTOR;
2707
2708 case XCB_NOTIFY_DETAIL_VIRTUAL:
2709 return ECORE_X_EVENT_DETAIL_VIRTUAL;
2710
2711 case XCB_NOTIFY_DETAIL_INFERIOR:
2712 return ECORE_X_EVENT_DETAIL_INFERIOR;
2713
2714 case XCB_NOTIFY_DETAIL_NONLINEAR:
2715 return ECORE_X_EVENT_DETAIL_NON_LINEAR;
2716
2717 case XCB_NOTIFY_DETAIL_NONLINEAR_VIRTUAL:
2718 return ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
2719
2720 case XCB_NOTIFY_DETAIL_POINTER:
2721 return ECORE_X_EVENT_DETAIL_POINTER;
2722
2723 case XCB_NOTIFY_DETAIL_POINTER_ROOT:
2724 return ECORE_X_EVENT_DETAIL_POINTER_ROOT;
2725
2726 case XCB_NOTIFY_DETAIL_NONE:
2727 default:
2728 return ECORE_X_EVENT_DETAIL_ANCESTOR;
2729 }
2730}
2731
2732static void
2733_ecore_xcb_event_xdnd_enter_free(void *data __UNUSED__,
2734 void *event)
2735{
2736 Ecore_X_Event_Xdnd_Enter *e;
2737 int i = 0;
2738
2739 e = event;
2740 for (i = 0; i < e->num_types; i++)
2741 free(e->types[i]);
2742 free(e->types);
2743 free(e);
2744}
2745
2746static void
2747_ecore_xcb_event_selection_notify_free(void *data __UNUSED__,
2748 void *event)
2749{
2750 Ecore_X_Event_Selection_Notify *e;
2751 Ecore_X_Selection_Data *sel;
2752
2753 e = event;
2754 if (!(sel = e->data)) return;
2755 if (sel->free) sel->free(sel);
2756 free(e->target);
2757 free(e);
2758}
2759
2760static void
2761_ecore_xcb_event_generic_event_free(void *data,
2762 void *event)
2763{
2764 Ecore_X_Event_Generic *e;
2765
2766 e = (Ecore_X_Event_Generic *)event;
2767 if (e->data) free(data);
2768 free(e);
2769}
2770
2771static void
2772_ecore_xcb_event_mouse_down_info_clear(void)
2773{
2774 Eina_Inlist *l;
2775 Ecore_X_Mouse_Down_Info *info = NULL;
2776
2777 l = _ecore_xcb_mouse_down_info_list;
2778 while (l)
2779 {
2780 info = EINA_INLIST_CONTAINER_GET(l, Ecore_X_Mouse_Down_Info);
2781 l = eina_inlist_remove(l, l);
2782 free(info);
2783 }
2784 _ecore_xcb_mouse_down_info_list = NULL;
2785}
2786
2787static Ecore_X_Mouse_Down_Info *
2788_ecore_xcb_event_mouse_down_info_get(int dev)
2789{
2790 Eina_Inlist *l;
2791 Ecore_X_Mouse_Down_Info *info = NULL;
2792
2793 l = _ecore_xcb_mouse_down_info_list;
2794 EINA_INLIST_FOREACH(l, info)
2795 if (info->dev == dev) return info;
2796
2797 if (!(info = calloc(1, sizeof(Ecore_X_Mouse_Down_Info)))) return NULL;
2798
2799 info->dev = dev;
2800 l = eina_inlist_append(l, (Eina_Inlist *)info);
2801 _ecore_xcb_mouse_down_info_list = l;
2802
2803 return info;
2804}
2805
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_extensions.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_extensions.c
new file mode 100644
index 0000000..40c10ac
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_extensions.c
@@ -0,0 +1,148 @@
1#include "ecore_xcb_private.h"
2
3void
4_ecore_xcb_extensions_init(void)
5{
6 LOGFN(__FILE__, __LINE__, __FUNCTION__);
7
8 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_big_requests_id);
9 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_shm_id);
10
11#ifdef ECORE_XCB_SHAPE
12 _ecore_xcb_shape_init();
13#endif
14
15#ifdef ECORE_XCB_SCREENSAVER
16 _ecore_xcb_screensaver_init();
17#endif
18
19#ifdef ECORE_XCB_SYNC
20 _ecore_xcb_sync_init();
21#endif
22
23#ifdef ECORE_XCB_RANDR
24 _ecore_xcb_randr_init();
25#endif
26
27#ifdef ECORE_XCB_XFIXES
28 _ecore_xcb_xfixes_init();
29#endif
30
31#ifdef ECORE_XCB_DAMAGE
32 _ecore_xcb_damage_init();
33#endif
34
35#ifdef ECORE_XCB_RENDER
36 _ecore_xcb_render_init();
37#endif
38
39#ifdef ECORE_XCB_COMPOSITE
40 _ecore_xcb_composite_init();
41#endif
42
43#ifdef ECORE_XCB_DPMS
44 _ecore_xcb_dpms_init();
45#endif
46
47#ifdef ECORE_XCB_DPMS
48 _ecore_xcb_dpms_init();
49#endif
50
51#ifdef ECORE_XCB_CURSOR
52 _ecore_xcb_cursor_init();
53#endif
54
55#ifdef ECORE_XCB_XINERAMA
56 _ecore_xcb_xinerama_init();
57#endif
58
59#ifdef ECORE_XCB_XINPUT
60 _ecore_xcb_input_init();
61#endif
62
63#ifdef ECORE_XCB_GESTURE
64 _ecore_xcb_gesture_init();
65#endif
66
67/* #ifdef ECORE_XCB_DRI */
68/* _ecore_xcb_dri_init(); */
69/* #endif */
70
71#ifdef ECORE_XCB_XTEST
72 _ecore_xcb_xtest_init();
73#endif
74
75 xcb_prefetch_maximum_request_length(_ecore_xcb_conn);
76}
77
78void
79_ecore_xcb_extensions_finalize(void)
80{
81 LOGFN(__FILE__, __LINE__, __FUNCTION__);
82
83 xcb_get_extension_data(_ecore_xcb_conn, &xcb_big_requests_id);
84 xcb_get_extension_data(_ecore_xcb_conn, &xcb_shm_id);
85
86#ifdef ECORE_XCB_SHAPE
87 _ecore_xcb_shape_finalize();
88#endif
89
90#ifdef ECORE_XCB_SCREENSAVER
91 _ecore_xcb_screensaver_finalize();
92#endif
93
94#ifdef ECORE_XCB_SYNC
95 _ecore_xcb_sync_finalize();
96#endif
97
98#ifdef ECORE_XCB_RANDR
99 _ecore_xcb_randr_finalize();
100#endif
101
102#ifdef ECORE_XCB_XFIXES
103 _ecore_xcb_xfixes_finalize();
104#endif
105
106#ifdef ECORE_XCB_DAMAGE
107 _ecore_xcb_damage_finalize();
108#endif
109
110#ifdef ECORE_XCB_RENDER
111 _ecore_xcb_render_finalize();
112#endif
113
114#ifdef ECORE_XCB_COMPOSITE
115 _ecore_xcb_composite_finalize();
116#endif
117
118#ifdef ECORE_XCB_DPMS
119 _ecore_xcb_dpms_finalize();
120#endif
121
122#ifdef ECORE_XCB_CURSOR
123 _ecore_xcb_cursor_finalize();
124#endif
125
126#ifdef ECORE_XCB_XINERAMA
127 _ecore_xcb_xinerama_finalize();
128#endif
129
130#ifdef ECORE_XCB_XINPUT
131 _ecore_xcb_input_finalize();
132#endif
133
134#ifdef ECORE_XCB_GESTURE
135 _ecore_xcb_gesture_finalize();
136#endif
137
138/* #ifdef ECORE_XCB_DRI */
139/* _ecore_xcb_dri_finalize(); */
140/* #endif */
141
142#ifdef ECORE_XCB_XTEST
143 _ecore_xcb_xtest_finalize();
144#endif
145
146 xcb_get_maximum_request_length(_ecore_xcb_conn);
147}
148
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c
new file mode 100644
index 0000000..d811b54
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gc.c
@@ -0,0 +1,173 @@
1#include "ecore_xcb_private.h"
2
3/**
4 * Creates a new default graphics context associated with the given
5 * drawable.
6 * @param draw Drawable to create graphics context with. If @c 0 is
7 * given instead, the default root window is used.
8 * @param value_mask Bitmask values.
9 * @param value_list List of values. The order of values must be the
10 * same than the corresponding bitmaks.
11 * @return The new default graphics context.
12 */
13EAPI Ecore_X_GC
14ecore_x_gc_new(Ecore_X_Drawable drawable,
15 Ecore_X_GC_Value_Mask value_mask,
16 const unsigned int *value_list)
17{
18 xcb_gcontext_t gc;
19 uint32_t vmask = 0;
20 int i = 0, mask = 0;
21
22 LOGFN(__FILE__, __LINE__, __FUNCTION__);
23 CHECK_XCB_CONN;
24
25 if (!drawable) drawable = ((xcb_screen_t *)_ecore_xcb_screen)->root;
26
27 for (i = 0, mask = 1; i <= 22; i++, mask <<= 1)
28 {
29 switch (mask & value_mask)
30 {
31 case ECORE_X_GC_VALUE_MASK_FUNCTION:
32 vmask |= XCB_GC_FUNCTION;
33 break;
34
35 case ECORE_X_GC_VALUE_MASK_PLANE_MASK:
36 vmask |= XCB_GC_PLANE_MASK;
37 break;
38
39 case ECORE_X_GC_VALUE_MASK_FOREGROUND:
40 vmask |= XCB_GC_FOREGROUND;
41 break;
42
43 case ECORE_X_GC_VALUE_MASK_BACKGROUND:
44 vmask |= XCB_GC_BACKGROUND;
45 break;
46
47 case ECORE_X_GC_VALUE_MASK_LINE_WIDTH:
48 vmask |= XCB_GC_LINE_WIDTH;
49 break;
50
51 case ECORE_X_GC_VALUE_MASK_LINE_STYLE:
52 vmask |= XCB_GC_LINE_STYLE;
53 break;
54
55 case ECORE_X_GC_VALUE_MASK_CAP_STYLE:
56 vmask |= XCB_GC_CAP_STYLE;
57 break;
58
59 case ECORE_X_GC_VALUE_MASK_JOIN_STYLE:
60 vmask |= XCB_GC_JOIN_STYLE;
61 break;
62
63 case ECORE_X_GC_VALUE_MASK_FILL_STYLE:
64 vmask |= XCB_GC_FILL_STYLE;
65 break;
66
67 case ECORE_X_GC_VALUE_MASK_FILL_RULE:
68 vmask |= XCB_GC_FILL_RULE;
69 break;
70
71 case ECORE_X_GC_VALUE_MASK_TILE:
72 vmask |= XCB_GC_TILE;
73 break;
74
75 case ECORE_X_GC_VALUE_MASK_STIPPLE:
76 vmask |= XCB_GC_STIPPLE;
77 break;
78
79 case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X:
80 vmask |= XCB_GC_TILE_STIPPLE_ORIGIN_X;
81 break;
82
83 case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y:
84 vmask |= XCB_GC_TILE_STIPPLE_ORIGIN_Y;
85 break;
86
87 case ECORE_X_GC_VALUE_MASK_FONT:
88 vmask |= XCB_GC_FONT;
89 break;
90
91 case ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE:
92 vmask |= XCB_GC_SUBWINDOW_MODE;
93 break;
94
95 case ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES:
96 vmask |= XCB_GC_GRAPHICS_EXPOSURES;
97 break;
98
99 case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X:
100 vmask |= XCB_GC_CLIP_ORIGIN_X;
101 break;
102
103 case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y:
104 vmask |= XCB_GC_CLIP_ORIGIN_Y;
105 break;
106
107 case ECORE_X_GC_VALUE_MASK_CLIP_MASK:
108 vmask |= XCB_GC_CLIP_MASK;
109 break;
110
111 case ECORE_X_GC_VALUE_MASK_DASH_OFFSET:
112 vmask |= XCB_GC_DASH_OFFSET;
113 break;
114
115 case ECORE_X_GC_VALUE_MASK_DASH_LIST:
116 vmask |= XCB_GC_DASH_LIST;
117 break;
118
119 case ECORE_X_GC_VALUE_MASK_ARC_MODE:
120 vmask |= XCB_GC_ARC_MODE;
121 break;
122 }
123 }
124
125 gc = xcb_generate_id(_ecore_xcb_conn);
126 xcb_create_gc(_ecore_xcb_conn, gc, drawable, vmask, value_list);
127
128// ecore_x_flush();
129 return gc;
130}
131
132/**
133 * Deletes and frees the given graphics context.
134 * @param gc The given graphics context.
135 */
136EAPI void
137ecore_x_gc_free(Ecore_X_GC gc)
138{
139 LOGFN(__FILE__, __LINE__, __FUNCTION__);
140 CHECK_XCB_CONN;
141
142 xcb_free_gc(_ecore_xcb_conn, gc);
143// ecore_x_flush();
144}
145
146EAPI void
147ecore_x_gc_foreground_set(Ecore_X_GC gc,
148 unsigned long foreground)
149{
150 uint32_t list;
151
152 LOGFN(__FILE__, __LINE__, __FUNCTION__);
153 CHECK_XCB_CONN;
154
155 list = foreground;
156 xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_FOREGROUND, &list);
157// ecore_x_flush();
158}
159
160EAPI void
161ecore_x_gc_background_set(Ecore_X_GC gc,
162 unsigned long background)
163{
164 uint32_t list;
165
166 LOGFN(__FILE__, __LINE__, __FUNCTION__);
167 CHECK_XCB_CONN;
168
169 list = background;
170 xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_BACKGROUND, &list);
171// ecore_x_flush();
172}
173
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gesture.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gesture.c
new file mode 100644
index 0000000..263dade
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_gesture.c
@@ -0,0 +1,203 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_XGESTURE
3# include <xcb/gesture.h>
4# include <xcb/xcb_event.h>
5#endif
6
7/* local variables */
8static Eina_Bool _gesture_available = EINA_FALSE;
9
10/* external variables */
11int _ecore_xcb_event_gesture = -1;
12
13void
14_ecore_xcb_gesture_init(void)
15{
16 LOGFN(__FILE__, __LINE__, __FUNCTION__);
17
18#ifdef ECORE_XCB_XGESTURE
19 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_gesture_id);
20#endif
21}
22
23void
24_ecore_xcb_gesture_finalize(void)
25{
26#ifdef ECORE_XCB_XGESTURE
27 xcb_gesture_query_version_cookie_t cookie;
28 xcb_gesture_query_version_reply_t *reply;
29#endif
30
31 LOGFN(__FILE__, __LINE__, __FUNCTION__);
32
33#ifdef ECORE_XCB_XGESTURE
34 cookie =
35 xcb_gesture_query_version_unchecked(_ecore_xcb_conn);
36 reply =
37 xcb_gesture_query_version_reply(_ecore_xcb_conn, cookie, NULL);
38 if (reply)
39 {
40 _gesture_available = EINA_TRUE;
41 free(reply);
42 }
43
44 if (_gesture_available)
45 {
46 const xcb_query_extension_reply_t *ext_reply;
47
48 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_gesture_id);
49 if (ext_reply)
50 _ecore_xcb_event_gesture = ext_reply->first_event;
51 }
52#endif
53}
54
55void
56_ecore_xcb_gesture_shutdown(void)
57{
58 LOGFN(__FILE__, __LINE__, __FUNCTION__);
59}
60
61EAPI Eina_Bool
62ecore_x_gesture_supported(void)
63{
64 return _gesture_available;
65}
66
67#ifdef ECORE_XCB_XGESTURE
68EAPI Eina_Bool
69ecore_x_gesture_events_select(Ecore_X_Window win,
70 Ecore_X_Gesture_Event_Mask mask)
71#else
72EAPI Eina_Bool
73ecore_x_gesture_events_select(Ecore_X_Window win __UNUSED__,
74 Ecore_X_Gesture_Event_Mask mask __UNUSED__)
75#endif
76
77{
78#ifdef ECORE_XCB_XGESTURE
79 if (!_gesture_available) return EINA_FALSE;
80
81 LOGFN(__FILE__, __LINE__, __FUNCTION__);
82 CHECK_XCB_CONN
83
84 xcb_gesture_select_events(_ecore_xcb_conn, win, mask);
85
86 return EINA_TRUE;
87#else
88 return EINA_FALSE;
89#endif
90}
91
92#ifdef ECORE_XCB_XGESTURE
93EAPI Ecore_X_Gesture_Event_Mask
94ecore_x_gesture_events_selected_get(Ecore_X_Window win)
95#else
96EAPI Ecore_X_Gesture_Event_Mask
97ecore_x_gesture_events_selected_get(Ecore_X_Window win __UNUSED__)
98#endif
99{
100#ifdef ECORE_XCB_XGESTURE
101 xcb_gesture_get_selected_events_cookie_t ecookie;
102 xcb_gesture_get_selected_events_reply_t *ereply;
103 Ecore_X_Gesture_Event_Mask mask = ECORE_X_GESTURE_EVENT_MASK_NONE;
104
105 if (!_gesture_available) return mask;
106
107 LOGFN(__FILE__, __LINE__, __FUNCTION__);
108 CHECK_XCB_CONN
109
110 ecookie = xcb_gesture_get_selected_events(_ecore_xcb_conn, win);
111 ereply =
112 xcb_gesture_get_selected_events_reply(_ecore_xcb_conn, ecookie, NULL);
113 if (ereply)
114 {
115 mask = ereply->mask;
116 free(ereply);
117 }
118
119 return mask;
120#else
121 return ECORE_X_GESTURE_EVENT_MASK_NONE;
122#endif
123}
124
125#ifdef ECORE_XCB_XGESTURE
126EAPI Eina_Bool
127ecore_x_gesture_event_grab(Ecore_X_Window win,
128 Ecore_X_Gesture_Event_Type type,
129 int num_fingers)
130#else
131EAPI Eina_Bool
132ecore_x_gesture_event_grab(Ecore_X_Window win __UNUSED__,
133 Ecore_X_Gesture_Event_Type type __UNUSED__,
134 int num_fingers __UNUSED__)
135#endif
136{
137#ifdef ECORE_XCB_XGESTURE
138 Eina_Bool status = EINA_TRUE;
139 xcb_gesture_grab_event_cookie_t ecookie;
140 xcb_gesture_grab_event_reply_t *ereply;
141
142 if (!_gesture_available) return EINA_FALSE;
143
144 LOGFN(__FILE__, __LINE__, __FUNCTION__);
145 CHECK_XCB_CONN
146
147 ecookie =
148 xcb_gesture_grab_event(_ecore_xcb_conn, win, type, num_fingers, 0L);
149 ereply = xcb_gesture_grab_event_reply(_ecore_xcb_conn, ecookie, NULL);
150
151 if (ereply)
152 {
153 if (ereply->status) status = EINA_FALSE;
154 free(ereply);
155 }
156 else
157 status = EINA_FALSE;
158
159 return status;
160#else
161 return EINA_FALSE;
162#endif
163}
164
165#ifdef ECORE_XCB_XGESTURE
166EAPI Eina_Bool
167ecore_x_gesture_event_ungrab(Ecore_X_Window win,
168 Ecore_X_Gesture_Event_Type type,
169 int num_fingers)
170#else
171EAPI Eina_Bool
172ecore_x_gesture_event_ungrab(Ecore_X_Window win __UNUSED__,
173 Ecore_X_Gesture_Event_Type type __UNUSED__,
174 int num_fingers __UNUSED__)
175#endif
176{
177#ifdef ECORE_XCB_XGESTURE
178 Eina_Bool status = EINA_TRUE;
179 xcb_gesture_ungrab_event_cookie_t ecookie;
180 xcb_gesture_ungrab_event_reply_t *ereply;
181
182 if (!_gesture_available) return EINA_FALSE;
183
184 LOGFN(__FILE__, __LINE__, __FUNCTION__);
185 CHECK_XCB_CONN
186
187 ecookie =
188 xcb_gesture_ungrab_event(_ecore_xcb_conn, win, type, num_fingers, 0L);
189 ereply = xcb_gesture_ungrab_event_reply(_ecore_xcb_conn, ecookie, NULL);
190
191 if (ereply)
192 {
193 if (ereply->status) status = EINA_FALSE;
194 free(ereply);
195 }
196 else
197 status = EINA_FALSE;
198
199 return status;
200#else
201 return EINA_FALSE;
202#endif
203}
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_icccm.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_icccm.c
new file mode 100644
index 0000000..6459db7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_icccm.c
@@ -0,0 +1,1568 @@
1#include "ecore_xcb_private.h"
2#include <xcb/xcb_icccm.h>
3
4EAPI void
5ecore_x_icccm_init(void)
6{
7}
8
9/**
10 * Sets the WM_COMMAND property for @a win.
11 *
12 * @param win The window.
13 * @param argc Number of arguments.
14 * @param argv Arguments.
15 */
16EAPI void
17ecore_x_icccm_command_set(Ecore_X_Window win,
18 int argc,
19 char **argv)
20{
21 void *buf;
22 char *b;
23 int nbytes, i;
24
25 LOGFN(__FILE__, __LINE__, __FUNCTION__);
26 CHECK_XCB_CONN;
27
28 for (i = 0, nbytes = 0; i < argc; i++)
29 if (argv[i]) nbytes += strlen(argv[i]) + 1;
30
31 buf = malloc(sizeof(char) * nbytes);
32 if (!buf) return;
33
34 b = (char *)buf;
35 for (i = 0; i < argc; i++)
36 {
37 if (argv[i])
38 {
39 strcpy(b, argv[i]);
40 b += strlen(argv[i]) + 1;
41 }
42 else
43 *b++ = '\0';
44 }
45 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
46 ECORE_X_ATOM_WM_COMMAND, ECORE_X_ATOM_STRING, 8,
47 nbytes, buf);
48 free(buf);
49}
50
51/**
52 * Get the WM_COMMAND property for @a win.
53 *
54 * Return the command of a window. String must be free'd when done with.
55 *
56 * @param win The window.
57 * @param argc Number of arguments.
58 * @param argv Arguments.
59 */
60EAPI void
61ecore_x_icccm_command_get(Ecore_X_Window win,
62 int *argc,
63 char ***argv)
64{
65 xcb_get_property_cookie_t cookie;
66 xcb_get_property_reply_t *reply;
67 int len = 0;
68 char **v, *data, *cp, *start;
69 int c = 0, i = 0, j = 0;
70
71 LOGFN(__FILE__, __LINE__, __FUNCTION__);
72 CHECK_XCB_CONN;
73
74 if (argc) *argc = 0;
75 if (argv) *argv = NULL;
76
77 cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
78 ECORE_X_ATOM_WM_COMMAND,
79 XCB_GET_PROPERTY_TYPE_ANY,
80 0, 1000000L);
81 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
82 if (!reply) return;
83
84 if ((reply->type != ECORE_X_ATOM_STRING) || (reply->format != 8))
85 {
86 free(reply);
87 return;
88 }
89
90 len = reply->value_len;
91 if (len < 1)
92 {
93 free(reply);
94 return;
95 }
96
97 data = (char *)xcb_get_property_value(reply);
98 if (len && (data[len - 1] == '\0'))
99 len--;
100
101 c = 1;
102 for (cp = (char *)data, i = len; i > 0; cp++, i--)
103 if (*cp == '\0') c++;
104
105 v = (char **)malloc((c + 1) * sizeof(char *));
106 if (!v)
107 {
108 free(reply);
109 return;
110 }
111
112 start = (char *)malloc((len + 1) * sizeof(char));
113 if (!start)
114 {
115 free(reply);
116 free(v);
117 return;
118 }
119
120 memcpy(start, (char *)data, len);
121 start[len] = '\0';
122 for (cp = start, i = len + 1, j = 0; i > 0; cp++, i--)
123 {
124 if (*cp == '\0')
125 {
126 v[j] = start;
127 start = (cp + 1);
128 j++;
129 }
130 }
131
132 if (c < 1)
133 {
134 free(reply);
135 free(v);
136 return;
137 }
138
139 if (argc) *argc = c;
140
141 if (argv)
142 {
143 (*argv) = malloc(c * sizeof(char *));
144 if (!*argv)
145 {
146 free(reply);
147 free(v);
148 if (argc) *argc = 0;
149 return;
150 }
151
152 for (i = 0; i < c; i++)
153 {
154 if (v[i])
155 (*argv)[i] = strdup(v[i]);
156 else
157 (*argv)[i] = strdup("");
158 }
159 }
160
161 free(reply);
162 free(v);
163}
164
165EAPI char *
166ecore_x_icccm_title_get(Ecore_X_Window win)
167{
168 xcb_get_property_cookie_t cookie;
169#ifdef OLD_XCB_VERSION
170 xcb_get_text_property_reply_t prop;
171#else
172 xcb_icccm_get_text_property_reply_t prop;
173#endif
174 uint8_t ret = 0;
175 char *title = NULL;
176
177 LOGFN(__FILE__, __LINE__, __FUNCTION__);
178 CHECK_XCB_CONN;
179
180 if (!win) return NULL;
181#ifdef OLD_XCB_VERSION
182 cookie = xcb_get_wm_name_unchecked(_ecore_xcb_conn, win);
183 ret = xcb_get_wm_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
184#else
185 cookie = xcb_icccm_get_wm_name_unchecked(_ecore_xcb_conn, win);
186 ret = xcb_icccm_get_wm_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
187#endif
188 if (ret == 0) return NULL;
189 if (prop.name_len < 1)
190 {
191#ifdef OLD_XCB_VERSION
192 xcb_get_text_property_reply_wipe(&prop);
193#else
194 xcb_icccm_get_text_property_reply_wipe(&prop);
195#endif
196 return NULL;
197 }
198
199 if (!(title = malloc((prop.name_len + 1) * sizeof(char *))))
200 {
201#ifdef OLD_XCB_VERSION
202 xcb_get_text_property_reply_wipe(&prop);
203#else
204 xcb_icccm_get_text_property_reply_wipe(&prop);
205#endif
206 return NULL;
207 }
208 memcpy(title, prop.name, sizeof(char *) * prop.name_len);
209 title[prop.name_len] = '\0';
210
211 if (prop.encoding != ECORE_X_ATOM_UTF8_STRING)
212 {
213 Ecore_Xcb_Textproperty tp;
214 int count = 0;
215 char **list = NULL;
216 Eina_Bool ret = EINA_FALSE;
217
218 tp.value = strdup(title);
219 tp.nitems = prop.name_len;
220 tp.encoding = prop.encoding;
221#ifdef HAVE_ICONV
222 ret = _ecore_xcb_utf8_textproperty_to_textlist(&tp, &list, &count);
223#else
224 ret = _ecore_xcb_mb_textproperty_to_textlist(&tp, &list, &count);
225#endif
226 if (ret)
227 {
228 if (count > 0)
229 title = strdup(list[0]);
230
231 if (list) free(list);
232 }
233 }
234
235#ifdef OLD_XCB_VERSION
236 xcb_get_text_property_reply_wipe(&prop);
237#else
238 xcb_icccm_get_text_property_reply_wipe(&prop);
239#endif
240 return title;
241}
242
243EAPI void
244ecore_x_icccm_title_set(Ecore_X_Window win,
245 const char *title)
246{
247 Ecore_Xcb_Textproperty prop;
248 char *list[1];
249 Eina_Bool ret = EINA_FALSE;
250
251 LOGFN(__FILE__, __LINE__, __FUNCTION__);
252 CHECK_XCB_CONN;
253
254 if (!title) return;
255
256 prop.value = NULL;
257 list[0] = strdup(title);
258
259#ifdef HAVE_ICONV
260 ret = _ecore_xcb_utf8_textlist_to_textproperty(list, 1, XcbUTF8StringStyle,
261 &prop);
262#else
263 ret = _ecore_xcb_mb_textlist_to_textproperty(list, 1, XcbStdICCTextStyle,
264 &prop);
265#endif
266
267 if (ret)
268 {
269#ifdef OLD_XCB_VERSION
270 xcb_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
271 strlen(prop.value), prop.value);
272#else
273 xcb_icccm_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING, 8,
274 strlen(prop.value), prop.value);
275#endif
276 if (prop.value) free(prop.value);
277 }
278 else
279#ifdef OLD_XCB_VERSION
280 xcb_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
281 strlen(title), title);
282#else
283 xcb_icccm_set_wm_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING, 8,
284 strlen(title), title);
285#endif
286 free(list[0]);
287}
288
289/**
290 * Get a window name & class.
291 * @param win The window
292 * @param n The name string
293 * @param c The class string
294 *
295 * Get a window name * class
296 */
297EAPI void
298ecore_x_icccm_name_class_get(Ecore_X_Window win,
299 char **name,
300 char **class)
301{
302 xcb_get_property_cookie_t cookie;
303#ifdef OLD_XCB_VERSION
304 xcb_get_wm_class_reply_t prop;
305#else
306 xcb_icccm_get_wm_class_reply_t prop;
307#endif
308 uint8_t ret = 0;
309
310 LOGFN(__FILE__, __LINE__, __FUNCTION__);
311 CHECK_XCB_CONN;
312
313 if (name) *name = NULL;
314 if (class) *class = NULL;
315
316#ifdef OLD_XCB_VERSION
317 cookie = xcb_get_wm_class_unchecked(_ecore_xcb_conn, win);
318 ret = xcb_get_wm_class_reply(_ecore_xcb_conn, cookie, &prop, NULL);
319#else
320 cookie = xcb_icccm_get_wm_class_unchecked(_ecore_xcb_conn, win);
321 ret = xcb_icccm_get_wm_class_reply(_ecore_xcb_conn, cookie, &prop, NULL);
322#endif
323 if (ret == 0) return;
324
325 if (name) *name = strdup(prop.instance_name);
326 if (class) *class = strdup(prop.class_name);
327
328#ifdef OLD_XCB_VERSION
329 xcb_get_wm_class_reply_wipe(&prop);
330#else
331 xcb_icccm_get_wm_class_reply_wipe(&prop);
332#endif
333}
334
335/**
336 * Set a window name & class.
337 * @param win The window
338 * @param n The name string
339 * @param c The class string
340 *
341 * Set a window name * class
342 */
343EAPI void
344ecore_x_icccm_name_class_set(Ecore_X_Window win,
345 const char *name,
346 const char *class)
347{
348 char *class_string, *s;
349 int length_name, length_class;
350
351 LOGFN(__FILE__, __LINE__, __FUNCTION__);
352 CHECK_XCB_CONN;
353
354 length_name = strlen(name);
355 length_class = strlen(class);
356 class_string =
357 (char *)malloc(sizeof(char) * (length_name + length_class + 2));
358 if (!class_string) return;
359
360 s = class_string;
361 if (length_name)
362 {
363 strcpy(s, name);
364 s += length_name + 1;
365 }
366 else
367 *s++ = '\0';
368
369 if (length_class)
370 strcpy(s, class);
371 else
372 *s = '\0';
373
374 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
375 ECORE_X_ATOM_WM_CLASS, ECORE_X_ATOM_STRING, 8,
376 length_name + length_class + 2, (void *)class_string);
377 free(class_string);
378}
379
380/**
381 * Specify that a window is transient for another top-level window and should be handled accordingly.
382 * @param win the transient window
383 * @param forwin the toplevel window
384 */
385EAPI void
386ecore_x_icccm_transient_for_set(Ecore_X_Window win,
387 Ecore_X_Window forwindow)
388{
389 LOGFN(__FILE__, __LINE__, __FUNCTION__);
390 CHECK_XCB_CONN;
391
392 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
393 ECORE_X_ATOM_WM_TRANSIENT_FOR, ECORE_X_ATOM_WINDOW, 32,
394 1, (void *)&forwindow);
395}
396
397/**
398 * Remove the transient_for setting from a window.
399 * @param The window
400 */
401EAPI void
402ecore_x_icccm_transient_for_unset(Ecore_X_Window win)
403{
404 LOGFN(__FILE__, __LINE__, __FUNCTION__);
405
406 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_WM_TRANSIENT_FOR);
407}
408
409/**
410 * Get the window this window is transient for, if any.
411 * @param win The window to check
412 * @return The window ID of the top-level window, or 0 if the property does not exist.
413 */
414EAPI Ecore_X_Window
415ecore_x_icccm_transient_for_get(Ecore_X_Window win)
416{
417 Ecore_X_Window forwin = 0;
418 xcb_get_property_cookie_t cookie;
419
420 LOGFN(__FILE__, __LINE__, __FUNCTION__);
421 CHECK_XCB_CONN;
422
423#ifdef OLD_XCB_VERSION
424 cookie = xcb_get_wm_transient_for_unchecked(_ecore_xcb_conn, win);
425 xcb_get_wm_transient_for_reply(_ecore_xcb_conn, cookie, &forwin, NULL);
426#else
427 cookie = xcb_icccm_get_wm_transient_for_unchecked(_ecore_xcb_conn, win);
428 xcb_icccm_get_wm_transient_for_reply(_ecore_xcb_conn, cookie, &forwin, NULL);
429#endif
430
431 return forwin;
432}
433
434/**
435 * Get the window role.
436 * @param win The window
437 * @return The window's role string.
438 */
439EAPI char *
440ecore_x_icccm_window_role_get(Ecore_X_Window win)
441{
442 LOGFN(__FILE__, __LINE__, __FUNCTION__);
443
444 return ecore_x_window_prop_string_get(win, ECORE_X_ATOM_WM_WINDOW_ROLE);
445}
446
447/**
448 * Set the window role hint.
449 * @param win The window
450 * @param role The role string
451 */
452EAPI void
453ecore_x_icccm_window_role_set(Ecore_X_Window win,
454 const char *role)
455{
456 LOGFN(__FILE__, __LINE__, __FUNCTION__);
457
458 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_WM_WINDOW_ROLE, role);
459}
460
461/**
462 * Get the window's client leader.
463 * @param win The window
464 * @return The window's client leader window, or 0 if unset
465 */
466EAPI Ecore_X_Window
467ecore_x_icccm_client_leader_get(Ecore_X_Window win)
468{
469 Ecore_X_Window leader;
470
471 LOGFN(__FILE__, __LINE__, __FUNCTION__);
472
473 if (ecore_x_window_prop_window_get(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
474 &leader, 1) > 0)
475 return leader;
476
477 return 0;
478}
479
480/**
481 * Set the window's client leader.
482 * @param win The window
483 * @param l The client leader window
484 *
485 * All non-transient top-level windows created by an app other than
486 * the main window must have this property set to the app's main window.
487 */
488EAPI void
489ecore_x_icccm_client_leader_set(Ecore_X_Window win,
490 Ecore_X_Window leader)
491{
492 LOGFN(__FILE__, __LINE__, __FUNCTION__);
493
494 ecore_x_window_prop_window_set(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
495 &leader, 1);
496}
497
498EAPI Ecore_X_Window_State_Hint
499ecore_x_icccm_state_get(Ecore_X_Window win)
500{
501 xcb_get_property_cookie_t cookie;
502 xcb_get_property_reply_t *reply;
503 Ecore_X_Window_State_Hint hint = ECORE_X_WINDOW_STATE_HINT_NONE;
504 uint8_t *prop;
505
506 LOGFN(__FILE__, __LINE__, __FUNCTION__);
507 CHECK_XCB_CONN;
508
509 cookie =
510 xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
511 ECORE_X_ATOM_WM_STATE, ECORE_X_ATOM_WM_STATE,
512 0L, 0x7fffffff);
513 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
514 if (!reply) return hint;
515 if ((reply->type == 0) || (reply->format != 8) || (reply->value_len != 2))
516 {
517 free(reply);
518 return hint;
519 }
520
521 prop = (uint8_t *)xcb_get_property_value(reply);
522#ifdef OLD_XCB_VERSION
523 switch (prop[0])
524 {
525 case XCB_WM_STATE_WITHDRAWN:
526 hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
527 break;
528
529 case XCB_WM_STATE_NORMAL:
530 hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
531 break;
532
533 case XCB_WM_STATE_ICONIC:
534 hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
535 break;
536
537 default:
538 break;
539 }
540#else
541 switch (prop[0])
542 {
543 case XCB_ICCCM_WM_STATE_WITHDRAWN:
544 hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
545 break;
546
547 case XCB_ICCCM_WM_STATE_NORMAL:
548 hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
549 break;
550
551 case XCB_ICCCM_WM_STATE_ICONIC:
552 hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
553 break;
554
555 default:
556 break;
557 }
558#endif
559
560 free(reply);
561 return hint;
562}
563
564EAPI void
565ecore_x_icccm_state_set(Ecore_X_Window win,
566 Ecore_X_Window_State_Hint state)
567{
568#ifdef OLD_XCB_VERSION
569 xcb_wm_hints_t hints;
570#else
571 xcb_icccm_wm_hints_t hints;
572#endif
573
574 LOGFN(__FILE__, __LINE__, __FUNCTION__);
575 CHECK_XCB_CONN;
576
577#ifdef OLD_XCB_VERSION
578 xcb_wm_hints_set_none(&hints);
579
580 hints.flags = XCB_WM_HINT_STATE;
581
582 if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
583 xcb_wm_hints_set_withdrawn(&hints);
584 else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
585 xcb_wm_hints_set_normal(&hints);
586 else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
587 xcb_wm_hints_set_iconic(&hints);
588
589 xcb_set_wm_hints(_ecore_xcb_conn, win, &hints);
590#else
591 xcb_icccm_wm_hints_set_none(&hints);
592
593 hints.flags = XCB_ICCCM_WM_HINT_STATE;
594
595 if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
596 xcb_icccm_wm_hints_set_withdrawn(&hints);
597 else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
598 xcb_icccm_wm_hints_set_normal(&hints);
599 else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
600 xcb_icccm_wm_hints_set_iconic(&hints);
601
602 xcb_icccm_set_wm_hints(_ecore_xcb_conn, win, &hints);
603#endif
604}
605
606EAPI void
607ecore_x_icccm_delete_window_send(Ecore_X_Window win,
608 Ecore_X_Time t)
609{
610 LOGFN(__FILE__, __LINE__, __FUNCTION__);
611 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
612 ECORE_X_EVENT_MASK_NONE,
613 ECORE_X_ATOM_WM_DELETE_WINDOW, t, 0, 0, 0);
614}
615
616EAPI void
617ecore_x_icccm_hints_set(Ecore_X_Window win,
618 Eina_Bool accepts_focus,
619 Ecore_X_Window_State_Hint initial_state,
620 Ecore_X_Pixmap icon_pixmap,
621 Ecore_X_Pixmap icon_mask,
622 Ecore_X_Window icon_window,
623 Ecore_X_Window window_group,
624 Eina_Bool is_urgent)
625{
626#ifdef OLD_XCB_VERSION
627 xcb_wm_hints_t hints;
628#else
629 xcb_icccm_wm_hints_t hints;
630#endif
631
632 LOGFN(__FILE__, __LINE__, __FUNCTION__);
633 CHECK_XCB_CONN;
634
635#ifdef OLD_XCB_VERSION
636 xcb_wm_hints_set_none(&hints);
637 xcb_wm_hints_set_input(&hints, accepts_focus);
638
639 if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
640 xcb_wm_hints_set_withdrawn(&hints);
641 else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
642 xcb_wm_hints_set_normal(&hints);
643 else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
644 xcb_wm_hints_set_iconic(&hints);
645
646 if (icon_pixmap != 0) xcb_wm_hints_set_icon_pixmap(&hints, icon_pixmap);
647 if (icon_mask != 0) xcb_wm_hints_set_icon_mask(&hints, icon_mask);
648 if (icon_window != 0) xcb_wm_hints_set_icon_window(&hints, icon_window);
649 if (window_group != 0) xcb_wm_hints_set_window_group(&hints, window_group);
650 if (is_urgent) xcb_wm_hints_set_urgency(&hints);
651
652 xcb_set_wm_hints(_ecore_xcb_conn, win, &hints);
653#else
654 xcb_icccm_wm_hints_set_none(&hints);
655 xcb_icccm_wm_hints_set_input(&hints, accepts_focus);
656
657 if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
658 xcb_icccm_wm_hints_set_withdrawn(&hints);
659 else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
660 xcb_icccm_wm_hints_set_normal(&hints);
661 else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
662 xcb_icccm_wm_hints_set_iconic(&hints);
663
664 if (icon_pixmap != 0)
665 xcb_icccm_wm_hints_set_icon_pixmap(&hints, icon_pixmap);
666 if (icon_mask != 0)
667 xcb_icccm_wm_hints_set_icon_mask(&hints, icon_mask);
668 if (icon_window != 0)
669 xcb_icccm_wm_hints_set_icon_window(&hints, icon_window);
670 if (window_group != 0)
671 xcb_icccm_wm_hints_set_window_group(&hints, window_group);
672 if (is_urgent)
673 xcb_icccm_wm_hints_set_urgency(&hints);
674
675 xcb_icccm_set_wm_hints(_ecore_xcb_conn, win, &hints);
676#endif
677}
678
679EAPI Eina_Bool
680ecore_x_icccm_hints_get(Ecore_X_Window win,
681 Eina_Bool *accepts_focus,
682 Ecore_X_Window_State_Hint *initial_state,
683 Ecore_X_Pixmap *icon_pixmap,
684 Ecore_X_Pixmap *icon_mask,
685 Ecore_X_Window *icon_window,
686 Ecore_X_Window *window_group,
687 Eina_Bool *is_urgent)
688{
689 xcb_get_property_cookie_t cookie;
690#ifdef OLD_XCB_VERSION
691 xcb_wm_hints_t hints;
692#else
693 xcb_icccm_wm_hints_t hints;
694#endif
695 uint8_t ret = 0;
696
697 LOGFN(__FILE__, __LINE__, __FUNCTION__);
698 CHECK_XCB_CONN;
699
700 if (accepts_focus) *accepts_focus = EINA_TRUE;
701 if (initial_state) *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
702 if (icon_pixmap) *icon_pixmap = 0;
703 if (icon_mask) *icon_mask = 0;
704 if (icon_window) *icon_window = 0;
705 if (window_group) *window_group = 0;
706 if (is_urgent) *is_urgent = EINA_FALSE;
707
708#ifdef OLD_XCB_VERSION
709 xcb_wm_hints_set_none(&hints);
710 cookie = xcb_get_wm_hints_unchecked(_ecore_xcb_conn, win);
711 ret = xcb_get_wm_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
712#else
713 xcb_icccm_wm_hints_set_none(&hints);
714 cookie = xcb_icccm_get_wm_hints_unchecked(_ecore_xcb_conn, win);
715 ret = xcb_icccm_get_wm_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
716#endif
717 if (!ret) return EINA_FALSE;
718
719#ifdef OLD_XCB_VERSION
720 if ((hints.flags & XCB_WM_HINT_INPUT) && (accepts_focus))
721#else
722 if ((hints.flags & XCB_ICCCM_WM_HINT_INPUT) && (accepts_focus))
723#endif
724 {
725 if (hints.input)
726 *accepts_focus = EINA_TRUE;
727 else
728 *accepts_focus = EINA_FALSE;
729 }
730
731#ifdef OLD_XCB_VERSION
732 if ((hints.flags & XCB_WM_HINT_STATE) && (initial_state))
733 {
734 if (hints.initial_state == XCB_WM_STATE_WITHDRAWN)
735 *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
736 else if (hints.initial_state == XCB_WM_STATE_NORMAL)
737 *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
738 else if (hints.initial_state == XCB_WM_STATE_ICONIC)
739 *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
740 }
741
742 if ((hints.flags & XCB_WM_HINT_ICON_PIXMAP) && (icon_pixmap))
743 *icon_pixmap = hints.icon_pixmap;
744
745 if ((hints.flags & XCB_WM_HINT_ICON_MASK) && (icon_mask))
746 *icon_mask = hints.icon_mask;
747
748 if ((hints.flags & XCB_WM_HINT_ICON_WINDOW) && (icon_window))
749 *icon_window = hints.icon_window;
750
751 if ((hints.flags & XCB_WM_HINT_WINDOW_GROUP) && (window_group))
752 *window_group = hints.window_group;
753
754 if ((hints.flags & XCB_WM_HINT_X_URGENCY) && (is_urgent))
755 *is_urgent = EINA_TRUE;
756#else
757 if ((hints.flags & XCB_ICCCM_WM_HINT_STATE) && (initial_state))
758 {
759 if (hints.initial_state == XCB_ICCCM_WM_STATE_WITHDRAWN)
760 *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
761 else if (hints.initial_state == XCB_ICCCM_WM_STATE_NORMAL)
762 *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
763 else if (hints.initial_state == XCB_ICCCM_WM_STATE_ICONIC)
764 *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
765 }
766
767 if ((hints.flags & XCB_ICCCM_WM_HINT_ICON_PIXMAP) && (icon_pixmap))
768 *icon_pixmap = hints.icon_pixmap;
769
770 if ((hints.flags & XCB_ICCCM_WM_HINT_ICON_MASK) && (icon_mask))
771 *icon_mask = hints.icon_mask;
772
773 if ((hints.flags & XCB_ICCCM_WM_HINT_ICON_WINDOW) && (icon_window))
774 *icon_window = hints.icon_window;
775
776 if ((hints.flags & XCB_ICCCM_WM_HINT_WINDOW_GROUP) && (window_group))
777 *window_group = hints.window_group;
778
779 if ((hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY) && (is_urgent))
780 *is_urgent = EINA_TRUE;
781#endif
782
783 return EINA_TRUE;
784}
785
786/**
787 * Get a window icon name.
788 * @param win The window
789 * @return The windows icon name string
790 *
791 * Return the icon name of a window. String must be free'd when done with.
792 */
793EAPI char *
794ecore_x_icccm_icon_name_get(Ecore_X_Window win)
795{
796 xcb_get_property_cookie_t cookie;
797#ifdef OLD_XCB_VERSION
798 xcb_get_text_property_reply_t prop;
799#else
800 xcb_icccm_get_text_property_reply_t prop;
801#endif
802 uint8_t ret = 0;
803 char *tmp = NULL;
804
805 LOGFN(__FILE__, __LINE__, __FUNCTION__);
806 CHECK_XCB_CONN;
807
808 if (!win) return NULL;
809
810#ifdef OLD_XCB_VERSION
811 cookie = xcb_get_wm_icon_name_unchecked(_ecore_xcb_conn, win);
812 ret = xcb_get_wm_icon_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
813#else
814 cookie = xcb_icccm_get_wm_icon_name_unchecked(_ecore_xcb_conn, win);
815 ret = xcb_icccm_get_wm_icon_name_reply(_ecore_xcb_conn, cookie, &prop, NULL);
816#endif
817 if (ret == 0) return NULL;
818
819 if (prop.name_len < 1)
820 {
821#ifdef OLD_XCB_VERSION
822 xcb_get_text_property_reply_wipe(&prop);
823#else
824 xcb_icccm_get_text_property_reply_wipe(&prop);
825#endif
826 return NULL;
827 }
828
829 if (!(tmp = malloc((prop.name_len + 1) * sizeof(char *))))
830 {
831#ifdef OLD_XCB_VERSION
832 xcb_get_text_property_reply_wipe(&prop);
833#else
834 xcb_icccm_get_text_property_reply_wipe(&prop);
835#endif
836 return NULL;
837 }
838 memcpy(tmp, prop.name, sizeof(char *) * prop.name_len);
839 tmp[prop.name_len] = '\0';
840
841 if (prop.encoding != ECORE_X_ATOM_UTF8_STRING)
842 {
843 Ecore_Xcb_Textproperty tp;
844 int count = 0;
845 char **list = NULL;
846 Eina_Bool ret = EINA_FALSE;
847
848 tp.value = strdup(tmp);
849 tp.nitems = prop.name_len;
850 tp.encoding = prop.encoding;
851#ifdef HAVE_ICONV
852 ret = _ecore_xcb_utf8_textproperty_to_textlist(&tp, &list, &count);
853#else
854 ret = _ecore_xcb_mb_textproperty_to_textlist(&tp, &list, &count);
855#endif
856 if (ret)
857 {
858 if (count > 0)
859 tmp = strdup(list[0]);
860
861 if (list) free(list);
862 }
863 }
864
865#ifdef OLD_XCB_VERSION
866 xcb_get_text_property_reply_wipe(&prop);
867#else
868 xcb_icccm_get_text_property_reply_wipe(&prop);
869#endif
870 return tmp;
871}
872
873/**
874 * Set a window icon name.
875 * @param win The window
876 * @param t The icon name string
877 *
878 * Set a window icon name
879 */
880EAPI void
881ecore_x_icccm_icon_name_set(Ecore_X_Window win,
882 const char *name)
883{
884 Ecore_Xcb_Textproperty prop;
885 char *list[1];
886 Eina_Bool ret = EINA_FALSE;
887
888 LOGFN(__FILE__, __LINE__, __FUNCTION__);
889 CHECK_XCB_CONN;
890
891 if ((!win) || (!name)) return;
892
893 prop.value = NULL;
894 list[0] = strdup(name);
895
896#ifdef HAVE_ICONV
897 ret = _ecore_xcb_utf8_textlist_to_textproperty(list, 1, XcbUTF8StringStyle,
898 &prop);
899#else
900 ret = _ecore_xcb_mb_textlist_to_textproperty(list, 1, XcbStdICCTextStyle,
901 &prop);
902#endif
903
904 if (ret)
905 {
906#ifdef OLD_XCB_VERSION
907 xcb_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
908 strlen(prop.value), prop.value);
909#else
910 xcb_icccm_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
911 8, strlen(prop.value), prop.value);
912#endif
913 if (prop.value) free(prop.value);
914 }
915 else
916#ifdef OLD_XCB_VERSION
917 xcb_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
918 strlen(name), name);
919#else
920 xcb_icccm_set_wm_icon_name(_ecore_xcb_conn, win, ECORE_X_ATOM_STRING,
921 8, strlen(name), name);
922#endif
923
924 free(list[0]);
925}
926
927EAPI void
928ecore_x_icccm_iconic_request_send(Ecore_X_Window win,
929 Ecore_X_Window root)
930{
931 xcb_client_message_event_t ev;
932
933 LOGFN(__FILE__, __LINE__, __FUNCTION__);
934 CHECK_XCB_CONN;
935
936 if (!win) return;
937 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
938
939 memset(&ev, 0, sizeof(xcb_client_message_event_t));
940
941 ev.response_type = XCB_CLIENT_MESSAGE;
942 ev.format = 32;
943 ev.window = win;
944 ev.type = ECORE_X_ATOM_WM_CHANGE_STATE;
945#ifdef OLD_XCB_VERSION
946 ev.data.data32[0] = XCB_WM_STATE_ICONIC;
947#else
948 ev.data.data32[0] = XCB_ICCCM_WM_STATE_ICONIC;
949#endif
950
951 xcb_send_event(_ecore_xcb_conn, 0, root,
952 (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
953 XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT),
954 (const char *)&ev);
955// ecore_x_flush();
956}
957
958/**
959 * Set or unset a wm protocol property.
960 * @param win The Window
961 * @param protocol The protocol to enable/disable
962 * @param on On/Off
963 */
964EAPI void
965ecore_x_icccm_protocol_set(Ecore_X_Window win,
966 Ecore_X_WM_Protocol protocol,
967 Eina_Bool on)
968{
969 Ecore_X_Atom proto;
970 xcb_get_property_cookie_t cookie;
971#ifdef OLD_XCB_VERSION
972 xcb_get_wm_protocols_reply_t protos;
973#else
974 xcb_icccm_get_wm_protocols_reply_t protos;
975#endif
976 int i = 0, count = 0, set = 0;
977
978 LOGFN(__FILE__, __LINE__, __FUNCTION__);
979 CHECK_XCB_CONN;
980
981 if (protocol >= ECORE_X_WM_PROTOCOL_NUM) return;
982 proto = _ecore_xcb_atoms_wm_protocol[protocol];
983#ifdef OLD_XCB_VERSION
984 cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
985 if (!xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL))
986#else
987 cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
988 if (!xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL))
989#endif
990 count = 0;
991 else
992 count = protos.atoms_len;
993
994 for (i = 0; i < count; i++)
995 {
996 if (protos.atoms[i] == proto)
997 {
998 set = 1;
999 break;
1000 }
1001 }
1002
1003 if (on)
1004 {
1005 if (!set)
1006 {
1007 Ecore_X_Atom *atoms = NULL;
1008
1009 atoms = malloc((count + 1) * sizeof(Ecore_X_Atom));
1010 if (atoms)
1011 {
1012 for (i = 0; i < count; i++)
1013 atoms[i] = protos.atoms[i];
1014 atoms[count] = proto;
1015#ifdef OLD_XCB_VERSION
1016 xcb_set_wm_protocols(_ecore_xcb_conn,
1017 ECORE_X_ATOM_WM_PROTOCOLS,
1018 win, count, atoms);
1019#else
1020 xcb_icccm_set_wm_protocols(_ecore_xcb_conn, win,
1021 ECORE_X_ATOM_WM_PROTOCOLS,
1022 count, atoms);
1023#endif
1024 free(atoms);
1025 }
1026 }
1027 }
1028 else
1029 {
1030 if (set)
1031 {
1032 for (i = 0; i < count; i++)
1033 {
1034 if (protos.atoms[i] == proto)
1035 {
1036 int j = 0;
1037
1038 for (j = (i + 1); j < count; j++)
1039 protos.atoms[j - 1] = protos.atoms[j];
1040 if (count > 1)
1041#ifdef OLD_XCB_VERSION
1042 xcb_set_wm_protocols(_ecore_xcb_conn,
1043 ECORE_X_ATOM_WM_PROTOCOLS,
1044 win, count - 1, protos.atoms);
1045#else
1046 xcb_icccm_set_wm_protocols(_ecore_xcb_conn, win,
1047 ECORE_X_ATOM_WM_PROTOCOLS,
1048 count - 1, protos.atoms);
1049#endif
1050 else
1051 ecore_x_window_prop_property_del(win,
1052 ECORE_X_ATOM_WM_PROTOCOLS);
1053 break;
1054 }
1055 }
1056 }
1057 }
1058
1059#ifdef OLD_XCB_VERSION
1060 xcb_get_wm_protocols_reply_wipe(&protos);
1061#else
1062 xcb_icccm_get_wm_protocols_reply_wipe(&protos);
1063#endif
1064}
1065
1066/**
1067 * Determines whether a protocol is set for a window.
1068 * @param win The Window
1069 * @param protocol The protocol to query
1070 * @return 1 if the protocol is set, else 0.
1071 */
1072EAPI Eina_Bool
1073ecore_x_icccm_protocol_isset(Ecore_X_Window win,
1074 Ecore_X_WM_Protocol protocol)
1075{
1076 Ecore_X_Atom proto;
1077 Eina_Bool ret = EINA_FALSE;
1078 xcb_get_property_cookie_t cookie;
1079#ifdef OLD_XCB_VERSION
1080 xcb_get_wm_protocols_reply_t reply;
1081#else
1082 xcb_icccm_get_wm_protocols_reply_t reply;
1083#endif
1084 uint8_t val = 0;
1085 unsigned int i = 0;
1086
1087 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1088 CHECK_XCB_CONN;
1089
1090 if (protocol >= ECORE_X_WM_PROTOCOL_NUM) return EINA_FALSE;
1091
1092 proto = _ecore_xcb_atoms_wm_protocol[protocol];
1093#ifdef OLD_XCB_VERSION
1094 cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
1095 val = xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &reply, NULL);
1096#else
1097 cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win, proto);
1098 val = xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &reply, NULL);
1099#endif
1100 if (!val) return EINA_FALSE;
1101
1102 for (i = 0; i < reply.atoms_len; i++)
1103 if (reply.atoms[i] == proto)
1104 {
1105 ret = EINA_TRUE;
1106 break;
1107 }
1108
1109#ifdef OLD_XCB_VERSION
1110 xcb_get_wm_protocols_reply_wipe(&reply);
1111#else
1112 xcb_icccm_get_wm_protocols_reply_wipe(&reply);
1113#endif
1114
1115 return ret;
1116}
1117
1118/**
1119 * Set protocol atoms explicitly
1120 * @param win The Window
1121 * @param protos An array of protocol atoms
1122 * @param num the number of members of the array
1123 */
1124EAPI void
1125ecore_x_icccm_protocol_atoms_set(Ecore_X_Window win,
1126 Ecore_X_Atom *protos,
1127 int num)
1128{
1129 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1130 CHECK_XCB_CONN;
1131
1132 if (num > 0)
1133#ifdef OLD_XCB_VERSION
1134 xcb_set_wm_protocols(_ecore_xcb_conn, ECORE_X_ATOM_WM_PROTOCOLS,
1135 win, num, protos);
1136#else
1137 xcb_icccm_set_wm_protocols(_ecore_xcb_conn, win,
1138 ECORE_X_ATOM_WM_PROTOCOLS, num, protos);
1139#endif
1140 else
1141 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_WM_PROTOCOLS);
1142}
1143
1144EAPI Eina_Bool
1145ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win,
1146 Eina_Bool *request_pos,
1147 Ecore_X_Gravity *gravity,
1148 int *min_w,
1149 int *min_h,
1150 int *max_w,
1151 int *max_h,
1152 int *base_w,
1153 int *base_h,
1154 int *step_x,
1155 int *step_y,
1156 double *min_aspect,
1157 double *max_aspect)
1158{
1159 xcb_size_hints_t hints;
1160 xcb_get_property_cookie_t cookie;
1161 uint8_t ret = 0;
1162 int32_t minw = 0, minh = 0;
1163 int32_t maxw = 32767, maxh = 32767;
1164 int32_t basew = -1, baseh = -1;
1165 int32_t stepx = -1, stepy = -1;
1166 double mina = 0.0, maxa = 0.0;
1167
1168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1169 CHECK_XCB_CONN;
1170
1171 if (request_pos) *request_pos = EINA_FALSE;
1172 if (gravity) *gravity = ECORE_X_GRAVITY_NW;
1173 if (min_w) *min_w = minw;
1174 if (min_h) *min_h = minh;
1175 if (max_w) *max_w = maxw;
1176 if (max_h) *max_h = maxh;
1177 if (base_w) *base_w = basew;
1178 if (base_h) *base_h = baseh;
1179 if (step_x) *step_x = stepx;
1180 if (step_y) *step_y = stepy;
1181 if (min_aspect) *min_aspect = mina;
1182 if (max_aspect) *max_aspect = maxa;
1183
1184#ifdef OLD_XCB_VERSION
1185 cookie = xcb_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
1186 ret = xcb_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
1187#else
1188 cookie = xcb_icccm_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
1189 ret = xcb_icccm_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie,
1190 &hints, NULL);
1191#endif
1192 if (!ret) return EINA_FALSE;
1193
1194#ifdef OLD_XCB_VERSION
1195 if ((hints.flags & XCB_SIZE_HINT_US_POSITION) ||
1196 (hints.flags & XCB_SIZE_HINT_P_POSITION))
1197#else
1198 if ((hints.flags & XCB_ICCCM_SIZE_HINT_US_POSITION) ||
1199 (hints.flags & XCB_ICCCM_SIZE_HINT_P_POSITION))
1200#endif
1201 {
1202 if (request_pos) *request_pos = EINA_TRUE;
1203 }
1204
1205#ifdef OLD_XCB_VERSION
1206 if (hints.flags & XCB_SIZE_HINT_P_WIN_GRAVITY)
1207#else
1208 if (hints.flags & XCB_ICCCM_SIZE_HINT_P_WIN_GRAVITY)
1209#endif
1210 {
1211 if (gravity) *gravity = hints.win_gravity;
1212 }
1213
1214#ifdef OLD_XCB_VERSION
1215 if (hints.flags & XCB_SIZE_HINT_P_MIN_SIZE)
1216#else
1217 if (hints.flags & XCB_ICCCM_SIZE_HINT_P_MIN_SIZE)
1218#endif
1219 {
1220 minw = hints.min_width;
1221 minh = hints.min_height;
1222 }
1223
1224#ifdef OLD_XCB_VERSION
1225 if (hints.flags & XCB_SIZE_HINT_P_MAX_SIZE)
1226#else
1227 if (hints.flags & XCB_ICCCM_SIZE_HINT_P_MAX_SIZE)
1228#endif
1229 {
1230 maxw = hints.max_width;
1231 maxh = hints.max_height;
1232 if (maxw < minw) maxw = minw;
1233 if (maxh < minh) maxh = minh;
1234 }
1235
1236#ifdef OLD_XCB_VERSION
1237 if (hints.flags & XCB_SIZE_HINT_BASE_SIZE)
1238#else
1239 if (hints.flags & XCB_ICCCM_SIZE_HINT_BASE_SIZE)
1240#endif
1241 {
1242 basew = hints.base_width;
1243 baseh = hints.base_height;
1244 if (basew > minw) minw = basew;
1245 if (baseh > minh) minh = baseh;
1246 }
1247
1248#ifdef OLD_XCB_VERSION
1249 if (hints.flags & XCB_SIZE_HINT_P_RESIZE_INC)
1250#else
1251 if (hints.flags & XCB_ICCCM_SIZE_HINT_P_RESIZE_INC)
1252#endif
1253 {
1254 stepx = hints.width_inc;
1255 stepy = hints.height_inc;
1256 if (stepx < 1) stepx = 1;
1257 if (stepy < 1) stepy = 1;
1258 }
1259
1260#ifdef OLD_XCB_VERSION
1261 if (hints.flags & XCB_SIZE_HINT_P_ASPECT)
1262#else
1263 if (hints.flags & XCB_ICCCM_SIZE_HINT_P_ASPECT)
1264#endif
1265 {
1266 if (hints.min_aspect_den > 0)
1267 mina = ((double)hints.min_aspect_num) / ((double)hints.min_aspect_den);
1268
1269 if (hints.max_aspect_den > 0)
1270 maxa = ((double)hints.max_aspect_num) / ((double)hints.max_aspect_den);
1271 }
1272
1273 if (min_w) *min_w = minw;
1274 if (min_h) *min_h = minh;
1275 if (max_w) *max_w = maxw;
1276 if (max_h) *max_h = maxh;
1277 if (base_w) *base_w = basew;
1278 if (base_h) *base_h = baseh;
1279 if (step_x) *step_x = stepx;
1280 if (step_y) *step_y = stepy;
1281 if (min_aspect) *min_aspect = mina;
1282 if (max_aspect) *max_aspect = maxa;
1283
1284 return EINA_TRUE;
1285}
1286
1287EAPI void
1288ecore_x_icccm_size_pos_hints_set(Ecore_X_Window win,
1289 Eina_Bool request_pos,
1290 Ecore_X_Gravity gravity,
1291 int min_w,
1292 int min_h,
1293 int max_w,
1294 int max_h,
1295 int base_w,
1296 int base_h,
1297 int step_x,
1298 int step_y,
1299 double min_aspect,
1300 double max_aspect)
1301{
1302 xcb_get_property_cookie_t cookie;
1303 xcb_size_hints_t hints;
1304 uint8_t ret = 0;
1305
1306 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1307 CHECK_XCB_CONN;
1308
1309#ifdef OLD_XCB_VERSION
1310 cookie = xcb_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
1311 ret = xcb_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie, &hints, NULL);
1312#else
1313 cookie = xcb_icccm_get_wm_normal_hints_unchecked(_ecore_xcb_conn, win);
1314 ret = xcb_icccm_get_wm_normal_hints_reply(_ecore_xcb_conn, cookie,
1315 &hints, NULL);
1316#endif
1317 if (!ret) memset(&hints, 0, sizeof(xcb_size_hints_t));
1318
1319 hints.flags = 0;
1320
1321#ifdef OLD_XCB_VERSION
1322 if (request_pos)
1323 hints.flags |= XCB_SIZE_HINT_US_POSITION;
1324
1325 if (gravity != ECORE_X_GRAVITY_NW)
1326 xcb_size_hints_set_win_gravity(&hints, gravity);
1327 if ((min_w > 0) || (min_h > 0))
1328 xcb_size_hints_set_min_size(&hints, min_w, min_h);
1329 if ((max_w > 0) || (max_h > 0))
1330 xcb_size_hints_set_max_size(&hints, max_w, max_h);
1331 if ((base_w > 0) || (base_h > 0))
1332 xcb_size_hints_set_base_size(&hints, base_w, base_h);
1333 if ((step_x > 1) || (step_y > 1))
1334 xcb_size_hints_set_resize_inc(&hints, step_x, step_y);
1335 if ((min_aspect > 0.0) || (max_aspect > 0.0))
1336 xcb_size_hints_set_aspect(&hints,
1337 (int32_t)(min_aspect * 10000), 10000,
1338 (int32_t)(max_aspect * 10000), 10000);
1339
1340 xcb_set_wm_normal_hints(_ecore_xcb_conn, win, &hints);
1341#else
1342 if (request_pos)
1343 hints.flags |= XCB_ICCCM_SIZE_HINT_US_POSITION;
1344
1345 if (gravity != ECORE_X_GRAVITY_NW)
1346 xcb_icccm_size_hints_set_win_gravity(&hints, gravity);
1347 if ((min_w > 0) || (min_h > 0))
1348 xcb_icccm_size_hints_set_min_size(&hints, min_w, min_h);
1349 if ((max_w > 0) || (max_h > 0))
1350 xcb_icccm_size_hints_set_max_size(&hints, max_w, max_h);
1351 if ((base_w > 0) || (base_h > 0))
1352 xcb_icccm_size_hints_set_base_size(&hints, base_w, base_h);
1353 if ((step_x > 1) || (step_y > 1))
1354 xcb_icccm_size_hints_set_resize_inc(&hints, step_x, step_y);
1355 if ((min_aspect > 0.0) || (max_aspect > 0.0))
1356 xcb_icccm_size_hints_set_aspect(&hints,
1357 (int32_t)(min_aspect * 10000), 10000,
1358 (int32_t)(max_aspect * 10000), 10000);
1359
1360 xcb_icccm_set_wm_normal_hints(_ecore_xcb_conn, win, &hints);
1361#endif
1362}
1363
1364EAPI void
1365ecore_x_icccm_move_resize_send(Ecore_X_Window win,
1366 int x,
1367 int y,
1368 int w,
1369 int h)
1370{
1371 xcb_configure_notify_event_t ev;
1372
1373 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1374 CHECK_XCB_CONN;
1375
1376 if (!win) return;
1377
1378 memset(&ev, 0, sizeof(xcb_configure_notify_event_t));
1379
1380 ev.response_type = XCB_CONFIGURE_NOTIFY;
1381 ev.event = win;
1382 ev.window = win;
1383 ev.above_sibling = XCB_NONE;
1384 ev.x = x;
1385 ev.y = y;
1386 ev.width = w;
1387 ev.height = h;
1388 ev.border_width = 0;
1389 ev.override_redirect = 0;
1390
1391 xcb_send_event(_ecore_xcb_conn, 0, win,
1392 XCB_EVENT_MASK_STRUCTURE_NOTIFY, (const char *)&ev);
1393// ecore_x_flush();
1394}
1395
1396/**
1397 * Get a window client machine string.
1398 * @param win The window
1399 * @return The windows client machine string
1400 *
1401 * Return the client machine of a window. String must be free'd when done with.
1402 */
1403EAPI char *
1404ecore_x_icccm_client_machine_get(Ecore_X_Window win)
1405{
1406 xcb_get_property_cookie_t cookie;
1407#ifdef OLD_XCB_VERSION
1408 xcb_get_text_property_reply_t prop;
1409#else
1410 xcb_icccm_get_text_property_reply_t prop;
1411#endif
1412 uint8_t ret = 0;
1413 char *tmp = NULL;
1414
1415 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1416 CHECK_XCB_CONN;
1417
1418#ifdef OLD_XCB_VERSION
1419 cookie = xcb_get_wm_client_machine_unchecked(_ecore_xcb_conn, win);
1420 ret = xcb_get_wm_client_machine_reply(_ecore_xcb_conn, cookie, &prop, NULL);
1421#else
1422 cookie = xcb_icccm_get_wm_client_machine_unchecked(_ecore_xcb_conn, win);
1423 ret = xcb_icccm_get_wm_client_machine_reply(_ecore_xcb_conn, cookie,
1424 &prop, NULL);
1425#endif
1426 if (ret == 0) return NULL;
1427
1428 tmp = malloc((prop.name_len + 1) * sizeof(char *));
1429 if (!tmp)
1430 {
1431#ifdef OLD_XCB_VERSION
1432 xcb_get_text_property_reply_wipe(&prop);
1433#else
1434 xcb_icccm_get_text_property_reply_wipe(&prop);
1435#endif
1436 return NULL;
1437 }
1438 memcpy(tmp, prop.name, sizeof(char *) * prop.name_len);
1439 tmp[prop.name_len] = '\0';
1440
1441#ifdef OLD_XCB_VERSION
1442 xcb_get_text_property_reply_wipe(&prop);
1443#else
1444 xcb_icccm_get_text_property_reply_wipe(&prop);
1445#endif
1446
1447 return tmp;
1448}
1449
1450EAPI void
1451ecore_x_icccm_take_focus_send(Ecore_X_Window win,
1452 Ecore_X_Time t)
1453{
1454 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1455
1456 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
1457 XCB_EVENT_MASK_NO_EVENT,
1458 ECORE_X_ATOM_WM_TAKE_FOCUS, t, 0, 0, 0);
1459}
1460
1461EAPI void
1462ecore_x_icccm_save_yourself_send(Ecore_X_Window win,
1463 Ecore_X_Time t)
1464{
1465 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1466 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
1467 XCB_EVENT_MASK_NO_EVENT,
1468 ECORE_X_ATOM_WM_SAVE_YOURSELF, t, 0, 0, 0);
1469}
1470
1471/**
1472 * Add a subwindow to the list of windows that need a different colormap installed.
1473 * @param win The toplevel window
1474 * @param subwin The subwindow to be added to the colormap windows list
1475 */
1476EAPI void
1477ecore_x_icccm_colormap_window_set(Ecore_X_Window win,
1478 Ecore_X_Window subwin)
1479{
1480 int num = 0, i = 0;
1481 unsigned char *odata = NULL, *data = NULL;
1482 Ecore_X_Window *newset = NULL, *oldset = NULL;
1483
1484 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1485
1486 if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1487 ECORE_X_ATOM_WINDOW, 32, &odata, &num))
1488 {
1489 if (!(newset = calloc(1, sizeof(Ecore_X_Window)))) return;
1490 newset[0] = subwin;
1491 num = 1;
1492 data = (unsigned char *)newset;
1493 }
1494 else
1495 {
1496 if (!(newset = calloc(num + 1, sizeof(Ecore_X_Window)))) return;
1497 oldset = (Ecore_X_Window *)odata;
1498 for (i = 0; i < num; i++)
1499 {
1500 if (oldset[i] == subwin)
1501 {
1502 if (odata) free(odata);
1503 odata = NULL;
1504 free(newset);
1505 return;
1506 }
1507 newset[i] = oldset[i];
1508 }
1509 newset[num++] = subwin;
1510 if (odata) free(odata);
1511 data = (unsigned char *)newset;
1512 }
1513 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1514 ECORE_X_ATOM_WINDOW, 32, data, num);
1515 free(newset);
1516}
1517
1518/**
1519 * Remove a window from the list of colormap windows.
1520 * @param win The toplevel window
1521 * @param subwin The window to be removed from the colormap window list.
1522 */
1523EAPI void
1524ecore_x_icccm_colormap_window_unset(Ecore_X_Window win,
1525 Ecore_X_Window subwin)
1526{
1527 int num = 0, i = 0, j = 0, k = 0;
1528 unsigned char *odata = NULL, *data = NULL;
1529 Ecore_X_Window *newset = NULL, *oldset = NULL;
1530
1531 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1532
1533 if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1534 ECORE_X_ATOM_WINDOW, 32, &odata, &num))
1535 return;
1536
1537 oldset = (Ecore_X_Window *)odata;
1538 for (i = 0; i < num; i++)
1539 {
1540 if (oldset[i] == subwin)
1541 {
1542 if (num == 1)
1543 {
1544 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
1545 if (odata) free(odata);
1546 odata = NULL;
1547 return;
1548 }
1549 else
1550 {
1551 newset = calloc(num - 1, sizeof(Ecore_X_Window));
1552 data = (unsigned char *)newset;
1553 for (j = 0; j < num; ++j)
1554 if (oldset[j] != subwin)
1555 newset[k++] = oldset[j];
1556
1557 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1558 ECORE_X_ATOM_WINDOW, 32, data, k);
1559 if (odata) free(odata);
1560 odata = NULL;
1561 free(newset);
1562 return;
1563 }
1564 }
1565 }
1566 if (odata) free(odata);
1567}
1568
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_image.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_image.c
new file mode 100644
index 0000000..6789b94
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_image.c
@@ -0,0 +1,740 @@
1#include "ecore_xcb_private.h"
2#include <sys/ipc.h>
3#include <sys/shm.h>
4#include <xcb/xcb_event.h>
5#include <xcb/shm.h>
6
7struct _Ecore_X_Image
8{
9 xcb_shm_segment_info_t shminfo;
10 xcb_image_t *xim;
11 Ecore_X_Visual vis;
12 int depth, w, h;
13 int bpl, bpp, rows;
14 unsigned char *data;
15 Eina_Bool shm : 1;
16};
17
18/* local function prototypes */
19static void _ecore_xcb_image_shm_check(void);
20static void _ecore_xcb_image_shm_create(Ecore_X_Image *im);
21static xcb_format_t *_ecore_xcb_image_find_format(const xcb_setup_t *setup,
22 uint8_t depth);
23
24/* local variables */
25static int _ecore_xcb_image_shm_can = -1;
26
27EAPI Ecore_X_Image *
28ecore_x_image_new(int w,
29 int h,
30 Ecore_X_Visual vis,
31 int depth)
32{
33 Ecore_X_Image *im;
34
35 LOGFN(__FILE__, __LINE__, __FUNCTION__);
36
37 if (!(im = calloc(1, sizeof(Ecore_X_Image)))) return NULL;
38 im->w = w;
39 im->h = h;
40 im->vis = vis;
41 im->depth = depth;
42 _ecore_xcb_image_shm_check();
43 im->shm = _ecore_xcb_image_shm_can;
44 return im;
45}
46
47EAPI void
48ecore_x_image_free(Ecore_X_Image *im)
49{
50 LOGFN(__FILE__, __LINE__, __FUNCTION__);
51 CHECK_XCB_CONN;
52
53 if (!im) return;
54 if (im->shm)
55 {
56 if (im->xim)
57 {
58 xcb_shm_detach(_ecore_xcb_conn, im->shminfo.shmseg);
59 xcb_image_destroy(im->xim);
60 shmdt(im->shminfo.shmaddr);
61 shmctl(im->shminfo.shmid, IPC_RMID, 0);
62 }
63 }
64 else if (im->xim)
65 {
66 if (im->xim->data) free(im->xim->data);
67 im->xim->data = NULL;
68 xcb_image_destroy(im->xim);
69 }
70
71 free(im);
72// ecore_x_flush();
73}
74
75EAPI Eina_Bool
76ecore_x_image_get(Ecore_X_Image *im,
77 Ecore_X_Drawable draw,
78 int x,
79 int y,
80 int sx,
81 int sy,
82 int w,
83 int h)
84{
85 Eina_Bool ret = EINA_TRUE;
86
87 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 CHECK_XCB_CONN;
89
90 if (im->shm)
91 {
92 if (!im->xim) _ecore_xcb_image_shm_create(im);
93 if (!im->xim) return EINA_FALSE;
94
95 if ((sx == 0) && (w == im->w))
96 {
97 im->xim->data = (uint8_t *)im->data + (im->xim->stride * sy) +
98 (sx * im->bpp);
99 im->xim->width = w;
100 im->xim->height = h;
101
102 ecore_x_grab();
103 if (!xcb_image_shm_get(_ecore_xcb_conn, draw, im->xim,
104 im->shminfo, x, y, 0xffffffff))
105 {
106 DBG("\tImage Shm Get Failed");
107 ret = EINA_FALSE;
108 }
109 ecore_x_ungrab();
110 ecore_x_sync(); // needed
111 }
112 else
113 {
114 Ecore_X_Image *tim;
115
116 tim = ecore_x_image_new(w, h, im->vis, im->depth);
117 if (tim)
118 {
119 ret = ecore_x_image_get(tim, draw, x, y, 0, 0, w, h);
120 if (ret)
121 {
122 unsigned char *spixels, *pixels;
123 int sbpp = 0, sbpl = 0, srows = 0;
124 int bpp = 0, bpl = 0, rows = 0;
125
126 spixels =
127 ecore_x_image_data_get(tim, &sbpl, &srows, &sbpp);
128 pixels = ecore_x_image_data_get(im, &bpl, &rows, &bpp);
129 if ((spixels) && (pixels))
130 {
131 unsigned char *p, *sp;
132 int r = 0;
133
134 p = (pixels + (sy * bpl) + (sx * bpp));
135 sp = spixels;
136 for (r = srows; r > 0; r--)
137 {
138 memcpy(p, sp, sbpl);
139 p += bpl;
140 sp += sbpl;
141 }
142 }
143 }
144 ecore_x_image_free(tim);
145 }
146 }
147 }
148 else
149 {
150 ret = EINA_FALSE;
151 ecore_x_grab();
152 im->xim =
153 xcb_image_get(_ecore_xcb_conn, draw, x, y, w, h,
154 0xffffffff, XCB_IMAGE_FORMAT_Z_PIXMAP);
155 if (!im->xim) ret = EINA_FALSE;
156 ecore_x_ungrab();
157 ecore_x_sync(); // needed
158
159 if (im->xim)
160 {
161 im->data = (unsigned char *)im->xim->data;
162 im->bpl = im->xim->stride;
163 im->rows = im->xim->height;
164 if (im->xim->bpp <= 8)
165 im->bpp = 1;
166 else if (im->xim->bpp <= 16)
167 im->bpp = 2;
168 else
169 im->bpp = 4;
170 }
171 }
172
173 return ret;
174}
175
176EAPI void *
177ecore_x_image_data_get(Ecore_X_Image *im,
178 int *bpl,
179 int *rows,
180 int *bpp)
181{
182 LOGFN(__FILE__, __LINE__, __FUNCTION__);
183
184 if (!im) return NULL;
185 if (!im->xim) _ecore_xcb_image_shm_create(im);
186 if (!im->xim) return NULL;
187
188 if (bpl) *bpl = im->bpl;
189 if (rows) *rows = im->rows;
190 if (bpp) *bpp = im->bpp;
191
192 return im->data;
193}
194
195EAPI void
196ecore_x_image_put(Ecore_X_Image *im,
197 Ecore_X_Drawable draw,
198 Ecore_X_GC gc,
199 int x,
200 int y,
201 int sx,
202 int sy,
203 int w,
204 int h)
205{
206 Ecore_X_GC tgc = 0;
207
208 LOGFN(__FILE__, __LINE__, __FUNCTION__);
209 CHECK_XCB_CONN;
210
211 if (!gc)
212 {
213 uint32_t mask, values[1];
214
215 tgc = xcb_generate_id(_ecore_xcb_conn);
216 mask = XCB_GC_SUBWINDOW_MODE;
217 values[0] = XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS;
218 xcb_create_gc(_ecore_xcb_conn, tgc, draw, mask, values);
219 gc = tgc;
220 }
221 if (!im->xim) _ecore_xcb_image_shm_create(im);
222 if (im->xim)
223 {
224 if (im->shm)
225 xcb_shm_put_image(_ecore_xcb_conn, draw, gc, im->xim->width,
226 im->xim->height, sx, sy, w, h, x, y,
227 im->xim->depth, im->xim->format, 0,
228 im->shminfo.shmseg,
229 im->xim->data - im->shminfo.shmaddr);
230// xcb_image_shm_put(_ecore_xcb_conn, draw, gc, im->xim,
231// im->shminfo, sx, sy, x, y, w, h, 0);
232 else
233 xcb_image_put(_ecore_xcb_conn, draw, gc, im->xim, sx, sy, 0);
234 }
235 if (tgc) ecore_x_gc_free(tgc);
236 ecore_x_sync();
237}
238
239EAPI Eina_Bool
240ecore_x_image_is_argb32_get(Ecore_X_Image *im)
241{
242 xcb_visualtype_t *vis;
243
244 LOGFN(__FILE__, __LINE__, __FUNCTION__);
245 CHECK_XCB_CONN;
246
247 vis = (xcb_visualtype_t *)im->vis;
248 if (!im->xim) _ecore_xcb_image_shm_create(im);
249
250 if (((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) ||
251 (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR)) &&
252 (im->depth >= 24) && (vis->red_mask == 0xff0000) &&
253 (vis->green_mask == 0x00ff00) && (vis->blue_mask == 0x0000ff))
254 {
255#ifdef WORDS_BIGENDIAN
256 if (im->xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
257 return EINA_TRUE;
258#else
259 if (im->xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
260 return EINA_TRUE;
261#endif
262 }
263
264 return EINA_FALSE;
265}
266
267EAPI Eina_Bool
268ecore_x_image_to_argb_convert(void *src,
269 int sbpp,
270 int sbpl,
271 Ecore_X_Colormap c,
272 Ecore_X_Visual v,
273 int x,
274 int y,
275 int w,
276 int h,
277 unsigned int *dst,
278 int dbpl,
279 int dx,
280 int dy)
281{
282 xcb_visualtype_t *vis;
283 uint32_t *cols;
284 int n = 0, nret = 0, i, row, mode = 0;
285 unsigned int pal[256], r, g, b;
286 enum
287 {
288 rgbnone = 0,
289 rgb565,
290 bgr565,
291 rgbx555,
292 argbx888,
293 abgrx888,
294 rgba888x,
295 bgra888x,
296 argbx666
297 };
298
299 LOGFN(__FILE__, __LINE__, __FUNCTION__);
300 CHECK_XCB_CONN;
301
302 sbpp *= 8;
303
304 vis = (xcb_visualtype_t *)v;
305 n = vis->colormap_entries;
306 if ((n <= 256) &&
307 ((vis->_class == XCB_VISUAL_CLASS_PSEUDO_COLOR) ||
308 (vis->_class == XCB_VISUAL_CLASS_STATIC_COLOR) ||
309 (vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) ||
310 (vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY)))
311 {
312 xcb_query_colors_cookie_t cookie;
313 xcb_query_colors_reply_t *reply;
314
315 if (!c)
316 {
317 c = (xcb_colormap_t)((xcb_screen_t *)
318 _ecore_xcb_screen)->default_colormap;
319 }
320
321 cols = alloca(n * sizeof(uint32_t));
322 for (i = 0; i < n; i++)
323 cols[i] = i;
324
325 cookie = xcb_query_colors_unchecked(_ecore_xcb_conn, c, n, cols);
326 reply = xcb_query_colors_reply(_ecore_xcb_conn, cookie, NULL);
327 if (reply)
328 {
329 xcb_rgb_iterator_t iter;
330 xcb_rgb_t *ret;
331
332 iter = xcb_query_colors_colors_iterator(reply);
333 ret = xcb_query_colors_colors(reply);
334 if (ret)
335 {
336 for (i = 0; iter.rem; xcb_rgb_next(&iter), i++)
337 {
338 pal[i] = 0xff000000 |
339 ((iter.data->red >> 8) << 16) |
340 ((iter.data->green >> 8) << 8) |
341 ((iter.data->blue >> 8));
342 }
343 nret = n;
344 }
345 free(reply);
346 }
347 }
348 else if ((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) ||
349 (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR))
350 {
351 if ((vis->red_mask == 0x00ff0000) &&
352 (vis->green_mask == 0x0000ff00) &&
353 (vis->blue_mask == 0x000000ff))
354 mode = argbx888;
355 else if ((vis->red_mask == 0x000000ff) &&
356 (vis->green_mask == 0x0000ff00) &&
357 (vis->blue_mask == 0x00ff0000))
358 mode = abgrx888;
359 else if ((vis->red_mask == 0xff000000) &&
360 (vis->green_mask == 0x00ff0000) &&
361 (vis->blue_mask == 0x0000ff00))
362 mode = rgba888x;
363 else if ((vis->red_mask == 0x0000ff00) &&
364 (vis->green_mask == 0x00ff0000) &&
365 (vis->blue_mask == 0xff000000))
366 mode = bgra888x;
367 else if ((vis->red_mask == 0x0003f000) &&
368 (vis->green_mask == 0x00000fc0) &&
369 (vis->blue_mask == 0x0000003f))
370 mode = argbx666;
371 else if ((vis->red_mask == 0x0000f800) &&
372 (vis->green_mask == 0x000007e0) &&
373 (vis->blue_mask == 0x0000001f))
374 mode = rgb565;
375 else if ((vis->red_mask == 0x0000001f) &&
376 (vis->green_mask == 0x000007e0) &&
377 (vis->blue_mask == 0x0000f800))
378 mode = bgr565;
379 else if ((vis->red_mask == 0x00007c00) &&
380 (vis->green_mask == 0x000003e0) &&
381 (vis->blue_mask == 0x0000001f))
382 mode = rgbx555;
383 else
384 return EINA_FALSE;
385 }
386 for (row = 0; row < h; row++)
387 {
388 unsigned char *s8;
389 unsigned short *s16;
390 unsigned int *s32, *dp, *de;
391
392 dp = ((unsigned int *)(((unsigned char *)dst) +
393 ((dy + row) * dbpl))) + dx;
394 de = dp + w;
395 switch (sbpp)
396 {
397 case 8:
398 s8 = ((unsigned char *)(((unsigned char *)src) +
399 ((y + row) * sbpl))) + x;
400 if (nret > 0)
401 {
402 while (dp < de)
403 {
404 *dp = pal[*s8];
405 s8++; dp++;
406 }
407 }
408 else
409 return EINA_FALSE;
410 break;
411
412 case 16:
413 s16 = ((unsigned short *)(((unsigned char *)src) +
414 ((y + row) * sbpl))) + x;
415 switch (mode)
416 {
417 case rgb565:
418 while (dp < de)
419 {
420 r = (*s16 & 0xf800) << 8;
421 g = (*s16 & 0x07e0) << 5;
422 b = (*s16 & 0x001f) << 3;
423 r |= (r >> 5) & 0xff0000;
424 g |= (g >> 6) & 0x00ff00;
425 b |= (b >> 5);
426 *dp = 0xff000000 | r | g | b;
427 s16++; dp++;
428 }
429 break;
430
431 case bgr565:
432 while (dp < de)
433 {
434 r = (*s16 & 0x001f) << 19;
435 g = (*s16 & 0x07e0) << 5;
436 b = (*s16 & 0xf800) >> 8;
437 r |= (r >> 5) & 0xff0000;
438 g |= (g >> 6) & 0x00ff00;
439 b |= (b >> 5);
440 *dp = 0xff000000 | r | g | b;
441 s16++; dp++;
442 }
443 break;
444
445 case rgbx555:
446 while (dp < de)
447 {
448 r = (*s16 & 0x7c00) << 9;
449 g = (*s16 & 0x03e0) << 6;
450 b = (*s16 & 0x001f) << 3;
451 r |= (r >> 5) & 0xff0000;
452 g |= (g >> 5) & 0x00ff00;
453 b |= (b >> 5);
454 *dp = 0xff000000 | r | g | b;
455 s16++; dp++;
456 }
457 break;
458
459 default:
460 return EINA_FALSE;
461 break;
462 }
463 break;
464
465 case 24:
466 case 32:
467 s32 = ((unsigned int *)(((unsigned char *)src) +
468 ((y + row) * sbpl))) + x;
469 switch (mode)
470 {
471 case argbx888:
472 while (dp < de)
473 {
474 *dp = 0xff000000 | *s32;
475 s32++; dp++;
476 }
477 break;
478
479 case abgrx888:
480 while (dp < de)
481 {
482 r = *s32 & 0x000000ff;
483 g = *s32 & 0x0000ff00;
484 b = *s32 & 0x00ff0000;
485 *dp = 0xff000000 | (r << 16) | (g) | (b >> 16);
486 s32++; dp++;
487 }
488 break;
489
490 case rgba888x:
491 while (dp < de)
492 {
493 *dp = 0xff000000 | (*s32 >> 8);
494 s32++; dp++;
495 }
496 break;
497
498 case bgra888x:
499 while (dp < de)
500 {
501 r = *s32 & 0x0000ff00;
502 g = *s32 & 0x00ff0000;
503 b = *s32 & 0xff000000;
504 *dp = 0xff000000 | (r << 8) | (g >> 8) | (b >> 24);
505 s32++; dp++;
506 }
507 break;
508
509 case argbx666:
510 while (dp < de)
511 {
512 r = (*s32 & 0x3f000) << 6;
513 g = (*s32 & 0x00fc0) << 4;
514 b = (*s32 & 0x0003f) << 2;
515 r |= (r >> 6) & 0xff0000;
516 g |= (g >> 6) & 0x00ff00;
517 b |= (b >> 6);
518 *dp = 0xff000000 | r | g | b;
519 s32++; dp++;
520 }
521 break;
522
523 default:
524 return EINA_FALSE;
525 break;
526 }
527 break;
528 break;
529
530 default:
531 return EINA_FALSE;
532 break;
533 }
534 }
535 return EINA_TRUE;
536}
537
538/* local functions */
539static void
540_ecore_xcb_image_shm_check(void)
541{
542// xcb_shm_query_version_reply_t *reply;
543 xcb_shm_segment_info_t shminfo;
544 xcb_shm_get_image_cookie_t cookie;
545 xcb_shm_get_image_reply_t *ireply;
546 xcb_image_t *img = 0;
547 uint8_t depth = 0;
548
549 if (_ecore_xcb_image_shm_can != -1) return;
550 CHECK_XCB_CONN;
551
552 /* reply = */
553 /* xcb_shm_query_version_reply(_ecore_xcb_conn, */
554 /* xcb_shm_query_version(_ecore_xcb_conn), NULL); */
555 /* if (!reply) */
556 /* { */
557 /* _ecore_xcb_image_shm_can = 0; */
558 /* return; */
559 /* } */
560
561 /* if ((reply->major_version < 1) || */
562 /* ((reply->major_version == 1) && (reply->minor_version == 0))) */
563 /* { */
564 /* _ecore_xcb_image_shm_can = 0; */
565 /* free(reply); */
566 /* return; */
567 /* } */
568
569 /* free(reply); */
570
571 depth = ((xcb_screen_t *)_ecore_xcb_screen)->root_depth;
572
573 ecore_x_sync(); // needed
574
575 img = _ecore_xcb_image_create_native(1, 1, XCB_IMAGE_FORMAT_Z_PIXMAP,
576 depth, NULL, ~0, NULL);
577 if (!img)
578 {
579 _ecore_xcb_image_shm_can = 0;
580 return;
581 }
582
583 shminfo.shmid =
584 shmget(IPC_PRIVATE, img->stride * img->height, (IPC_CREAT | 0666));
585 if (shminfo.shmid == (uint32_t)-1)
586 {
587 xcb_image_destroy(img);
588 _ecore_xcb_image_shm_can = 0;
589 return;
590 }
591
592 shminfo.shmaddr = shmat(shminfo.shmid, 0, 0);
593 img->data = shminfo.shmaddr;
594 if (img->data == (uint8_t *)-1)
595 {
596 xcb_image_destroy(img);
597 _ecore_xcb_image_shm_can = 0;
598 return;
599 }
600
601 shminfo.shmseg = xcb_generate_id(_ecore_xcb_conn);
602 xcb_shm_attach(_ecore_xcb_conn, shminfo.shmseg, shminfo.shmid, 0);
603
604 cookie =
605 xcb_shm_get_image(_ecore_xcb_conn,
606 ((xcb_screen_t *)_ecore_xcb_screen)->root,
607 0, 0, img->width, img->height,
608 0xffffffff, img->format,
609 shminfo.shmseg, img->data - shminfo.shmaddr);
610
611 ecore_x_sync(); // needed
612
613 ireply = xcb_shm_get_image_reply(_ecore_xcb_conn, cookie, NULL);
614 if (ireply)
615 {
616 _ecore_xcb_image_shm_can = 1;
617 free(ireply);
618 }
619 else
620 _ecore_xcb_image_shm_can = 0;
621
622 xcb_shm_detach(_ecore_xcb_conn, shminfo.shmseg);
623 xcb_image_destroy(img);
624 shmdt(shminfo.shmaddr);
625 shmctl(shminfo.shmid, IPC_RMID, 0);
626}
627
628static void
629_ecore_xcb_image_shm_create(Ecore_X_Image *im)
630{
631 CHECK_XCB_CONN;
632
633 im->xim =
634 _ecore_xcb_image_create_native(im->w, im->h, XCB_IMAGE_FORMAT_Z_PIXMAP,
635 im->depth, NULL, ~0, NULL);
636 if (!im->xim) return;
637
638 im->shminfo.shmid = shmget(IPC_PRIVATE, im->xim->size, (IPC_CREAT | 0666));
639 if (im->shminfo.shmid == (uint32_t)-1)
640 {
641 xcb_image_destroy(im->xim);
642 return;
643 }
644
645 im->shminfo.shmaddr = shmat(im->shminfo.shmid, 0, 0);
646 im->xim->data = im->shminfo.shmaddr;
647 if ((!im->xim->data) || (im->xim->data == (uint8_t *)-1))
648 {
649 DBG("Shm Create No Image Data");
650 xcb_image_destroy(im->xim);
651 shmdt(im->shminfo.shmaddr);
652 shmctl(im->shminfo.shmid, IPC_RMID, 0);
653 return;
654 }
655
656 im->shminfo.shmseg = xcb_generate_id(_ecore_xcb_conn);
657 xcb_shm_attach(_ecore_xcb_conn, im->shminfo.shmseg, im->shminfo.shmid, 0);
658
659 im->data = (unsigned char *)im->xim->data;
660 im->bpl = im->xim->stride;
661 im->rows = im->xim->height;
662 if (im->xim->bpp <= 8)
663 im->bpp = 1;
664 else if (im->xim->bpp <= 16)
665 im->bpp = 2;
666 else
667 im->bpp = 4;
668}
669
670xcb_image_t *
671_ecore_xcb_image_create_native(int w,
672 int h,
673 xcb_image_format_t format,
674 uint8_t depth,
675 void *base,
676 uint32_t bytes,
677 uint8_t *data)
678{
679 static uint8_t dpth = 0;
680 static xcb_format_t *fmt = NULL;
681 const xcb_setup_t *setup;
682 xcb_image_format_t xif;
683
684 CHECK_XCB_CONN;
685
686 /* NB: We cannot use xcb_image_create_native as it only creates images
687 * using MSB_FIRST, so this routine recreates that function and uses
688 * the endian-ness of the server setup */
689 setup = xcb_get_setup(_ecore_xcb_conn);
690 xif = format;
691
692 if ((xif == XCB_IMAGE_FORMAT_Z_PIXMAP) && (depth == 1))
693 xif = XCB_IMAGE_FORMAT_XY_PIXMAP;
694
695 if (dpth != depth)
696 {
697 dpth = depth;
698 fmt = _ecore_xcb_image_find_format(setup, depth);
699 if (!fmt) return 0;
700 }
701
702 switch (xif)
703 {
704 case XCB_IMAGE_FORMAT_XY_BITMAP:
705 if (depth != 1) return 0;
706
707 case XCB_IMAGE_FORMAT_XY_PIXMAP:
708 case XCB_IMAGE_FORMAT_Z_PIXMAP:
709 return xcb_image_create(w, h, xif,
710 fmt->scanline_pad,
711 fmt->depth, fmt->bits_per_pixel,
712 setup->bitmap_format_scanline_unit,
713 setup->image_byte_order,
714 setup->bitmap_format_bit_order,
715 base, bytes, data);
716
717 default:
718 break;
719 }
720
721 return 0;
722}
723
724static xcb_format_t *
725_ecore_xcb_image_find_format(const xcb_setup_t *setup,
726 uint8_t depth)
727{
728 xcb_format_t *fmt, *fmtend;
729
730 CHECK_XCB_CONN;
731
732 fmt = xcb_setup_pixmap_formats(setup);
733 fmtend = fmt + xcb_setup_pixmap_formats_length(setup);
734 for (; fmt != fmtend; ++fmt)
735 if (fmt->depth == depth)
736 return fmt;
737
738 return 0;
739}
740
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_input.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_input.c
new file mode 100644
index 0000000..c0338c2
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_input.c
@@ -0,0 +1,274 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_XINPUT
3# include <xcb/xinput.h>
4# include <xcb/xcb_event.h>
5#endif
6
7/* FIXME: this is a guess. can't find defines for touch events in xcb libs
8 * online */
9/* these are not yet defined in xcb support for xi2 - so manually create */
10#ifndef XCB_INPUT_DEVICE_TOUCH_BEGIN
11#define XCB_INPUT_DEVICE_TOUCH_BEGIN 18
12#endif
13#ifndef XCB_INPUT_DEVICE_TOUCH_END
14#define XCB_INPUT_DEVICE_TOUCH_END 19
15#endif
16#ifndef XCB_INPUT_DEVICE_TOUCH_UPDATE
17#define XCB_INPUT_DEVICE_TOUCH_UPDATE 21
18#endif
19
20#ifndef XCB_INPUT_POINTER_EMULATED_MASK
21#define XCB_INPUT_POINTER_EMULATED_MASK (1 << 16)
22#endif
23
24/* local variables */
25static Eina_Bool _input_avail = EINA_FALSE;
26
27/* external variables */
28int _ecore_xcb_event_input = 0;
29
30void
31_ecore_xcb_input_init(void)
32{
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
34
35#ifdef ECORE_XCB_XINPUT
36 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_input_id);
37#endif
38}
39
40void
41_ecore_xcb_input_finalize(void)
42{
43#ifdef ECORE_XCB_XINPUT
44 xcb_input_get_extension_version_cookie_t cookie;
45 xcb_input_get_extension_version_reply_t *reply;
46 char buff[128];
47#endif
48
49 LOGFN(__FILE__, __LINE__, __FUNCTION__);
50
51#ifdef ECORE_XCB_XINPUT
52 cookie =
53 xcb_input_get_extension_version_unchecked(_ecore_xcb_conn, 127, buff);
54 reply =
55 xcb_input_get_extension_version_reply(_ecore_xcb_conn, cookie, NULL);
56 if (reply)
57 {
58 _input_avail = EINA_TRUE;
59 free(reply);
60 }
61
62 if (_input_avail)
63 {
64 const xcb_query_extension_reply_t *ext_reply;
65
66 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_input_id);
67 if (ext_reply)
68 _ecore_xcb_event_input = ext_reply->first_event;
69 }
70#endif
71}
72
73void
74_ecore_xcb_input_shutdown(void)
75{
76 LOGFN(__FILE__, __LINE__, __FUNCTION__);
77}
78
79void
80#ifdef ECORE_XCB_XINPUT
81_ecore_xcb_input_handle_event(xcb_generic_event_t *event)
82#else
83_ecore_xcb_input_handle_event(xcb_generic_event_t * event __UNUSED__)
84#endif
85{
86#ifdef ECORE_XCB_XINPUT
87 xcb_ge_event_t *ev;
88#endif
89
90 LOGFN(__FILE__, __LINE__, __FUNCTION__);
91 CHECK_XCB_CONN;
92
93 /* FIXME: look at xlib ecore_x_xi2.c to copy logic in when i can find an
94 * xcb-input lib to test with */
95#ifdef ECORE_XCB_XINPUT
96 ev = (xcb_ge_event_t *)event;
97 switch (ev->event_type)
98 {
99 case XCB_INPUT_DEVICE_MOTION_NOTIFY:
100 {
101 xcb_input_device_motion_notify_event_t *de;
102 unsigned int child_win = 0;
103
104 de = (xcb_input_device_motion_notify_event_t *)ev->pad1;
105 child_win = (de->child ? de->child : de->event);
106 _ecore_xcb_event_mouse_move(de->time, de->state, de->event_x,
107 de->event_y, de->root_x, de->root_y,
108 de->event, child_win, de->root,
109 de->same_screen, de->device_id,
110 1, 1, 1.0, 0.0,
111 de->event_x, de->event_y,
112 de->root_x, de->root_y);
113 }
114 break;
115
116 case XCB_INPUT_DEVICE_BUTTON_PRESS:
117 {
118 xcb_input_device_button_press_event_t *de;
119 unsigned int child_win = 0;
120
121 de = (xcb_input_device_button_press_event_t *)ev->pad1;
122 child_win = (de->child ? de->child : de->event);
123 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
124 de->time, de->state, de->detail,
125 de->event_x, de->event_y,
126 de->root_x, de->root_y, de->event,
127 child_win, de->root,
128 de->same_screen, de->device_id,
129 1, 1, 1.0, 0.0,
130 de->event_x, de->event_y,
131 de->root_x, de->root_y);
132 }
133 break;
134
135 case XCB_INPUT_DEVICE_BUTTON_RELEASE:
136 {
137 xcb_input_device_button_release_event_t *de;
138 unsigned int child_win = 0;
139
140 de = (xcb_input_device_button_release_event_t *)ev->pad1;
141 child_win = (de->child ? de->child : de->event);
142 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
143 de->time, de->state, de->detail,
144 de->event_x, de->event_y,
145 de->root_x, de->root_y, de->event,
146 child_win, de->root,
147 de->same_screen, de->device_id,
148 1, 1, 1.0, 0.0,
149 de->event_x, de->event_y,
150 de->root_x, de->root_y);
151 }
152 break;
153
154 case XCB_INPUT_DEVICE_TOUCH_UPDATE:
155 {
156 xcb_input_device_motion_notify_event_t *de;
157 unsigned int child_win = 0;
158
159 de = (xcb_input_device_motion_notify_event_t *)ev->pad1;
160 child_win = (de->child ? de->child : de->event);
161 _ecore_xcb_event_mouse_move(de->time, de->state, de->event_x,
162 de->event_y, de->root_x, de->root_y,
163 de->event, child_win, de->root,
164 de->same_screen, de->device_id,
165 1, 1, 1.0, 0.0,
166 de->event_x, de->event_y,
167 de->root_x, de->root_y);
168 }
169 break;
170
171 case XCB_INPUT_DEVICE_TOUCH_BEGIN:
172 {
173 xcb_input_device_button_press_event_t *de;
174 unsigned int child_win = 0;
175
176 de = (xcb_input_device_button_press_event_t *)ev->pad1;
177 child_win = (de->child ? de->child : de->event);
178 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
179 de->time, de->state, de->detail,
180 de->event_x, de->event_y,
181 de->root_x, de->root_y, de->event,
182 child_win, de->root,
183 de->same_screen, de->device_id,
184 1, 1, 1.0, 0.0,
185 de->event_x, de->event_y,
186 de->root_x, de->root_y);
187 }
188 break;
189
190 case XCB_INPUT_DEVICE_TOUCH_END:
191 {
192 xcb_input_device_button_release_event_t *de;
193 unsigned int child_win = 0;
194
195 de = (xcb_input_device_button_release_event_t *)ev->pad1;
196 child_win = (de->child ? de->child : de->event);
197 _ecore_xcb_event_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
198 de->time, de->state, de->detail,
199 de->event_x, de->event_y,
200 de->root_x, de->root_y, de->event,
201 child_win, de->root,
202 de->same_screen, de->device_id,
203 1, 1, 1.0, 0.0,
204 de->event_x, de->event_y,
205 de->root_x, de->root_y);
206 }
207 break;
208
209 default:
210 break;
211 }
212#endif
213}
214
215EAPI Eina_Bool
216ecore_x_input_multi_select(Ecore_X_Window win)
217{
218 Eina_Bool find = EINA_FALSE;
219#ifdef ECORE_XCB_XINPUT
220 xcb_input_list_input_devices_cookie_t dcookie;
221 xcb_input_list_input_devices_reply_t *dreply;
222 xcb_input_device_info_iterator_t diter;
223#endif
224
225 LOGFN(__FILE__, __LINE__, __FUNCTION__);
226 CHECK_XCB_CONN;
227
228 if (!_input_avail) return EINA_FALSE;
229
230 /* FIXME: i can't seemingly test this! no xcb input lib so can't look and
231 * test and look at types etc. - look at xlib code and copy logic over
232 * when we can */
233#ifdef ECORE_XCB_XINPUT
234 dcookie = xcb_input_list_input_devices_unchecked(_ecore_xcb_conn);
235 dreply =
236 xcb_input_list_input_devices_reply(_ecore_xcb_conn, dcookie, NULL);
237 if (!dreply) return EINA_FALSE;
238
239 diter = xcb_input_list_input_devices_devices_iterator(dreply);
240 while (diter.rem)
241 {
242 xcb_input_device_info_t *dev;
243 const xcb_input_event_class_t iclass[] =
244 {
245 XCB_INPUT_DEVICE_BUTTON_PRESS,
246 XCB_INPUT_DEVICE_BUTTON_RELEASE,
247 XCB_INPUT_DEVICE_MOTION_NOTIFY,
248 XCB_INPUT_DEVICE_TOUCH_BEGIN,
249 XCB_INPUT_DEVICE_TOUCH_END,
250 XCB_INPUT_DEVICE_TOUCH_UPDATE
251 };
252
253 dev = diter.data;
254 if (dev->device_use == XCB_INPUT_DEVICE_USE_IS_X_EXTENSION_DEVICE)
255 {
256 DBG("Device %d", dev->device_id);
257 DBG("\tType: %d", dev->device_type);
258 DBG("\tNum Classes: %d", dev->num_class_info);
259 DBG("\tUse: %d", dev->device_use);
260
261 xcb_input_select_extension_event(_ecore_xcb_conn, win,
262 sizeof(iclass) / sizeof(xcb_input_event_class_t),
263 iclass);
264 find = EINA_TRUE;
265 }
266 xcb_input_device_info_next(&diter);
267 }
268 free(dreply);
269#endif
270
271 return find;
272 win = 0;
273}
274
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_keymap.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_keymap.c
new file mode 100644
index 0000000..40304df
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_keymap.c
@@ -0,0 +1,482 @@
1#include "ecore_xcb_private.h"
2#define NEED_KEYSYM_TABLE
3#define NEED_VTABLE
4#include "ecore_xcb_keysym_table.h"
5#include <xcb/xcb_keysyms.h>
6#include <X11/keysym.h>
7
8/* local function prototypes */
9static int _ecore_xcb_keymap_mask_get(void *reply,
10 xcb_keysym_t sym);
11static xcb_keysym_t _ecore_xcb_keymap_string_to_keysym(const char *str);
12static int _ecore_xcb_keymap_translate_key(xcb_keycode_t keycode,
13 unsigned int modifiers,
14 unsigned int *modifiers_return,
15 xcb_keysym_t *keysym_return);
16static int _ecore_xcb_keymap_translate_keysym(xcb_keysym_t keysym,
17 unsigned int modifiers,
18 char *buffer,
19 int bytes);
20
21/* local variables */
22static xcb_key_symbols_t *_ecore_xcb_keysyms;
23static int _ecore_xcb_mode_switch = 0;
24
25/* public variables */
26EAPI int ECORE_X_MODIFIER_SHIFT = 0;
27EAPI int ECORE_X_MODIFIER_CTRL = 0;
28EAPI int ECORE_X_MODIFIER_ALT = 0;
29EAPI int ECORE_X_MODIFIER_WIN = 0;
30EAPI int ECORE_X_LOCK_SCROLL = 0;
31EAPI int ECORE_X_LOCK_NUM = 0;
32EAPI int ECORE_X_LOCK_CAPS = 0;
33EAPI int ECORE_X_LOCK_SHIFT = 0;
34
35void
36_ecore_xcb_keymap_init(void)
37{
38 LOGFN(__FILE__, __LINE__, __FUNCTION__);
39
40 _ecore_xcb_keysyms = xcb_key_symbols_alloc(_ecore_xcb_conn);
41}
42
43void
44_ecore_xcb_keymap_finalize(void)
45{
46 xcb_get_modifier_mapping_cookie_t cookie;
47 xcb_get_modifier_mapping_reply_t *reply;
48
49 LOGFN(__FILE__, __LINE__, __FUNCTION__);
50 CHECK_XCB_CONN;
51
52 cookie = xcb_get_modifier_mapping_unchecked(_ecore_xcb_conn);
53 reply = xcb_get_modifier_mapping_reply(_ecore_xcb_conn, cookie, NULL);
54 if (!reply)
55 {
56 xcb_key_symbols_free(_ecore_xcb_keysyms);
57 return;
58 }
59
60 _ecore_xcb_mode_switch = _ecore_xcb_keymap_mask_get(reply, XK_Mode_switch);
61
62 ECORE_X_MODIFIER_SHIFT = _ecore_xcb_keymap_mask_get(reply, XK_Shift_L);
63 ECORE_X_MODIFIER_CTRL = _ecore_xcb_keymap_mask_get(reply, XK_Control_L);
64
65 ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Alt_L);
66 if (!ECORE_X_MODIFIER_ALT)
67 ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Meta_L);
68 if (!ECORE_X_MODIFIER_ALT)
69 ECORE_X_MODIFIER_ALT = _ecore_xcb_keymap_mask_get(reply, XK_Super_L);
70
71 ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Super_L);
72 if (!ECORE_X_MODIFIER_WIN)
73 ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Mode_switch);
74 if (!ECORE_X_MODIFIER_WIN)
75 ECORE_X_MODIFIER_WIN = _ecore_xcb_keymap_mask_get(reply, XK_Meta_L);
76
77 if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
78 ECORE_X_MODIFIER_WIN = 0;
79 if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)
80 ECORE_X_MODIFIER_ALT = 0;
81
82 ECORE_X_LOCK_SCROLL = _ecore_xcb_keymap_mask_get(reply, XK_Scroll_Lock);
83 ECORE_X_LOCK_NUM = _ecore_xcb_keymap_mask_get(reply, XK_Num_Lock);
84 ECORE_X_LOCK_CAPS = _ecore_xcb_keymap_mask_get(reply, XK_Caps_Lock);
85 ECORE_X_LOCK_SHIFT = _ecore_xcb_keymap_mask_get(reply, XK_Shift_Lock);
86}
87
88void
89_ecore_xcb_modifiers_get(void)
90{
91 _ecore_xcb_keymap_finalize();
92}
93
94void
95_ecore_xcb_keymap_shutdown(void)
96{
97 LOGFN(__FILE__, __LINE__, __FUNCTION__);
98
99 if (_ecore_xcb_keysyms) xcb_key_symbols_free(_ecore_xcb_keysyms);
100}
101
102void
103_ecore_xcb_keymap_refresh(xcb_mapping_notify_event_t *event)
104{
105 CHECK_XCB_CONN;
106 xcb_refresh_keyboard_mapping(_ecore_xcb_keysyms, event);
107}
108
109xcb_keysym_t
110_ecore_xcb_keymap_keycode_to_keysym(xcb_keycode_t keycode,
111 int col)
112{
113 xcb_keysym_t key0, key1;
114
115 CHECK_XCB_CONN;
116 if (col & _ecore_xcb_mode_switch)
117 {
118 key0 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 4);
119 key1 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 5);
120 }
121 else
122 {
123 key0 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 0);
124 key1 = xcb_key_symbols_get_keysym(_ecore_xcb_keysyms, keycode, 1);
125 }
126
127 if (key1 == XCB_NO_SYMBOL)
128 key1 = key0;
129
130 if ((col & ECORE_X_LOCK_NUM) &&
131 ((xcb_is_keypad_key(key1)) || (xcb_is_private_keypad_key(key1))))
132 {
133 if ((col & XCB_MOD_MASK_SHIFT) ||
134 ((col & XCB_MOD_MASK_LOCK) && (col & ECORE_X_LOCK_SHIFT)))
135 return key0;
136 else
137 return key1;
138 }
139 else if (!(col & XCB_MOD_MASK_SHIFT) && !(col & XCB_MOD_MASK_LOCK))
140 return key0;
141 else if (!(col & XCB_MOD_MASK_SHIFT) &&
142 (col & XCB_MOD_MASK_LOCK && (col & ECORE_X_LOCK_CAPS)))
143 return key1;
144 else if ((col & XCB_MOD_MASK_SHIFT) &&
145 (col & XCB_MOD_MASK_LOCK) && (col & ECORE_X_LOCK_CAPS))
146 return key0;
147 else if ((col & XCB_MOD_MASK_SHIFT) ||
148 (col & XCB_MOD_MASK_LOCK && (col & ECORE_X_LOCK_SHIFT)))
149 return key1;
150
151 return XCB_NO_SYMBOL;
152}
153
154xcb_keycode_t *
155_ecore_xcb_keymap_keysym_to_keycode(xcb_keysym_t keysym)
156{
157 CHECK_XCB_CONN;
158 return xcb_key_symbols_get_keycode(_ecore_xcb_keysyms, keysym);
159}
160
161char *
162_ecore_xcb_keymap_keysym_to_string(xcb_keysym_t keysym)
163{
164 int i = 0, n = 0, h = 0, idx = 0;
165 const unsigned char *entry;
166 unsigned char val1, val2, val3, val4;
167
168 CHECK_XCB_CONN;
169 if (!keysym) return NULL;
170 if (keysym == XK_VoidSymbol) keysym = 0;
171 if (keysym <= 0x1fffffff)
172 {
173 val1 = (keysym >> 24);
174 val2 = ((keysym >> 16) & 0xff);
175 val3 = ((keysym >> 8) & 0xff);
176 val4 = (keysym & 0xff);
177 i = keysym % VTABLESIZE;
178 h = i + 1;
179 n = VMAXHASH;
180 while ((idx = hashKeysym[i]))
181 {
182 entry = &_ecore_xcb_keytable[idx];
183 if ((entry[0] == val1) && (entry[1] == val2) &&
184 (entry[2] == val3) && (entry[3] == val4))
185 return (char *)entry + 4;
186 if (!--n) break;
187 i += h;
188 if (i >= VTABLESIZE) i -= VTABLESIZE;
189 }
190 }
191
192 if ((keysym >= 0x01000100) && (keysym <= 0x0110ffff))
193 {
194 xcb_keysym_t val;
195 char *s = NULL;
196 int i = 0;
197
198 val = (keysym & 0xffffff);
199 if (val & 0xff0000)
200 i = 10;
201 else
202 i = 6;
203
204 if (!(s = malloc(i))) return NULL;
205 i--;
206 s[i--] = '\0';
207 for (; i; i--)
208 {
209 val1 = (val & 0xf);
210 val >>= 4;
211 if (val1 < 10)
212 s[i] = '0' + val1;
213 else
214 s[i] = 'A' + val1 - 10;
215 }
216 s[i] = 'U';
217 return s;
218 }
219
220 return NULL;
221}
222
223xcb_keycode_t
224_ecore_xcb_keymap_string_to_keycode(const char *key)
225{
226 if (!strncmp(key, "Keycode-", 8))
227 return atoi(key + 8);
228 else
229 {
230 xcb_keysym_t keysym = XCB_NO_SYMBOL;
231 xcb_keycode_t *keycodes, keycode = 0;
232 int i = 0;
233
234 CHECK_XCB_CONN;
235
236 keysym = _ecore_xcb_keymap_string_to_keysym(key);
237 if (keysym == XCB_NO_SYMBOL) return XCB_NO_SYMBOL;
238
239 keycodes = _ecore_xcb_keymap_keysym_to_keycode(keysym);
240 if (!keycodes) return XCB_NO_SYMBOL;
241
242 while (keycodes[i] != XCB_NO_SYMBOL)
243 {
244 if (keycodes[i] != 0)
245 {
246 keycode = keycodes[i];
247 break;
248 }
249 i++;
250 }
251 return keycode;
252 }
253}
254
255int
256_ecore_xcb_keymap_lookup_string(xcb_keycode_t keycode,
257 int state,
258 char *buffer,
259 int bytes,
260 xcb_keysym_t *sym)
261{
262 unsigned int modifiers = 0;
263 xcb_keysym_t keysym;
264
265 CHECK_XCB_CONN;
266 if (!_ecore_xcb_keymap_translate_key(keycode, state, &modifiers, &keysym))
267 return 0;
268
269 if (sym) *sym = keysym;
270
271 return _ecore_xcb_keymap_translate_keysym(keysym, state, buffer, bytes);
272}
273
274EAPI const char *
275ecore_x_keysym_string_get(int keysym)
276{
277 LOGFN(__FILE__, __LINE__, __FUNCTION__);
278
279 return _ecore_xcb_keymap_keysym_to_string(keysym);
280}
281
282/* local functions */
283static int
284_ecore_xcb_keymap_mask_get(void *reply,
285 xcb_keysym_t sym)
286{
287 xcb_get_modifier_mapping_reply_t *rep;
288 xcb_keysym_t sym2;
289 int mask = 0;
290 const int masks[8] =
291 {
292 XCB_MOD_MASK_SHIFT, XCB_MOD_MASK_LOCK, XCB_MOD_MASK_CONTROL,
293 XCB_MOD_MASK_1, XCB_MOD_MASK_2, XCB_MOD_MASK_3, XCB_MOD_MASK_4,
294 XCB_MOD_MASK_5
295 };
296
297 LOGFN(__FILE__, __LINE__, __FUNCTION__);
298 CHECK_XCB_CONN;
299
300 rep = (xcb_get_modifier_mapping_reply_t *)reply;
301 if ((rep) && (rep->keycodes_per_modifier > 0))
302 {
303 int i = 0;
304 xcb_keycode_t *modmap;
305
306 modmap = xcb_get_modifier_mapping_keycodes(rep);
307 for (i = 0; i < (8 * rep->keycodes_per_modifier); i++)
308 {
309 int j = 0;
310
311 for (j = 0; j < 8; j++)
312 {
313 sym2 =
314 xcb_key_symbols_get_keysym(_ecore_xcb_keysyms,
315 modmap[i], j);
316 if (sym2 != 0) break;
317 }
318 if (sym2 == sym)
319 {
320 mask = masks[i / rep->keycodes_per_modifier];
321 break;
322 }
323 }
324 }
325
326 return mask;
327}
328
329static xcb_keysym_t
330_ecore_xcb_keymap_string_to_keysym(const char *str)
331{
332 int i = 0, n = 0, h = 0;
333 unsigned long sig = 0;
334 const char *p = NULL;
335 int c = 0, idx = 0;
336 const unsigned char *entry;
337 unsigned char sig1, sig2;
338 long unsigned int val;
339
340 p = str;
341 while ((c = *p++))
342 sig = (sig << 1) + c;
343
344 i = (sig % KTABLESIZE);
345 h = i + 1;
346 sig1 = (sig >> 8) & 0xff;
347 sig2 = sig & 0xff;
348 n = KMAXHASH;
349
350 while ((idx = hashString[i]))
351 {
352 entry = &_ecore_xcb_keytable[idx];
353 if ((entry[0] == sig1) && (entry[1] == sig2) &&
354 !strcmp(str, (char *)entry + 6))
355 {
356 val = ((entry[2] << 24) | (entry[3] << 16) |
357 (entry[4] << 8) | (entry[5]));
358 if (!val) val = 0xffffff;
359 return val;
360 }
361 if (!--n) break;
362 i += h;
363 if (i >= KTABLESIZE) i -= KTABLESIZE;
364 }
365
366 if (*str == 'U')
367 {
368 val = 0;
369 for (p = &str[1]; *p; p++)
370 {
371 c = *p;
372 if (('0' <= c) && (c <= '9'))
373 val = (val << 4) + c - '0';
374 else if (('a' <= c) && (c <= 'f'))
375 val = (val << 4) + c - 'a' + 10;
376 else if (('A' <= c) && (c <= 'F'))
377 val = (val << 4) + c - 'A' + 10;
378 else
379 return XCB_NO_SYMBOL;
380 if (val > 0x10ffff) return XCB_NO_SYMBOL;
381 }
382 if ((val < 0x20) || ((val > 0x7e) && (val < 0xa0)))
383 return XCB_NO_SYMBOL;
384 if (val < 0x100) return val;
385 return val | 0x01000000;
386 }
387
388 if ((strlen(str) > 2) && (str[0] == '0') && (str[1] == 'x'))
389 {
390 char *tmp = NULL;
391
392 val = strtoul(str, &tmp, 16);
393 if ((val == ULONG_MAX) || ((tmp) && (*tmp != '\0')))
394 return XCB_NO_SYMBOL;
395 else
396 return val;
397 }
398
399 if (!strncmp(str, "XF86_", 5))
400 {
401 long unsigned int ret;
402 char *tmp;
403
404 tmp = strdup(str);
405 if (!tmp) return XCB_NO_SYMBOL;
406 memmove(&tmp[4], &tmp[5], strlen(str) - 5 + 1);
407 ret = _ecore_xcb_keymap_string_to_keysym(tmp);
408 free(tmp);
409 return ret;
410 }
411
412 return XCB_NO_SYMBOL;
413}
414
415static int
416_ecore_xcb_keymap_translate_key(xcb_keycode_t keycode,
417 unsigned int modifiers,
418 unsigned int *modifiers_return,
419 xcb_keysym_t *keysym_return)
420{
421 xcb_keysym_t sym;
422
423 if (!_ecore_xcb_keysyms) return 0;
424
425 sym = _ecore_xcb_keymap_keycode_to_keysym(keycode, modifiers);
426
427 if (modifiers_return)
428 *modifiers_return = ((XCB_MOD_MASK_SHIFT | XCB_MOD_MASK_LOCK) |
429 _ecore_xcb_mode_switch | ECORE_X_LOCK_NUM);
430 if (keysym_return)
431 *keysym_return = sym;
432
433 return 1;
434}
435
436static int
437_ecore_xcb_keymap_translate_keysym(xcb_keysym_t keysym,
438 unsigned int modifiers,
439 char *buffer,
440 int bytes)
441{
442 unsigned long hbytes = 0;
443 unsigned char c;
444
445 if (!keysym) return 0;
446 hbytes = (keysym >> 8);
447
448 if (!(bytes &&
449 ((hbytes == 0) ||
450 ((hbytes == 0xFF) &&
451 (((keysym >= XK_BackSpace) && (keysym <= XK_Clear)) ||
452 (keysym == XK_Return) || (keysym == XK_Escape) ||
453 (keysym == XK_KP_Space) || (keysym == XK_KP_Tab) ||
454 (keysym == XK_KP_Enter) ||
455 ((keysym >= XK_KP_Multiply) && (keysym <= XK_KP_9)) ||
456 (keysym == XK_KP_Equal) || (keysym == XK_Delete))))))
457 return 0;
458
459 if (keysym == XK_KP_Space)
460 c = (XK_space & 0x7F);
461 else if (hbytes == 0xFF)
462 c = (keysym & 0x7F);
463 else
464 c = (keysym & 0xFF);
465
466 if (modifiers & ECORE_X_MODIFIER_CTRL)
467 {
468 if (((c >= '@') && (c < '\177')) || c == ' ')
469 c &= 0x1F;
470 else if (c == '2')
471 c = '\000';
472 else if ((c >= '3') && (c <= '7'))
473 c -= ('3' - '\033');
474 else if (c == '8')
475 c = '\177';
476 else if (c == '/')
477 c = '_' & 0x1F;
478 }
479 buffer[0] = c;
480 return 1;
481}
482
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_mwm.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_mwm.c
new file mode 100644
index 0000000..6c95331
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_mwm.c
@@ -0,0 +1,104 @@
1#include "ecore_xcb_private.h"
2//#include "Ecore_X_Atoms.h"
3
4#define ECORE_X_MWM_HINTS_FUNCTIONS (1 << 0)
5#define ECORE_X_MWM_HINTS_DECORATIONS (1 << 1)
6#define ECORE_X_MWM_HINTS_INPUT_MODE (1 << 2)
7#define ECORE_X_MWM_HINTS_STATUS (1 << 3)
8
9typedef struct _mwmhints
10{
11 uint32_t flags;
12 uint32_t functions;
13 uint32_t decorations;
14 int32_t inputmode;
15 uint32_t status;
16} MWMHints;
17
18/**
19 * @defgroup Ecore_X_MWM_Group MWM related functions.
20 *
21 * Functions related to MWM.
22 */
23
24/**
25 * Sets the borderless flag of a window using MWM.
26 *
27 * @param win The window.
28 * @param borderless The borderless flag.
29 *
30 * @ingroup Ecore_X_MWM_Group
31 */
32EAPI void
33ecore_x_mwm_borderless_set(Ecore_X_Window win,
34 Eina_Bool borderless)
35{
36 uint32_t data[5] = { 0, 0, 0, 0, 0 };
37
38 LOGFN(__FILE__, __LINE__, __FUNCTION__);
39
40 data[0] = 2;
41 data[2] = !borderless;
42
43 ecore_x_window_prop_property_set(win,
44 ECORE_X_ATOM_MOTIF_WM_HINTS,
45 ECORE_X_ATOM_MOTIF_WM_HINTS, 32,
46 (void *)data, 5);
47}
48
49EAPI Eina_Bool
50ecore_x_mwm_hints_get(Ecore_X_Window win,
51 Ecore_X_MWM_Hint_Func *fhint,
52 Ecore_X_MWM_Hint_Decor *dhint,
53 Ecore_X_MWM_Hint_Input *ihint)
54{
55 xcb_get_property_cookie_t cookie;
56 xcb_get_property_reply_t *reply;
57 MWMHints *mwmhints = NULL;
58 int ret = EINA_FALSE;
59
60 LOGFN(__FILE__, __LINE__, __FUNCTION__);
61 CHECK_XCB_CONN;
62
63 cookie =
64 xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
65 ECORE_X_ATOM_MOTIF_WM_HINTS,
66 ECORE_X_ATOM_MOTIF_WM_HINTS, 0, UINT_MAX);
67 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
68 if (!reply) return EINA_FALSE;
69 if ((reply->format != 32) || (reply->value_len == 0))
70 {
71 free(reply);
72 return EINA_FALSE;
73 }
74
75 mwmhints = xcb_get_property_value(reply);
76 if (reply->value_len >= 4)
77 {
78 if (dhint)
79 {
80 if (mwmhints->flags & ECORE_X_MWM_HINTS_DECORATIONS)
81 *dhint = mwmhints->decorations;
82 else
83 *dhint = ECORE_X_MWM_HINT_DECOR_ALL;
84 }
85 if (fhint)
86 {
87 if (mwmhints->flags & ECORE_X_MWM_HINTS_FUNCTIONS)
88 *fhint = mwmhints->functions;
89 else
90 *fhint = ECORE_X_MWM_HINT_FUNC_ALL;
91 }
92 if (ihint)
93 {
94 if (mwmhints->flags & ECORE_X_MWM_HINTS_INPUT_MODE)
95 *ihint = mwmhints->inputmode;
96 else
97 *ihint = ECORE_X_MWM_HINT_INPUT_MODELESS;
98 }
99 ret = EINA_TRUE;
100 }
101 free(reply);
102 return ret;
103}
104
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_netwm.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_netwm.c
new file mode 100644
index 0000000..0a523b9
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_netwm.c
@@ -0,0 +1,1525 @@
1#include "ecore_xcb_private.h"
2
3/* local function prototypes */
4/* static void _ecore_xcb_netwm_startup_info_free(void *data); */
5static Ecore_X_Atom _ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type);
6static Ecore_X_Window_Type _ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom);
7static Ecore_X_Atom _ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state);
8static Ecore_X_Atom _ecore_xcb_netwm_action_atom_get(Ecore_X_Action action);
9
10/* local variables */
11//static Eina_Hash *_startup_info = NULL;
12
13/* local structures */
14typedef struct _Ecore_Xcb_Startup_Info Ecore_Xcb_Startup_Info;
15struct _Ecore_Xcb_Startup_Info
16{
17 Ecore_X_Window win;
18 int init, size;
19 char *buffer;
20 int length;
21
22 /* sequence info fields */
23 char *id, *name;
24 int screen;
25 char *bin, *icon;
26 int desktop, timestamp;
27 char *description, *wmclass;
28 int silent;
29};
30
31EAPI void
32ecore_x_netwm_init(void)
33{
34 LOGFN(__FILE__, __LINE__, __FUNCTION__);
35
36// _startup_info =
37// eina_hash_string_superfast_new(_ecore_xcb_netwm_startup_info_free);
38}
39
40EAPI void
41ecore_x_netwm_shutdown(void)
42{
43 LOGFN(__FILE__, __LINE__, __FUNCTION__);
44
45// if (_startup_info) eina_hash_free(_startup_info);
46// _startup_info = NULL;
47}
48
49EAPI Eina_Bool
50ecore_x_netwm_pid_get(Ecore_X_Window win,
51 int *pid)
52{
53 uint32_t tmp;
54
55 LOGFN(__FILE__, __LINE__, __FUNCTION__);
56
57 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1))
58 return EINA_FALSE;
59
60 if (pid) *pid = tmp;
61
62 return EINA_TRUE;
63}
64
65EAPI void
66ecore_x_netwm_pid_set(Ecore_X_Window win,
67 int pid)
68{
69 unsigned int tmp;
70
71 LOGFN(__FILE__, __LINE__, __FUNCTION__);
72
73 tmp = pid;
74 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID, &tmp, 1);
75}
76
77EAPI Eina_Bool
78ecore_x_netwm_window_type_get(Ecore_X_Window win,
79 Ecore_X_Window_Type *type)
80{
81 Ecore_X_Atom *atoms;
82 int num = 0;
83
84 LOGFN(__FILE__, __LINE__, __FUNCTION__);
85
86 if (type) *type = ECORE_X_WINDOW_TYPE_NORMAL;
87
88 num =
89 ecore_x_window_prop_atom_list_get(win,
90 ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atoms);
91 if ((type) && (num >= 1) && (atoms))
92 *type = _ecore_xcb_netwm_window_type_type_get(atoms[0]);
93
94 if (atoms) free(atoms);
95
96 if (num >= 1) return EINA_TRUE;
97 return EINA_FALSE;
98}
99
100EAPI void
101ecore_x_netwm_window_type_set(Ecore_X_Window win,
102 Ecore_X_Window_Type type)
103{
104 Ecore_X_Atom atom;
105
106 LOGFN(__FILE__, __LINE__, __FUNCTION__);
107
108 atom = _ecore_xcb_netwm_window_type_atom_get(type);
109 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE, &atom, 1);
110}
111
112EAPI int
113ecore_x_netwm_window_types_get(Ecore_X_Window win,
114 Ecore_X_Window_Type **types)
115{
116 int num = 0, i = 0;
117 Ecore_X_Atom *atoms = NULL;
118 Ecore_X_Window_Type *atoms2 = NULL;
119
120 LOGFN(__FILE__, __LINE__, __FUNCTION__);
121
122 if (types) *types = NULL;
123 num =
124 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
125 &atoms);
126 if ((num <= 0) || (!atoms))
127 {
128 if (atoms) free(atoms);
129 return 0;
130 }
131
132 atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
133 if (!atoms2)
134 {
135 if (atoms) free(atoms);
136 return 0;
137 }
138
139 for (i = 0; i < num; i++)
140 atoms2[i] = _ecore_xcb_netwm_window_type_type_get(atoms[i]);
141 if (atoms) free(atoms);
142
143 if (types)
144 *types = atoms2;
145 else
146 free(atoms2);
147
148 return num;
149}
150
151EAPI int
152ecore_x_netwm_name_get(Ecore_X_Window win,
153 char **name)
154{
155 LOGFN(__FILE__, __LINE__, __FUNCTION__);
156
157 if (name)
158 *name = ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_NAME);
159 return 1;
160}
161
162EAPI void
163ecore_x_netwm_name_set(Ecore_X_Window win,
164 const char *name)
165{
166 LOGFN(__FILE__, __LINE__, __FUNCTION__);
167
168 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
169}
170
171EAPI void
172ecore_x_netwm_opacity_set(Ecore_X_Window win,
173 unsigned int opacity)
174{
175 LOGFN(__FILE__, __LINE__, __FUNCTION__);
176
177 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
178 &opacity, 1);
179}
180
181EAPI Eina_Bool
182ecore_x_netwm_opacity_get(Ecore_X_Window win,
183 unsigned int *opacity)
184{
185 unsigned int tmp = 0;
186
187 LOGFN(__FILE__, __LINE__, __FUNCTION__);
188
189 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
190 &tmp, 1))
191 return EINA_FALSE;
192
193 if (opacity) *opacity = tmp;
194
195 return EINA_TRUE;
196}
197
198EAPI void
199ecore_x_netwm_wm_identify(Ecore_X_Window root,
200 Ecore_X_Window check,
201 const char *wm_name)
202{
203 LOGFN(__FILE__, __LINE__, __FUNCTION__);
204
205 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
206 &check, 1);
207 ecore_x_window_prop_window_set(check, ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
208 &check, 1);
209 ecore_x_window_prop_string_set(check, ECORE_X_ATOM_NET_WM_NAME, wm_name);
210 ecore_x_window_prop_string_set(root, ECORE_X_ATOM_NET_WM_NAME, wm_name);
211}
212
213EAPI void
214ecore_x_netwm_supported_set(Ecore_X_Window root,
215 Ecore_X_Atom *supported,
216 int num)
217{
218 LOGFN(__FILE__, __LINE__, __FUNCTION__);
219
220 ecore_x_window_prop_atom_set(root, ECORE_X_ATOM_NET_SUPPORTED,
221 supported, num);
222}
223
224EAPI Eina_Bool
225ecore_x_netwm_supported_get(Ecore_X_Window root,
226 Ecore_X_Atom **supported,
227 int *num)
228{
229 int num_ret = 0;
230
231 LOGFN(__FILE__, __LINE__, __FUNCTION__);
232
233 if (num) *num = 0;
234 if (supported) *supported = NULL;
235
236 num_ret =
237 ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
238 supported);
239 if (num_ret <= 0) return EINA_FALSE;
240 if (num) *num = num_ret;
241
242 return EINA_TRUE;
243}
244
245EAPI void
246ecore_x_netwm_desk_count_set(Ecore_X_Window root,
247 unsigned int n_desks)
248{
249 LOGFN(__FILE__, __LINE__, __FUNCTION__);
250
251 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
252 &n_desks, 1);
253}
254
255EAPI void
256ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
257 Ecore_X_Window *vroots,
258 unsigned int n_desks)
259{
260 LOGFN(__FILE__, __LINE__, __FUNCTION__);
261
262 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
263 vroots, n_desks);
264}
265
266EAPI void
267ecore_x_netwm_desk_names_set(Ecore_X_Window root,
268 const char **names,
269 unsigned int n_desks)
270{
271 char ss[32], *buf = NULL, *t = NULL;
272 const char *s;
273 uint32_t len = 0, i, l;
274
275 LOGFN(__FILE__, __LINE__, __FUNCTION__);
276 CHECK_XCB_CONN;
277
278 for (i = 0; i < n_desks; i++)
279 {
280 s = ((names) ? names[i] : NULL);
281 if (!s)
282 {
283 /* Default to "Desk-<number>" */
284 sprintf(ss, "Desk-%d", i);
285 s = ss;
286 }
287
288 l = strlen(s) + 1;
289 t = realloc(buf, len + 1);
290 if (t)
291 {
292 buf = t;
293 memcpy(buf + len, s, l);
294 }
295 len += l;
296 }
297
298 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, root,
299 ECORE_X_ATOM_NET_DESKTOP_NAMES,
300 ECORE_X_ATOM_UTF8_STRING, 8, len, (const void *)buf);
301// ecore_x_flush();
302 free(buf);
303}
304
305EAPI void
306ecore_x_netwm_desk_size_set(Ecore_X_Window root,
307 unsigned int width,
308 unsigned int height)
309{
310 uint32_t size[2];
311
312 LOGFN(__FILE__, __LINE__, __FUNCTION__);
313
314 size[0] = width;
315 size[1] = height;
316 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY,
317 size, 2);
318}
319
320EAPI void
321ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
322 unsigned int *origins,
323 unsigned int n_desks)
324{
325 LOGFN(__FILE__, __LINE__, __FUNCTION__);
326
327 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
328 origins, (2 * n_desks));
329}
330
331EAPI void
332ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
333 int orientation,
334 int columns,
335 int rows,
336 int starting_corner)
337{
338 unsigned int layout[4];
339
340 LOGFN(__FILE__, __LINE__, __FUNCTION__);
341
342 layout[0] = orientation;
343 layout[1] = columns;
344 layout[2] = rows;
345 layout[3] = starting_corner;
346 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
347 layout, 4);
348}
349
350EAPI void
351ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
352 unsigned int *areas,
353 unsigned int n_desks)
354{
355 LOGFN(__FILE__, __LINE__, __FUNCTION__);
356
357 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
358 4 * n_desks);
359}
360
361EAPI unsigned int *
362ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
363{
364 int ret;
365 unsigned int *areas = NULL;
366
367 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
368
369 ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
370 &areas);
371 if (!areas)
372 {
373 if (n_desks) *n_desks = 0;
374 return 0;
375 }
376 if (n_desks) *n_desks = ret / 4;
377 return areas;
378}
379
380EAPI void
381ecore_x_netwm_desk_current_set(Ecore_X_Window root,
382 unsigned int desk)
383{
384 LOGFN(__FILE__, __LINE__, __FUNCTION__);
385
386 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP,
387 &desk, 1);
388}
389
390EAPI void
391ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
392 Eina_Bool on)
393{
394 unsigned int val = 0;
395
396 LOGFN(__FILE__, __LINE__, __FUNCTION__);
397
398 val = ((on) ? 1 : 0);
399 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP,
400 &val, 1);
401}
402
403EAPI int
404ecore_x_netwm_startup_id_get(Ecore_X_Window win,
405 char **id)
406{
407 LOGFN(__FILE__, __LINE__, __FUNCTION__);
408
409 if (id)
410 {
411 *id =
412 ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_STARTUP_ID);
413 }
414
415 return 1;
416}
417
418EAPI void
419ecore_x_netwm_startup_id_set(Ecore_X_Window win,
420 const char *id)
421{
422 LOGFN(__FILE__, __LINE__, __FUNCTION__);
423
424 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
425}
426
427EAPI void
428ecore_x_netwm_state_request_send(Ecore_X_Window win,
429 Ecore_X_Window root,
430 Ecore_X_Window_State s1,
431 Ecore_X_Window_State s2,
432 Eina_Bool set)
433{
434 xcb_client_message_event_t ev;
435
436 LOGFN(__FILE__, __LINE__, __FUNCTION__);
437 CHECK_XCB_CONN;
438
439 if (!win) return;
440 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
441
442 ev.response_type = XCB_CLIENT_MESSAGE;
443 ev.format = 32;
444 ev.window = win;
445 ev.type = ECORE_X_ATOM_NET_WM_STATE;
446 ev.data.data32[0] = !!set;
447 ev.data.data32[1] = _ecore_xcb_netwm_window_state_atom_get(s1);
448 ev.data.data32[2] = _ecore_xcb_netwm_window_state_atom_get(s2);
449 /* 1 == normal client, if used in a pager this should be 2 */
450 ev.data.data32[3] = 1;
451 ev.data.data32[4] = 0;
452
453 xcb_send_event(_ecore_xcb_conn, 0, root,
454 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
455 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
456// ecore_x_flush();
457}
458
459EAPI void
460ecore_x_netwm_window_state_set(Ecore_X_Window win,
461 Ecore_X_Window_State *state,
462 unsigned int num)
463{
464 Ecore_X_Atom *set;
465 unsigned int i = 0;
466
467 LOGFN(__FILE__, __LINE__, __FUNCTION__);
468
469 if (!num)
470 {
471 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
472 return;
473 }
474
475 set = malloc(num * sizeof(Ecore_X_Atom));
476 if (!set) return;
477
478 for (i = 0; i < num; i++)
479 set[i] = _ecore_xcb_netwm_window_state_atom_get(state[i]);
480
481 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
482 free(set);
483}
484
485EAPI Eina_Bool
486ecore_x_netwm_window_state_get(Ecore_X_Window win,
487 Ecore_X_Window_State **state,
488 unsigned int *num)
489{
490 Ecore_X_Atom *atoms;
491 int ret = 0;
492
493 LOGFN(__FILE__, __LINE__, __FUNCTION__);
494
495 if (num) *num = 0;
496 if (state) *state = NULL;
497
498 ret =
499 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE, &atoms);
500
501 if (ret <= 0) return EINA_FALSE;
502
503 if (state)
504 {
505 *state = malloc(ret * sizeof(Ecore_X_Window_State));
506 if (*state)
507 {
508 int i = 0;
509
510 for (i = 0; i < ret; i++)
511 (*state)[i] = _ecore_xcb_netwm_window_state_get(atoms[i]);
512 if (num) *num = ret;
513 }
514 }
515
516 free(atoms);
517
518 return EINA_TRUE;
519}
520
521EAPI void
522ecore_x_netwm_client_active_set(Ecore_X_Window root,
523 Ecore_X_Window win)
524{
525 LOGFN(__FILE__, __LINE__, __FUNCTION__);
526
527 ecore_x_window_prop_window_set(root,
528 ECORE_X_ATOM_NET_ACTIVE_WINDOW, &win, 1);
529}
530
531EAPI void
532ecore_x_netwm_client_active_request(Ecore_X_Window root,
533 Ecore_X_Window win,
534 int type,
535 Ecore_X_Window current_win)
536{
537 xcb_client_message_event_t ev;
538
539 LOGFN(__FILE__, __LINE__, __FUNCTION__);
540 CHECK_XCB_CONN;
541
542 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
543
544 ev.response_type = XCB_CLIENT_MESSAGE;
545 ev.format = 32;
546 ev.window = win;
547 ev.type = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
548 ev.data.data32[0] = type;
549 ev.data.data32[1] = XCB_CURRENT_TIME;
550 ev.data.data32[2] = current_win;
551 ev.data.data32[3] = 0;
552 ev.data.data32[4] = 0;
553
554 xcb_send_event(_ecore_xcb_conn, 0, root,
555 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
556 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
557// ecore_x_flush();
558}
559
560EAPI void
561ecore_x_netwm_client_list_set(Ecore_X_Window root,
562 Ecore_X_Window *p_clients,
563 unsigned int n_clients)
564{
565 LOGFN(__FILE__, __LINE__, __FUNCTION__);
566
567 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
568 p_clients, n_clients);
569}
570
571EAPI void
572ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
573 Ecore_X_Window *p_clients,
574 unsigned int n_clients)
575{
576 LOGFN(__FILE__, __LINE__, __FUNCTION__);
577
578 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
579 p_clients, n_clients);
580}
581
582EAPI Eina_Bool
583ecore_x_screen_is_composited(int screen)
584{
585 char buff[32];
586 xcb_get_selection_owner_cookie_t ocookie;
587 xcb_get_selection_owner_reply_t *oreply;
588 Ecore_X_Window win;
589 static Ecore_X_Atom atom = XCB_NONE;
590
591 LOGFN(__FILE__, __LINE__, __FUNCTION__);
592 CHECK_XCB_CONN;
593
594 snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
595
596 if (atom == XCB_NONE)
597 {
598 xcb_intern_atom_cookie_t acookie;
599 xcb_intern_atom_reply_t *areply;
600
601 acookie =
602 xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
603 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
604 if (!areply) return EINA_FALSE;
605 atom = areply->atom;
606 free(areply);
607 }
608 if (atom == XCB_NONE) return EINA_FALSE;
609
610 ocookie = xcb_get_selection_owner_unchecked(_ecore_xcb_conn, atom);
611 oreply = xcb_get_selection_owner_reply(_ecore_xcb_conn, ocookie, NULL);
612 if (!oreply) return EINA_FALSE;
613 win = oreply->owner;
614 free(oreply);
615
616 return (win != XCB_NONE) ? EINA_TRUE : EINA_FALSE;
617}
618
619EAPI void
620ecore_x_screen_is_composited_set(int screen,
621 Ecore_X_Window win)
622{
623 static Ecore_X_Atom atom = XCB_NONE;
624 char buff[32];
625
626 LOGFN(__FILE__, __LINE__, __FUNCTION__);
627 CHECK_XCB_CONN;
628
629 snprintf(buff, sizeof(buff), "_NET_WM_CM_S%i", screen);
630 if (atom == XCB_NONE)
631 {
632 xcb_intern_atom_cookie_t acookie;
633 xcb_intern_atom_reply_t *areply;
634
635 acookie =
636 xcb_intern_atom_unchecked(_ecore_xcb_conn, 0, strlen(buff), buff);
637 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
638 if (!areply) return;
639 atom = areply->atom;
640 free(areply);
641 }
642 if (atom == XCB_NONE) return;
643 xcb_set_selection_owner(_ecore_xcb_conn, win, atom,
644 _ecore_xcb_events_last_time_get());
645}
646
647EAPI void
648ecore_x_netwm_ping_send(Ecore_X_Window win)
649{
650 xcb_client_message_event_t ev;
651
652 LOGFN(__FILE__, __LINE__, __FUNCTION__);
653 CHECK_XCB_CONN;
654
655 if (!win) return;
656
657 ev.response_type = XCB_CLIENT_MESSAGE;
658 ev.format = 32;
659 ev.window = win;
660 ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
661 ev.data.data32[0] = ECORE_X_ATOM_NET_WM_PING;
662 ev.data.data32[1] = ecore_x_current_time_get();
663 ev.data.data32[2] = win;
664 ev.data.data32[3] = 0;
665 ev.data.data32[4] = 0;
666
667 xcb_send_event(_ecore_xcb_conn, 0, win,
668 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
669// ecore_x_flush();
670}
671
672EAPI void
673ecore_x_netwm_frame_size_set(Ecore_X_Window win,
674 int fl,
675 int fr,
676 int ft,
677 int fb)
678{
679 uint32_t frames[4];
680
681 LOGFN(__FILE__, __LINE__, __FUNCTION__);
682
683 frames[0] = fl;
684 frames[1] = fr;
685 frames[2] = ft;
686 frames[3] = fb;
687 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
688 frames, 4);
689}
690
691EAPI Eina_Bool
692ecore_x_netwm_frame_size_get(Ecore_X_Window win,
693 int *fl,
694 int *fr,
695 int *ft,
696 int *fb)
697{
698 int ret = 0;
699 unsigned int frames[4];
700
701 LOGFN(__FILE__, __LINE__, __FUNCTION__);
702
703 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_FRAME_EXTENTS,
704 frames, 4);
705 if (ret != 4) return EINA_FALSE;
706
707 if (fl) *fl = frames[0];
708 if (fr) *fr = frames[1];
709 if (ft) *ft = frames[2];
710 if (fb) *fb = frames[3];
711
712 return EINA_TRUE;
713}
714
715EAPI void
716ecore_x_netwm_sync_request_send(Ecore_X_Window win,
717 unsigned int serial)
718{
719 xcb_client_message_event_t ev;
720
721 LOGFN(__FILE__, __LINE__, __FUNCTION__);
722 CHECK_XCB_CONN;
723
724 if (!win) return;
725
726 /* FIXME: Maybe need XSyncIntToValue ?? */
727 memset(&ev, 0, sizeof(xcb_client_message_event_t));
728
729 ev.response_type = XCB_CLIENT_MESSAGE;
730 ev.format = 32;
731 ev.window = win;
732 ev.type = ECORE_X_ATOM_WM_PROTOCOLS;
733 ev.data.data32[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
734 ev.data.data32[1] = _ecore_xcb_events_last_time_get();
735 ev.data.data32[2] = serial;
736 ev.data.data32[3] = 0;
737 ev.data.data32[4] = 0;
738
739 xcb_send_event(_ecore_xcb_conn, 0, win,
740 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
741// ecore_x_flush();
742}
743
744EAPI void
745ecore_x_netwm_desktop_set(Ecore_X_Window win,
746 unsigned int desk)
747{
748 LOGFN(__FILE__, __LINE__, __FUNCTION__);
749
750 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
751}
752
753EAPI Eina_Bool
754ecore_x_netwm_desktop_get(Ecore_X_Window win,
755 unsigned int *desk)
756{
757 unsigned int tmp = 0;
758
759 LOGFN(__FILE__, __LINE__, __FUNCTION__);
760
761 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
762 &tmp, 1))
763 return EINA_FALSE;
764
765 if (desk) *desk = tmp;
766
767 return EINA_TRUE;
768}
769
770EAPI void
771ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
772 Ecore_X_Window root,
773 unsigned int desktop)
774{
775 xcb_client_message_event_t ev;
776
777 LOGFN(__FILE__, __LINE__, __FUNCTION__);
778 CHECK_XCB_CONN;
779
780 if (!root) root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
781
782 memset(&ev, 0, sizeof(xcb_client_message_event_t));
783
784 ev.response_type = XCB_CLIENT_MESSAGE;
785 ev.format = 32;
786 ev.window = win;
787 ev.type = ECORE_X_ATOM_NET_WM_DESKTOP;
788 ev.data.data32[0] = desktop;
789
790 xcb_send_event(_ecore_xcb_conn, 0, root,
791 (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
792 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY), (const char *)&ev);
793// ecore_x_flush();
794}
795
796EAPI void
797ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
798{
799 LOGFN(__FILE__, __LINE__, __FUNCTION__);
800
801 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
802 NULL, 0);
803}
804
805EAPI Eina_Bool
806ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
807{
808 LOGFN(__FILE__, __LINE__, __FUNCTION__);
809
810 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
811 NULL, 0))
812 return EINA_FALSE;
813
814 return EINA_TRUE;
815}
816
817EAPI int
818ecore_x_netwm_icon_name_get(Ecore_X_Window win,
819 char **name)
820{
821 LOGFN(__FILE__, __LINE__, __FUNCTION__);
822
823 if (name)
824 {
825 *name =
826 ecore_x_window_prop_string_get(win, ECORE_X_ATOM_NET_WM_ICON_NAME);
827 }
828
829 return 1;
830}
831
832EAPI void
833ecore_x_netwm_icon_name_set(Ecore_X_Window win,
834 const char *name)
835{
836 LOGFN(__FILE__, __LINE__, __FUNCTION__);
837
838 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME, name);
839}
840
841EAPI Eina_Bool
842ecore_x_netwm_icons_get(Ecore_X_Window win,
843 Ecore_X_Icon **icon,
844 int *num)
845{
846 int num_ret = 0;
847 unsigned int i = 0, len = 0, icons = 0;
848 unsigned int *data, *p, *src;
849
850 LOGFN(__FILE__, __LINE__, __FUNCTION__);
851
852 if (num) *num = 0;
853 if (icon) *icon = NULL;
854
855 num_ret =
856 ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON, &data);
857
858 if ((num_ret <= 0) || (!data))
859 {
860 if (data) free(data);
861 return EINA_FALSE;
862 }
863 if (num_ret < 2)
864 {
865 if (data) free(data);
866 return EINA_FALSE;
867 }
868
869 icons = 0;
870 p = data;
871 while (p)
872 {
873 len = (p[0] * p[1]);
874 p += (len + 2);
875 if ((p - data) > num_ret)
876 {
877 if (data) free(data);
878 return EINA_FALSE;
879 }
880 icons++;
881 if ((p - data) == num_ret) p = NULL;
882 }
883 if (num) *num = icons;
884 if (!icon)
885 {
886 if (data) free(data);
887 return EINA_TRUE;
888 }
889
890 *icon = malloc(icons * sizeof(Ecore_X_Icon));
891 if (!(*icon))
892 {
893 if (data) free(data);
894 return EINA_FALSE;
895 }
896
897 /* Fetch the icons */
898 p = data;
899 for (i = 0; i < icons; i++)
900 {
901 unsigned int *ps, *pd, *pe;
902
903 len = p[0] * p[1];
904 ((*icon)[i]).width = p[0];
905 ((*icon)[i]).height = p[1];
906 src = &(p[2]);
907 ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
908 if (!((*icon)[i]).data)
909 {
910 while (i)
911 free(((*icon)[--i]).data);
912 free(*icon);
913 free(data);
914 return EINA_FALSE;
915 }
916
917 pd = ((*icon)[i]).data;
918 ps = src;
919 pe = ps + len;
920 for (; ps < pe; ps++)
921 {
922 unsigned int r, g, b, a;
923
924 a = (*ps >> 24) & 0xff;
925 r = (((*ps >> 16) & 0xff) * a) / 255;
926 g = (((*ps >> 8) & 0xff) * a) / 255;
927 b = (((*ps) & 0xff) * a) / 255;
928 *pd = (a << 24) | (r << 16) | (g << 8) | (b);
929 pd++;
930 }
931 p += (len + 2);
932 }
933
934 if (data) free(data);
935 return EINA_TRUE;
936}
937
938EAPI void
939ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
940 int x,
941 int y,
942 int w,
943 int h)
944{
945 unsigned int geom[4];
946
947 LOGFN(__FILE__, __LINE__, __FUNCTION__);
948
949 geom[0] = x;
950 geom[1] = y;
951 geom[2] = w;
952 geom[3] = h;
953 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
954 geom, 4);
955}
956
957EAPI Eina_Bool
958ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
959 int *x,
960 int *y,
961 int *w,
962 int *h)
963{
964 int ret = 0;
965 unsigned int geom[4];
966
967 LOGFN(__FILE__, __LINE__, __FUNCTION__);
968
969 ret =
970 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
971 geom, 4);
972 if (ret != 4) return EINA_FALSE;
973 if (x) *x = geom[0];
974 if (y) *y = geom[1];
975 if (w) *w = geom[2];
976 if (h) *h = geom[3];
977
978 return EINA_TRUE;
979}
980
981EAPI void
982ecore_x_netwm_strut_set(Ecore_X_Window win,
983 int l,
984 int r,
985 int t,
986 int b)
987{
988 unsigned int strut[4];
989
990 LOGFN(__FILE__, __LINE__, __FUNCTION__);
991
992 strut[0] = l;
993 strut[1] = r;
994 strut[2] = t;
995 strut[3] = b;
996 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
997}
998
999EAPI Eina_Bool
1000ecore_x_netwm_strut_get(Ecore_X_Window win,
1001 int *l,
1002 int *r,
1003 int *t,
1004 int *b)
1005{
1006 unsigned int strut[4];
1007 int ret = 0;
1008
1009 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1010
1011 ret =
1012 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
1013 if (ret != 4) return EINA_FALSE;
1014
1015 if (l) *l = strut[0];
1016 if (r) *r = strut[1];
1017 if (t) *t = strut[2];
1018 if (b) *b = strut[3];
1019
1020 return EINA_TRUE;
1021}
1022
1023EAPI void
1024ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
1025 int left,
1026 int right,
1027 int top,
1028 int bottom,
1029 int left_start_y,
1030 int left_end_y,
1031 int right_start_y,
1032 int right_end_y,
1033 int top_start_x,
1034 int top_end_x,
1035 int bottom_start_x,
1036 int bottom_end_x)
1037{
1038 unsigned int strut[12];
1039
1040 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1041
1042 strut[0] = left;
1043 strut[1] = right;
1044 strut[2] = top;
1045 strut[3] = bottom;
1046 strut[4] = left_start_y;
1047 strut[5] = left_end_y;
1048 strut[6] = right_start_y;
1049 strut[7] = right_end_y;
1050 strut[8] = top_start_x;
1051 strut[9] = top_end_x;
1052 strut[10] = bottom_start_x;
1053 strut[11] = bottom_end_x;
1054 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
1055 strut, 12);
1056}
1057
1058EAPI Eina_Bool
1059ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
1060 int *left,
1061 int *right,
1062 int *top,
1063 int *bottom,
1064 int *left_start_y,
1065 int *left_end_y,
1066 int *right_start_y,
1067 int *right_end_y,
1068 int *top_start_x,
1069 int *top_end_x,
1070 int *bottom_start_x,
1071 int *bottom_end_x)
1072{
1073 unsigned int strut[12];
1074 int ret = 0;
1075
1076 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1077
1078 ret =
1079 ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
1080 strut, 12);
1081 if (ret != 12) return EINA_FALSE;
1082
1083 if (left) *left = strut[0];
1084 if (right) *right = strut[1];
1085 if (top) *top = strut[2];
1086 if (bottom) *bottom = strut[3];
1087 if (left_start_y) *left_start_y = strut[4];
1088 if (left_end_y) *left_end_y = strut[5];
1089 if (right_start_y) *right_start_y = strut[6];
1090 if (right_end_y) *right_end_y = strut[7];
1091 if (top_start_x) *top_start_x = strut[8];
1092 if (top_end_x) *top_end_x = strut[9];
1093 if (bottom_start_x) *bottom_start_x = strut[10];
1094 if (bottom_end_x) *bottom_end_x = strut[11];
1095
1096 return EINA_TRUE;
1097}
1098
1099EAPI void
1100ecore_x_netwm_user_time_set(Ecore_X_Window win,
1101 unsigned int t)
1102{
1103 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1104
1105 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME, &t, 1);
1106}
1107
1108EAPI Eina_Bool
1109ecore_x_netwm_user_time_get(Ecore_X_Window win,
1110 unsigned int *t)
1111{
1112 unsigned int tmp;
1113
1114 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1115
1116 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
1117 &tmp, 1))
1118 return EINA_FALSE;
1119
1120 if (t) *t = tmp;
1121
1122 return EINA_TRUE;
1123}
1124
1125EAPI void
1126ecore_x_netwm_visible_name_set(Ecore_X_Window win,
1127 const char *name)
1128{
1129 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1130
1131 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
1132 name);
1133}
1134
1135EAPI int
1136ecore_x_netwm_visible_name_get(Ecore_X_Window win,
1137 char **name)
1138{
1139 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1140
1141 if (name)
1142 *name = ecore_x_window_prop_string_get(win,
1143 ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
1144 return 1;
1145}
1146
1147EAPI void
1148ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
1149 const char *name)
1150{
1151 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1152
1153 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
1154 name);
1155}
1156
1157EAPI int
1158ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
1159 char **name)
1160{
1161 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1162
1163 if (name)
1164 {
1165 *name =
1166 ecore_x_window_prop_string_get(win,
1167 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
1168 }
1169
1170 return 1;
1171}
1172
1173EAPI Eina_Bool
1174ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
1175 Ecore_X_Sync_Counter *counter)
1176{
1177 unsigned int tmp;
1178
1179 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1180
1181 if (!ecore_x_window_prop_card32_get(win,
1182 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
1183 &tmp, 1))
1184 return EINA_FALSE;
1185
1186 if (counter) *counter = tmp;
1187
1188 return EINA_TRUE;
1189}
1190
1191EAPI Eina_Bool
1192ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
1193 Ecore_X_Action action)
1194{
1195 int num = 0, i = 0;
1196 Ecore_X_Atom *atoms, atom;
1197 Eina_Bool ret = EINA_FALSE;
1198
1199 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1200
1201 num =
1202 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1203 &atoms);
1204 if (num <= 0) return EINA_FALSE;
1205
1206 atom = _ecore_xcb_netwm_action_atom_get(action);
1207 for (i = 0; i < num; i++)
1208 {
1209 if (atoms[i] == atom)
1210 {
1211 ret = EINA_TRUE;
1212 break;
1213 }
1214 }
1215
1216 if (atoms) free(atoms);
1217 return ret;
1218}
1219
1220EAPI Eina_Bool
1221ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
1222 Ecore_X_Action **action,
1223 unsigned int *num)
1224{
1225 Ecore_X_Atom *atoms;
1226 int num_ret = 0;
1227
1228 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1229
1230 if (num) *num = 0;
1231 if (action) *action = NULL;
1232
1233 num_ret =
1234 ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1235 &atoms);
1236 if (num_ret <= 0) return EINA_FALSE;
1237 if (action)
1238 {
1239 *action = malloc(num_ret * sizeof(Ecore_X_Action));
1240 if (*action)
1241 {
1242 int i = 0;
1243
1244 for (i = 0; i < num_ret; i++)
1245 (*action)[i] = _ecore_xcb_netwm_action_atom_get(atoms[i]);
1246 }
1247 if (num) *num = num_ret;
1248 }
1249 free(atoms);
1250 return EINA_TRUE;
1251}
1252
1253EAPI void
1254ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
1255 Ecore_X_Action *action,
1256 unsigned int num)
1257{
1258 Ecore_X_Atom *set;
1259 unsigned int i = 0;
1260
1261 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1262
1263 if (!num)
1264 {
1265 ecore_x_window_prop_property_del(win,
1266 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
1267 return;
1268 }
1269
1270 set = malloc(num * sizeof(Ecore_X_Atom));
1271 if (!set) return;
1272
1273 for (i = 0; i < num; i++)
1274 set[i] = _ecore_xcb_netwm_action_atom_get(action[i]);
1275
1276 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1277 set, num);
1278 free(set);
1279}
1280
1281/* local functions */
1282int
1283_ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
1284 uint8_t data __UNUSED__)
1285{
1286 // TODO: TBD
1287 return 1;
1288}
1289
1290int
1291_ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
1292 uint8_t data __UNUSED__)
1293{
1294 // TODO: TBD
1295 return 1;
1296}
1297
1298/* static void */
1299/* _ecore_xcb_netwm_startup_info_free(void *data) */
1300/* { */
1301/* Ecore_Xcb_Startup_Info *info; */
1302
1303/* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
1304
1305/* if (!(info = data)) return; */
1306/* if (info->buffer) free(info->buffer); */
1307/* if (info->id) free(info->id); */
1308/* if (info->name) free(info->name); */
1309/* if (info->bin) free(info->bin); */
1310/* if (info->icon) free(info->icon); */
1311/* if (info->description) free(info->description); */
1312/* if (info->wmclass) free(info->wmclass); */
1313/* free(info); */
1314/* } */
1315
1316static Ecore_X_Atom
1317_ecore_xcb_netwm_window_type_atom_get(Ecore_X_Window_Type type)
1318{
1319 switch (type)
1320 {
1321 case ECORE_X_WINDOW_TYPE_DESKTOP:
1322 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
1323
1324 case ECORE_X_WINDOW_TYPE_DOCK:
1325 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
1326
1327 case ECORE_X_WINDOW_TYPE_TOOLBAR:
1328 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
1329
1330 case ECORE_X_WINDOW_TYPE_MENU:
1331 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
1332
1333 case ECORE_X_WINDOW_TYPE_UTILITY:
1334 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
1335
1336 case ECORE_X_WINDOW_TYPE_SPLASH:
1337 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
1338
1339 case ECORE_X_WINDOW_TYPE_DIALOG:
1340 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
1341
1342 case ECORE_X_WINDOW_TYPE_NORMAL:
1343 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
1344
1345 case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
1346 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
1347
1348 case ECORE_X_WINDOW_TYPE_POPUP_MENU:
1349 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
1350
1351 case ECORE_X_WINDOW_TYPE_TOOLTIP:
1352 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
1353
1354 case ECORE_X_WINDOW_TYPE_NOTIFICATION:
1355 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
1356
1357 case ECORE_X_WINDOW_TYPE_COMBO:
1358 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
1359
1360 case ECORE_X_WINDOW_TYPE_DND:
1361 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
1362
1363 default:
1364 return 0;
1365 }
1366}
1367
1368static Ecore_X_Window_Type
1369_ecore_xcb_netwm_window_type_type_get(Ecore_X_Atom atom)
1370{
1371 if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
1372 return ECORE_X_WINDOW_TYPE_DESKTOP;
1373 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
1374 return ECORE_X_WINDOW_TYPE_DOCK;
1375 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
1376 return ECORE_X_WINDOW_TYPE_TOOLBAR;
1377 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
1378 return ECORE_X_WINDOW_TYPE_MENU;
1379 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
1380 return ECORE_X_WINDOW_TYPE_UTILITY;
1381 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
1382 return ECORE_X_WINDOW_TYPE_SPLASH;
1383 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
1384 return ECORE_X_WINDOW_TYPE_DIALOG;
1385 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
1386 return ECORE_X_WINDOW_TYPE_NORMAL;
1387 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
1388 return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
1389 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
1390 return ECORE_X_WINDOW_TYPE_POPUP_MENU;
1391 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
1392 return ECORE_X_WINDOW_TYPE_TOOLTIP;
1393 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
1394 return ECORE_X_WINDOW_TYPE_NOTIFICATION;
1395 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
1396 return ECORE_X_WINDOW_TYPE_COMBO;
1397 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
1398 return ECORE_X_WINDOW_TYPE_DND;
1399 else
1400 return ECORE_X_WINDOW_TYPE_UNKNOWN;
1401}
1402
1403static Ecore_X_Atom
1404_ecore_xcb_netwm_window_state_atom_get(Ecore_X_Window_State state)
1405{
1406 switch (state)
1407 {
1408 case ECORE_X_WINDOW_STATE_MODAL:
1409 return ECORE_X_ATOM_NET_WM_STATE_MODAL;
1410
1411 case ECORE_X_WINDOW_STATE_STICKY:
1412 return ECORE_X_ATOM_NET_WM_STATE_STICKY;
1413
1414 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
1415 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
1416
1417 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
1418 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
1419
1420 case ECORE_X_WINDOW_STATE_SHADED:
1421 return ECORE_X_ATOM_NET_WM_STATE_SHADED;
1422
1423 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
1424 return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
1425
1426 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
1427 return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
1428
1429 case ECORE_X_WINDOW_STATE_HIDDEN:
1430 return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
1431
1432 case ECORE_X_WINDOW_STATE_FULLSCREEN:
1433 return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
1434
1435 case ECORE_X_WINDOW_STATE_ABOVE:
1436 return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
1437
1438 case ECORE_X_WINDOW_STATE_BELOW:
1439 return ECORE_X_ATOM_NET_WM_STATE_BELOW;
1440
1441 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
1442 return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
1443
1444 default:
1445 return 0;
1446 }
1447}
1448
1449Ecore_X_Window_State
1450_ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom)
1451{
1452 if (atom == ECORE_X_ATOM_NET_WM_STATE_MODAL)
1453 return ECORE_X_WINDOW_STATE_MODAL;
1454 else if (atom == ECORE_X_ATOM_NET_WM_STATE_STICKY)
1455 return ECORE_X_WINDOW_STATE_STICKY;
1456 else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
1457 return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
1458 else if (atom == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
1459 return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
1460 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SHADED)
1461 return ECORE_X_WINDOW_STATE_SHADED;
1462 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
1463 return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
1464 else if (atom == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
1465 return ECORE_X_WINDOW_STATE_SKIP_PAGER;
1466 else if (atom == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
1467 return ECORE_X_WINDOW_STATE_HIDDEN;
1468 else if (atom == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
1469 return ECORE_X_WINDOW_STATE_FULLSCREEN;
1470 else if (atom == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
1471 return ECORE_X_WINDOW_STATE_ABOVE;
1472 else if (atom == ECORE_X_ATOM_NET_WM_STATE_BELOW)
1473 return ECORE_X_WINDOW_STATE_BELOW;
1474 else if (atom == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
1475 return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
1476 else
1477 return ECORE_X_WINDOW_STATE_UNKNOWN;
1478}
1479
1480static Ecore_X_Atom
1481_ecore_xcb_netwm_action_atom_get(Ecore_X_Action action)
1482{
1483 switch (action)
1484 {
1485 case ECORE_X_ACTION_MOVE:
1486 return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
1487
1488 case ECORE_X_ACTION_RESIZE:
1489 return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
1490
1491 case ECORE_X_ACTION_MINIMIZE:
1492 return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
1493
1494 case ECORE_X_ACTION_SHADE:
1495 return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
1496
1497 case ECORE_X_ACTION_STICK:
1498 return ECORE_X_ATOM_NET_WM_ACTION_STICK;
1499
1500 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1501 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
1502
1503 case ECORE_X_ACTION_MAXIMIZE_VERT:
1504 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
1505
1506 case ECORE_X_ACTION_FULLSCREEN:
1507 return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
1508
1509 case ECORE_X_ACTION_CHANGE_DESKTOP:
1510 return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
1511
1512 case ECORE_X_ACTION_CLOSE:
1513 return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
1514
1515 case ECORE_X_ACTION_ABOVE:
1516 return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
1517
1518 case ECORE_X_ACTION_BELOW:
1519 return ECORE_X_ATOM_NET_WM_ACTION_BELOW;
1520
1521 default:
1522 return 0;
1523 }
1524}
1525
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_pixmap.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_pixmap.c
new file mode 100644
index 0000000..f9bf525
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_pixmap.c
@@ -0,0 +1,128 @@
1#include "ecore_xcb_private.h"
2
3/**
4 * @defgroup Ecore_X_Pixmap_Group X Pixmap Functions
5 *
6 * Functions that operate on pixmaps.
7 */
8
9/**
10 * Creates a new pixmap.
11 * @param win Window used to determine which screen of the display the
12 * pixmap should be created on. If 0, the default root window
13 * is used.
14 * @param w Width of the new pixmap.
15 * @param h Height of the new pixmap.
16 * @param dep Depth of the pixmap. If 0, the default depth of the default
17 * screen is used.
18 * @return New pixmap.
19 * @ingroup Ecore_X_Pixmap_Group
20 */
21EAPI Ecore_X_Pixmap
22ecore_x_pixmap_new(Ecore_X_Window win,
23 int w,
24 int h,
25 int dep)
26{
27 Ecore_X_Pixmap pmap;
28
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
30 CHECK_XCB_CONN;
31
32 if (win == 0) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
33 if (dep == 0) dep = ((xcb_screen_t *)_ecore_xcb_screen)->root_depth;
34
35 pmap = xcb_generate_id(_ecore_xcb_conn);
36 xcb_create_pixmap(_ecore_xcb_conn, dep, pmap, win, w, h);
37
38// ecore_x_flush();
39 return pmap;
40}
41
42/**
43 * Deletes the reference to the given pixmap.
44 *
45 * If no other clients have a reference to the given pixmap, the server
46 * will destroy it.
47 *
48 * @param pmap The given pixmap.
49 * @ingroup Ecore_X_Pixmap_Group
50 */
51EAPI void
52ecore_x_pixmap_free(Ecore_X_Pixmap pmap)
53{
54 LOGFN(__FILE__, __LINE__, __FUNCTION__);
55 CHECK_XCB_CONN;
56
57 xcb_free_pixmap(_ecore_xcb_conn, pmap);
58// ecore_x_flush();
59}
60
61/**
62 * Pastes a rectangular area of the given pixmap onto the given drawable.
63 * @param pmap The given pixmap.
64 * @param dest The given drawable.
65 * @param gc The graphics context which governs which operation will
66 * be used to paste the area onto the drawable.
67 * @param sx The X position of the area on the pixmap.
68 * @param sy The Y position of the area on the pixmap.
69 * @param w The width of the area.
70 * @param h The height of the area.
71 * @param dx The X position at which to paste the area on @p dest.
72 * @param dy The Y position at which to paste the area on @p dest.
73 * @ingroup Ecore_X_Pixmap_Group
74 */
75EAPI void
76ecore_x_pixmap_paste(Ecore_X_Pixmap pmap,
77 Ecore_X_Drawable dest,
78 Ecore_X_GC gc,
79 int sx,
80 int sy,
81 int w,
82 int h,
83 int dx,
84 int dy)
85{
86 LOGFN(__FILE__, __LINE__, __FUNCTION__);
87 CHECK_XCB_CONN;
88
89 xcb_copy_area(_ecore_xcb_conn, pmap, dest, gc, sx, sy, dx, dy, w, h);
90// ecore_x_flush();
91}
92
93/**
94 * Retrieves the size of the given pixmap.
95 * @param pmap The given pixmap.
96 * @param x Pointer to an integer in which to store the X position.
97 * @param y Pointer to an integer in which to store the Y position.
98 * @param w Pointer to an integer in which to store the width.
99 * @param h Pointer to an integer in which to store the height.
100 * @ingroup Ecore_X_Pixmap_Group
101 */
102EAPI void
103ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap,
104 int *x,
105 int *y,
106 int *w,
107 int *h)
108{
109 LOGFN(__FILE__, __LINE__, __FUNCTION__);
110
111 if (pmap)
112 ecore_x_drawable_geometry_get(pmap, x, y, w, h);
113}
114
115/**
116 * Retrieves the depth of the given pixmap.
117 * @param pmap The given pixmap.
118 * @return The depth of the pixmap.
119 * @ingroup Ecore_X_Pixmap_Group
120 */
121EAPI int
122ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap)
123{
124 LOGFN(__FILE__, __LINE__, __FUNCTION__);
125
126 return ecore_x_drawable_depth_get(pmap);
127}
128
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h
new file mode 100644
index 0000000..cf8f3e5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_private.h
@@ -0,0 +1,451 @@
1#ifndef __ECORE_XCB_PRIVATE_H__
2# define __ECORE_XCB_PRIVATE_H__
3
4//# define LOGFNS 1
5
6# ifdef HAVE_CONFIG_H
7# include "config.h"
8# endif
9
10# include <unistd.h> // included for close & gethostname functions
11
12/* generic xcb includes */
13# include <xcb/xcb.h>
14# include <xcb/bigreq.h>
15# include <xcb/shm.h>
16# include <xcb/xcb_image.h>
17
18/* EFL includes */
19# include "Ecore.h"
20# include "Ecore_Input.h"
21# include "Ecore_X.h"
22
23/* logging */
24extern int _ecore_xcb_log_dom;
25
26# ifdef ECORE_XCB_DEFAULT_LOG_COLOR
27# undef ECORE_XCB_DEFAULT_LOG_COLOR
28# endif
29# define ECORE_XCB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
30
31# ifdef ERR
32# undef ERR
33# endif
34# define ERR(...) EINA_LOG_DOM_ERR(_ecore_xcb_log_dom, __VA_ARGS__)
35
36# ifdef DBG
37# undef DBG
38# endif
39# define DBG(...) EINA_LOG_DOM_DBG(_ecore_xcb_log_dom, __VA_ARGS__)
40
41# ifdef INF
42# undef INF
43# endif
44# define INF(...) EINA_LOG_DOM_INFO(_ecore_xcb_log_dom, __VA_ARGS__)
45
46# ifdef WRN
47# undef WRN
48# endif
49# define WRN(...) EINA_LOG_DOM_WARN(_ecore_xcb_log_dom, __VA_ARGS__)
50
51# ifdef CRIT
52# undef CRIT
53# endif
54# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_xcb_log_dom, __VA_ARGS__)
55
56# ifdef LOGFNS
57# include <stdio.h>
58# define LOGFN(fl, ln, fn) printf("-ECORE-XCB: %25s: %5i - %s\n", fl, ln, fn);
59# else
60# define LOGFN(fl, ln, fn)
61# endif
62
63# ifndef MAXHOSTNAMELEN
64# define MAXHOSTNAMELEN 256
65# endif
66
67# ifndef MIN
68# define MIN(x, y) (((x) > (y)) ? (y) : (x))
69# endif
70
71# ifndef MAX
72# define MAX(a, b) ((a < b) ? b : a)
73# endif
74
75#define CHECK_XCB_CONN \
76 { \
77 if (xcb_connection_has_error(_ecore_xcb_conn)) \
78 { \
79 DBG("XCB Connection Has Error !!"); \
80 _ecore_xcb_io_error_handle(NULL); \
81 } \
82 }
83
84/* enums */
85typedef enum _Ecore_Xcb_Encoding_Style Ecore_Xcb_Encoding_Style;
86
87enum _Ecore_Xcb_Encoding_Style
88{
89 XcbStringStyle,
90 XcbCompoundTextStyle,
91 XcbTextStyle,
92 XcbStdICCTextStyle,
93 XcbUTF8StringStyle
94};
95
96/* structures */
97typedef struct _Ecore_X_DND_Source Ecore_X_DND_Source;
98typedef struct _Ecore_X_DND_Target Ecore_X_DND_Target;
99typedef struct _Ecore_X_Selection_Intern Ecore_X_Selection_Intern;
100typedef struct _Ecore_X_Selection_Converter Ecore_X_Selection_Converter;
101typedef struct _Ecore_X_Selection_Parser Ecore_X_Selection_Parser;
102typedef struct _Ecore_Xcb_Textproperty Ecore_Xcb_Textproperty;
103
104struct _Ecore_X_DND_Source
105{
106 int version;
107 Ecore_X_Window win, dest;
108
109 enum
110 {
111 ECORE_X_DND_SOURCE_IDLE,
112 ECORE_X_DND_SOURCE_DRAGGING,
113 ECORE_X_DND_SOURCE_DROPPED,
114 ECORE_X_DND_SOURCE_CONVERTING
115 } state;
116
117 struct
118 {
119 short x, y;
120 unsigned short width, height;
121 } rectangle;
122
123 struct
124 {
125 Ecore_X_Window window;
126 int x, y;
127 } prev;
128
129 Ecore_X_Time time;
130
131 Ecore_X_Atom action, accepted_action;
132
133 int will_accept, suppress;
134 int await_status;
135};
136
137struct _Ecore_X_DND_Target
138{
139 int version;
140 Ecore_X_Window win, source;
141
142 enum
143 {
144 ECORE_X_DND_TARGET_IDLE,
145 ECORE_X_DND_TARGET_ENTERED
146 } state;
147
148 struct
149 {
150 int x, y;
151 } pos;
152
153 Ecore_X_Time time;
154
155 Ecore_X_Atom action, accepted_action;
156 int will_accept;
157};
158
159struct _Ecore_X_Selection_Intern
160{
161 Ecore_X_Window win;
162 Ecore_X_Atom selection;
163 unsigned char *data;
164 int length;
165 Ecore_X_Time time;
166};
167
168struct _Ecore_X_Selection_Converter
169{
170 Ecore_X_Atom target;
171 Eina_Bool (*convert)(char *target,
172 void *data,
173 int size,
174 void **data_ret,
175 int *size_ret,
176 Ecore_X_Atom *type,
177 int *size_type);
178 Ecore_X_Selection_Converter *next;
179};
180
181struct _Ecore_X_Selection_Parser
182{
183 char *target;
184 void *(*parse)(const char *target, void *data, int size, int format);
185 Ecore_X_Selection_Parser *next;
186};
187
188struct _Ecore_Xcb_Textproperty
189{
190 char *value;
191 Ecore_X_Atom encoding;
192 unsigned int format, nitems;
193};
194
195/* external variables */
196extern Ecore_X_Connection *_ecore_xcb_conn;
197extern Ecore_X_Screen *_ecore_xcb_screen;
198extern double _ecore_xcb_double_click_time;
199extern int16_t _ecore_xcb_event_last_root_x;
200extern int16_t _ecore_xcb_event_last_root_y;
201
202/* external variables for extension events */
203extern int _ecore_xcb_event_damage;
204extern int _ecore_xcb_event_randr;
205extern int _ecore_xcb_event_screensaver;
206extern int _ecore_xcb_event_shape;
207extern int _ecore_xcb_event_sync;
208extern int _ecore_xcb_event_xfixes;
209extern int _ecore_xcb_event_input;
210extern int _ecore_xcb_event_gesture;
211
212extern int ECORE_X_MODIFIER_SHIFT;
213extern int ECORE_X_MODIFIER_CTRL;
214extern int ECORE_X_MODIFIER_ALT;
215extern int ECORE_X_MODIFIER_WIN;
216extern int ECORE_X_LOCK_SCROLL;
217extern int ECORE_X_LOCK_NUM;
218extern int ECORE_X_LOCK_CAPS;
219extern int ECORE_X_LOCK_SHIFT;
220
221extern Ecore_X_Atom _ecore_xcb_atoms_wm_protocol[ECORE_X_WM_PROTOCOL_NUM];
222
223extern int _ecore_xcb_button_grabs_num;
224extern int _ecore_xcb_key_grabs_num;
225extern Ecore_X_Window *_ecore_xcb_button_grabs;
226extern Ecore_X_Window *_ecore_xcb_key_grabs;
227extern Eina_Bool (*_ecore_xcb_window_grab_replay_func)(void *data,
228 int type,
229 void *event);
230extern void *_ecore_xcb_window_grab_replay_data;
231
232/* private function prototypes */
233void _ecore_xcb_error_handler_init(void);
234void _ecore_xcb_error_handler_shutdown(void);
235
236void _ecore_xcb_atoms_init(void);
237void _ecore_xcb_atoms_finalize(void);
238
239void _ecore_xcb_extensions_init(void);
240void _ecore_xcb_extensions_finalize(void);
241
242void _ecore_xcb_shape_init(void);
243void _ecore_xcb_shape_finalize(void);
244
245void _ecore_xcb_screensaver_init(void);
246void _ecore_xcb_screensaver_finalize(void);
247
248void _ecore_xcb_sync_init(void);
249void _ecore_xcb_sync_finalize(void);
250void _ecore_xcb_sync_magic_send(int val,
251 Ecore_X_Window win);
252
253void _ecore_xcb_render_init(void);
254void _ecore_xcb_render_finalize(void);
255Eina_Bool _ecore_xcb_render_argb_get(void);
256Eina_Bool _ecore_xcb_render_anim_get(void);
257Eina_Bool _ecore_xcb_render_avail_get(void);
258
259Eina_Bool _ecore_xcb_render_visual_supports_alpha(Ecore_X_Visual visual);
260uint32_t _ecore_xcb_render_find_visual_id(int type,
261 Eina_Bool check_alpha);
262Ecore_X_Visual *_ecore_xcb_render_visual_get(int visual_id);
263
264void _ecore_xcb_randr_init(void);
265void _ecore_xcb_randr_finalize(void);
266
267void _ecore_xcb_gesture_init(void);
268void _ecore_xcb_gesture_finalize(void);
269void _ecore_xcb_gesture_shutdown(void);
270
271void _ecore_xcb_xfixes_init(void);
272void _ecore_xcb_xfixes_finalize(void);
273Eina_Bool _ecore_xcb_xfixes_avail_get(void);
274
275void _ecore_xcb_damage_init(void);
276void _ecore_xcb_damage_finalize(void);
277
278void _ecore_xcb_composite_init(void);
279void _ecore_xcb_composite_finalize(void);
280
281void _ecore_xcb_dpms_init(void);
282void _ecore_xcb_dpms_finalize(void);
283
284void _ecore_xcb_cursor_init(void);
285void _ecore_xcb_cursor_finalize(void);
286
287void _ecore_xcb_xinerama_init(void);
288void _ecore_xcb_xinerama_finalize(void);
289
290void _ecore_xcb_dnd_init(void);
291void _ecore_xcb_dnd_shutdown(void);
292Ecore_X_DND_Source *_ecore_xcb_dnd_source_get(void);
293Ecore_X_DND_Target *_ecore_xcb_dnd_target_get(void);
294void _ecore_xcb_dnd_drag(Ecore_X_Window root,
295 int x,
296 int y);
297
298void _ecore_xcb_selection_init(void);
299void _ecore_xcb_selection_shutdown(void);
300void *_ecore_xcb_selection_parse(const char *target,
301 void *data,
302 int size,
303 int format);
304char *_ecore_xcb_selection_target_get(Ecore_X_Atom target);
305Ecore_X_Selection_Intern *_ecore_xcb_selection_get(Ecore_X_Atom selection);
306
307# ifdef HAVE_ICONV
308Eina_Bool _ecore_xcb_utf8_textlist_to_textproperty(char **list,
309 int count,
310 Ecore_Xcb_Encoding_Style style,
311 Ecore_Xcb_Textproperty *ret);
312# endif
313Eina_Bool _ecore_xcb_mb_textlist_to_textproperty(char **list,
314 int count,
315 Ecore_Xcb_Encoding_Style style,
316 Ecore_Xcb_Textproperty *ret);
317Eina_Bool _ecore_xcb_textlist_to_textproperty(const char *type,
318 char **list,
319 int count,
320 Ecore_Xcb_Encoding_Style style,
321 Ecore_Xcb_Textproperty *ret);
322
323# ifdef HAVE_ICONV
324Eina_Bool _ecore_xcb_utf8_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
325 char ***list_ret,
326 int *count_ret);
327# endif
328Eina_Bool _ecore_xcb_mb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
329 char ***list_ret,
330 int *count_ret);
331Eina_Bool _ecore_xcb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
332 const char *type,
333 char ***list_ret,
334 int *count_ret);
335
336void _ecore_xcb_events_init(void);
337void _ecore_xcb_events_shutdown(void);
338void _ecore_xcb_events_handle(xcb_generic_event_t *ev);
339Ecore_X_Time _ecore_xcb_events_last_time_get(void);
340unsigned int _ecore_xcb_events_modifiers_get(unsigned int state);
341void _ecore_xcb_event_mouse_move(uint16_t timestamp,
342 uint16_t modifiers,
343 int16_t x,
344 int16_t y,
345 int16_t root_x,
346 int16_t root_y,
347 xcb_window_t event_win,
348 xcb_window_t win,
349 xcb_window_t root_win,
350 uint8_t same_screen,
351 int dev,
352 double radx,
353 double rady,
354 double pressure,
355 double angle,
356 int16_t mx,
357 int16_t my,
358 int16_t mrx,
359 int16_t mry);
360Ecore_Event_Mouse_Button *_ecore_xcb_event_mouse_button(int event,
361 uint16_t timestamp,
362 uint16_t modifiers,
363 xcb_button_t buttons,
364 int16_t x,
365 int16_t y,
366 int16_t root_x,
367 int16_t root_y,
368 xcb_window_t event_win,
369 xcb_window_t win,
370 xcb_window_t root_win,
371 uint8_t same_screen,
372 int dev,
373 double radx,
374 double rady,
375 double pressure,
376 double angle,
377 int16_t mx,
378 int16_t my,
379 int16_t mrx,
380 int16_t mry);
381
382void _ecore_xcb_keymap_init(void);
383void _ecore_xcb_keymap_finalize(void);
384void _ecore_xcb_keymap_shutdown(void);
385void _ecore_xcb_keymap_refresh(xcb_mapping_notify_event_t *event);
386xcb_keysym_t _ecore_xcb_keymap_keycode_to_keysym(xcb_keycode_t keycode,
387 int col);
388xcb_keycode_t *_ecore_xcb_keymap_keysym_to_keycode(xcb_keysym_t keysym);
389char *_ecore_xcb_keymap_keysym_to_string(xcb_keysym_t keysym);
390xcb_keycode_t _ecore_xcb_keymap_string_to_keycode(const char *key);
391int _ecore_xcb_keymap_lookup_string(xcb_keycode_t keycode,
392 int state,
393 char *buffer,
394 int bytes,
395 xcb_keysym_t *sym);
396
397void _ecore_xcb_input_init(void);
398void _ecore_xcb_input_finalize(void);
399void _ecore_xcb_input_shutdown(void);
400# ifdef ECORE_XCB_XINPUT
401void _ecore_xcb_input_handle_event(xcb_generic_event_t *event);
402# else
403void _ecore_xcb_input_handle_event(xcb_generic_event_t *event __UNUSED__);
404# endif
405
406void _ecore_xcb_dri_init(void);
407void _ecore_xcb_dri_finalize(void);
408
409void _ecore_xcb_xtest_init(void);
410void _ecore_xcb_xtest_finalize(void);
411
412Ecore_X_Window _ecore_xcb_window_root_of_screen_get(int screen);
413void _ecore_xcb_window_prop_string_utf8_set(Ecore_X_Window win,
414 Ecore_X_Atom atom,
415 const char *str);
416Ecore_X_Visual _ecore_xcb_window_visual_get(Ecore_X_Window win);
417void _ecore_xcb_window_button_grab_remove(Ecore_X_Window win);
418void _ecore_xcb_window_key_grab_remove(Ecore_X_Window win);
419void _ecore_xcb_window_grab_allow_events(Ecore_X_Window event_win,
420 Ecore_X_Window child_win,
421 int type,
422 void *event,
423 Ecore_X_Time timestamp);
424
425int _ecore_xcb_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
426 uint8_t data __UNUSED__);
427int _ecore_xcb_netwm_startup_info(Ecore_X_Window win __UNUSED__,
428 uint8_t data __UNUSED__);
429Ecore_X_Window_State _ecore_xcb_netwm_window_state_get(Ecore_X_Atom atom);
430
431int _ecore_xcb_error_handle(xcb_generic_error_t *err);
432int _ecore_xcb_io_error_handle(xcb_generic_error_t *err);
433
434xcb_image_t *_ecore_xcb_image_create_native(int w,
435 int h,
436 xcb_image_format_t format,
437 uint8_t depth,
438 void *base,
439 uint32_t bytes,
440 uint8_t *data);
441
442void _ecore_xcb_xdefaults_init(void);
443void _ecore_xcb_xdefaults_shutdown(void);
444char *_ecore_xcb_xdefaults_string_get(const char *prog,
445 const char *param);
446int _ecore_xcb_xdefaults_int_get(const char *prog,
447 const char *param);
448
449void _ecore_xcb_modifiers_get(void);
450
451#endif
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_randr.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_randr.c
new file mode 100644
index 0000000..510da49
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_randr.c
@@ -0,0 +1,3474 @@
1/* TODO: List of missing functions
2 *
3 * ecore_x_randr_crtc_clone_set
4 * ecore_x_randr_output_size_mm_get
5 * ecore_x_randr_output_crtc_set
6 * ecore_x_randr_edid_version_get
7 * ecore_x_randr_edid_info_has_valid_checksum
8 * ecore_x_randr_edid_manufacturer_name_get
9 * ecore_x_randr_edid_display_ascii_get
10 * ecore_x_randr_edid_display_serial_get
11 * ecore_x_randr_edid_model_get
12 * ecore_x_randr_edid_manufacturer_serial_number_get
13 * ecore_x_randr_edid_manufacturer_model_get
14 * ecore_x_randr_edid_dpms_available_get
15 * ecore_x_randr_edid_dpms_standby_available_get
16 * ecore_x_randr_edid_dpms_suspend_available_get
17 * ecore_x_randr_edid_dpms_off_available_get
18 * ecore_x_randr_edid_display_aspect_ratio_preferred_get
19 * ecore_x_randr_edid_display_aspect_ratios_get
20 * ecore_x_randr_edid_display_colorscheme_get
21 * ecore_x_randr_edid_display_type_digital_get
22 * ecore_x_randr_edid_display_interface_type_get
23 * ecore_x_randr_screen_backlight_level_set
24 * ecore_x_randr_output_subpixel_order_get
25 * ecore_x_randr_output_wired_clones_get
26 * ecore_x_randr_output_compatibility_list_get
27 * ecore_x_randr_output_signal_formats_get
28 * ecore_x_randr_output_signal_format_set
29 * ecore_x_randr_output_signal_properties_get
30 * ecore_x_randr_output_connector_number_get
31 * ecore_x_randr_output_connector_type_get
32 * ecore_x_randr_crtc_panning_area_get
33 * ecore_x_randr_crtc_panning_area_set
34 * ecore_x_randr_crtc_tracking_area_get
35 * ecore_x_randr_crtc_tracking_area_set
36 * ecore_x_randr_crtc_border_area_get
37 * ecore_x_randr_crtc_border_area_set
38 */
39
40#include "ecore_xcb_private.h"
41# ifdef ECORE_XCB_RANDR
42# include <xcb/randr.h>
43# endif
44
45#define Ecore_X_Randr_None 0
46#define Ecore_X_Randr_Unset -1
47
48#define RANDR_1_1 ((1 << 16) | 1)
49#define RANDR_1_2 ((1 << 16) | 2)
50#define RANDR_1_3 ((1 << 16) | 3)
51
52#define RANDR_CHECK_1_1_RET(ret) if (_randr_version < RANDR_1_1) return ret
53#define RANDR_CHECK_1_2_RET(ret) if (_randr_version < RANDR_1_2) return ret
54#define RANDR_CHECK_1_3_RET(ret) if (_randr_version < RANDR_1_3) return ret
55
56#define ECORE_X_RANDR_EDID_VERSION_13 ((1 << 8) | 3)
57#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR 0x12
58#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR 0x13
59#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK 0x36
60#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE 3
61#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT 5
62#define _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX 13
63
64#define _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
65 for (block = edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK; block <= (edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK + (3 * 18)); block += 18)
66
67#define _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) \
68 _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
69 if ((block[0] == 0) && (block[1] == 0))
70
71/* local function prototypes */
72static Eina_Bool _ecore_xcb_randr_output_validate(Ecore_X_Window root,
73 Ecore_X_Randr_Output output);
74static Eina_Bool _ecore_xcb_randr_crtc_validate(Ecore_X_Window root,
75 Ecore_X_Randr_Crtc crtc);
76static Eina_Bool _ecore_xcb_randr_root_validate(Ecore_X_Window root);
77static int _ecore_xcb_randr_root_to_screen(Ecore_X_Window root);
78static xcb_randr_get_screen_resources_reply_t *_ecore_xcb_randr_12_get_resources(Ecore_X_Window win);
79static xcb_randr_get_screen_resources_current_reply_t *_ecore_xcb_randr_13_get_resources(Ecore_X_Window win);
80static xcb_timestamp_t _ecore_xcb_randr_12_get_resource_timestamp(Ecore_X_Window win);
81static xcb_timestamp_t _ecore_xcb_randr_13_get_resource_timestamp(Ecore_X_Window win);
82
83static Ecore_X_Randr_Mode *_ecore_xcb_randr_12_output_modes_get(Ecore_X_Window root,
84 Ecore_X_Randr_Output output,
85 int *num,
86 int *npreferred);
87static Ecore_X_Randr_Mode *_ecore_xcb_randr_13_output_modes_get(Ecore_X_Window root,
88 Ecore_X_Randr_Output output,
89 int *num,
90 int *npreferred);
91static Ecore_X_Randr_Mode_Info *_ecore_xcb_randr_12_mode_info_get(Ecore_X_Window root,
92 Ecore_X_Randr_Mode mode);
93static Ecore_X_Randr_Mode_Info *_ecore_xcb_randr_13_mode_info_get(Ecore_X_Window root,
94 Ecore_X_Randr_Mode mode);
95static Ecore_X_Randr_Mode_Info **_ecore_xcb_randr_12_modes_info_get(Ecore_X_Window root,
96 int *num);
97static Ecore_X_Randr_Mode_Info **_ecore_xcb_randr_13_modes_info_get(Ecore_X_Window root,
98 int *num);
99static void _ecore_xcb_randr_12_mode_size_get(Ecore_X_Window root,
100 Ecore_X_Randr_Mode mode,
101 int *w,
102 int *h);
103static void _ecore_xcb_randr_13_mode_size_get(Ecore_X_Window root,
104 Ecore_X_Randr_Mode mode,
105 int *w,
106 int *h);
107static Ecore_X_Randr_Output *_ecore_xcb_randr_12_output_clones_get(Ecore_X_Window root,
108 Ecore_X_Randr_Output output,
109 int *num);
110static Ecore_X_Randr_Output *_ecore_xcb_randr_13_output_clones_get(Ecore_X_Window root,
111 Ecore_X_Randr_Output output,
112 int *num);
113static Ecore_X_Randr_Crtc *_ecore_xcb_randr_12_output_possible_crtcs_get(Ecore_X_Window root,
114 Ecore_X_Randr_Output output,
115 int *num);
116static Ecore_X_Randr_Crtc *_ecore_xcb_randr_13_output_possible_crtcs_get(Ecore_X_Window root,
117 Ecore_X_Randr_Output output,
118 int *num);
119static char *_ecore_xcb_randr_12_output_name_get(Ecore_X_Window root,
120 Ecore_X_Randr_Output output,
121 int *len);
122static char *_ecore_xcb_randr_13_output_name_get(Ecore_X_Window root,
123 Ecore_X_Randr_Output output,
124 int *len);
125static Ecore_X_Randr_Connection_Status _ecore_xcb_randr_12_output_connection_status_get(Ecore_X_Window root,
126 Ecore_X_Randr_Output output);
127static Ecore_X_Randr_Connection_Status _ecore_xcb_randr_13_output_connection_status_get(Ecore_X_Window root,
128 Ecore_X_Randr_Output output);
129static Ecore_X_Randr_Output *_ecore_xcb_randr_12_outputs_get(Ecore_X_Window root,
130 int *num);
131static Ecore_X_Randr_Output *_ecore_xcb_randr_13_outputs_get(Ecore_X_Window root,
132 int *num);
133static Ecore_X_Randr_Crtc _ecore_xcb_randr_12_output_crtc_get(Ecore_X_Window root,
134 Ecore_X_Randr_Output output);
135static Ecore_X_Randr_Crtc _ecore_xcb_randr_13_output_crtc_get(Ecore_X_Window root,
136 Ecore_X_Randr_Output output);
137
138/* local variables */
139static Eina_Bool _randr_avail = EINA_FALSE;
140static int _randr_version = -1;
141
142/* external variables */
143int _ecore_xcb_event_randr = -1;
144
145void
146_ecore_xcb_randr_init(void)
147{
148 LOGFN(__FILE__, __LINE__, __FUNCTION__);
149
150#ifdef ECORE_XCB_RANDR
151 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_randr_id);
152#endif
153}
154
155void
156_ecore_xcb_randr_finalize(void)
157{
158#ifdef ECORE_XCB_RANDR
159 const xcb_query_extension_reply_t *ext_reply;
160#endif
161
162 LOGFN(__FILE__, __LINE__, __FUNCTION__);
163
164#ifdef ECORE_XCB_RANDR
165 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_randr_id);
166 if ((ext_reply) && (ext_reply->present))
167 {
168 xcb_randr_query_version_cookie_t cookie;
169 xcb_randr_query_version_reply_t *reply;
170
171 cookie =
172 xcb_randr_query_version_unchecked(_ecore_xcb_conn,
173 XCB_RANDR_MAJOR_VERSION,
174 XCB_RANDR_MINOR_VERSION);
175 reply = xcb_randr_query_version_reply(_ecore_xcb_conn, cookie, NULL);
176 if (reply)
177 {
178 if ((reply->major_version >= XCB_RANDR_MAJOR_VERSION) &&
179 (reply->minor_version >= XCB_RANDR_MINOR_VERSION))
180 _randr_avail = EINA_TRUE;
181
182 _randr_version =
183 ((reply->major_version << 16) | reply->minor_version);
184
185 free(reply);
186 }
187
188 if (_randr_avail)
189 _ecore_xcb_event_randr = ext_reply->first_event;
190 }
191#endif
192}
193
194static Eina_Bool
195_ecore_xcb_randr_root_validate(Ecore_X_Window root)
196{
197#ifdef ECORE_XCB_RANDR
198 Ecore_X_Randr_Screen scr = -1;
199# define RANDR_VALIDATE_ROOT(screen, root) \
200 ((screen == _ecore_xcb_randr_root_to_screen(root)) != -1)
201#endif
202
203 LOGFN(__FILE__, __LINE__, __FUNCTION__);
204
205#ifdef ECORE_XCB_RANDR
206 if ((root) && RANDR_VALIDATE_ROOT(scr, root))
207 return EINA_TRUE;
208#endif
209
210 return EINA_FALSE;
211}
212
213static int
214_ecore_xcb_randr_root_to_screen(Ecore_X_Window root)
215{
216 int count = 0, num = 0;
217
218 CHECK_XCB_CONN;
219
220 count = xcb_setup_roots_length(xcb_get_setup(_ecore_xcb_conn));
221 for (num = 0; num < count; num++)
222 if (_ecore_xcb_window_root_of_screen_get(num) == root)
223 return num;
224
225 return -1;
226}
227
228/* public functions */
229
230/*
231 * @brief query whether randr is available or not
232 * @return EINA_TRUE, if extension is available, else EINA_FALSE
233 */
234EAPI Eina_Bool
235ecore_x_randr_query(void)
236{
237 return _randr_avail;
238}
239
240/*
241 * @return version of the RandRR extension supported by the server or,
242 * in case RandRR extension is not available, Ecore_X_Randr_Unset (=-1).
243 * bit version information: 31 MAJOR 16 | 15 MINOR 0
244 */
245EAPI int
246ecore_x_randr_version_get(void)
247{
248 return _randr_version;
249}
250
251/*
252 * @param root window which's primary output will be queried
253 */
254EAPI Ecore_X_Randr_Orientation
255ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root)
256{
257 int ret = Ecore_X_Randr_None;
258#ifdef ECORE_XCB_RANDR
259 xcb_randr_get_screen_info_cookie_t cookie;
260 xcb_randr_get_screen_info_reply_t *reply;
261#endif
262
263 LOGFN(__FILE__, __LINE__, __FUNCTION__);
264 CHECK_XCB_CONN;
265
266#ifdef ECORE_XCB_RANDR
267 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
268 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
269 if (reply)
270 {
271 ret = reply->rotations;
272 free(reply);
273 }
274#endif
275
276 return ret;
277}
278
279/*
280 * @param root window which's primary output will be queried
281 * @return the current orientation of the root window's screen primary output
282 */
283EAPI Ecore_X_Randr_Orientation
284ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root)
285{
286 int ret = Ecore_X_Randr_None;
287#ifdef ECORE_XCB_RANDR
288 xcb_randr_get_screen_info_cookie_t cookie;
289 xcb_randr_get_screen_info_reply_t *reply;
290#endif
291
292 LOGFN(__FILE__, __LINE__, __FUNCTION__);
293 CHECK_XCB_CONN;
294
295#ifdef ECORE_XCB_RANDR
296 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
297 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
298 if (reply)
299 {
300 ret = reply->rotation;
301 free(reply);
302 }
303#endif
304
305 return ret;
306}
307
308/*
309 * @brief sets a given screen's primary output's orientation
310 * @param root window which's screen's primary output will be queried
311 * @param orientation orientation which should be set for the root window's screen primary output
312 * @return EINA_TRUE if the primary output's orientation could be successfully altered
313 */
314EAPI Eina_Bool
315ecore_x_randr_screen_primary_output_orientation_set(Ecore_X_Window root,
316 Ecore_X_Randr_Orientation orientation)
317{
318 int ret = EINA_FALSE;
319#ifdef ECORE_XCB_RANDR
320 xcb_randr_get_screen_info_cookie_t cookie;
321 xcb_randr_get_screen_info_reply_t *reply;
322#endif
323
324 LOGFN(__FILE__, __LINE__, __FUNCTION__);
325 CHECK_XCB_CONN;
326
327#ifdef ECORE_XCB_RANDR
328 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
329 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
330 if (reply)
331 {
332 xcb_randr_set_screen_config_cookie_t scookie;
333 xcb_randr_set_screen_config_reply_t *sreply;
334
335 scookie =
336 xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
337 XCB_CURRENT_TIME,
338 reply->config_timestamp,
339 reply->sizeID, orientation,
340 reply->rate);
341 sreply =
342 xcb_randr_set_screen_config_reply(_ecore_xcb_conn, scookie, NULL);
343 if (!sreply)
344 ret = EINA_FALSE;
345 else
346 {
347 ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
348 EINA_TRUE : EINA_FALSE;
349 free(sreply);
350 }
351 free(reply);
352 }
353#endif
354
355 return ret;
356}
357
358/*
359 * @brief gets a screen's primary output's possible sizes
360 * @param root window which's primary output will be queried
361 * @param num number of sizes reported as supported by the screen's primary output
362 * @return an array of sizes reported as supported by the screen's primary output or - if query failed - NULL
363 */
364EAPI Ecore_X_Randr_Screen_Size_MM *
365ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root,
366 int *num)
367{
368#ifdef ECORE_XCB_RANDR
369 xcb_randr_get_screen_info_cookie_t cookie;
370 xcb_randr_get_screen_info_reply_t *reply;
371 Ecore_X_Randr_Screen_Size_MM *ret = NULL;
372#endif
373
374 LOGFN(__FILE__, __LINE__, __FUNCTION__);
375 CHECK_XCB_CONN;
376
377#ifdef ECORE_XCB_RANDR
378 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
379 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
380 if (reply)
381 {
382 int len = 0, i = 0;
383 xcb_randr_screen_size_t *sizes;
384
385 len = xcb_randr_get_screen_info_sizes_length(reply);
386 sizes = xcb_randr_get_screen_info_sizes(reply);
387 if ((!sizes) || (len <= 0))
388 {
389 free(reply);
390 return NULL;
391 }
392 if (num) *num = len;
393 ret = calloc(len, sizeof(Ecore_X_Randr_Screen_Size_MM));
394 if (!ret)
395 {
396 free(reply);
397 return NULL;
398 }
399 for (i = 0; i < len; i++)
400 {
401 ret[i].width = sizes[i].width;
402 ret[i].height = sizes[i].height;
403 ret[i].width_mm = sizes[i].mwidth;
404 ret[i].height_mm = sizes[i].mheight;
405 }
406
407 free(reply);
408 }
409
410 return ret;
411#else
412 return NULL;
413#endif
414}
415
416/*
417 * @brief get the current set size of a given screen's primary output
418 * @param root window which's primary output will be queried
419 * @param w the current size's width
420 * @param h the current size's height
421 * @param w_mm the current size's width in mm
422 * @param h_mm the current size's height in mm
423 * @param size_index of current set size to be used with ecore_x_randr_primary_output_size_set()
424 */
425EAPI void
426ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root,
427 int *w,
428 int *h,
429 int *w_mm,
430 int *h_mm,
431 int *size_index)
432{
433#ifdef ECORE_XCB_RANDR
434 xcb_randr_get_screen_info_cookie_t cookie;
435 xcb_randr_get_screen_info_reply_t *reply;
436#endif
437
438 LOGFN(__FILE__, __LINE__, __FUNCTION__);
439 CHECK_XCB_CONN;
440
441#ifdef ECORE_XCB_RANDR
442 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
443 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
444 if (reply)
445 {
446 int len = 0, idx = 0;
447 xcb_randr_screen_size_t *sizes;
448
449 len = xcb_randr_get_screen_info_sizes_length(reply);
450 sizes = xcb_randr_get_screen_info_sizes(reply);
451 if ((!sizes) || (len <= 0))
452 {
453 free(reply);
454 return;
455 }
456 idx = reply->sizeID;
457 if ((idx < len) && (idx >= 0))
458 {
459 if (w) *w = sizes[idx].width;
460 if (h) *h = sizes[idx].height;
461 if (w_mm) *w_mm = sizes[idx].mwidth;
462 if (h_mm) *h_mm = sizes[idx].mheight;
463 if (size_index) *size_index = idx;
464 }
465
466 free(reply);
467 }
468#endif
469}
470
471/*
472 * @brief sets a given screen's primary output size, but disables all other outputs at the same time
473 * @param root window which's primary output will be queried
474 * @param size_index within the list of sizes reported as supported by the root window's screen primary output
475 * @return EINA_TRUE on success, EINA_FALSE on failure due to e.g. invalid times
476 */
477EAPI Eina_Bool
478ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root,
479 int size_index)
480{
481 Eina_Bool ret = EINA_FALSE;
482#ifdef ECORE_XCB_RANDR
483 xcb_randr_get_screen_info_cookie_t cookie;
484 xcb_randr_get_screen_info_reply_t *reply;
485#endif
486
487 LOGFN(__FILE__, __LINE__, __FUNCTION__);
488 CHECK_XCB_CONN;
489
490#ifdef ECORE_XCB_RANDR
491 if (!((size_index >= 0) && (_ecore_xcb_randr_root_validate(root))))
492 return EINA_FALSE;
493
494 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
495 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
496 if (reply)
497 {
498 int len = 0;
499
500 len = xcb_randr_get_screen_info_sizes_length(reply);
501 if (len <= 0)
502 {
503 free(reply);
504 return EINA_FALSE;
505 }
506 if ((size_index < len) && (size_index >= 0))
507 {
508 xcb_randr_set_screen_config_cookie_t scookie;
509 xcb_randr_set_screen_config_reply_t *sreply;
510
511 scookie =
512 xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
513 XCB_CURRENT_TIME,
514 reply->config_timestamp,
515 size_index,
516 reply->rotation,
517 reply->rate);
518 sreply =
519 xcb_randr_set_screen_config_reply(_ecore_xcb_conn,
520 scookie, NULL);
521 if (!sreply)
522 ret = EINA_FALSE;
523 else
524 {
525 ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
526 EINA_TRUE : EINA_FALSE;
527 free(sreply);
528 }
529 }
530
531 free(reply);
532 }
533#endif
534 return ret;
535}
536
537/*
538 * @param root window which's primary output will be queried
539 * @return currently used refresh rate or - if request failed or RandRR is not available - 0.0
540 */
541EAPI Ecore_X_Randr_Refresh_Rate
542ecore_x_randr_screen_primary_output_current_refresh_rate_get(Ecore_X_Window root)
543{
544#ifdef ECORE_XCB_RANDR
545 xcb_randr_get_screen_info_cookie_t cookie;
546 xcb_randr_get_screen_info_reply_t *reply;
547 Ecore_X_Randr_Refresh_Rate ret = 0.0;
548#endif
549
550 LOGFN(__FILE__, __LINE__, __FUNCTION__);
551 CHECK_XCB_CONN;
552
553#ifdef ECORE_XCB_RANDR
554 if (!_ecore_xcb_randr_root_validate(root)) return ret;
555
556 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
557 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
558 if (reply)
559 {
560 ret = reply->rate;
561 free(reply);
562 }
563
564 return ret;
565#else
566 return 0.0;
567#endif
568}
569
570/*
571 * @param root window which's primary output will be queried
572 * @param size_index referencing the size to query valid refresh rates for
573 * @return currently used refresh rate or - if request failed or RandRR is not available - NULL
574 */
575EAPI Ecore_X_Randr_Refresh_Rate *
576ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root,
577 int size_index,
578 int *num)
579{
580#ifdef ECORE_XCB_RANDR
581 xcb_randr_get_screen_info_cookie_t cookie;
582 xcb_randr_get_screen_info_reply_t *reply;
583 Ecore_X_Randr_Refresh_Rate *ret = NULL;
584#endif
585
586 LOGFN(__FILE__, __LINE__, __FUNCTION__);
587 CHECK_XCB_CONN;
588
589#ifdef ECORE_XCB_RANDR
590 if (!_ecore_xcb_randr_root_validate(root)) return ret;
591
592 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
593 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
594 if (reply)
595 {
596 int len = 0;
597
598 len = xcb_randr_get_screen_info_rates_length(reply);
599 if (num) *num = len;
600
601 ret = malloc(sizeof(Ecore_X_Randr_Refresh_Rate) * len);
602 if (ret)
603 {
604 xcb_randr_refresh_rates_iterator_t iter;
605 int i = 0;
606
607 iter = xcb_randr_get_screen_info_rates_iterator(reply);
608 while (i++ < size_index)
609 xcb_randr_refresh_rates_next(&iter);
610
611 memcpy(ret, xcb_randr_refresh_rates_rates(iter.data),
612 sizeof(Ecore_X_Randr_Refresh_Rate) * len);
613 }
614 free(reply);
615 }
616
617 return ret;
618#else
619 return NULL;
620#endif
621}
622
623/*
624 * @brief sets the current primary output's refresh rate
625 * @param root window which's primary output will be queried
626 * @param size_index referencing the size to be set
627 * @param rate the refresh rate to be set
628 * @return EINA_TRUE on success else EINA_FALSE
629 */
630EAPI Eina_Bool
631ecore_x_randr_screen_primary_output_refresh_rate_set(Ecore_X_Window root,
632 int size_index,
633 Ecore_X_Randr_Refresh_Rate rate)
634{
635 Eina_Bool ret = EINA_FALSE;
636#ifdef ECORE_XCB_RANDR
637 xcb_randr_get_screen_info_cookie_t cookie;
638 xcb_randr_get_screen_info_reply_t *reply;
639#endif
640
641 LOGFN(__FILE__, __LINE__, __FUNCTION__);
642 CHECK_XCB_CONN;
643
644#ifdef ECORE_XCB_RANDR
645 if (_randr_version < RANDR_1_1) return EINA_FALSE;
646
647 cookie = xcb_randr_get_screen_info_unchecked(_ecore_xcb_conn, root);
648 reply = xcb_randr_get_screen_info_reply(_ecore_xcb_conn, cookie, NULL);
649 if (reply)
650 {
651 xcb_randr_set_screen_config_cookie_t scookie;
652 xcb_randr_set_screen_config_reply_t *sreply;
653
654 scookie =
655 xcb_randr_set_screen_config_unchecked(_ecore_xcb_conn, root,
656 XCB_CURRENT_TIME,
657 reply->config_timestamp,
658 size_index,
659 reply->rotation, rate);
660 sreply =
661 xcb_randr_set_screen_config_reply(_ecore_xcb_conn,
662 scookie, NULL);
663 if (!sreply)
664 ret = EINA_FALSE;
665 else
666 {
667 ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
668 EINA_TRUE : EINA_FALSE;
669 free(sreply);
670 }
671 free(reply);
672 }
673#endif
674
675 return ret;
676}
677
678/*
679 * @brief free detailed mode information. The pointer handed in will be set to
680 * NULL after freeing the memory.
681 * @param mode_info the mode information that should be freed
682 */
683EAPI void
684ecore_x_randr_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info)
685{
686 LOGFN(__FILE__, __LINE__, __FUNCTION__);
687 CHECK_XCB_CONN;
688
689 RANDR_CHECK_1_2_RET();
690
691 if (!mode_info) return;
692
693 if (mode_info->name) free(mode_info->name);
694 free(mode_info);
695 mode_info = NULL;
696}
697
698/*
699 * @param root window which's screen should be queried
700 * @return Ecore_X_Randr_Ouptut_Id or - if query failed or none is set - Ecore_X_Randr_None
701 */
702EAPI Ecore_X_Randr_Output
703ecore_x_randr_primary_output_get(Ecore_X_Window root)
704{
705 Ecore_X_Randr_Output ret = Ecore_X_Randr_None;
706#ifdef ECORE_XCB_RANDR
707 xcb_randr_get_output_primary_cookie_t cookie;
708 xcb_randr_get_output_primary_reply_t *reply;
709#endif
710
711 LOGFN(__FILE__, __LINE__, __FUNCTION__);
712 CHECK_XCB_CONN;
713
714#ifdef ECORE_XCB_RANDR
715 RANDR_CHECK_1_3_RET(Ecore_X_Randr_None);
716
717 if (!_ecore_xcb_randr_root_validate(root))
718 return Ecore_X_Randr_None;
719
720 cookie = xcb_randr_get_output_primary_unchecked(_ecore_xcb_conn, root);
721 reply = xcb_randr_get_output_primary_reply(_ecore_xcb_conn, cookie, NULL);
722 if (reply)
723 {
724 ret = reply->output;
725 free(reply);
726 }
727#endif
728 return ret;
729}
730
731/*
732 * @param root window which's screen should be queried
733 * @param output that should be set as given root window's screen primary output
734 */
735EAPI void
736ecore_x_randr_primary_output_set(Ecore_X_Window root,
737 Ecore_X_Randr_Output output)
738{
739 LOGFN(__FILE__, __LINE__, __FUNCTION__);
740 CHECK_XCB_CONN;
741
742#ifdef ECORE_XCB_RANDR
743 RANDR_CHECK_1_3_RET();
744
745 if ((output) && (_ecore_xcb_randr_root_validate(root)))
746 xcb_randr_set_output_primary(_ecore_xcb_conn, root, output);
747#endif
748}
749
750EAPI Ecore_X_Randr_Mode *
751ecore_x_randr_output_modes_get(Ecore_X_Window root,
752 Ecore_X_Randr_Output output,
753 int *num,
754 int *npreferred)
755{
756 Ecore_X_Randr_Mode *modes = NULL;
757
758 LOGFN(__FILE__, __LINE__, __FUNCTION__);
759 CHECK_XCB_CONN;
760
761#ifdef ECORE_XCB_RANDR
762 RANDR_CHECK_1_2_RET(NULL);
763
764 if (_randr_version >= RANDR_1_3)
765 {
766 modes =
767 _ecore_xcb_randr_13_output_modes_get(root, output, num, npreferred);
768 }
769 else if (_randr_version == RANDR_1_2)
770 {
771 modes =
772 _ecore_xcb_randr_12_output_modes_get(root, output, num, npreferred);
773 }
774#endif
775
776 return modes;
777}
778
779/*
780 * @brief get detailed information for a given mode id
781 * @param root window which's screen's ressources are queried
782 * @param mode the XID which identifies the mode of interest
783 * @return mode's detailed information
784 */
785EAPI Ecore_X_Randr_Mode_Info *
786ecore_x_randr_mode_info_get(Ecore_X_Window root,
787 Ecore_X_Randr_Mode mode)
788{
789 Ecore_X_Randr_Mode_Info *ret = NULL;
790
791 LOGFN(__FILE__, __LINE__, __FUNCTION__);
792 CHECK_XCB_CONN;
793
794#ifdef ECORE_XCB_RANDR
795 RANDR_CHECK_1_2_RET(NULL);
796
797 if (!_ecore_xcb_randr_root_validate(root)) return NULL;
798
799 if (_randr_version >= RANDR_1_3)
800 ret = _ecore_xcb_randr_13_mode_info_get(root, mode);
801 else if (_randr_version == RANDR_1_2)
802 ret = _ecore_xcb_randr_12_mode_info_get(root, mode);
803#endif
804 return ret;
805}
806
807/*
808 * @brief get detailed information for all modes related to a root window's screen
809 * @param root window which's screen's ressources are queried
810 * @param num number of modes returned
811 * @return modes' information
812 */
813EAPI Ecore_X_Randr_Mode_Info **
814ecore_x_randr_modes_info_get(Ecore_X_Window root,
815 int *num)
816{
817 Ecore_X_Randr_Mode_Info **ret = NULL;
818
819 LOGFN(__FILE__, __LINE__, __FUNCTION__);
820 CHECK_XCB_CONN;
821
822 if (num) *num = 0;
823
824#ifdef ECORE_XCB_RANDR
825 RANDR_CHECK_1_2_RET(NULL);
826
827 if (!_ecore_xcb_randr_root_validate(root)) return NULL;
828
829 if (_randr_version >= RANDR_1_3)
830 ret = _ecore_xcb_randr_13_modes_info_get(root, num);
831 else if (_randr_version == RANDR_1_2)
832 ret = _ecore_xcb_randr_12_modes_info_get(root, num);
833#endif
834 return ret;
835}
836
837/**
838 * @brief gets the width and hight of a given mode
839 * @param mode the mode which's size is to be looked up
840 * @param w width of given mode in px
841 * @param h height of given mode in px
842 */
843EAPI void
844ecore_x_randr_mode_size_get(Ecore_X_Window root,
845 Ecore_X_Randr_Mode mode,
846 int *w,
847 int *h)
848{
849 LOGFN(__FILE__, __LINE__, __FUNCTION__);
850 CHECK_XCB_CONN;
851
852#ifdef ECORE_XCB_RANDR
853 RANDR_CHECK_1_2_RET();
854
855 if (mode == Ecore_X_Randr_None) return;
856
857 if (_randr_version >= RANDR_1_3)
858 _ecore_xcb_randr_13_mode_size_get(root, mode, w, h);
859 else if (_randr_version == RANDR_1_2)
860 _ecore_xcb_randr_12_mode_size_get(root, mode, w, h);
861#endif
862}
863
864/**
865 * @brief gets the EDID information of an attached output if available.
866 * Note that this information is not to be compared using ordinary string
867 * comparison functions, since it includes 0-bytes.
868 * @param root window this information should be queried from
869 * @param output the XID of the output
870 * @param length length of the byte-array. If NULL, request will fail.
871 */
872EAPI unsigned char *
873ecore_x_randr_output_edid_get(Ecore_X_Window root,
874 Ecore_X_Randr_Output output,
875 unsigned long *length)
876{
877 unsigned char *ret = NULL;
878#ifdef ECORE_XCB_RANDR
879 xcb_randr_get_output_property_cookie_t cookie;
880 xcb_randr_get_output_property_reply_t *reply;
881 Ecore_X_Atom atom;
882#endif
883
884 LOGFN(__FILE__, __LINE__, __FUNCTION__);
885 CHECK_XCB_CONN;
886
887#ifdef ECORE_XCB_RANDR
888 RANDR_CHECK_1_2_RET(NULL);
889
890 if ((!length) || (!_ecore_xcb_randr_output_validate(root, output)))
891 return NULL;
892
893 atom = ecore_x_atom_get("EDID");
894 cookie =
895 xcb_randr_get_output_property_unchecked(_ecore_xcb_conn, output, atom,
896 XCB_GET_PROPERTY_TYPE_ANY,
897 0, 100, 0, 0);
898 reply =
899 xcb_randr_get_output_property_reply(_ecore_xcb_conn, cookie, NULL);
900 if (reply)
901 {
902 if ((reply->type == XCB_ATOM_INTEGER) && (reply->format == 8))
903 {
904 if (length) *length = reply->num_items;
905 if ((ret = malloc(reply->num_items * sizeof(unsigned char))))
906 {
907 memcpy(ret, xcb_randr_get_output_property_data(reply),
908 (reply->num_items * sizeof(unsigned char)));
909 }
910 }
911 free(reply);
912 }
913#endif
914 return ret;
915}
916
917/**
918 * @brief gets the the outputs which might be used simultenously on the same
919 * CRTC.
920 * @param root window that this information should be queried for.
921 * @param output the output which's clones we concern
922 * @param num number of possible clones
923 */
924EAPI Ecore_X_Randr_Output *
925ecore_x_randr_output_clones_get(Ecore_X_Window root,
926 Ecore_X_Randr_Output output,
927 int *num)
928{
929 Ecore_X_Randr_Output *outputs = NULL;
930
931 LOGFN(__FILE__, __LINE__, __FUNCTION__);
932 CHECK_XCB_CONN;
933
934#ifdef ECORE_XCB_RANDR
935 RANDR_CHECK_1_2_RET(NULL);
936
937 if (output == Ecore_X_Randr_None) return NULL;
938
939 if (_randr_version >= RANDR_1_3)
940 outputs = _ecore_xcb_randr_13_output_clones_get(root, output, num);
941 else if (_randr_version == RANDR_1_2)
942 outputs = _ecore_xcb_randr_12_output_clones_get(root, output, num);
943#endif
944 return outputs;
945}
946
947EAPI Ecore_X_Randr_Crtc *
948ecore_x_randr_output_possible_crtcs_get(Ecore_X_Window root,
949 Ecore_X_Randr_Output output,
950 int *num)
951{
952 Ecore_X_Randr_Crtc *crtcs = NULL;
953
954 LOGFN(__FILE__, __LINE__, __FUNCTION__);
955 CHECK_XCB_CONN;
956
957#ifdef ECORE_XCB_RANDR
958 RANDR_CHECK_1_2_RET(NULL);
959
960 if (output == Ecore_X_Randr_None) return NULL;
961
962 if (_randr_version >= RANDR_1_3)
963 crtcs = _ecore_xcb_randr_13_output_possible_crtcs_get(root, output, num);
964 else if (_randr_version == RANDR_1_2)
965 crtcs = _ecore_xcb_randr_12_output_possible_crtcs_get(root, output, num);
966#endif
967 return crtcs;
968}
969
970/**
971 * @brief gets the given output's name as reported by X
972 * @param root the window which's screen will be queried
973 * @param len length of returned c-string.
974 * @return name of the output as reported by X
975 */
976EAPI char *
977ecore_x_randr_output_name_get(Ecore_X_Window root,
978 Ecore_X_Randr_Output output,
979 int *len)
980{
981 LOGFN(__FILE__, __LINE__, __FUNCTION__);
982 CHECK_XCB_CONN;
983
984#ifdef ECORE_XCB_RANDR
985 RANDR_CHECK_1_2_RET(NULL);
986
987 if (output == Ecore_X_Randr_None) return NULL;
988
989 if (_randr_version >= RANDR_1_3)
990 return _ecore_xcb_randr_13_output_name_get(root, output, len);
991 else if (_randr_version == RANDR_1_2)
992 return _ecore_xcb_randr_12_output_name_get(root, output, len);
993#endif
994
995 return NULL;
996}
997
998EAPI Ecore_X_Randr_Connection_Status
999ecore_x_randr_output_connection_status_get(Ecore_X_Window root,
1000 Ecore_X_Randr_Output output)
1001{
1002 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1003 CHECK_XCB_CONN;
1004
1005#ifdef ECORE_XCB_RANDR
1006 RANDR_CHECK_1_2_RET(ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN);
1007
1008 if (output == Ecore_X_Randr_None)
1009 return ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
1010
1011 if (_randr_version >= RANDR_1_3)
1012 return _ecore_xcb_randr_13_output_connection_status_get(root, output);
1013 else if (_randr_version == RANDR_1_2)
1014 return _ecore_xcb_randr_12_output_connection_status_get(root, output);
1015#endif
1016
1017 return ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
1018}
1019
1020EAPI Ecore_X_Randr_Output *
1021ecore_x_randr_outputs_get(Ecore_X_Window root,
1022 int *num)
1023{
1024 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1025 CHECK_XCB_CONN;
1026
1027#ifdef ECORE_XCB_RANDR
1028 RANDR_CHECK_1_2_RET(NULL);
1029
1030 if (_randr_version >= RANDR_1_3)
1031 return _ecore_xcb_randr_13_outputs_get(root, num);
1032 else if (_randr_version == RANDR_1_2)
1033 return _ecore_xcb_randr_12_outputs_get(root, num);
1034#endif
1035
1036 return NULL;
1037}
1038
1039EAPI Ecore_X_Randr_Crtc
1040ecore_x_randr_output_crtc_get(Ecore_X_Window root,
1041 Ecore_X_Randr_Output output)
1042{
1043 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1044 CHECK_XCB_CONN;
1045
1046#ifdef ECORE_XCB_RANDR
1047 RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
1048
1049 if (output == Ecore_X_Randr_None) return Ecore_X_Randr_None;
1050
1051 if (_randr_version >= RANDR_1_3)
1052 return _ecore_xcb_randr_13_output_crtc_get(root, output);
1053 else if (_randr_version == RANDR_1_2)
1054 return _ecore_xcb_randr_12_output_crtc_get(root, output);
1055#endif
1056
1057 return Ecore_X_Randr_None;
1058}
1059
1060/**
1061 * @brief sets the demanded parameters for a given CRTC. Note that the CRTC is
1062 * auto enabled in it's preferred mode, when it was disabled before.
1063 * @param root the root window which's default display will be queried
1064 * @param crtc the CRTC which's configuration should be altered
1065 * @param outputs an array of outputs, that should display this CRTC's content.
1066 * @param noutputs number of outputs in the array of outputs.
1067 * If set to Ecore_X_Randr_Unset, current outputs and number of outputs will be used.
1068 * If set to Ecore_X_Randr_None, CRTC will be disabled
1069 * @param x new x coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current x
1070 * corrdinate will be assumed.
1071 * @param y new y coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current y
1072 * corrdinate will be assumed.
1073 * @param mode the new mode to be set. If Ecore_X_Randr_None is passed, the
1074 * CRTC will be disabled. If Ecore_X_Randr_Unset is passed, the current mode is assumed.
1075 * @param orientation the new orientation to be set. If Ecore_X_Randr_Unset is used,
1076 * the current mode is assumed.
1077 * @return EINA_TRUE if the configuration alteration was successful, else
1078 * EINA_FALSE
1079 */
1080EAPI Eina_Bool
1081ecore_x_randr_crtc_settings_set(Ecore_X_Window root,
1082 Ecore_X_Randr_Crtc crtc,
1083 Ecore_X_Randr_Output *outputs,
1084 int num,
1085 int x,
1086 int y,
1087 Ecore_X_Randr_Mode mode,
1088 Ecore_X_Randr_Orientation orientation)
1089{
1090 Eina_Bool ret = EINA_FALSE;
1091#ifdef ECORE_XCB_RANDR
1092 xcb_timestamp_t stamp = 0;
1093 xcb_randr_get_crtc_info_cookie_t ccookie;
1094 xcb_randr_get_crtc_info_reply_t *creply;
1095#endif
1096
1097 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1098 CHECK_XCB_CONN;
1099
1100#ifdef ECORE_XCB_RANDR
1101 RANDR_CHECK_1_2_RET(EINA_FALSE);
1102
1103 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
1104
1105 if (_randr_version >= RANDR_1_3)
1106 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1107 else if (_randr_version == RANDR_1_2)
1108 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1109
1110 ccookie =
1111 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1112 creply =
1113 xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ccookie, NULL);
1114 if (creply)
1115 {
1116 xcb_randr_set_crtc_config_cookie_t scookie;
1117 xcb_randr_set_crtc_config_reply_t *sreply;
1118
1119 if ((mode == Ecore_X_Randr_None) ||
1120 (num == Ecore_X_Randr_None))
1121 {
1122 outputs = NULL;
1123 num = 0;
1124 }
1125 else if (num == (int)Ecore_X_Randr_Unset)
1126 {
1127 outputs = xcb_randr_get_crtc_info_outputs(creply);
1128 num = creply->num_outputs;
1129 }
1130 if ((int)mode == Ecore_X_Randr_Unset) mode = creply->mode;
1131 if (x < 0) x = creply->x;
1132 if (y < 0) y = creply->y;
1133 if ((int)orientation == Ecore_X_Randr_Unset)
1134 orientation = creply->rotation;
1135
1136 scookie =
1137 xcb_randr_set_crtc_config_unchecked(_ecore_xcb_conn,
1138 crtc, XCB_CURRENT_TIME, stamp,
1139 x, y, mode, orientation,
1140 num, outputs);
1141 sreply =
1142 xcb_randr_set_crtc_config_reply(_ecore_xcb_conn, scookie, NULL);
1143 if (sreply)
1144 {
1145 ret = (sreply->status == XCB_RANDR_SET_CONFIG_SUCCESS) ?
1146 EINA_TRUE : EINA_FALSE;
1147 free(sreply);
1148 }
1149 free(creply);
1150 }
1151#endif
1152
1153 return ret;
1154}
1155
1156/**
1157 * @brief sets a mode for a CRTC and the outputs attached to it
1158 * @param root the window's screen to be queried
1159 * @param crtc the CRTC which shall be set
1160 * @param outputs array of outputs which have to be compatible with the mode. If
1161 * NULL CRTC will be disabled.
1162 * @param noutputs number of outputs in array to be used. Use
1163 * Ecore_X_Randr_Unset (or -1) to use currently used outputs.
1164 * @param mode XID of the mode to be set. If set to 0 the CRTC will be disabled.
1165 * If set to -1 the call will fail.
1166 * @return EINA_TRUE if mode setting was successful. Else EINA_FALSE
1167 */
1168EAPI Eina_Bool
1169ecore_x_randr_crtc_mode_set(Ecore_X_Window root,
1170 Ecore_X_Randr_Crtc crtc,
1171 Ecore_X_Randr_Output *outputs,
1172 int num,
1173 Ecore_X_Randr_Mode mode)
1174{
1175 Eina_Bool ret = EINA_FALSE;
1176
1177 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1178 CHECK_XCB_CONN;
1179
1180#ifdef ECORE_XCB_RANDR
1181 RANDR_CHECK_1_2_RET(EINA_FALSE);
1182
1183 if ((int)mode == Ecore_X_Randr_Unset) return ret;
1184 ret =
1185 ecore_x_randr_crtc_settings_set(root, crtc, outputs, num,
1186 Ecore_X_Randr_Unset, Ecore_X_Randr_Unset,
1187 mode, Ecore_X_Randr_Unset);
1188#endif
1189
1190 return ret;
1191}
1192
1193/**
1194 * @brief Get the current set mode of a given CRTC
1195 * @param root the window's screen to be queried
1196 * @param crtc the CRTC which's should be queried
1197 * @return currently set mode or - in case parameters are invalid -
1198 * Ecore_X_Randr_Unset
1199 */
1200EAPI Ecore_X_Randr_Mode
1201ecore_x_randr_crtc_mode_get(Ecore_X_Window root,
1202 Ecore_X_Randr_Crtc crtc)
1203{
1204 Ecore_X_Randr_Mode ret = Ecore_X_Randr_Unset;
1205#ifdef ECORE_XCB_RANDR
1206 xcb_timestamp_t stamp = 0;
1207 xcb_randr_get_crtc_info_cookie_t ocookie;
1208 xcb_randr_get_crtc_info_reply_t *oreply;
1209#endif
1210
1211 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1212 CHECK_XCB_CONN;
1213
1214#ifdef ECORE_XCB_RANDR
1215 RANDR_CHECK_1_2_RET(Ecore_X_Randr_Unset);
1216
1217 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
1218
1219 if (_randr_version >= RANDR_1_3)
1220 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1221 else if (_randr_version == RANDR_1_2)
1222 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1223
1224 ocookie =
1225 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1226 oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
1227 if (oreply)
1228 {
1229 ret = oreply->mode;
1230 free(oreply);
1231 }
1232#endif
1233
1234 return ret;
1235}
1236
1237EAPI Ecore_X_Randr_Orientation
1238ecore_x_randr_crtc_orientation_get(Ecore_X_Window root,
1239 Ecore_X_Randr_Crtc crtc)
1240{
1241 Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
1242#ifdef ECORE_XCB_RANDR
1243 xcb_timestamp_t stamp = 0;
1244 xcb_randr_get_crtc_info_cookie_t ocookie;
1245 xcb_randr_get_crtc_info_reply_t *oreply;
1246#endif
1247
1248 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1249 CHECK_XCB_CONN;
1250
1251#ifdef ECORE_XCB_RANDR
1252 RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
1253
1254 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
1255
1256 if (_randr_version >= RANDR_1_3)
1257 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1258 else if (_randr_version == RANDR_1_2)
1259 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1260
1261 ocookie =
1262 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1263 oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
1264 if (oreply)
1265 {
1266 ret = oreply->rotation;
1267 free(oreply);
1268 }
1269#endif
1270
1271 return ret;
1272}
1273
1274EAPI Eina_Bool
1275ecore_x_randr_crtc_orientation_set(Ecore_X_Window root,
1276 Ecore_X_Randr_Crtc crtc,
1277 Ecore_X_Randr_Orientation orientation)
1278{
1279 Eina_Bool ret = EINA_FALSE;
1280
1281 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1282 CHECK_XCB_CONN;
1283
1284#ifdef ECORE_XCB_RANDR
1285 RANDR_CHECK_1_2_RET(EINA_FALSE);
1286
1287 if (orientation != Ecore_X_Randr_None)
1288 {
1289 ret =
1290 ecore_x_randr_crtc_settings_set(root, crtc, NULL,
1291 Ecore_X_Randr_Unset, Ecore_X_Randr_Unset,
1292 Ecore_X_Randr_Unset, Ecore_X_Randr_Unset,
1293 orientation);
1294 }
1295#endif
1296 return ret;
1297}
1298
1299EAPI Ecore_X_Randr_Orientation
1300ecore_x_randr_crtc_orientations_get(Ecore_X_Window root,
1301 Ecore_X_Randr_Crtc crtc)
1302{
1303 Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
1304#ifdef ECORE_XCB_RANDR
1305 xcb_timestamp_t stamp = 0;
1306 xcb_randr_get_crtc_info_cookie_t ocookie;
1307 xcb_randr_get_crtc_info_reply_t *oreply;
1308#endif
1309
1310 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1311 CHECK_XCB_CONN;
1312
1313#ifdef ECORE_XCB_RANDR
1314 RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
1315
1316 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
1317
1318 if (_randr_version >= RANDR_1_3)
1319 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1320 else if (_randr_version == RANDR_1_2)
1321 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1322
1323 ocookie =
1324 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1325 oreply =
1326 xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
1327 if (oreply)
1328 {
1329 ret = oreply->rotations;
1330 free(oreply);
1331 }
1332#endif
1333
1334 return ret;
1335}
1336
1337/*
1338 * @brief get a CRTC's possible outputs.
1339 * @param root the root window which's screen will be queried
1340 * @param num number of possible outputs referenced by given CRTC
1341 */
1342EAPI Ecore_X_Randr_Output *
1343ecore_x_randr_crtc_possible_outputs_get(Ecore_X_Window root,
1344 Ecore_X_Randr_Crtc crtc,
1345 int *num)
1346{
1347 Ecore_X_Randr_Output *ret = NULL;
1348#ifdef ECORE_XCB_RANDR
1349 xcb_timestamp_t stamp = 0;
1350 xcb_randr_get_crtc_info_cookie_t ocookie;
1351 xcb_randr_get_crtc_info_reply_t *oreply;
1352#endif
1353
1354 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1355 CHECK_XCB_CONN;
1356
1357#ifdef ECORE_XCB_RANDR
1358 RANDR_CHECK_1_2_RET(NULL);
1359
1360 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
1361
1362 if (_randr_version >= RANDR_1_3)
1363 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1364 else if (_randr_version == RANDR_1_2)
1365 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1366
1367 ocookie =
1368 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1369 oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
1370 if (oreply)
1371 {
1372 if (num) *num = oreply->num_possible_outputs;
1373 ret = malloc(sizeof(Ecore_X_Randr_Output) *
1374 oreply->num_possible_outputs);
1375 if (ret)
1376 {
1377 memcpy(ret, xcb_randr_get_crtc_info_possible(oreply),
1378 sizeof(Ecore_X_Randr_Output) *
1379 oreply->num_possible_outputs);
1380 }
1381 free(oreply);
1382 }
1383#endif
1384
1385 return ret;
1386}
1387
1388/*
1389 * @brief get all known CRTCs related to a root window's screen
1390 * @param root window which's screen's ressources are queried
1391 * @param num number of CRTCs returned
1392 * @return CRTC IDs
1393 */
1394EAPI Ecore_X_Randr_Crtc *
1395ecore_x_randr_crtcs_get(Ecore_X_Window root,
1396 int *num)
1397{
1398 Ecore_X_Randr_Crtc *ret = NULL;
1399
1400 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1401 CHECK_XCB_CONN;
1402
1403#ifdef ECORE_XCB_RANDR
1404 RANDR_CHECK_1_2_RET(NULL);
1405
1406 if (_randr_version >= RANDR_1_3)
1407 {
1408 xcb_randr_get_screen_resources_current_reply_t *reply;
1409
1410 reply = _ecore_xcb_randr_13_get_resources(root);
1411 if (reply)
1412 {
1413 if (num) *num = reply->num_crtcs;
1414 ret = malloc(sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
1415 if (ret)
1416 memcpy(ret, xcb_randr_get_screen_resources_current_crtcs(reply),
1417 sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
1418 free(reply);
1419 }
1420 }
1421 else if (_randr_version == RANDR_1_2)
1422 {
1423 xcb_randr_get_screen_resources_reply_t *reply;
1424
1425 reply = _ecore_xcb_randr_12_get_resources(root);
1426 if (reply)
1427 {
1428 if (num) *num = reply->num_crtcs;
1429 ret = malloc(sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
1430 if (ret)
1431 memcpy(ret, xcb_randr_get_screen_resources_crtcs(reply),
1432 sizeof(Ecore_X_Randr_Crtc) * reply->num_crtcs);
1433 free(reply);
1434 }
1435 }
1436#endif
1437
1438 return ret;
1439}
1440
1441/*
1442 * @brief get a CRTC's outputs.
1443 * @param root the root window which's screen will be queried
1444 * @param num number of outputs referenced by given CRTC
1445 */
1446EAPI Ecore_X_Randr_Output *
1447ecore_x_randr_crtc_outputs_get(Ecore_X_Window root,
1448 Ecore_X_Randr_Crtc crtc,
1449 int *num)
1450{
1451 Ecore_X_Randr_Output *ret = NULL;
1452#ifdef ECORE_XCB_RANDR
1453 xcb_timestamp_t stamp = 0;
1454 xcb_randr_get_crtc_info_cookie_t ocookie;
1455 xcb_randr_get_crtc_info_reply_t *oreply;
1456#endif
1457
1458 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1459 CHECK_XCB_CONN;
1460
1461#ifdef ECORE_XCB_RANDR
1462 RANDR_CHECK_1_2_RET(NULL);
1463
1464 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return ret;
1465
1466 if (_randr_version >= RANDR_1_3)
1467 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1468 else if (_randr_version == RANDR_1_2)
1469 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1470
1471 ocookie =
1472 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1473 oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
1474 if (oreply)
1475 {
1476 if (num) *num = oreply->num_outputs;
1477 ret = malloc(sizeof(Ecore_X_Randr_Output) * oreply->num_outputs);
1478 if (ret)
1479 memcpy(ret, xcb_randr_get_crtc_info_outputs(oreply),
1480 sizeof(Ecore_X_Randr_Output) * oreply->num_outputs);
1481 free(oreply);
1482 }
1483#endif
1484
1485 return ret;
1486}
1487
1488EAPI void
1489ecore_x_randr_crtc_geometry_get(Ecore_X_Window root,
1490 Ecore_X_Randr_Crtc crtc,
1491 int *x,
1492 int *y,
1493 int *w,
1494 int *h)
1495{
1496#ifdef ECORE_XCB_RANDR
1497 xcb_timestamp_t stamp = 0;
1498 xcb_randr_get_crtc_info_cookie_t ocookie;
1499 xcb_randr_get_crtc_info_reply_t *oreply;
1500#endif
1501
1502 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1503 CHECK_XCB_CONN;
1504
1505#ifdef ECORE_XCB_RANDR
1506 RANDR_CHECK_1_2_RET();
1507
1508 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return;
1509
1510 if (_randr_version >= RANDR_1_3)
1511 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1512 else if (_randr_version == RANDR_1_2)
1513 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1514
1515 ocookie =
1516 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtc, stamp);
1517 oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn, ocookie, NULL);
1518 if (oreply)
1519 {
1520 if (x) *x = oreply->x;
1521 if (y) *y = oreply->y;
1522 if (w) *w = oreply->width;
1523 if (h) *h = oreply->height;
1524 free(oreply);
1525 }
1526#endif
1527}
1528
1529/**
1530 * @brief sets a CRTC relative to another one.
1531 * @param crtc_r1 the CRTC to be positioned.
1532 * @param crtc_r2 the CRTC the position should be relative to
1533 * @param position the relation between the crtcs
1534 * @param alignment in case CRTCs size differ, aligns CRTC1 accordingly at CRTC2's
1535 * borders
1536 * @return EINA_TRUE if crtc could be successfully positioned. EINA_FALSE if
1537 * repositioning failed or if position of new crtc would be out of given screen's min/max bounds.
1538 */
1539EAPI Eina_Bool
1540ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window root,
1541 Ecore_X_Randr_Crtc crtc1,
1542 Ecore_X_Randr_Crtc crtc2,
1543 Ecore_X_Randr_Output_Policy policy,
1544 Ecore_X_Randr_Relative_Alignment alignment)
1545{
1546#ifdef ECORE_XCB_RANDR
1547 Eina_Rectangle r1, r2;
1548 int w_max = 0, h_max = 0, cw = 0, ch = 0, xn = -1, yn = -1;
1549#endif
1550
1551 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1552 CHECK_XCB_CONN;
1553
1554#ifdef ECORE_XCB_RANDR
1555 RANDR_CHECK_1_2_RET(EINA_FALSE);
1556
1557 if ((ecore_x_randr_crtc_mode_get(root, crtc1) == 0) ||
1558 (ecore_x_randr_crtc_mode_get(root, crtc2) == 0))
1559 return EINA_FALSE;
1560
1561 if ((!_ecore_xcb_randr_crtc_validate(root, crtc1) ||
1562 (!(crtc1 != crtc2) && (!_ecore_xcb_randr_crtc_validate(root, crtc2)))))
1563 return EINA_FALSE;
1564
1565 ecore_x_randr_crtc_geometry_get(root, crtc1, &r1.x, &r1.y, &r1.w, &r1.h);
1566 ecore_x_randr_crtc_geometry_get(root, crtc2, &r2.x, &r2.y, &r2.w, &r2.h);
1567 ecore_x_randr_screen_size_range_get(root, NULL, NULL, &w_max, &h_max);
1568 ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
1569
1570 switch (policy)
1571 {
1572 case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT:
1573 xn = (r2.x + r2.w);
1574 if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
1575 yn = -1;
1576 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
1577 yn = ((int)(((double)r2.h / 2.0) + (double)r2.y - ((double)r1.h / 2.0)));
1578 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
1579 yn = ((int)((double)ch / 2.0) - ((double)r1.h / 2.0));
1580 break;
1581
1582 case ECORE_X_RANDR_OUTPUT_POLICY_LEFT:
1583 xn = (r2.x - r1.w);
1584 if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
1585 yn = -1;
1586 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
1587 yn = ((int)(((double)r2.h / 2.0) + (double)r2.y - ((double)r1.h / 2.0)));
1588 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
1589 yn = ((int)((double)ch / 2.0) - ((double)r1.h / 2.0));
1590 break;
1591
1592 case ECORE_X_RANDR_OUTPUT_POLICY_BELOW:
1593 yn = (r2.y + r2.h);
1594 if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
1595 xn = -1;
1596 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
1597 xn = ((int)((((double)r2.x + (double)r2.w) / 2.0) - ((double)r1.w / 2.0)));
1598 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
1599 xn = ((int)((double)cw / 2.0));
1600 break;
1601
1602 case ECORE_X_RANDR_OUTPUT_POLICY_ABOVE:
1603 yn = (r2.y - r1.h);
1604 if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE)
1605 xn = -1;
1606 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL)
1607 xn = ((int)((((double)r2.x + (double)r2.w) / 2.0) - ((double)r1.w / 2.0)));
1608 else if (alignment == ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR)
1609 xn = ((int)((double)cw / 2.0));
1610 break;
1611
1612 case ECORE_X_RANDR_OUTPUT_POLICY_CLONE:
1613 return ecore_x_randr_crtc_pos_set(root, crtc1, r2.x, r2.y);
1614 break;
1615
1616 case ECORE_X_RANDR_OUTPUT_POLICY_NONE:
1617 break;
1618 }
1619
1620 if ((xn == r1.x) && (yn == r1.x)) return EINA_TRUE;
1621 if (((yn + r1.h) > h_max) || ((xn + r1.w) > w_max))
1622 return EINA_FALSE;
1623
1624 return ecore_x_randr_crtc_pos_set(root, crtc1, xn, yn);
1625#endif
1626
1627 return EINA_FALSE;
1628}
1629
1630EAPI Eina_Bool
1631ecore_x_randr_move_all_crtcs_but(Ecore_X_Window root,
1632 const Ecore_X_Randr_Crtc *not_moved,
1633 int num,
1634 int dx,
1635 int dy)
1636{
1637 Eina_Bool ret = EINA_FALSE;
1638#ifdef ECORE_XCB_RANDR
1639 Ecore_X_Randr_Crtc *crtcs = NULL, *move = NULL;
1640 int i = 0, j = 0, k = 0, n = 0, total = 0;
1641#endif
1642
1643 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1644 CHECK_XCB_CONN;
1645
1646#ifdef ECORE_XCB_RANDR
1647 if ((num <= 0) || (!not_moved) || (!_ecore_xcb_randr_root_validate(root)))
1648 return EINA_FALSE;
1649
1650 crtcs = ecore_x_randr_crtcs_get(root, &total);
1651 n = (total - num);
1652 move = malloc(sizeof(Ecore_X_Randr_Crtc) * n);
1653 if (move)
1654 {
1655 for (i = 0, k = 0; (i < total) && (k < n); i++)
1656 {
1657 for (j = 0; j < num; j++)
1658 if (crtcs[i] == not_moved[j]) break;
1659 if (j == num)
1660 move[k++] = crtcs[i];
1661 }
1662 ret = ecore_x_randr_move_crtcs(root, move, n, dx, dy);
1663 free(move);
1664 free(crtcs);
1665 }
1666#endif
1667
1668 return ret;
1669}
1670
1671EAPI void
1672ecore_x_randr_crtc_pos_get(Ecore_X_Window root,
1673 Ecore_X_Randr_Crtc crtc,
1674 int *x,
1675 int *y)
1676{
1677 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1678 CHECK_XCB_CONN;
1679
1680#ifdef ECORE_XCB_RANDR
1681 RANDR_CHECK_1_2_RET();
1682
1683 ecore_x_randr_crtc_geometry_get(root, crtc, x, y, NULL, NULL);
1684#endif
1685}
1686
1687/*
1688 * @brief sets the position of given CRTC within root window's screen
1689 * @param root the window's screen to be queried
1690 * @param crtc the CRTC which's position within the mentioned screen is to be altered
1691 * @param x position on the x-axis (0 == left) of the screen. if x < 0 current value will be kept.
1692 * @param y position on the y-ayis (0 == top) of the screen. if y < 0, current value will be kept.
1693 * @return EINA_TRUE if position could be successfully be altered.
1694 */
1695EAPI Eina_Bool
1696ecore_x_randr_crtc_pos_set(Ecore_X_Window root,
1697 Ecore_X_Randr_Crtc crtc,
1698 int x,
1699 int y)
1700{
1701 Eina_Bool ret = EINA_FALSE;
1702#ifdef ECORE_XCB_RANDR
1703 int w = 0, h = 0, nw = 0, nh = 0;
1704 Eina_Rectangle rect;
1705#endif
1706
1707 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1708 CHECK_XCB_CONN;
1709
1710#ifdef ECORE_XCB_RANDR
1711 RANDR_CHECK_1_2_RET(EINA_FALSE);
1712
1713 ecore_x_randr_crtc_geometry_get(root, crtc,
1714 &rect.x, &rect.y, &rect.w, &rect.h);
1715 ecore_x_randr_screen_current_size_get(root, &w, &h, NULL, NULL);
1716 if (x < 0) x = rect.x;
1717 if (y < 0) y = rect.y;
1718 if ((x + rect.w) > w)
1719 nw = (x + rect.w);
1720 if ((y + rect.h) > h)
1721 nh = (y + rect.h);
1722
1723 if ((nw != 0) || (nh != 0))
1724 {
1725 if (!ecore_x_randr_screen_current_size_set(root, nw, nh, 0, 0))
1726 return EINA_FALSE;
1727 }
1728
1729 ret = ecore_x_randr_crtc_settings_set(root, crtc, NULL, -1, x, y, -1, -1);
1730#endif
1731
1732 return ret;
1733}
1734
1735EAPI void
1736ecore_x_randr_crtc_size_get(Ecore_X_Window root,
1737 Ecore_X_Randr_Crtc crtc,
1738 int *w,
1739 int *h)
1740{
1741 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1742 CHECK_XCB_CONN;
1743
1744#ifdef ECORE_XCB_RANDR
1745 RANDR_CHECK_1_2_RET();
1746 ecore_x_randr_crtc_geometry_get(root, crtc, NULL, NULL, w, h);
1747#endif
1748}
1749
1750EAPI Ecore_X_Randr_Refresh_Rate
1751ecore_x_randr_crtc_refresh_rate_get(Ecore_X_Window root,
1752 Ecore_X_Randr_Crtc crtc,
1753 Ecore_X_Randr_Mode mode)
1754{
1755 Ecore_X_Randr_Refresh_Rate ret = 0.0;
1756
1757 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1758 CHECK_XCB_CONN;
1759
1760#ifdef ECORE_XCB_RANDR
1761 RANDR_CHECK_1_2_RET(0.0);
1762
1763 if (!_ecore_xcb_randr_crtc_validate(root, crtc)) return 0.0;
1764
1765 if (_randr_version >= RANDR_1_3)
1766 {
1767 xcb_randr_get_screen_resources_current_reply_t *reply;
1768
1769 reply = _ecore_xcb_randr_13_get_resources(root);
1770 if (reply)
1771 {
1772 xcb_randr_mode_info_iterator_t miter;
1773
1774 miter =
1775 xcb_randr_get_screen_resources_current_modes_iterator(reply);
1776 while (miter.rem)
1777 {
1778 xcb_randr_mode_info_t *minfo;
1779
1780 minfo = miter.data;
1781 if (minfo->id == mode)
1782 {
1783 if ((minfo->htotal) && (minfo->vtotal))
1784 {
1785 ret = ((double)minfo->dot_clock /
1786 ((double)minfo->htotal *
1787 (double)minfo->vtotal));
1788 }
1789 break;
1790 }
1791 xcb_randr_mode_info_next(&miter);
1792 }
1793 free(reply);
1794 }
1795 }
1796 else if (_randr_version == RANDR_1_2)
1797 {
1798 xcb_randr_get_screen_resources_reply_t *reply;
1799
1800 reply = _ecore_xcb_randr_12_get_resources(root);
1801 if (reply)
1802 {
1803 xcb_randr_mode_info_iterator_t miter;
1804
1805 miter = xcb_randr_get_screen_resources_modes_iterator(reply);
1806 while (miter.rem)
1807 {
1808 xcb_randr_mode_info_t *minfo;
1809
1810 minfo = miter.data;
1811 if (minfo->id == mode)
1812 {
1813 if ((minfo->htotal) && (minfo->vtotal))
1814 {
1815 ret = ((double)minfo->dot_clock /
1816 ((double)minfo->htotal *
1817 (double)minfo->vtotal));
1818 }
1819 break;
1820 }
1821 xcb_randr_mode_info_next(&miter);
1822 }
1823 free(reply);
1824 }
1825 }
1826#endif
1827 return ret;
1828}
1829
1830/*
1831 * @brief move given CRTCs belonging to the given root window's screen dx/dy pixels relative to their current position. The screen size will be automatically adjusted if necessary and possible.
1832 * @param root window which's screen's resources are used
1833 * @param crtcs list of CRTCs to be moved
1834 * @param ncrtc number of CRTCs in array
1835 * @param dx amount of pixels the CRTCs should be moved in x direction
1836 * @param dy amount of pixels the CRTCs should be moved in y direction
1837 * @return EINA_TRUE if all crtcs could be moved successfully.
1838 */
1839EAPI Eina_Bool
1840ecore_x_randr_move_crtcs(Ecore_X_Window root,
1841 const Ecore_X_Randr_Crtc *crtcs,
1842 int num,
1843 int dx,
1844 int dy)
1845{
1846 Eina_Bool ret = EINA_TRUE;
1847#ifdef ECORE_XCB_RANDR
1848 xcb_timestamp_t stamp = 0;
1849 xcb_randr_get_crtc_info_reply_t *oreply[num];
1850 int i = 0, cw = 0, ch = 0;
1851 int mw = 0, mh = 0, nw = 0, nh = 0;
1852#endif
1853
1854 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1855 CHECK_XCB_CONN;
1856
1857#ifdef ECORE_XCB_RANDR
1858 RANDR_CHECK_1_2_RET(EINA_FALSE);
1859
1860 if (!_ecore_xcb_randr_root_validate(root)) return EINA_FALSE;
1861
1862 if (_randr_version >= RANDR_1_3)
1863 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1864 else if (_randr_version == RANDR_1_2)
1865 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1866
1867 ecore_x_randr_screen_size_range_get(root, NULL, NULL, &mw, &mh);
1868 ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
1869 nw = cw;
1870 nh = ch;
1871
1872 for (i = 0; i < num; i++)
1873 {
1874 xcb_randr_get_crtc_info_cookie_t ocookie;
1875
1876 ocookie =
1877 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtcs[i],
1878 stamp);
1879 oreply[i] = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn,
1880 ocookie, NULL);
1881 if (oreply[i])
1882 {
1883 if (((oreply[i]->x + dx) < 0) ||
1884 ((oreply[i]->y + dy) < 0) ||
1885 ((oreply[i]->x + oreply[i]->width + dx) > mw) ||
1886 ((oreply[i]->y + oreply[i]->height + dy) > mh))
1887 {
1888 continue;
1889 }
1890 nw = MAX((int)(oreply[i]->x + oreply[i]->width + dx), nw);
1891 nh = MAX((int)(oreply[i]->y + oreply[i]->height + dy), nh);
1892 }
1893 }
1894
1895 if ((nw > cw) || (nh > ch))
1896 {
1897 if (!ecore_x_randr_screen_current_size_set(root, nw, nh, -1, -1))
1898 {
1899 for (i = 0; i < num; i++)
1900 if (oreply[i]) free(oreply[i]);
1901
1902 return EINA_FALSE;
1903 }
1904 }
1905
1906 for (i = 0; ((i < num) && (oreply[i])); i++)
1907 {
1908 if (!oreply[i]) continue;
1909 if (!ecore_x_randr_crtc_settings_set(root, crtcs[i], NULL, -1,
1910 (oreply[i]->x + dx),
1911 (oreply[i]->y + dy),
1912 oreply[i]->mode,
1913 oreply[i]->rotation))
1914 {
1915 ret = EINA_FALSE;
1916 break;
1917 }
1918 }
1919
1920 if (i < num)
1921 {
1922 while (i-- >= 0)
1923 {
1924 if (oreply[i])
1925 ecore_x_randr_crtc_settings_set(root, crtcs[i], NULL, -1,
1926 (oreply[i]->x - dx),
1927 (oreply[i]->y - dy),
1928 oreply[i]->mode,
1929 oreply[i]->rotation);
1930 }
1931 }
1932
1933 for (i = 0; i < num; i++)
1934 if (oreply[i]) free(oreply[i]);
1935#endif
1936
1937 return ret;
1938}
1939
1940/**
1941 * @brief enable event selection. This enables basic interaction with
1942 * output/crtc events and requires RRandR >= 1.2.
1943 * @param win select this window's properties for RandRR events
1944 * @param on enable/disable selecting
1945 */
1946EAPI void
1947ecore_x_randr_events_select(Ecore_X_Window win,
1948 Eina_Bool on)
1949{
1950#ifdef ECORE_XCB_RANDR
1951 uint16_t mask = 0;
1952#endif
1953
1954 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1955 CHECK_XCB_CONN;
1956
1957#ifdef ECORE_XCB_RANDR
1958 if (on)
1959 {
1960 mask = XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE;
1961 if (_randr_version >= ((1 << 16) | 2))
1962 {
1963 mask |= (XCB_RANDR_NOTIFY_MASK_CRTC_CHANGE |
1964 XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE |
1965 XCB_RANDR_NOTIFY_MASK_OUTPUT_PROPERTY);
1966 }
1967 }
1968
1969 xcb_randr_select_input(_ecore_xcb_conn, win, mask);
1970#endif
1971}
1972
1973/**
1974 * @brief removes unused screen space. The most upper left CRTC is set to 0x0
1975 * and all other CRTCs dx,dy respectively.
1976 * @param root the window's screen which will be reset.
1977 */
1978EAPI void
1979ecore_x_randr_screen_reset(Ecore_X_Window root)
1980{
1981#ifdef ECORE_XCB_RANDR
1982 xcb_timestamp_t stamp = 0;
1983 Ecore_X_Randr_Crtc *crtcs = NULL;
1984 int total = 0, i = 0, w = 0, h = 0;
1985 int dx = 100000, dy = 100000, num = 0;
1986#endif
1987
1988 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1989 CHECK_XCB_CONN;
1990
1991#ifdef ECORE_XCB_RANDR
1992 if (!_ecore_xcb_randr_root_validate(root)) return;
1993 crtcs = ecore_x_randr_crtcs_get(root, &total);
1994
1995 if (_randr_version >= RANDR_1_3)
1996 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
1997 else if (_randr_version == RANDR_1_2)
1998 stamp = _ecore_xcb_randr_12_get_resource_timestamp(root);
1999
2000 /* I hate declaring variables inside code like this, but we need the
2001 * value of 'total' before we can */
2002 Ecore_X_Randr_Crtc enabled[total];
2003
2004 for (i = 0; i < total; i++)
2005 {
2006 xcb_randr_get_crtc_info_cookie_t ocookie;
2007 xcb_randr_get_crtc_info_reply_t *oreply;
2008
2009 ocookie =
2010 xcb_randr_get_crtc_info_unchecked(_ecore_xcb_conn, crtcs[i], stamp);
2011 oreply = xcb_randr_get_crtc_info_reply(_ecore_xcb_conn,
2012 ocookie, NULL);
2013 if (!oreply) continue;
2014 if ((oreply->mode <= 0) || (oreply->num_outputs == 0))
2015 {
2016 free(oreply);
2017 continue;
2018 }
2019
2020 enabled[num++] = crtcs[i];
2021 if ((int)(oreply->x + oreply->width) > w)
2022 w = (oreply->x + oreply->width);
2023 if ((int)(oreply->y + oreply->height) > h)
2024 h = (oreply->y + oreply->height);
2025
2026 if (oreply->x < dx) dx = oreply->x;
2027 if (oreply->y < dy) dy = oreply->y;
2028
2029 free(oreply);
2030 }
2031 free(crtcs);
2032
2033 if ((dx > 0) || (dy > 0))
2034 {
2035 if (ecore_x_randr_move_crtcs(root, enabled, num, -dx, -dy))
2036 {
2037 w -= dx;
2038 h -= dy;
2039 }
2040 }
2041
2042 ecore_x_randr_screen_current_size_set(root, w, h, -1, -1);
2043#endif
2044}
2045
2046/*
2047 * @param root window which's screen will be queried
2048 * @param wmin minimum width the screen can be set to
2049 * @param hmin minimum height the screen can be set to
2050 * @param wmax maximum width the screen can be set to
2051 * @param hmax maximum height the screen can be set to
2052 */
2053EAPI void
2054ecore_x_randr_screen_size_range_get(Ecore_X_Window root,
2055 int *minw,
2056 int *minh,
2057 int *maxw,
2058 int *maxh)
2059{
2060#ifdef ECORE_XCB_RANDR
2061 xcb_randr_get_screen_size_range_cookie_t cookie;
2062 xcb_randr_get_screen_size_range_reply_t *reply;
2063#endif
2064
2065 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2066 CHECK_XCB_CONN;
2067
2068#ifdef ECORE_XCB_RANDR
2069 RANDR_CHECK_1_2_RET();
2070
2071 cookie = xcb_randr_get_screen_size_range_unchecked(_ecore_xcb_conn, root);
2072 reply = xcb_randr_get_screen_size_range_reply(_ecore_xcb_conn, cookie, NULL);
2073 if (reply)
2074 {
2075 if (minw) *minw = reply->min_width;
2076 if (minh) *minh = reply->min_height;
2077 if (maxw) *maxw = reply->max_width;
2078 if (maxh) *maxh = reply->max_height;
2079 free(reply);
2080 }
2081#endif
2082}
2083
2084/*
2085 * @param w width of screen in px
2086 * @param h height of screen in px
2087 */
2088EAPI void
2089ecore_x_randr_screen_current_size_get(Ecore_X_Window root,
2090 int *w,
2091 int *h,
2092 int *w_mm,
2093 int *h_mm)
2094{
2095#ifdef ECORE_XCB_RANDR
2096 Ecore_X_Randr_Screen scr = 0;
2097 xcb_screen_t *s;
2098# define RANDR_VALIDATE_ROOT(screen, root) \
2099 ((screen == _ecore_xcb_randr_root_to_screen(root)) != -1)
2100#endif
2101
2102 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2103 CHECK_XCB_CONN;
2104
2105#ifdef ECORE_XCB_RANDR
2106 RANDR_CHECK_1_2_RET();
2107
2108 if (!RANDR_VALIDATE_ROOT(scr, root)) return;
2109
2110 s = ecore_x_screen_get(scr);
2111 if (w) *w = s->width_in_pixels;
2112 if (h) *h = s->height_in_pixels;
2113 if (w_mm) *w_mm = s->width_in_millimeters;
2114 if (h_mm) *h_mm = s->height_in_millimeters;
2115#endif
2116}
2117
2118/*
2119 * @param root window which's screen's size should be set. If invalid (e.g. NULL) no action is taken.
2120 * @param w width in px the screen should be set to. If out of valid boundaries, current value is assumed.
2121 * @param h height in px the screen should be set to. If out of valid boundaries, current value is assumed.
2122 * @param w_mm width in mm the screen should be set to. If 0, current aspect is assumed.
2123 * @param h_mm height in mm the screen should be set to. If 0, current aspect is assumed.
2124 * @return EINA_TRUE if request was successfully sent or screen is already in
2125 * requested size, EINA_FALSE if parameters are invalid
2126 */
2127EAPI Eina_Bool
2128ecore_x_randr_screen_current_size_set(Ecore_X_Window root,
2129 int w,
2130 int h,
2131 int w_mm,
2132 int h_mm)
2133{
2134 Eina_Bool ret = EINA_TRUE;
2135#ifdef ECORE_XCB_RANDR
2136 Ecore_X_Randr_Screen scr;
2137 int wc = 0, hc = 0, w_mm_c = 0, h_mm_c = 0;
2138 int mw = 0, mh = 0, xw = 0, xh = 0;
2139# define RANDR_VALIDATE_ROOT(screen, root) \
2140 ((screen == _ecore_xcb_randr_root_to_screen(root)) != -1)
2141#endif
2142
2143 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2144 CHECK_XCB_CONN;
2145
2146#ifdef ECORE_XCB_RANDR
2147 RANDR_CHECK_1_2_RET(EINA_FALSE);
2148
2149 if (!RANDR_VALIDATE_ROOT(scr, root)) return EINA_FALSE;
2150 ecore_x_randr_screen_current_size_get(root, &wc, &hc, &w_mm_c, &h_mm_c);
2151 if ((w == wc) && (h == hc) && (w_mm == w_mm_c) && (h_mm == h_mm_c))
2152 return EINA_TRUE;
2153 ecore_x_randr_screen_size_range_get(root, &mw, &mh, &xw, &xh);
2154 if (((w != 1) && ((w < mw) || (w > xw))) ||
2155 ((h != -1) && ((h < mh) || (h > xh)))) return EINA_FALSE;
2156
2157 if (w <= 0)
2158 w = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
2159 if (h <= 0)
2160 h = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
2161
2162 /* NB: Hmmmm, xlib version divides w_mm by width ... that seems wrong */
2163 if (w_mm <= 0)
2164 w_mm = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_millimeters;
2165 if (h_mm <= 0)
2166 h_mm = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_millimeters;
2167
2168 xcb_randr_set_screen_size(_ecore_xcb_conn, root, w, h, w_mm, h_mm);
2169#endif
2170
2171 return ret;
2172}
2173
2174/*
2175 * @brief get the outputs, which display a certain window
2176 * @param window window the displaying outputs shall be found for
2177 * @param num the number of outputs displaying the window
2178 * @return array of outputs that display a certain window. NULL if no outputs
2179 * was found that displays the specified window.
2180 */
2181EAPI Ecore_X_Randr_Output *
2182ecore_x_randr_window_outputs_get(Ecore_X_Window window,
2183 int *num)
2184{
2185#ifdef ECORE_XCB_RANDR
2186 Ecore_X_Window root;
2187 Eina_Rectangle w_geo, c_geo;
2188 Ecore_X_Randr_Crtc *crtcs;
2189 Ecore_X_Randr_Mode mode;
2190 Ecore_X_Randr_Output *outputs, *ret = NULL, *tret;
2191 int ncrtcs, noutputs, i, nret = 0;
2192 xcb_translate_coordinates_cookie_t cookie;
2193 xcb_translate_coordinates_reply_t *trans;
2194#endif
2195
2196 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2197 CHECK_XCB_CONN;
2198
2199 if (num) *num = 0;
2200
2201#ifdef ECORE_XCB_RANDR
2202 RANDR_CHECK_1_2_RET(NULL);
2203
2204 ecore_x_window_geometry_get(window, &w_geo.x, &w_geo.y, &w_geo.w, &w_geo.h);
2205
2206 root = ecore_x_window_root_get(window);
2207 crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
2208 if (!crtcs) return NULL;
2209
2210 /* now get window RELATIVE to root window - thats what matters. */
2211 cookie = xcb_translate_coordinates(_ecore_xcb_conn, window, root, 0, 0);
2212 trans = xcb_translate_coordinates_reply(_ecore_xcb_conn, cookie, NULL);
2213 w_geo.x = trans->dst_x;
2214 w_geo.y = trans->dst_y;
2215 free(trans);
2216
2217 for (i = 0; i < ncrtcs; i++)
2218 {
2219 /* if crtc is not enabled, don't bother about it any further */
2220 mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
2221 if (mode == Ecore_X_Randr_None) continue;
2222
2223 ecore_x_randr_crtc_geometry_get(root, crtcs[i], &c_geo.x, &c_geo.y,
2224 &c_geo.w, &c_geo.h);
2225 if (eina_rectangles_intersect(&w_geo, &c_geo))
2226 {
2227 outputs =
2228 ecore_x_randr_crtc_outputs_get(root, crtcs[i], &noutputs);
2229 /* The case below should be impossible, but for safety reasons
2230 * remains */
2231 if (!outputs)
2232 {
2233 if (num) *num = 0;
2234 free(ret);
2235 free(crtcs);
2236 return NULL;
2237 }
2238 tret = realloc(ret, ((nret + noutputs) *
2239 sizeof(Ecore_X_Randr_Output)));
2240 if (!tret)
2241 {
2242 if (num) *num = 0;
2243 free(outputs);
2244 free(ret);
2245 free(crtcs);
2246 return NULL;
2247 }
2248 ret = tret;
2249 memcpy(&ret[nret], outputs,
2250 (noutputs * sizeof(Ecore_X_Randr_Output)));
2251 nret += noutputs;
2252 free(outputs);
2253 }
2254 }
2255 free(crtcs);
2256
2257 if (num) *num = nret;
2258 return ret;
2259
2260#endif
2261 if (num) *num = 0;
2262 return NULL;
2263}
2264
2265/*
2266 * @brief get the backlight level of the given output
2267 * @param root window which's screen should be queried
2268 * @param output from which the backlight level should be retrieved
2269 * @return the backlight level
2270 */
2271EAPI double
2272ecore_x_randr_output_backlight_level_get(Ecore_X_Window root,
2273 Ecore_X_Randr_Output output)
2274{
2275#ifdef ECORE_XCB_RANDR
2276 Ecore_X_Atom _backlight;
2277 xcb_intern_atom_cookie_t acookie;
2278 xcb_intern_atom_reply_t *areply;
2279 xcb_randr_get_output_property_cookie_t cookie;
2280 xcb_randr_get_output_property_reply_t *reply;
2281 xcb_randr_query_output_property_cookie_t qcookie;
2282 xcb_randr_query_output_property_reply_t *qreply;
2283 double dvalue;
2284 long value, max, min;
2285#endif
2286
2287 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2288 CHECK_XCB_CONN;
2289
2290#ifdef ECORE_XCB_RANDR
2291 RANDR_CHECK_1_2_RET(-1);
2292
2293 acookie =
2294 xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
2295 strlen("Backlight"), "Backlight");
2296 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
2297
2298 if (!areply)
2299 {
2300 ERR("Backlight property is not suppported on this server or driver");
2301 return -1;
2302 }
2303 else
2304 {
2305 _backlight = areply->atom;
2306 free(areply);
2307 }
2308
2309 if (!_ecore_xcb_randr_output_validate(root, output))
2310 {
2311 ERR("Invalid output");
2312 return -1;
2313 }
2314
2315 cookie =
2316 xcb_randr_get_output_property_unchecked(_ecore_xcb_conn,
2317 output, _backlight,
2318 XCB_ATOM_NONE, 0, 4, 0, 0);
2319 reply =
2320 xcb_randr_get_output_property_reply(_ecore_xcb_conn, cookie, NULL);
2321 if (!reply)
2322 {
2323 WRN("Backlight not supported on this output");
2324 return -1;
2325 }
2326
2327 if ((reply->format != 32) || (reply->num_items != 1) ||
2328 (reply->type != XCB_ATOM_INTEGER))
2329 {
2330 free(reply);
2331 return -1;
2332 }
2333
2334 value = *((long *)xcb_randr_get_output_property_data(reply));
2335 free (reply);
2336
2337 /* I have the current value of the backlight */
2338 /* Now retrieve the min and max intensities of the output */
2339 qcookie =
2340 xcb_randr_query_output_property_unchecked(_ecore_xcb_conn,
2341 output, _backlight);
2342 qreply =
2343 xcb_randr_query_output_property_reply(_ecore_xcb_conn, qcookie, NULL);
2344 if (qreply)
2345 {
2346 dvalue = -1;
2347 if ((qreply->range) &&
2348 (xcb_randr_query_output_property_valid_values_length(qreply) == 2))
2349 {
2350 int32_t *vals;
2351
2352 vals = xcb_randr_query_output_property_valid_values(qreply);
2353 /* finally convert the current value in the interval [0..1] */
2354 min = vals[0];
2355 max = vals[1];
2356 dvalue = ((double)(value - min)) / ((double)(max - min));
2357 }
2358 free(qreply);
2359 return dvalue;
2360 }
2361#endif
2362 return -1;
2363}
2364
2365/*
2366 * @brief set the backlight level of a given output
2367 * @param root window which's screen should be queried
2368 * @param output that should be set
2369 * @param level for which the backlight should be set
2370 * @return EINA_TRUE in case of success
2371 */
2372EAPI Eina_Bool
2373ecore_x_randr_output_backlight_level_set(Ecore_X_Window root,
2374 Ecore_X_Randr_Output output,
2375 double level)
2376{
2377#ifdef ECORE_XCB_RANDR
2378 Ecore_X_Atom _backlight;
2379 xcb_intern_atom_cookie_t acookie;
2380 xcb_intern_atom_reply_t *areply;
2381 xcb_randr_query_output_property_cookie_t qcookie;
2382 xcb_randr_query_output_property_reply_t *qreply;
2383#endif
2384
2385 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2386 CHECK_XCB_CONN;
2387
2388#ifdef ECORE_XCB_RANDR
2389 RANDR_CHECK_1_2_RET(EINA_FALSE);
2390
2391 if ((level < 0) || (level > 1))
2392 {
2393 ERR("Backlight level should be between 0 and 1");
2394 return EINA_FALSE;
2395 }
2396
2397 if (!_ecore_xcb_randr_output_validate(root, output))
2398 {
2399 ERR("Wrong output value");
2400 return EINA_FALSE;
2401 }
2402
2403 acookie =
2404 xcb_intern_atom_unchecked(_ecore_xcb_conn, 1,
2405 strlen("Backlight"), "Backlight");
2406 areply = xcb_intern_atom_reply(_ecore_xcb_conn, acookie, NULL);
2407 if (!areply)
2408 {
2409 WRN("Backlight property is not suppported on this server or driver");
2410 return EINA_FALSE;
2411 }
2412 else
2413 {
2414 _backlight = areply->atom;
2415 free(areply);
2416 }
2417
2418 qcookie =
2419 xcb_randr_query_output_property_unchecked(_ecore_xcb_conn,
2420 output, _backlight);
2421 qreply =
2422 xcb_randr_query_output_property_reply(_ecore_xcb_conn, qcookie, NULL);
2423 if (qreply)
2424 {
2425 if ((qreply->range) && (qreply->length == 2))
2426 {
2427 int32_t *vals;
2428 double min, max, tmp;
2429 long n;
2430
2431 vals = xcb_randr_query_output_property_valid_values(qreply);
2432 min = vals[0];
2433 max = vals[1];
2434 tmp = (level * (max - min)) + min;
2435 n = tmp;
2436 if (n > max) n = max;
2437 if (n < min) n = min;
2438 xcb_randr_change_output_property(_ecore_xcb_conn, output,
2439 _backlight, XCB_ATOM_INTEGER,
2440 32, XCB_PROP_MODE_REPLACE,
2441 1, (unsigned char *)&n);
2442 ecore_x_flush(); // needed
2443 }
2444
2445 free(qreply);
2446 return EINA_TRUE;
2447 }
2448#endif
2449 return EINA_FALSE;
2450}
2451
2452EAPI int
2453ecore_x_randr_edid_version_get(unsigned char *edid, unsigned long edid_length)
2454{
2455 if ((edid_length > _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR) &&
2456 (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
2457 return (edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR] << 8) |
2458 edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR];
2459 return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
2460}
2461
2462EAPI char *
2463ecore_x_randr_edid_display_name_get(unsigned char *edid, unsigned long edid_length)
2464{
2465 unsigned char *block = NULL;
2466 int version = 0;
2467
2468 version = ecore_x_randr_edid_version_get(edid, edid_length);
2469 if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
2470
2471 _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
2472 {
2473 if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfc)
2474 {
2475 char *name, *p;
2476 const char *edid_name;
2477
2478 edid_name = (const char *)block +
2479 _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
2480 name =
2481 malloc(sizeof(char) *
2482 _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
2483 if (!name) return NULL;
2484
2485 strncpy(name, edid_name,
2486 (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
2487 name[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
2488 for (p = name; *p; p++)
2489 if ((*p < ' ') || (*p > '~')) *p = 0;
2490
2491 return name;
2492 }
2493 }
2494 return NULL;
2495}
2496
2497EAPI Eina_Bool
2498ecore_x_randr_edid_has_valid_header(unsigned char *edid, unsigned long edid_length)
2499{
2500 const unsigned char header[] =
2501 {
2502 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00
2503 };
2504
2505 if ((!edid) || (edid_length < 8)) return EINA_FALSE;
2506 if (!memcmp(edid, header, 8)) return EINA_TRUE;
2507 return EINA_FALSE;
2508}
2509
2510/* local functions */
2511static Eina_Bool
2512_ecore_xcb_randr_output_validate(Ecore_X_Window root,
2513 Ecore_X_Randr_Output output)
2514{
2515 Eina_Bool ret = EINA_FALSE;
2516
2517 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2518 CHECK_XCB_CONN;
2519
2520#ifdef ECORE_XCB_RANDR
2521 RANDR_CHECK_1_2_RET(EINA_FALSE);
2522
2523 if ((output) && (_ecore_xcb_randr_root_validate(root)))
2524 {
2525 if (_randr_version >= RANDR_1_3)
2526 {
2527 xcb_randr_get_screen_resources_current_reply_t *reply;
2528
2529 reply = _ecore_xcb_randr_13_get_resources(root);
2530 if (reply)
2531 {
2532 int len = 0, i = 0;
2533 xcb_randr_output_t *outputs;
2534
2535 len =
2536 xcb_randr_get_screen_resources_current_outputs_length(reply);
2537 outputs =
2538 xcb_randr_get_screen_resources_current_outputs(reply);
2539 for (i = 0; i < len; i++)
2540 {
2541 if (outputs[i] == output)
2542 {
2543 ret = EINA_TRUE;
2544 break;
2545 }
2546 }
2547 free(reply);
2548 }
2549 }
2550 else if (_randr_version == RANDR_1_2)
2551 {
2552 xcb_randr_get_screen_resources_reply_t *reply;
2553
2554 reply = _ecore_xcb_randr_12_get_resources(root);
2555 if (reply)
2556 {
2557 int len = 0, i = 0;
2558 xcb_randr_output_t *outputs;
2559
2560 len = xcb_randr_get_screen_resources_outputs_length(reply);
2561 outputs = xcb_randr_get_screen_resources_outputs(reply);
2562 for (i = 0; i < len; i++)
2563 {
2564 if (outputs[i] == output)
2565 {
2566 ret = EINA_TRUE;
2567 break;
2568 }
2569 }
2570 free(reply);
2571 }
2572 }
2573 }
2574#endif
2575 return ret;
2576}
2577
2578/**
2579 * @brief validates a CRTC for a given root window's screen.
2580 * @param root the window which's default display will be queried
2581 * @param crtc the CRTC to be validated.
2582 * @return in case it is found EINA_TRUE will be returned. Else EINA_FALSE is returned.
2583 */
2584static Eina_Bool
2585_ecore_xcb_randr_crtc_validate(Ecore_X_Window root,
2586 Ecore_X_Randr_Crtc crtc)
2587{
2588 Eina_Bool ret = EINA_FALSE;
2589
2590 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2591 CHECK_XCB_CONN;
2592
2593#ifdef ECORE_XCB_RANDR
2594 RANDR_CHECK_1_2_RET(EINA_FALSE);
2595
2596 if (((int)crtc == Ecore_X_Randr_None) || ((int)crtc == Ecore_X_Randr_Unset))
2597 return ret;
2598
2599 if ((crtc) && (_ecore_xcb_randr_root_validate(root)))
2600 {
2601 if (_randr_version >= RANDR_1_3)
2602 {
2603 xcb_randr_get_screen_resources_current_reply_t *reply;
2604
2605 reply = _ecore_xcb_randr_13_get_resources(root);
2606 if (reply)
2607 {
2608 int i = 0;
2609 xcb_randr_crtc_t *crtcs;
2610
2611 crtcs = xcb_randr_get_screen_resources_current_crtcs(reply);
2612 for (i = 0; i < reply->num_crtcs; i++)
2613 {
2614 if (crtcs[i] == crtc)
2615 {
2616 ret = EINA_TRUE;
2617 break;
2618 }
2619 }
2620 free(reply);
2621 }
2622 }
2623 else if (_randr_version == RANDR_1_2)
2624 {
2625 xcb_randr_get_screen_resources_reply_t *reply;
2626
2627 reply = _ecore_xcb_randr_12_get_resources(root);
2628 if (reply)
2629 {
2630 int i = 0;
2631 xcb_randr_crtc_t *crtcs;
2632
2633 crtcs = xcb_randr_get_screen_resources_crtcs(reply);
2634 for (i = 0; i < reply->num_crtcs; i++)
2635 {
2636 if (crtcs[i] == crtc)
2637 {
2638 ret = EINA_TRUE;
2639 break;
2640 }
2641 }
2642 free(reply);
2643 }
2644 }
2645 }
2646#endif
2647
2648 return ret;
2649}
2650
2651static Ecore_X_Randr_Mode *
2652_ecore_xcb_randr_12_output_modes_get(Ecore_X_Window root,
2653 Ecore_X_Randr_Output output,
2654 int *num,
2655 int *npreferred)
2656{
2657 Ecore_X_Randr_Mode *modes = NULL;
2658 xcb_randr_get_screen_resources_reply_t *reply;
2659
2660 reply = _ecore_xcb_randr_12_get_resources(root);
2661 if (reply)
2662 {
2663 xcb_randr_get_output_info_cookie_t ocookie;
2664 xcb_randr_get_output_info_reply_t *oreply;
2665
2666 ocookie =
2667 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
2668 reply->config_timestamp);
2669 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
2670 ocookie, NULL);
2671 if (oreply)
2672 {
2673 if (num) *num = oreply->num_modes;
2674 if (npreferred) *npreferred = oreply->num_preferred;
2675
2676 modes = malloc(sizeof(Ecore_X_Randr_Mode) *
2677 oreply->num_modes);
2678 if (modes)
2679 {
2680 xcb_randr_mode_t *rmodes;
2681 int len = 0;
2682
2683 len = xcb_randr_get_output_info_modes_length(oreply);
2684 rmodes = xcb_randr_get_output_info_modes(oreply);
2685 memcpy(modes, rmodes, sizeof(Ecore_X_Randr_Mode) * len);
2686 }
2687 free(oreply);
2688 }
2689 free(reply);
2690 }
2691
2692 return modes;
2693}
2694
2695static Ecore_X_Randr_Mode *
2696_ecore_xcb_randr_13_output_modes_get(Ecore_X_Window root,
2697 Ecore_X_Randr_Output output,
2698 int *num,
2699 int *npreferred)
2700{
2701 Ecore_X_Randr_Mode *modes = NULL;
2702 xcb_timestamp_t stamp = 0;
2703 xcb_randr_get_output_info_cookie_t ocookie;
2704 xcb_randr_get_output_info_reply_t *oreply;
2705
2706 stamp = _ecore_xcb_randr_13_get_resource_timestamp(root);
2707
2708 ocookie =
2709 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output, stamp);
2710 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn, ocookie, NULL);
2711 if (oreply)
2712 {
2713 if (num) *num = oreply->num_modes;
2714 if (npreferred) *npreferred = oreply->num_preferred;
2715
2716 modes = malloc(sizeof(Ecore_X_Randr_Mode) * oreply->num_modes);
2717 if (modes)
2718 {
2719 xcb_randr_mode_t *rmodes;
2720 int len = 0;
2721
2722 len = xcb_randr_get_output_info_modes_length(oreply);
2723 rmodes = xcb_randr_get_output_info_modes(oreply);
2724 memcpy(modes, rmodes, sizeof(Ecore_X_Randr_Mode) * len);
2725 }
2726 free(oreply);
2727 }
2728
2729 return modes;
2730}
2731
2732static Ecore_X_Randr_Mode_Info *
2733_ecore_xcb_randr_12_mode_info_get(Ecore_X_Window root,
2734 Ecore_X_Randr_Mode mode)
2735{
2736 Ecore_X_Randr_Mode_Info *ret = NULL;
2737 xcb_randr_get_screen_resources_reply_t *reply;
2738
2739 reply = _ecore_xcb_randr_12_get_resources(root);
2740 if (reply)
2741 {
2742 if ((ret = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
2743 {
2744 uint8_t *nbuf;
2745 xcb_randr_mode_info_iterator_t miter;
2746
2747 nbuf = xcb_randr_get_screen_resources_names(reply);
2748 miter = xcb_randr_get_screen_resources_modes_iterator(reply);
2749 while (miter.rem)
2750 {
2751 xcb_randr_mode_info_t *minfo;
2752
2753 minfo = miter.data;
2754 nbuf += minfo->name_len;
2755
2756 if (minfo->id == mode)
2757 {
2758 ret->xid = minfo->id;
2759 ret->width = minfo->width;
2760 ret->height = minfo->height;
2761 ret->dotClock = minfo->dot_clock;
2762 ret->hSyncStart = minfo->hsync_start;
2763 ret->hSyncEnd = minfo->hsync_end;
2764 ret->hTotal = minfo->htotal;
2765 ret->vSyncStart = minfo->vsync_start;
2766 ret->vSyncEnd = minfo->vsync_end;
2767 ret->vTotal = minfo->vtotal;
2768 ret->modeFlags = minfo->mode_flags;
2769
2770 ret->name = NULL;
2771 ret->nameLength = minfo->name_len;
2772 if (ret->nameLength > 0)
2773 {
2774 ret->name = malloc(ret->nameLength + 1);
2775 if (ret->name)
2776 memcpy(ret->name, nbuf, ret->nameLength + 1);
2777 }
2778
2779 break;
2780 }
2781 xcb_randr_mode_info_next(&miter);
2782 }
2783 }
2784
2785 free(reply);
2786 }
2787 return ret;
2788}
2789
2790static Ecore_X_Randr_Mode_Info *
2791_ecore_xcb_randr_13_mode_info_get(Ecore_X_Window root,
2792 Ecore_X_Randr_Mode mode)
2793{
2794 Ecore_X_Randr_Mode_Info *ret = NULL;
2795 xcb_randr_get_screen_resources_current_reply_t *reply;
2796
2797 reply = _ecore_xcb_randr_13_get_resources(root);
2798 if (reply)
2799 {
2800 if ((ret = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
2801 {
2802 uint8_t *nbuf;
2803 xcb_randr_mode_info_iterator_t miter;
2804
2805 nbuf = xcb_randr_get_screen_resources_current_names(reply);
2806 miter =
2807 xcb_randr_get_screen_resources_current_modes_iterator(reply);
2808 while (miter.rem)
2809 {
2810 xcb_randr_mode_info_t *minfo;
2811
2812 minfo = miter.data;
2813 nbuf += minfo->name_len;
2814
2815 if (minfo->id == mode)
2816 {
2817 ret->xid = minfo->id;
2818 ret->width = minfo->width;
2819 ret->height = minfo->height;
2820 ret->dotClock = minfo->dot_clock;
2821 ret->hSyncStart = minfo->hsync_start;
2822 ret->hSyncEnd = minfo->hsync_end;
2823 ret->hTotal = minfo->htotal;
2824 ret->vSyncStart = minfo->vsync_start;
2825 ret->vSyncEnd = minfo->vsync_end;
2826 ret->vTotal = minfo->vtotal;
2827 ret->modeFlags = minfo->mode_flags;
2828
2829 ret->name = NULL;
2830 ret->nameLength = minfo->name_len;
2831 if (ret->nameLength > 0)
2832 {
2833 ret->name = malloc(ret->nameLength + 1);
2834 if (ret->name)
2835 memcpy(ret->name, nbuf, ret->nameLength + 1);
2836 }
2837
2838 break;
2839 }
2840 xcb_randr_mode_info_next(&miter);
2841 }
2842 }
2843
2844 free(reply);
2845 }
2846 return ret;
2847}
2848
2849static Ecore_X_Randr_Mode_Info **
2850_ecore_xcb_randr_12_modes_info_get(Ecore_X_Window root,
2851 int *num)
2852{
2853 Ecore_X_Randr_Mode_Info **ret = NULL;
2854 xcb_randr_get_screen_resources_reply_t *reply;
2855
2856 reply = _ecore_xcb_randr_12_get_resources(root);
2857 if (reply)
2858 {
2859 if (num) *num = reply->num_modes;
2860 ret = malloc(sizeof(Ecore_X_Randr_Mode_Info *) * reply->num_modes);
2861 if (ret)
2862 {
2863 xcb_randr_mode_info_iterator_t miter;
2864 int i = 0;
2865 uint8_t *nbuf;
2866
2867 nbuf = xcb_randr_get_screen_resources_names(reply);
2868 miter = xcb_randr_get_screen_resources_modes_iterator(reply);
2869 while (miter.rem)
2870 {
2871 xcb_randr_mode_info_t *minfo;
2872
2873 minfo = miter.data;
2874 nbuf += minfo->name_len;
2875 if ((ret[i] = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
2876 {
2877 ret[i]->xid = minfo->id;
2878 ret[i]->width = minfo->width;
2879 ret[i]->height = minfo->height;
2880 ret[i]->dotClock = minfo->dot_clock;
2881 ret[i]->hSyncStart = minfo->hsync_start;
2882 ret[i]->hSyncEnd = minfo->hsync_end;
2883 ret[i]->hTotal = minfo->htotal;
2884 ret[i]->vSyncStart = minfo->vsync_start;
2885 ret[i]->vSyncEnd = minfo->vsync_end;
2886 ret[i]->vTotal = minfo->vtotal;
2887 ret[i]->modeFlags = minfo->mode_flags;
2888
2889 ret[i]->name = NULL;
2890 ret[i]->nameLength = minfo->name_len;
2891 if (ret[i]->nameLength > 0)
2892 {
2893 ret[i]->name = malloc(ret[i]->nameLength + 1);
2894 if (ret[i]->name)
2895 memcpy(ret[i]->name, nbuf,
2896 ret[i]->nameLength + 1);
2897 }
2898 }
2899 else
2900 {
2901 while (i > 0)
2902 free(ret[--i]);
2903 free(ret);
2904 ret = NULL;
2905 break;
2906 }
2907 i++;
2908 xcb_randr_mode_info_next(&miter);
2909 }
2910 }
2911 free(reply);
2912 }
2913 return ret;
2914}
2915
2916static Ecore_X_Randr_Mode_Info **
2917_ecore_xcb_randr_13_modes_info_get(Ecore_X_Window root,
2918 int *num)
2919{
2920 Ecore_X_Randr_Mode_Info **ret = NULL;
2921 xcb_randr_get_screen_resources_current_reply_t *reply;
2922
2923 reply = _ecore_xcb_randr_13_get_resources(root);
2924 if (reply)
2925 {
2926 if (num) *num = reply->num_modes;
2927 ret = malloc(sizeof(Ecore_X_Randr_Mode_Info *) * reply->num_modes);
2928 if (ret)
2929 {
2930 xcb_randr_mode_info_iterator_t miter;
2931 int i = 0;
2932 uint8_t *nbuf;
2933
2934 nbuf = xcb_randr_get_screen_resources_current_names(reply);
2935 miter =
2936 xcb_randr_get_screen_resources_current_modes_iterator(reply);
2937 while (miter.rem)
2938 {
2939 xcb_randr_mode_info_t *minfo;
2940
2941 minfo = miter.data;
2942 nbuf += minfo->name_len;
2943 if ((ret[i] = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
2944 {
2945 ret[i]->xid = minfo->id;
2946 ret[i]->width = minfo->width;
2947 ret[i]->height = minfo->height;
2948 ret[i]->dotClock = minfo->dot_clock;
2949 ret[i]->hSyncStart = minfo->hsync_start;
2950 ret[i]->hSyncEnd = minfo->hsync_end;
2951 ret[i]->hTotal = minfo->htotal;
2952 ret[i]->vSyncStart = minfo->vsync_start;
2953 ret[i]->vSyncEnd = minfo->vsync_end;
2954 ret[i]->vTotal = minfo->vtotal;
2955 ret[i]->modeFlags = minfo->mode_flags;
2956
2957 ret[i]->name = NULL;
2958 ret[i]->nameLength = minfo->name_len;
2959 if (ret[i]->nameLength > 0)
2960 {
2961 ret[i]->name = malloc(ret[i]->nameLength + 1);
2962 if (ret[i]->name)
2963 memcpy(ret[i]->name, nbuf,
2964 ret[i]->nameLength + 1);
2965 }
2966 }
2967 else
2968 {
2969 while (i > 0)
2970 free(ret[--i]);
2971 free(ret);
2972 ret = NULL;
2973 break;
2974 }
2975 i++;
2976 xcb_randr_mode_info_next(&miter);
2977 }
2978 }
2979 free(reply);
2980 }
2981 return ret;
2982}
2983
2984static void
2985_ecore_xcb_randr_12_mode_size_get(Ecore_X_Window root,
2986 Ecore_X_Randr_Mode mode,
2987 int *w,
2988 int *h)
2989{
2990 xcb_randr_get_screen_resources_reply_t *reply;
2991
2992 reply = _ecore_xcb_randr_12_get_resources(root);
2993 if (reply)
2994 {
2995 xcb_randr_mode_info_iterator_t miter;
2996
2997 miter = xcb_randr_get_screen_resources_modes_iterator(reply);
2998 while (miter.rem)
2999 {
3000 xcb_randr_mode_info_t *minfo;
3001
3002 minfo = miter.data;
3003 if (minfo->id == mode)
3004 {
3005 if (w) *w = minfo->width;
3006 if (h) *h = minfo->height;
3007 break;
3008 }
3009 xcb_randr_mode_info_next(&miter);
3010 }
3011 free(reply);
3012 }
3013}
3014
3015static void
3016_ecore_xcb_randr_13_mode_size_get(Ecore_X_Window root,
3017 Ecore_X_Randr_Mode mode,
3018 int *w,
3019 int *h)
3020{
3021 xcb_randr_get_screen_resources_current_reply_t *reply;
3022
3023 reply = _ecore_xcb_randr_13_get_resources(root);
3024 if (reply)
3025 {
3026 xcb_randr_mode_info_iterator_t miter;
3027
3028 miter = xcb_randr_get_screen_resources_current_modes_iterator(reply);
3029 while (miter.rem)
3030 {
3031 xcb_randr_mode_info_t *minfo;
3032
3033 minfo = miter.data;
3034 if (minfo->id == mode)
3035 {
3036 if (w) *w = minfo->width;
3037 if (h) *h = minfo->height;
3038 break;
3039 }
3040 xcb_randr_mode_info_next(&miter);
3041 }
3042 free(reply);
3043 }
3044}
3045
3046static Ecore_X_Randr_Output *
3047_ecore_xcb_randr_12_output_clones_get(Ecore_X_Window root,
3048 Ecore_X_Randr_Output output,
3049 int *num)
3050{
3051 Ecore_X_Randr_Output *outputs = NULL;
3052 xcb_randr_get_screen_resources_reply_t *reply;
3053
3054 reply = _ecore_xcb_randr_12_get_resources(root);
3055 if (reply)
3056 {
3057 xcb_randr_get_output_info_cookie_t ocookie;
3058 xcb_randr_get_output_info_reply_t *oreply;
3059
3060 ocookie =
3061 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3062 reply->config_timestamp);
3063 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3064 ocookie, NULL);
3065 if (oreply)
3066 {
3067 if (num) *num = oreply->num_clones;
3068
3069 outputs =
3070 malloc(sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
3071 if (outputs)
3072 {
3073 memcpy(outputs, xcb_randr_get_output_info_clones(oreply),
3074 sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
3075 }
3076 free(oreply);
3077 }
3078 free(reply);
3079 }
3080 return outputs;
3081}
3082
3083static Ecore_X_Randr_Output *
3084_ecore_xcb_randr_13_output_clones_get(Ecore_X_Window root,
3085 Ecore_X_Randr_Output output,
3086 int *num)
3087{
3088 Ecore_X_Randr_Output *outputs = NULL;
3089 xcb_randr_get_screen_resources_current_reply_t *reply;
3090
3091 reply = _ecore_xcb_randr_13_get_resources(root);
3092 if (reply)
3093 {
3094 xcb_randr_get_output_info_cookie_t ocookie;
3095 xcb_randr_get_output_info_reply_t *oreply;
3096
3097 ocookie =
3098 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3099 reply->config_timestamp);
3100 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3101 ocookie, NULL);
3102 if (oreply)
3103 {
3104 if (num) *num = oreply->num_clones;
3105
3106 outputs =
3107 malloc(sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
3108 if (outputs)
3109 {
3110 memcpy(outputs, xcb_randr_get_output_info_clones(oreply),
3111 sizeof(Ecore_X_Randr_Output) * oreply->num_clones);
3112 }
3113 free(oreply);
3114 }
3115 free(reply);
3116 }
3117 return outputs;
3118}
3119
3120static Ecore_X_Randr_Crtc *
3121_ecore_xcb_randr_12_output_possible_crtcs_get(Ecore_X_Window root,
3122 Ecore_X_Randr_Output output,
3123 int *num)
3124{
3125 Ecore_X_Randr_Crtc *crtcs = NULL;
3126 xcb_randr_get_screen_resources_reply_t *reply;
3127
3128 reply = _ecore_xcb_randr_12_get_resources(root);
3129 if (reply)
3130 {
3131 xcb_randr_get_output_info_cookie_t ocookie;
3132 xcb_randr_get_output_info_reply_t *oreply;
3133
3134 ocookie =
3135 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3136 reply->config_timestamp);
3137 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3138 ocookie, NULL);
3139 if (oreply)
3140 {
3141 if (num) *num = oreply->num_crtcs;
3142
3143 crtcs = malloc(sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
3144 if (crtcs)
3145 {
3146 memcpy(crtcs, xcb_randr_get_output_info_crtcs(oreply),
3147 sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
3148 }
3149 free(oreply);
3150 }
3151 free(reply);
3152 }
3153 return crtcs;
3154}
3155
3156static Ecore_X_Randr_Crtc *
3157_ecore_xcb_randr_13_output_possible_crtcs_get(Ecore_X_Window root,
3158 Ecore_X_Randr_Output output,
3159 int *num)
3160{
3161 Ecore_X_Randr_Crtc *crtcs = NULL;
3162 xcb_randr_get_screen_resources_current_reply_t *reply;
3163
3164 reply = _ecore_xcb_randr_13_get_resources(root);
3165 if (reply)
3166 {
3167 xcb_randr_get_output_info_cookie_t ocookie;
3168 xcb_randr_get_output_info_reply_t *oreply;
3169
3170 ocookie =
3171 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3172 reply->config_timestamp);
3173 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3174 ocookie, NULL);
3175 if (oreply)
3176 {
3177 if (num) *num = oreply->num_crtcs;
3178
3179 crtcs = malloc(sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
3180 if (crtcs)
3181 {
3182 memcpy(crtcs, xcb_randr_get_output_info_crtcs(oreply),
3183 sizeof(Ecore_X_Randr_Crtc) * oreply->num_crtcs);
3184 }
3185 free(oreply);
3186 }
3187 free(reply);
3188 }
3189 return crtcs;
3190}
3191
3192static char *
3193_ecore_xcb_randr_12_output_name_get(Ecore_X_Window root,
3194 Ecore_X_Randr_Output output,
3195 int *len)
3196{
3197 char *ret = NULL;
3198 xcb_randr_get_screen_resources_reply_t *reply;
3199
3200 reply = _ecore_xcb_randr_12_get_resources(root);
3201 if (reply)
3202 {
3203 xcb_randr_get_output_info_cookie_t ocookie;
3204 xcb_randr_get_output_info_reply_t *oreply;
3205
3206 ocookie =
3207 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3208 reply->config_timestamp);
3209 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3210 ocookie, NULL);
3211 if (oreply)
3212 {
3213 uint8_t *nbuf;
3214
3215 nbuf = xcb_randr_get_output_info_name(oreply);
3216 nbuf += oreply->name_len;
3217
3218 if (len) *len = oreply->name_len;
3219 if (oreply->name_len > 0)
3220 {
3221 ret = malloc(oreply->name_len + 1);
3222 if (ret)
3223 memcpy(ret, nbuf, oreply->name_len + 1);
3224 }
3225
3226 free(oreply);
3227 }
3228 free(reply);
3229 }
3230 return ret;
3231}
3232
3233static char *
3234_ecore_xcb_randr_13_output_name_get(Ecore_X_Window root,
3235 Ecore_X_Randr_Output output,
3236 int *len)
3237{
3238 char *ret = NULL;
3239 xcb_randr_get_screen_resources_current_reply_t *reply;
3240
3241 reply = _ecore_xcb_randr_13_get_resources(root);
3242 if (reply)
3243 {
3244 xcb_randr_get_output_info_cookie_t ocookie;
3245 xcb_randr_get_output_info_reply_t *oreply;
3246
3247 ocookie =
3248 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3249 reply->config_timestamp);
3250 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3251 ocookie, NULL);
3252 if (oreply)
3253 {
3254 uint8_t *nbuf;
3255
3256 nbuf = xcb_randr_get_output_info_name(oreply);
3257 nbuf += oreply->name_len;
3258
3259 if (len) *len = oreply->name_len;
3260 if (oreply->name_len > 0)
3261 {
3262 ret = malloc(oreply->name_len + 1);
3263 if (ret)
3264 memcpy(ret, nbuf, oreply->name_len + 1);
3265 }
3266
3267 free(oreply);
3268 }
3269 free(reply);
3270 }
3271 return ret;
3272}
3273
3274static Ecore_X_Randr_Connection_Status
3275_ecore_xcb_randr_12_output_connection_status_get(Ecore_X_Window root,
3276 Ecore_X_Randr_Output output)
3277{
3278 Ecore_X_Randr_Connection_Status ret = ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
3279 xcb_randr_get_screen_resources_reply_t *reply;
3280
3281 reply = _ecore_xcb_randr_12_get_resources(root);
3282 if (reply)
3283 {
3284 xcb_randr_get_output_info_cookie_t ocookie;
3285 xcb_randr_get_output_info_reply_t *oreply;
3286
3287 ocookie =
3288 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3289 reply->config_timestamp);
3290 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3291 ocookie, NULL);
3292 if (oreply)
3293 {
3294 ret = oreply->connection;
3295 free(oreply);
3296 }
3297 free(reply);
3298 }
3299 return ret;
3300}
3301
3302static Ecore_X_Randr_Connection_Status
3303_ecore_xcb_randr_13_output_connection_status_get(Ecore_X_Window root,
3304 Ecore_X_Randr_Output output)
3305{
3306 Ecore_X_Randr_Connection_Status ret = ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
3307 xcb_randr_get_screen_resources_current_reply_t *reply;
3308
3309 reply = _ecore_xcb_randr_13_get_resources(root);
3310 if (reply)
3311 {
3312 xcb_randr_get_output_info_cookie_t ocookie;
3313 xcb_randr_get_output_info_reply_t *oreply;
3314
3315 ocookie =
3316 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3317 reply->config_timestamp);
3318 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3319 ocookie, NULL);
3320 if (oreply)
3321 {
3322 ret = oreply->connection;
3323 free(oreply);
3324 }
3325 free(reply);
3326 }
3327 return ret;
3328}
3329
3330static Ecore_X_Randr_Output *
3331_ecore_xcb_randr_12_outputs_get(Ecore_X_Window root,
3332 int *num)
3333{
3334 Ecore_X_Randr_Output *ret = NULL;
3335 xcb_randr_get_screen_resources_reply_t *reply;
3336
3337 reply = _ecore_xcb_randr_12_get_resources(root);
3338 if (reply)
3339 {
3340 if (num) *num = reply->num_outputs;
3341 ret = malloc(sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
3342 if (ret)
3343 memcpy(ret, xcb_randr_get_screen_resources_outputs(reply),
3344 sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
3345 free(reply);
3346 }
3347 return ret;
3348}
3349
3350static Ecore_X_Randr_Output *
3351_ecore_xcb_randr_13_outputs_get(Ecore_X_Window root,
3352 int *num)
3353{
3354 Ecore_X_Randr_Output *ret = NULL;
3355 xcb_randr_get_screen_resources_current_reply_t *reply;
3356
3357 reply = _ecore_xcb_randr_13_get_resources(root);
3358 if (reply)
3359 {
3360 if (num) *num = reply->num_outputs;
3361 ret = malloc(sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
3362 if (ret)
3363 memcpy(ret, xcb_randr_get_screen_resources_current_outputs(reply),
3364 sizeof(Ecore_X_Randr_Output) * reply->num_outputs);
3365 free(reply);
3366 }
3367 return ret;
3368}
3369
3370static Ecore_X_Randr_Crtc
3371_ecore_xcb_randr_12_output_crtc_get(Ecore_X_Window root,
3372 Ecore_X_Randr_Output output)
3373{
3374 Ecore_X_Randr_Crtc ret = Ecore_X_Randr_None;
3375 xcb_randr_get_screen_resources_reply_t *reply;
3376
3377 reply = _ecore_xcb_randr_12_get_resources(root);
3378 if (reply)
3379 {
3380 xcb_randr_get_output_info_cookie_t ocookie;
3381 xcb_randr_get_output_info_reply_t *oreply;
3382
3383 ocookie =
3384 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3385 reply->config_timestamp);
3386 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3387 ocookie, NULL);
3388 if (oreply)
3389 {
3390 ret = oreply->crtc;
3391 free(oreply);
3392 }
3393 free(reply);
3394 }
3395 return ret;
3396}
3397
3398static Ecore_X_Randr_Crtc
3399_ecore_xcb_randr_13_output_crtc_get(Ecore_X_Window root,
3400 Ecore_X_Randr_Output output)
3401{
3402 Ecore_X_Randr_Crtc ret = Ecore_X_Randr_None;
3403 xcb_randr_get_screen_resources_current_reply_t *reply;
3404
3405 reply = _ecore_xcb_randr_13_get_resources(root);
3406 if (reply)
3407 {
3408 xcb_randr_get_output_info_cookie_t ocookie;
3409 xcb_randr_get_output_info_reply_t *oreply;
3410
3411 ocookie =
3412 xcb_randr_get_output_info_unchecked(_ecore_xcb_conn, output,
3413 reply->config_timestamp);
3414 oreply = xcb_randr_get_output_info_reply(_ecore_xcb_conn,
3415 ocookie, NULL);
3416 if (oreply)
3417 {
3418 ret = oreply->crtc;
3419 free(oreply);
3420 }
3421 free(reply);
3422 }
3423 return ret;
3424}
3425
3426static xcb_randr_get_screen_resources_reply_t *
3427_ecore_xcb_randr_12_get_resources(Ecore_X_Window win)
3428{
3429 xcb_randr_get_screen_resources_cookie_t cookie;
3430 xcb_randr_get_screen_resources_reply_t *reply;
3431
3432 cookie = xcb_randr_get_screen_resources_unchecked(_ecore_xcb_conn, win);
3433 reply = xcb_randr_get_screen_resources_reply(_ecore_xcb_conn, cookie, NULL);
3434 return reply;
3435}
3436
3437static xcb_randr_get_screen_resources_current_reply_t *
3438_ecore_xcb_randr_13_get_resources(Ecore_X_Window win)
3439{
3440 xcb_randr_get_screen_resources_current_cookie_t cookie;
3441 xcb_randr_get_screen_resources_current_reply_t *reply;
3442
3443 cookie =
3444 xcb_randr_get_screen_resources_current_unchecked(_ecore_xcb_conn, win);
3445 reply =
3446 xcb_randr_get_screen_resources_current_reply(_ecore_xcb_conn,
3447 cookie, NULL);
3448 return reply;
3449}
3450
3451static xcb_timestamp_t
3452_ecore_xcb_randr_12_get_resource_timestamp(Ecore_X_Window win)
3453{
3454 xcb_timestamp_t stamp = 0;
3455 xcb_randr_get_screen_resources_reply_t *reply;
3456
3457 reply = _ecore_xcb_randr_12_get_resources(win);
3458 stamp = reply->config_timestamp;
3459 free(reply);
3460 return stamp;
3461}
3462
3463static xcb_timestamp_t
3464_ecore_xcb_randr_13_get_resource_timestamp(Ecore_X_Window win)
3465{
3466 xcb_timestamp_t stamp = 0;
3467 xcb_randr_get_screen_resources_current_reply_t *reply;
3468
3469 reply = _ecore_xcb_randr_13_get_resources(win);
3470 stamp = reply->config_timestamp;
3471 free(reply);
3472 return stamp;
3473}
3474
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_region.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_region.c
new file mode 100644
index 0000000..a221d8f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_region.c
@@ -0,0 +1,159 @@
1#include "ecore_xcb_private.h"
2#include <pixman.h>
3
4/*
5 * [ ] XPolygonRegion
6 * [ ] XShrinkRegion
7 * [ ] XClipBox
8 * [ ] XXorRegion
9 */
10
11EAPI Ecore_X_XRegion *
12ecore_x_xregion_new()
13{
14 pixman_region16_t *region;
15
16 region = (pixman_region16_t *)malloc(sizeof(pixman_region16_t));
17 if (!region) return NULL;
18
19 pixman_region_init(region);
20
21 return (Ecore_X_XRegion *)region;
22}
23
24EAPI void
25ecore_x_xregion_free(Ecore_X_XRegion *region)
26{
27 if (!region) return;
28
29 pixman_region_fini(region);
30 free(region);
31}
32
33EAPI Eina_Bool
34ecore_x_xregion_set(Ecore_X_XRegion *region,
35 Ecore_X_GC gc)
36{
37 xcb_rectangle_t *rects;
38 pixman_box16_t *boxes;
39 int num = 0, i = 0;
40
41 CHECK_XCB_CONN;
42
43 if (!region) return EINA_FALSE;
44
45 boxes = pixman_region_rectangles((pixman_region16_t *)region, &num);
46 if ((!boxes) || (num == 0)) return EINA_FALSE;
47
48 rects = (xcb_rectangle_t *)malloc(sizeof(xcb_rectangle_t) * num);
49 if (!rects) return EINA_FALSE;
50
51 for (i = 0; i < num; i++)
52 {
53 rects[i].x = boxes[i].x1;
54 rects[i].y = boxes[i].y1;
55 rects[i].width = boxes[i].x2 - boxes[i].x1 + 1;
56 rects[i].height = boxes[i].y2 - boxes[i].y1 + 1;
57 }
58
59 xcb_set_clip_rectangles(_ecore_xcb_conn, XCB_CLIP_ORDERING_YX_BANDED,
60 gc, 0, 0, num, rects);
61
62// ecore_x_flush();
63 return EINA_TRUE;
64}
65
66EAPI void
67ecore_x_xregion_translate(Ecore_X_XRegion *region,
68 int x,
69 int y)
70{
71 if (!region) return;
72
73 pixman_region_translate((pixman_region16_t *)region, x, y);
74}
75
76EAPI Eina_Bool
77ecore_x_xregion_intersect(Ecore_X_XRegion *dst,
78 Ecore_X_XRegion *r1,
79 Ecore_X_XRegion *r2)
80{
81 return pixman_region_intersect((pixman_region16_t *)dst,
82 (pixman_region16_t *)r1,
83 (pixman_region16_t *)r2);
84}
85
86EAPI Eina_Bool
87ecore_x_xregion_union(Ecore_X_XRegion *dst,
88 Ecore_X_XRegion *r1,
89 Ecore_X_XRegion *r2)
90{
91 return pixman_region_union((pixman_region16_t *)dst,
92 (pixman_region16_t *)r1,
93 (pixman_region16_t *)r2);
94}
95
96EAPI Eina_Bool
97ecore_x_xregion_union_rect(Ecore_X_XRegion *dst,
98 Ecore_X_XRegion *src,
99 Ecore_X_Rectangle *rect)
100{
101 return pixman_region_union_rect((pixman_region16_t *)dst,
102 (pixman_region16_t *)src,
103 rect->x, rect->y, rect->width, rect->height);
104}
105
106EAPI Eina_Bool
107ecore_x_xregion_subtract(Ecore_X_XRegion *dst,
108 Ecore_X_XRegion *rm,
109 Ecore_X_XRegion *rs)
110{
111 return pixman_region_subtract((pixman_region16_t *)dst,
112 (pixman_region16_t *)rm,
113 (pixman_region16_t *)rs);
114}
115
116EAPI Eina_Bool
117ecore_x_xregion_is_empty(Ecore_X_XRegion *region)
118{
119 if (!region) return EINA_TRUE;
120
121 return !pixman_region_not_empty((pixman_region16_t *)region);
122}
123
124EAPI Eina_Bool
125ecore_x_xregion_is_equal(Ecore_X_XRegion *r1,
126 Ecore_X_XRegion *r2)
127{
128 if ((!r1) || (!r2)) return EINA_FALSE;
129
130 return pixman_region_equal((pixman_region16_t *)r1,
131 (pixman_region16_t *)r2);
132}
133
134EAPI Eina_Bool
135ecore_x_xregion_point_contain(Ecore_X_XRegion *region,
136 int x,
137 int y)
138{
139 if (!region) return EINA_FALSE;
140
141 return pixman_region_contains_point((pixman_region16_t *)region, x, y, NULL);
142}
143
144EAPI Eina_Bool
145ecore_x_xregion_rect_contain(Ecore_X_XRegion *region,
146 Ecore_X_Rectangle *rect)
147{
148 pixman_box16_t box;
149
150 if ((!region) || (!rect)) return EINA_FALSE;
151
152 box.x1 = rect->x;
153 box.y1 = rect->y;
154 box.x2 = rect->x + rect->width - 1;
155 box.y2 = rect->y + rect->height - 1;
156
157 return pixman_region_contains_rectangle((pixman_region16_t *)region, &box);
158}
159
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_render.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_render.c
new file mode 100644
index 0000000..f36b4d2
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_render.c
@@ -0,0 +1,225 @@
1#include "ecore_xcb_private.h"
2#include <ctype.h> // for isupper/tolower
3#ifdef ECORE_XCB_RENDER
4# include <xcb/render.h>
5# include <xcb/xcb_renderutil.h>
6#endif
7
8/* local function prototypes */
9static Eina_Bool _ecore_xcb_render_parse_boolean(char *v);
10
11/* local variables */
12static Eina_Bool _render_avail = EINA_FALSE;
13static Eina_Bool _render_argb = EINA_FALSE;
14static Eina_Bool _render_anim = EINA_FALSE;
15
16void
17_ecore_xcb_render_init(void)
18{
19 LOGFN(__FILE__, __LINE__, __FUNCTION__);
20
21#ifdef ECORE_XCB_RENDER
22 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_render_id);
23#endif
24}
25
26void
27_ecore_xcb_render_finalize(void)
28{
29#ifdef ECORE_XCB_RENDER
30 const xcb_query_extension_reply_t *ext_reply;
31#endif
32
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
34
35#ifdef ECORE_XCB_RENDER
36 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_render_id);
37 if ((ext_reply) && (ext_reply->present))
38 {
39 xcb_render_query_version_cookie_t cookie;
40 xcb_render_query_version_reply_t *reply;
41
42 cookie =
43 xcb_render_query_version_unchecked(_ecore_xcb_conn,
44 XCB_RENDER_MAJOR_VERSION,
45 XCB_RENDER_MINOR_VERSION);
46 reply = xcb_render_query_version_reply(_ecore_xcb_conn, cookie, NULL);
47 if (reply)
48 {
49// if ((reply->major_version >= XCB_RENDER_MAJOR_VERSION) &&
50 if (reply->minor_version >= XCB_RENDER_MINOR_VERSION)
51 {
52 char *v = NULL;
53
54 _render_avail = EINA_TRUE;
55 _ecore_xcb_xdefaults_init();
56 if ((reply->major_version > 0) || (reply->minor_version >= 5))
57 {
58 _render_argb = EINA_TRUE;
59 v = getenv("XCURSOR_CORE");
60 if (!v)
61 v = _ecore_xcb_xdefaults_string_get("Xcursor", "core");
62 if ((v) && (_ecore_xcb_render_parse_boolean(v)))
63 _render_argb = EINA_FALSE;
64 }
65 if ((_render_argb) &&
66 ((reply->major_version > 0) || (reply->minor_version >= 8)))
67 {
68 _render_anim = EINA_TRUE;
69 v = getenv("XCURSOR_ANIM");
70 if (!v)
71 v = _ecore_xcb_xdefaults_string_get("Xcursor", "anim");
72 if ((v) && (_ecore_xcb_render_parse_boolean(v)))
73 _render_anim = EINA_FALSE;
74 }
75 _ecore_xcb_xdefaults_shutdown();
76 }
77 }
78 free(reply);
79 }
80#endif
81}
82
83Eina_Bool
84_ecore_xcb_render_avail_get(void)
85{
86 return _render_avail;
87}
88
89Eina_Bool
90_ecore_xcb_render_argb_get(void)
91{
92 return _render_argb;
93}
94
95Eina_Bool
96_ecore_xcb_render_anim_get(void)
97{
98 return _render_anim;
99}
100
101Eina_Bool
102_ecore_xcb_render_visual_supports_alpha(Ecore_X_Visual visual)
103{
104 Eina_Bool ret = EINA_FALSE;
105#ifdef ECORE_XCB_RENDER
106 const xcb_render_query_pict_formats_reply_t *reply;
107 xcb_render_pictvisual_t *vis;
108#endif
109
110 LOGFN(__FILE__, __LINE__, __FUNCTION__);
111 CHECK_XCB_CONN;
112
113 if (!visual) return EINA_FALSE;
114 if (!_render_avail) return EINA_FALSE;
115
116#ifdef ECORE_XCB_RENDER
117 reply = xcb_render_util_query_formats(_ecore_xcb_conn);
118 if (!reply) return EINA_FALSE;
119
120 vis =
121 xcb_render_util_find_visual_format(reply,
122 ((xcb_visualtype_t *)visual)->visual_id);
123 if (vis)
124 {
125 xcb_render_pictforminfo_t temp;
126 xcb_render_pictforminfo_t *format;
127
128 temp.id = vis->format;
129 format =
130 xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID, &temp, 0);
131
132 if ((format->type == XCB_RENDER_PICT_TYPE_DIRECT) &&
133 (format->direct.alpha_mask))
134 ret = EINA_TRUE;
135 }
136
137#endif
138
139 return ret;
140}
141
142uint32_t
143_ecore_xcb_render_find_visual_id(int type,
144 Eina_Bool check_alpha)
145{
146#ifdef ECORE_XCB_RENDER
147 const xcb_render_query_pict_formats_reply_t *reply;
148 xcb_render_pictvisual_t *visual = NULL;
149 xcb_render_pictscreen_iterator_t screens;
150 xcb_render_pictdepth_iterator_t depths;
151 xcb_render_pictvisual_iterator_t visuals;
152#endif
153
154 LOGFN(__FILE__, __LINE__, __FUNCTION__);
155 CHECK_XCB_CONN;
156
157 if (!_render_avail) return 0;
158
159#ifdef ECORE_XCB_RENDER
160 reply = xcb_render_util_query_formats(_ecore_xcb_conn);
161 if (!reply) return 0;
162
163 for (screens = xcb_render_query_pict_formats_screens_iterator(reply);
164 screens.rem; xcb_render_pictscreen_next(&screens))
165 {
166 for (depths = xcb_render_pictscreen_depths_iterator(screens.data);
167 depths.rem; xcb_render_pictdepth_next(&depths))
168 {
169 for (visuals = xcb_render_pictdepth_visuals_iterator(depths.data);
170 visuals.rem; xcb_render_pictvisual_next(&visuals))
171 {
172 xcb_render_pictforminfo_t temp;
173 xcb_render_pictforminfo_t *format;
174
175 visual = visuals.data;
176 temp.id = visual->format;
177
178 format =
179 xcb_render_util_find_format(reply, XCB_PICT_FORMAT_ID,
180 &temp, 0);
181 if (!format) continue;
182 if (format->type == type)
183 {
184 if (check_alpha)
185 {
186 if (format->direct.alpha_mask)
187 return visual->visual;
188 }
189 else
190 return visual->visual;
191 }
192 }
193 }
194 }
195#endif
196
197 return 0;
198}
199
200/* local function prototypes */
201static Eina_Bool
202_ecore_xcb_render_parse_boolean(char *v)
203{
204 char c;
205
206 c = *v;
207 if (isupper((int)c))
208 c = tolower(c);
209 if ((c == 't') || (c == 'y') || (c == '1'))
210 return EINA_TRUE;
211 if ((c == 'f') || (c == 'n') || (c == '0'))
212 return EINA_FALSE;
213 if (c == 'o')
214 {
215 char d;
216
217 d = v[1];
218 if (isupper((int)d))
219 d = tolower(d);
220 if (d == 'n') return EINA_TRUE;
221 if (d == 'f') return EINA_FALSE;
222 }
223 return EINA_FALSE;
224}
225
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_screensaver.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_screensaver.c
new file mode 100644
index 0000000..cb7249f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_screensaver.c
@@ -0,0 +1,338 @@
1#include "ecore_xcb_private.h"
2# ifdef ECORE_XCB_SCREENSAVER
3# include <xcb/screensaver.h>
4# endif
5
6/* local variables */
7static Eina_Bool _screensaver_avail = EINA_FALSE;
8
9/* external variables */
10int _ecore_xcb_event_screensaver = -1;
11
12void
13_ecore_xcb_screensaver_init(void)
14{
15 LOGFN(__FILE__, __LINE__, __FUNCTION__);
16
17#ifdef ECORE_XCB_SCREENSAVER
18 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_screensaver_id);
19#endif
20}
21
22void
23_ecore_xcb_screensaver_finalize(void)
24{
25#ifdef ECORE_XCB_SCREENSAVER
26 const xcb_query_extension_reply_t *ext_reply;
27#endif
28
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
30
31#ifdef ECORE_XCB_SCREENSAVER
32 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_screensaver_id);
33 if ((ext_reply) && (ext_reply->present))
34 {
35 xcb_screensaver_query_version_cookie_t cookie;
36 xcb_screensaver_query_version_reply_t *reply;
37
38 cookie =
39 xcb_screensaver_query_version_unchecked(_ecore_xcb_conn,
40 XCB_SCREENSAVER_MAJOR_VERSION,
41 XCB_SCREENSAVER_MINOR_VERSION);
42 reply =
43 xcb_screensaver_query_version_reply(_ecore_xcb_conn, cookie, NULL);
44 if (reply)
45 {
46 if ((reply->server_major_version >= XCB_SCREENSAVER_MAJOR_VERSION) &&
47 (reply->server_minor_version >= XCB_SCREENSAVER_MINOR_VERSION))
48 _screensaver_avail = EINA_TRUE;
49
50 free(reply);
51 }
52
53 if (_screensaver_avail)
54 _ecore_xcb_event_screensaver = ext_reply->first_event;
55 }
56#endif
57}
58
59EAPI int
60ecore_x_screensaver_idle_time_get(void)
61{
62 int ret = 0;
63#ifdef ECORE_XCB_SCREENSAVER
64 xcb_screensaver_query_info_cookie_t cookie;
65 xcb_screensaver_query_info_reply_t *reply;
66 Ecore_X_Window root;
67#endif
68
69 LOGFN(__FILE__, __LINE__, __FUNCTION__);
70 CHECK_XCB_CONN;
71
72 if (!_screensaver_avail) return 0;
73
74#ifdef ECORE_XCB_SCREENSAVER
75 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
76 cookie = xcb_screensaver_query_info_unchecked(_ecore_xcb_conn, root);
77 reply = xcb_screensaver_query_info_reply(_ecore_xcb_conn, cookie, NULL);
78 if (!reply) return 0;
79 ret = (reply->ms_until_server / 1000);
80 free(reply);
81#endif
82
83 return ret;
84}
85
86EAPI void
87ecore_x_screensaver_set(int timeout,
88 int interval,
89 int prefer_blanking,
90 int allow_exposures)
91{
92 LOGFN(__FILE__, __LINE__, __FUNCTION__);
93 CHECK_XCB_CONN;
94
95 if (!_screensaver_avail) return;
96
97#ifdef ECORE_XCB_SCREENSAVER
98 xcb_set_screen_saver(_ecore_xcb_conn,
99 timeout, interval, prefer_blanking, allow_exposures);
100#endif
101}
102
103EAPI void
104ecore_x_screensaver_timeout_set(int timeout)
105{
106#ifdef ECORE_XCB_SCREENSAVER
107 xcb_get_screen_saver_cookie_t cookie;
108 xcb_get_screen_saver_reply_t *reply;
109 uint16_t pint;
110 uint8_t pblank, pexpo;
111#endif
112
113 LOGFN(__FILE__, __LINE__, __FUNCTION__);
114 CHECK_XCB_CONN;
115
116 if (!_screensaver_avail) return;
117
118#ifdef ECORE_XCB_SCREENSAVER
119 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
120 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
121 if (!reply) return;
122 pint = reply->interval;
123 pblank = reply->prefer_blanking;
124 pexpo = reply->allow_exposures;
125 free(reply);
126 xcb_set_screen_saver(_ecore_xcb_conn, timeout, pint, pblank, pexpo);
127#endif
128}
129
130EAPI int
131ecore_x_screensaver_timeout_get(void)
132{
133 int timeout = 0;
134#ifdef ECORE_XCB_SCREENSAVER
135 xcb_get_screen_saver_cookie_t cookie;
136 xcb_get_screen_saver_reply_t *reply;
137#endif
138
139 LOGFN(__FILE__, __LINE__, __FUNCTION__);
140 CHECK_XCB_CONN;
141
142 if (!_screensaver_avail) return 0;
143
144#ifdef ECORE_XCB_SCREENSAVER
145 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
146 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
147 if (!reply) return 0;
148 timeout = reply->timeout;
149 free(reply);
150#endif
151
152 return timeout;
153}
154
155EAPI void
156ecore_x_screensaver_blank_set(int blank)
157{
158#ifdef ECORE_XCB_SCREENSAVER
159 xcb_get_screen_saver_cookie_t cookie;
160 xcb_get_screen_saver_reply_t *reply;
161 uint16_t pint, pto;
162 uint8_t pexpo;
163#endif
164
165 LOGFN(__FILE__, __LINE__, __FUNCTION__);
166 CHECK_XCB_CONN;
167
168 if (!_screensaver_avail) return;
169
170#ifdef ECORE_XCB_SCREENSAVER
171 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
172 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
173 if (!reply) return;
174 pto = reply->timeout;
175 pint = reply->interval;
176 pexpo = reply->allow_exposures;
177 free(reply);
178 xcb_set_screen_saver(_ecore_xcb_conn, pto, pint, blank, pexpo);
179#endif
180}
181
182EAPI int
183ecore_x_screensaver_blank_get(void)
184{
185 int blank = 0;
186#ifdef ECORE_XCB_SCREENSAVER
187 xcb_get_screen_saver_cookie_t cookie;
188 xcb_get_screen_saver_reply_t *reply;
189#endif
190
191 LOGFN(__FILE__, __LINE__, __FUNCTION__);
192 CHECK_XCB_CONN;
193
194 if (!_screensaver_avail) return 0;
195
196#ifdef ECORE_XCB_SCREENSAVER
197 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
198 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
199 if (!reply) return 0;
200 blank = reply->prefer_blanking;
201 free(reply);
202#endif
203
204 return blank;
205}
206
207EAPI void
208ecore_x_screensaver_expose_set(int expose)
209{
210#ifdef ECORE_XCB_SCREENSAVER
211 xcb_get_screen_saver_cookie_t cookie;
212 xcb_get_screen_saver_reply_t *reply;
213 uint16_t pint, pto;
214 uint8_t pblank;
215#endif
216
217 LOGFN(__FILE__, __LINE__, __FUNCTION__);
218 CHECK_XCB_CONN;
219
220 if (!_screensaver_avail) return;
221
222#ifdef ECORE_XCB_SCREENSAVER
223 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
224 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
225 if (!reply) return;
226 pto = reply->timeout;
227 pint = reply->interval;
228 pblank = reply->prefer_blanking;
229 free(reply);
230 xcb_set_screen_saver(_ecore_xcb_conn, pto, pint, pblank, expose);
231#endif
232}
233
234EAPI int
235ecore_x_screensaver_expose_get(void)
236{
237 int expose = 0;
238#ifdef ECORE_XCB_SCREENSAVER
239 xcb_get_screen_saver_cookie_t cookie;
240 xcb_get_screen_saver_reply_t *reply;
241#endif
242
243 LOGFN(__FILE__, __LINE__, __FUNCTION__);
244 CHECK_XCB_CONN;
245
246 if (!_screensaver_avail) return 0;
247
248#ifdef ECORE_XCB_SCREENSAVER
249 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
250 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
251 if (!reply) return 0;
252 expose = reply->allow_exposures;
253 free(reply);
254#endif
255
256 return expose;
257}
258
259EAPI void
260ecore_x_screensaver_interval_set(int interval)
261{
262#ifdef ECORE_XCB_SCREENSAVER
263 xcb_get_screen_saver_cookie_t cookie;
264 xcb_get_screen_saver_reply_t *reply;
265 uint16_t pto;
266 uint8_t pblank, pexpose;
267#endif
268
269 LOGFN(__FILE__, __LINE__, __FUNCTION__);
270 CHECK_XCB_CONN;
271
272 if (!_screensaver_avail) return;
273
274#ifdef ECORE_XCB_SCREENSAVER
275 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
276 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
277 if (!reply) return;
278 pto = reply->timeout;
279 pblank = reply->prefer_blanking;
280 pexpose = reply->allow_exposures;
281 free(reply);
282 xcb_set_screen_saver(_ecore_xcb_conn, pto, interval, pblank, pexpose);
283#endif
284}
285
286EAPI int
287ecore_x_screensaver_interval_get(void)
288{
289 int interval = 0;
290#ifdef ECORE_XCB_SCREENSAVER
291 xcb_get_screen_saver_cookie_t cookie;
292 xcb_get_screen_saver_reply_t *reply;
293#endif
294
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
296 CHECK_XCB_CONN;
297
298 if (!_screensaver_avail) return 0;
299
300#ifdef ECORE_XCB_SCREENSAVER
301 cookie = xcb_get_screen_saver_unchecked(_ecore_xcb_conn);
302 reply = xcb_get_screen_saver_reply(_ecore_xcb_conn, cookie, NULL);
303 if (!reply) return 0;
304 interval = reply->interval;
305 free(reply);
306#endif
307
308 return interval;
309}
310
311EAPI void
312ecore_x_screensaver_event_listen_set(Eina_Bool on)
313{
314#ifdef ECORE_XCB_SCREENSAVER
315 Ecore_X_Window root;
316#endif
317
318 LOGFN(__FILE__, __LINE__, __FUNCTION__);
319 CHECK_XCB_CONN;
320
321 if (!_screensaver_avail) return;
322
323#ifdef ECORE_XCB_SCREENSAVER
324 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
325 if (on)
326 xcb_screensaver_select_input(_ecore_xcb_conn, root,
327 XCB_SCREENSAVER_EVENT_NOTIFY_MASK);
328 else
329 xcb_screensaver_select_input(_ecore_xcb_conn, root, 0);
330#endif
331}
332
333EAPI Eina_Bool
334ecore_x_screensaver_event_available_get(void)
335{
336 return _screensaver_avail;
337}
338
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c
new file mode 100644
index 0000000..7b994bd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_selection.c
@@ -0,0 +1,1039 @@
1#include "ecore_xcb_private.h"
2//#include "Ecore_X_Atoms.h"
3
4#define ECORE_XCB_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x))
5
6/* local function prototypes */
7static Eina_Bool _ecore_xcb_selection_converter_text(char *target,
8 void *data,
9 int size,
10 void **data_ret,
11 int *size_ret,
12 Ecore_X_Atom *type,
13 int *size_type);
14static void *_ecore_xcb_selection_parser_text(const char *target __UNUSED__,
15 void *data,
16 int size,
17 int format __UNUSED__);
18static void *_ecore_xcb_selection_parser_files(const char *target,
19 void *data,
20 int size,
21 int format __UNUSED__);
22static void *_ecore_xcb_selection_parser_targets(const char *target __UNUSED__,
23 void *data,
24 int size,
25 int format __UNUSED__);
26
27//static int _ecore_xcb_selection_data_free(void *data);
28static int _ecore_xcb_selection_data_text_free(void *data);
29static int _ecore_xcb_selection_data_targets_free(void *data);
30static int _ecore_xcb_selection_data_files_free(void *data);
31static int _ecore_xcb_selection_data_default_free(void *data);
32static Eina_Bool _ecore_xcb_selection_set(Ecore_X_Window win,
33 const void *data,
34 int size,
35 Ecore_X_Atom selection);
36static void _ecore_xcb_selection_request(Ecore_X_Window win,
37 Ecore_X_Atom selection,
38 const char *target);
39static Ecore_X_Atom _ecore_xcb_selection_target_atom_get(const char *target);
40
41/* local variables */
42static Ecore_X_Selection_Intern _selections[4];
43static Ecore_X_Selection_Converter *_converters = NULL;
44static Ecore_X_Selection_Parser *_parsers = NULL;
45
46/* local functions */
47void
48_ecore_xcb_selection_init(void)
49{
50 LOGFN(__FILE__, __LINE__, __FUNCTION__);
51
52 memset(_selections, 0, sizeof(_selections));
53
54 /* init converters */
55 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_TEXT,
56 _ecore_xcb_selection_converter_text);
57 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_UTF8_STRING,
58 _ecore_xcb_selection_converter_text);
59 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_COMPOUND_TEXT,
60 _ecore_xcb_selection_converter_text);
61 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_STRING,
62 _ecore_xcb_selection_converter_text);
63
64 /* init parsers */
65 ecore_x_selection_parser_add("text/plain",
66 _ecore_xcb_selection_parser_text);
67 ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_UTF8_STRING,
68 _ecore_xcb_selection_parser_text);
69 ecore_x_selection_parser_add("text/uri-list",
70 _ecore_xcb_selection_parser_files);
71 ecore_x_selection_parser_add("_NETSCAPE_URL",
72 _ecore_xcb_selection_parser_files);
73 ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_TARGETS,
74 _ecore_xcb_selection_parser_targets);
75}
76
77void
78_ecore_xcb_selection_shutdown(void)
79{
80 Ecore_X_Selection_Converter *cnv;
81 Ecore_X_Selection_Parser *prs;
82
83 LOGFN(__FILE__, __LINE__, __FUNCTION__);
84
85 /* free selection converters */
86 cnv = _converters;
87 while (cnv)
88 {
89 Ecore_X_Selection_Converter *tmp;
90
91 tmp = cnv->next;
92 free(cnv);
93 cnv = tmp;
94 }
95 _converters = NULL;
96
97 /* free parsers */
98 prs = _parsers;
99 while (prs)
100 {
101 Ecore_X_Selection_Parser *tmp;
102
103 tmp = prs;
104 prs = prs->next;
105 free(tmp->target);
106 free(tmp);
107 }
108 _parsers = NULL;
109}
110
111/* public functions */
112EAPI void
113ecore_x_selection_converter_atom_add(Ecore_X_Atom target,
114 Eina_Bool (*func)(char *target,
115 void *data,
116 int size,
117 void **data_ret,
118 int *size_ret,
119 Ecore_X_Atom *type,
120 int *size_type))
121{
122 Ecore_X_Selection_Converter *cnv;
123
124 LOGFN(__FILE__, __LINE__, __FUNCTION__);
125
126 cnv = _converters;
127 if (_converters)
128 {
129 while (1)
130 {
131 if (cnv->target == target)
132 {
133 cnv->convert = func;
134 return;
135 }
136 if (cnv->next)
137 cnv = cnv->next;
138 else
139 break;
140 }
141 cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
142 if (!cnv->next) return;
143 cnv = cnv->next;
144 }
145 else
146 {
147 _converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
148 if (!_converters) return;
149 cnv = _converters;
150 }
151 cnv->target = target;
152 cnv->convert = func;
153}
154
155EAPI void
156ecore_x_selection_converter_add(char *target,
157 Eina_Bool (*func)(char *target,
158 void *data,
159 int size,
160 void **date_ret,
161 int *size_ret,
162 Ecore_X_Atom *atom_ret,
163 int *ret))
164{
165 Ecore_X_Atom atarget;
166
167 LOGFN(__FILE__, __LINE__, __FUNCTION__);
168
169 if ((!func) || (!target)) return;
170 atarget = _ecore_xcb_selection_target_atom_get(target);
171 ecore_x_selection_converter_atom_add(atarget, func);
172}
173
174EAPI void
175ecore_x_selection_converter_del(char *target)
176{
177 Ecore_X_Atom atarget;
178
179 LOGFN(__FILE__, __LINE__, __FUNCTION__);
180
181 if (!target) return;
182 atarget = _ecore_xcb_selection_target_atom_get(target);
183 ecore_x_selection_converter_atom_del(atarget);
184}
185
186EAPI void
187ecore_x_selection_converter_atom_del(Ecore_X_Atom target)
188{
189 Ecore_X_Selection_Converter *conv, *pconv = NULL;
190
191 LOGFN(__FILE__, __LINE__, __FUNCTION__);
192
193 conv = _converters;
194 while (conv)
195 {
196 if (conv->target == target)
197 {
198 if (pconv)
199 pconv->next = conv->next;
200 else
201 _converters = conv->next;
202 free(conv);
203 return;
204 }
205 pconv = conv;
206 conv = conv->next;
207 }
208}
209
210EAPI void
211ecore_x_selection_parser_add(const char *target,
212 void *(*func)(const char *target, void *data, int size, int format))
213{
214 Ecore_X_Selection_Parser *prs;
215
216 LOGFN(__FILE__, __LINE__, __FUNCTION__);
217
218 if (!target) return;
219 prs = _parsers;
220 if (prs)
221 {
222 while (prs->next)
223 {
224 if (!strcmp(prs->target, target))
225 {
226 prs->parse = func;
227 return;
228 }
229 prs = prs->next;
230 }
231 prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
232 prs = prs->next;
233 }
234 else
235 {
236 _parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
237 prs = _parsers;
238 }
239 prs->target = strdup(target);
240 prs->parse = func;
241}
242
243EAPI void
244ecore_x_selection_parser_del(const char *target)
245{
246 Ecore_X_Selection_Parser *prs, *pprs = NULL;
247
248 LOGFN(__FILE__, __LINE__, __FUNCTION__);
249
250 if (!target) return;
251
252 prs = _parsers;
253 while (prs)
254 {
255 if (!strcmp(prs->target, target))
256 {
257 if (pprs)
258 pprs->next = prs->next;
259 else
260 _parsers = prs->next;
261 free(prs->target);
262 free(prs);
263 return;
264 }
265 pprs = prs;
266 prs = prs->next;
267 }
268}
269
270/**
271 * Claim ownership of the PRIMARY selection and set its data.
272 * @param w The window to which this selection belongs
273 * @param data The data associated with the selection
274 * @param size The size of the data buffer in bytes
275 * @return Returns 1 if the ownership of the selection was successfully
276 * claimed, or 0 if unsuccessful.
277 */
278EAPI Eina_Bool
279ecore_x_selection_primary_set(Ecore_X_Window win,
280 const void *data,
281 int size)
282{
283 LOGFN(__FILE__, __LINE__, __FUNCTION__);
284
285 return _ecore_xcb_selection_set(win, data, size,
286 ECORE_X_ATOM_SELECTION_PRIMARY);
287}
288
289/**
290 * Release ownership of the primary selection
291 * @return Returns 1 if the selection was successfully cleared,
292 * or 0 if unsuccessful.
293 */
294EAPI Eina_Bool
295ecore_x_selection_primary_clear(void)
296{
297 LOGFN(__FILE__, __LINE__, __FUNCTION__);
298
299 return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
300 ECORE_X_ATOM_SELECTION_PRIMARY);
301}
302
303EAPI void
304ecore_x_selection_primary_request(Ecore_X_Window win,
305 const char *target)
306{
307 LOGFN(__FILE__, __LINE__, __FUNCTION__);
308
309 _ecore_xcb_selection_request(win, ECORE_X_ATOM_SELECTION_PRIMARY, target);
310}
311
312/**
313 * Claim ownership of the SECONDARY selection and set its data.
314 * @param w The window to which this selection belongs
315 * @param data The data associated with the selection
316 * @param size The size of the data buffer in bytes
317 * @return Returns 1 if the ownership of the selection was successfully
318 * claimed, or 0 if unsuccessful.
319 */
320EAPI Eina_Bool
321ecore_x_selection_secondary_set(Ecore_X_Window win,
322 const void *data,
323 int size)
324{
325 LOGFN(__FILE__, __LINE__, __FUNCTION__);
326
327 return _ecore_xcb_selection_set(win, data, size,
328 ECORE_X_ATOM_SELECTION_SECONDARY);
329}
330
331/**
332 * Release ownership of the secondary selection
333 * @return Returns 1 if the selection was successfully cleared,
334 * or 0 if unsuccessful.
335 */
336EAPI Eina_Bool
337ecore_x_selection_secondary_clear(void)
338{
339 LOGFN(__FILE__, __LINE__, __FUNCTION__);
340
341 return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
342 ECORE_X_ATOM_SELECTION_SECONDARY);
343}
344
345EAPI void
346ecore_x_selection_secondary_request(Ecore_X_Window win,
347 const char *target)
348{
349 LOGFN(__FILE__, __LINE__, __FUNCTION__);
350
351 _ecore_xcb_selection_request(win, ECORE_X_ATOM_SELECTION_SECONDARY, target);
352}
353
354/**
355 * Claim ownership of the XDND selection and set its data.
356 * @param w The window to which this selection belongs
357 * @param data The data associated with the selection
358 * @param size The size of the data buffer in bytes
359 * @return Returns 1 if the ownership of the selection was successfully
360 * claimed, or 0 if unsuccessful.
361 */
362EAPI Eina_Bool
363ecore_x_selection_xdnd_set(Ecore_X_Window win,
364 const void *data,
365 int size)
366{
367 LOGFN(__FILE__, __LINE__, __FUNCTION__);
368
369 return _ecore_xcb_selection_set(win, data, size,
370 ECORE_X_ATOM_SELECTION_XDND);
371}
372
373/**
374 * Release ownership of the XDND selection
375 * @return Returns 1 if the selection was successfully cleared,
376 * or 0 if unsuccessful.
377 */
378EAPI Eina_Bool
379ecore_x_selection_xdnd_clear(void)
380{
381 LOGFN(__FILE__, __LINE__, __FUNCTION__);
382
383 return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
384 ECORE_X_ATOM_SELECTION_XDND);
385}
386
387EAPI void
388ecore_x_selection_xdnd_request(Ecore_X_Window win,
389 const char *target)
390{
391 Ecore_X_Atom atom;
392 Ecore_X_DND_Target *_target;
393
394 LOGFN(__FILE__, __LINE__, __FUNCTION__);
395 CHECK_XCB_CONN;
396
397 _target = _ecore_xcb_dnd_target_get();
398 atom = _ecore_xcb_selection_target_atom_get(target);
399
400 xcb_convert_selection(_ecore_xcb_conn, win, ECORE_X_ATOM_SELECTION_XDND,
401 atom, ECORE_X_ATOM_SELECTION_PROP_XDND, _target->time);
402}
403
404/**
405 * Claim ownership of the CLIPBOARD selection and set its data.
406 * @param w The window to which this selection belongs
407 * @param data The data associated with the selection
408 * @param size The size of the data buffer in bytes
409 * @return Returns 1 if the ownership of the selection was successfully
410 * claimed, or 0 if unsuccessful.
411 *
412 * Get the converted data from a previous CLIPBOARD selection
413 * request. The buffer must be freed when done with.
414 */
415EAPI Eina_Bool
416ecore_x_selection_clipboard_set(Ecore_X_Window win,
417 const void *data,
418 int size)
419{
420 LOGFN(__FILE__, __LINE__, __FUNCTION__);
421
422 return _ecore_xcb_selection_set(win, data, size,
423 ECORE_X_ATOM_SELECTION_CLIPBOARD);
424}
425
426/**
427 * Release ownership of the clipboard selection
428 * @return Returns 1 if the selection was successfully cleared,
429 * or 0 if unsuccessful.
430 */
431EAPI Eina_Bool
432ecore_x_selection_clipboard_clear(void)
433{
434 LOGFN(__FILE__, __LINE__, __FUNCTION__);
435
436 return _ecore_xcb_selection_set(XCB_NONE, NULL, 0,
437 ECORE_X_ATOM_SELECTION_CLIPBOARD);
438}
439
440EAPI void
441ecore_x_selection_clipboard_request(Ecore_X_Window win,
442 const char *target)
443{
444 LOGFN(__FILE__, __LINE__, __FUNCTION__);
445
446 _ecore_xcb_selection_request(win, ECORE_X_ATOM_SELECTION_CLIPBOARD, target);
447}
448
449EAPI Eina_Bool
450ecore_x_selection_convert(Ecore_X_Atom selection,
451 Ecore_X_Atom target,
452 void **data_ret,
453 int *size,
454 Ecore_X_Atom *targtype,
455 int *typesize)
456{
457 Ecore_X_Selection_Intern *sel;
458 Ecore_X_Selection_Converter *cnv;
459 void *data;
460 char *tgt_str;
461
462 LOGFN(__FILE__, __LINE__, __FUNCTION__);
463
464 sel = _ecore_xcb_selection_get(selection);
465 tgt_str = _ecore_xcb_selection_target_get(target);
466
467 for (cnv = _converters; cnv; cnv = cnv->next)
468 {
469 if (cnv->target == target)
470 {
471 int r = 0;
472
473 r = cnv->convert(tgt_str, sel->data, sel->length, &data, size,
474 targtype, typesize);
475 free(tgt_str);
476 if (r)
477 {
478 if (data_ret) *data_ret = data;
479 return r;
480 }
481 else
482 return EINA_FALSE;
483 }
484 }
485
486 return EINA_FALSE;
487}
488
489EAPI Eina_Bool
490ecore_x_selection_notify_send(Ecore_X_Window requestor,
491 Ecore_X_Atom selection,
492 Ecore_X_Atom target,
493 Ecore_X_Atom property,
494 Ecore_X_Time tim)
495{
496 xcb_selection_notify_event_t ev;
497
498 LOGFN(__FILE__, __LINE__, __FUNCTION__);
499 CHECK_XCB_CONN;
500
501 memset(&ev, 0, sizeof(xcb_selection_notify_event_t));
502
503 ev.response_type = XCB_SELECTION_NOTIFY;
504 ev.requestor = requestor;
505 ev.selection = selection;
506 ev.target = target;
507 ev.property = property;
508 ev.time = tim;
509
510 xcb_send_event(_ecore_xcb_conn, 0, requestor,
511 XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
512// ecore_x_flush();
513
514 return EINA_TRUE;
515}
516
517EAPI void
518ecore_x_selection_owner_set(Ecore_X_Window win,
519 Ecore_X_Atom atom,
520 Ecore_X_Time tim)
521{
522 LOGFN(__FILE__, __LINE__, __FUNCTION__);
523 CHECK_XCB_CONN;
524
525 xcb_set_selection_owner(_ecore_xcb_conn, win, atom, tim);
526}
527
528EAPI Ecore_X_Window
529ecore_x_selection_owner_get(Ecore_X_Atom atom)
530{
531 xcb_get_selection_owner_cookie_t cookie;
532 xcb_get_selection_owner_reply_t *reply;
533 Ecore_X_Window ret;
534
535 LOGFN(__FILE__, __LINE__, __FUNCTION__);
536 CHECK_XCB_CONN;
537
538 cookie = xcb_get_selection_owner(_ecore_xcb_conn, atom);
539 reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
540 if (!reply) return 0;
541 ret = reply->owner;
542 free(reply);
543 return ret;
544}
545
546void *
547_ecore_xcb_selection_parse(const char *target,
548 void *data,
549 int size,
550 int format)
551{
552 Ecore_X_Selection_Parser *prs;
553 Ecore_X_Selection_Data *sel;
554
555 for (prs = _parsers; prs; prs = prs->next)
556 {
557 if (!strcmp(prs->target, target))
558 {
559 sel = prs->parse(target, data, size, format);
560 if (sel) return sel;
561 }
562 }
563
564 sel = calloc(1, sizeof(Ecore_X_Selection_Data));
565 if (!sel) return NULL;
566 sel->free = _ecore_xcb_selection_data_default_free;
567 sel->length = size;
568 sel->format = format;
569 sel->data = data;
570
571 return sel;
572}
573
574Ecore_X_Selection_Intern *
575_ecore_xcb_selection_get(Ecore_X_Atom selection)
576{
577 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
578 return &_selections[0];
579 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
580 return &_selections[1];
581 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
582 return &_selections[2];
583 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
584 return &_selections[3];
585 else
586 return NULL;
587}
588
589/* local functions */
590static Eina_Bool
591_ecore_xcb_selection_set(Ecore_X_Window win,
592 const void *data,
593 int size,
594 Ecore_X_Atom selection)
595{
596 xcb_get_selection_owner_cookie_t cookie;
597 xcb_get_selection_owner_reply_t *reply;
598 int in = 0;
599
600 LOGFN(__FILE__, __LINE__, __FUNCTION__);
601 CHECK_XCB_CONN;
602
603 xcb_set_selection_owner(_ecore_xcb_conn, win, selection, XCB_CURRENT_TIME);
604
605 cookie = xcb_get_selection_owner(_ecore_xcb_conn, selection);
606 reply = xcb_get_selection_owner_reply(_ecore_xcb_conn, cookie, NULL);
607 if (!reply) return EINA_FALSE;
608
609 if (reply->owner != win)
610 {
611 free(reply);
612 return EINA_FALSE;
613 }
614 free(reply);
615
616 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
617 in = 0;
618 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
619 in = 1;
620 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
621 in = 2;
622 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
623 in = 3;
624 else
625 return EINA_FALSE;
626
627 if (data)
628 {
629 unsigned char *buff = NULL;
630
631 _selections[in].win = win;
632 _selections[in].selection = selection;
633 _selections[in].length = size;
634 _selections[in].time = _ecore_xcb_events_last_time_get();
635
636 buff = malloc(size);
637 if (!buff) return EINA_FALSE;
638 memcpy(buff, data, size);
639 _selections[in].data = buff;
640 }
641 else if (_selections[in].data)
642 {
643 free(_selections[in].data);
644 memset(&_selections[in], 0, sizeof(Ecore_X_Selection_Data));
645 }
646
647 return EINA_TRUE;
648}
649
650static void
651_ecore_xcb_selection_request(Ecore_X_Window win,
652 Ecore_X_Atom selection,
653 const char *target)
654{
655 Ecore_X_Atom atarget, prop;
656
657 LOGFN(__FILE__, __LINE__, __FUNCTION__);
658 CHECK_XCB_CONN;
659
660 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
661 prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
662 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
663 prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
664 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
665 prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
666 else
667 return;
668
669 atarget = _ecore_xcb_selection_target_atom_get(target);
670
671 xcb_convert_selection(_ecore_xcb_conn, win, selection, atarget, prop,
672 XCB_CURRENT_TIME);
673}
674
675static Eina_Bool
676_ecore_xcb_selection_converter_text(char *target,
677 void *data,
678 int size,
679 void **data_ret,
680 int *size_ret,
681 Ecore_X_Atom *type __UNUSED__,
682 int *size_type __UNUSED__)
683{
684 Ecore_Xcb_Encoding_Style style;
685 Ecore_Xcb_Textproperty ret;
686 char *str;
687
688 LOGFN(__FILE__, __LINE__, __FUNCTION__);
689 CHECK_XCB_CONN;
690
691 if ((!data) || (!size)) return EINA_FALSE;
692
693 if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
694 style = XcbTextStyle;
695 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
696 style = XcbCompoundTextStyle;
697 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
698 style = XcbStringStyle;
699 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
700 style = XcbUTF8StringStyle;
701 else
702 return EINA_FALSE;
703
704 str = alloca(size + 1);
705 memcpy(str, data, size);
706 str[size] = '\0';
707
708#ifdef HAVE_ICONV
709 if (_ecore_xcb_utf8_textlist_to_textproperty(&str, 1, style, &ret))
710 {
711 int size = 0;
712
713 size = (strlen((char *)ret.value) + 1);
714 *data_ret = malloc(size);
715 if (!*data_ret) return EINA_FALSE;
716 memcpy(*data_ret, ret.value, size);
717 *size_ret = size;
718 if (ret.value) free(ret.value);
719 return EINA_TRUE;
720 }
721#else
722 if (_ecore_xcb_mb_textlist_to_textproperty(&str, 1, style, &ret))
723 {
724 int size = 0;
725
726 size = (strlen((char *)ret.value) + 1);
727 *data_ret = malloc(size);
728 if (!*data_ret) return EINA_FALSE;
729 memcpy(*data_ret, ret.value, size);
730 *size_ret = size;
731 if (ret.value) free(ret.value);
732 return EINA_TRUE;
733 }
734#endif
735 else
736 return EINA_TRUE;
737
738 return EINA_FALSE;
739}
740
741static void *
742_ecore_xcb_selection_parser_text(const char *target __UNUSED__,
743 void *data,
744 int size,
745 int format __UNUSED__)
746{
747 Ecore_X_Selection_Data_Text *sel;
748 unsigned char *_data;
749 void *t;
750
751 LOGFN(__FILE__, __LINE__, __FUNCTION__);
752
753 if (!(_data = data)) return NULL;
754
755 sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text));
756 if (!sel) return NULL;
757
758 if (_data[size - 1])
759 {
760 size++;
761 t = realloc(_data, size);
762 if (!t)
763 {
764 free(sel);
765 return NULL;
766 }
767 _data = t;
768 _data[size - 1] = 0;
769 }
770 sel->text = (char *)_data;
771 ECORE_XCB_SELECTION_DATA(sel)->length = size;
772 ECORE_XCB_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TEXT;
773 ECORE_XCB_SELECTION_DATA(sel)->data = _data;
774 ECORE_XCB_SELECTION_DATA(sel)->free = _ecore_xcb_selection_data_text_free;
775 return sel;
776}
777
778static void *
779_ecore_xcb_selection_parser_files(const char *target,
780 void *data,
781 int size,
782 int format __UNUSED__)
783{
784 Ecore_X_Selection_Data_Files *sel;
785 char *_data, *tmp, *t, **t2;
786 int i = 0, is = 0;
787
788 LOGFN(__FILE__, __LINE__, __FUNCTION__);
789
790 if ((strcmp(target, "text/uri-list")) &&
791 (strcmp(target, "_NETSCAPE_URL"))) return NULL;
792
793 if (!(_data = data)) return NULL;
794
795 sel = calloc(1, sizeof(Ecore_X_Selection_Data_Files));
796 if (!sel) return NULL;
797
798 ECORE_XCB_SELECTION_DATA(sel)->free = _ecore_xcb_selection_data_files_free;
799
800 if (_data[size - 1])
801 {
802 size++;
803 t = realloc(_data, size);
804 if (!t)
805 {
806 free(sel);
807 return NULL;
808 }
809 _data = t;
810 _data[size - 1] = 0;
811 }
812
813 tmp = malloc(size);
814 if (!tmp)
815 {
816 free(sel);
817 return NULL;
818 }
819
820 while ((is < size) && (_data[is]))
821 {
822 if ((i == 0) && (_data[is] == '#'))
823 {
824 for (; ((_data[is]) && (_data[is] != '\n')); is++) ;
825 }
826 else
827 {
828 if ((_data[is] != '\r') && (_data[is] != '\n'))
829 tmp[i++] = _data[is++];
830 else
831 {
832 while ((_data[is] == '\r') || (_data[is] == '\n'))
833 is++;
834 tmp[i] = 0;
835 sel->num_files++;
836 t2 = realloc(sel->files, sel->num_files * sizeof(char *));
837 if (t2)
838 {
839 sel->files = t2;
840 sel->files[sel->num_files - 1] = strdup(tmp);
841 }
842 tmp[0] = 0;
843 i = 0;
844 }
845 }
846 }
847 if (i > 0)
848 {
849 tmp[i] = 0;
850 sel->num_files++;
851 t2 = realloc(sel->files, sel->num_files * sizeof(char *));
852 if (t2)
853 {
854 sel->files = t2;
855 sel->files[sel->num_files - 1] = strdup(tmp);
856 }
857 }
858 if (tmp) free(tmp);
859 if (_data) free(_data);
860
861 ECORE_XCB_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_FILES;
862 ECORE_XCB_SELECTION_DATA(sel)->length = sel->num_files;
863
864 return ECORE_XCB_SELECTION_DATA(sel);
865}
866
867static void *
868_ecore_xcb_selection_parser_targets(const char *target __UNUSED__,
869 void *data,
870 int size,
871 int format __UNUSED__)
872{
873 Ecore_X_Selection_Data_Targets *sel;
874 unsigned long *targets;
875 int i = 0;
876
877 LOGFN(__FILE__, __LINE__, __FUNCTION__);
878 CHECK_XCB_CONN;
879
880 if (!(targets = (unsigned long *)data)) return NULL;
881
882 sel = calloc(1, sizeof(Ecore_X_Selection_Data_Targets));
883 if (!sel) return NULL;
884
885 sel->num_targets = (size - 2);
886 sel->targets = malloc((size - 2) * sizeof(char *));
887 if (!sel->targets)
888 {
889 free(sel);
890 return NULL;
891 }
892
893 for (i = 2; i < size; i++)
894 {
895 xcb_get_atom_name_cookie_t cookie;
896 xcb_get_atom_name_reply_t *reply;
897 char *name = NULL;
898 int len = 0;
899
900 cookie = xcb_get_atom_name_unchecked(_ecore_xcb_conn, targets[i]);
901 reply = xcb_get_atom_name_reply(_ecore_xcb_conn, cookie, NULL);
902 if (reply)
903 {
904 len = xcb_get_atom_name_name_length(reply);
905 name = (char *)malloc(sizeof(char) * (len + 1));
906 if (name)
907 {
908 memcpy(name, xcb_get_atom_name_name(reply), len);
909 name[len] = '\0';
910 sel->targets[i - 2] = name;
911 }
912 free(reply);
913 }
914 }
915
916 ECORE_XCB_SELECTION_DATA(sel)->free =
917 _ecore_xcb_selection_data_targets_free;
918 ECORE_XCB_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TARGETS;
919 ECORE_XCB_SELECTION_DATA(sel)->length = size;
920 ECORE_XCB_SELECTION_DATA(sel)->data = data;
921
922 return sel;
923}
924
925/*
926 static int
927 _ecore_xcb_selection_data_free(void *data)
928 {
929 Ecore_X_Selection_Data *sel;
930
931 LOGFN(__FILE__, __LINE__, __FUNCTION__);
932
933 if (!(sel = data)) return 0;
934 if (sel->data) free(sel->data);
935 free(sel);
936 return 1;
937 }
938 */
939
940static int
941_ecore_xcb_selection_data_text_free(void *data)
942{
943 Ecore_X_Selection_Data_Text *sel;
944
945 LOGFN(__FILE__, __LINE__, __FUNCTION__);
946
947 if (!(sel = data)) return 0;
948 if (sel->text) free(sel->text);
949 free(sel);
950 return 1;
951}
952
953static int
954_ecore_xcb_selection_data_targets_free(void *data)
955{
956 Ecore_X_Selection_Data_Targets *sel;
957
958 LOGFN(__FILE__, __LINE__, __FUNCTION__);
959
960 if (!(sel = data)) return 0;
961 if (sel->targets)
962 {
963 int i = 0;
964
965 for (i = 0; i < sel->num_targets; i++)
966 if (sel->targets[i]) free(sel->targets[i]);
967 if (sel->targets) free(sel->targets);
968 }
969 free(sel);
970 return 1;
971}
972
973static int
974_ecore_xcb_selection_data_files_free(void *data)
975{
976 Ecore_X_Selection_Data_Files *sel;
977
978 LOGFN(__FILE__, __LINE__, __FUNCTION__);
979
980 if (!(sel = data)) return 0;
981 if (sel->files)
982 {
983 int i = 0;
984
985 for (i = 0; i < sel->num_files; i++)
986 if (sel->files[i]) free(sel->files[i]);
987 if (sel->files) free(sel->files);
988 }
989 free(sel);
990 return 0;
991}
992
993static int
994_ecore_xcb_selection_data_default_free(void *data)
995{
996 Ecore_X_Selection_Data *sel;
997
998 if (!(sel = data)) return 1;
999 free(sel->data);
1000 free(sel);
1001 return 1;
1002}
1003
1004static Ecore_X_Atom
1005_ecore_xcb_selection_target_atom_get(const char *target)
1006{
1007 Ecore_X_Atom x_target;
1008
1009 if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
1010 x_target = ECORE_X_ATOM_TEXT;
1011 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
1012 x_target = ECORE_X_ATOM_COMPOUND_TEXT;
1013 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
1014 x_target = ECORE_X_ATOM_STRING;
1015 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
1016 x_target = ECORE_X_ATOM_UTF8_STRING;
1017 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
1018 x_target = ECORE_X_ATOM_FILE_NAME;
1019 else
1020 x_target = ecore_x_atom_get(target);
1021
1022 return x_target;
1023}
1024
1025char *
1026_ecore_xcb_selection_target_get(Ecore_X_Atom target)
1027{
1028 if (target == ECORE_X_ATOM_FILE_NAME)
1029 return strdup(ECORE_X_SELECTION_TARGET_FILENAME);
1030 else if (target == ECORE_X_ATOM_STRING)
1031 return strdup(ECORE_X_SELECTION_TARGET_STRING);
1032 else if (target == ECORE_X_ATOM_UTF8_STRING)
1033 return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
1034 else if (target == ECORE_X_ATOM_TEXT)
1035 return strdup(ECORE_X_SELECTION_TARGET_TEXT);
1036 else
1037 return ecore_x_atom_name_get(target);
1038}
1039
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_shape.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_shape.c
new file mode 100644
index 0000000..913f199
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_shape.c
@@ -0,0 +1,50 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_SHAPE
3# include <xcb/shape.h>
4#endif
5
6/* external variables */
7int _ecore_xcb_event_shape = -1;
8
9void
10_ecore_xcb_shape_init(void)
11{
12 LOGFN(__FILE__, __LINE__, __FUNCTION__);
13
14#ifdef ECORE_XCB_SHAPE
15 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_shape_id);
16#endif
17}
18
19void
20_ecore_xcb_shape_finalize(void)
21{
22#ifdef ECORE_XCB_SHAPE
23 const xcb_query_extension_reply_t *ext_reply;
24#endif
25
26 LOGFN(__FILE__, __LINE__, __FUNCTION__);
27
28#ifdef ECORE_XCB_SHAPE
29 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_shape_id);
30 if ((ext_reply) && (ext_reply->present))
31 {
32 xcb_shape_query_version_cookie_t cookie;
33 xcb_shape_query_version_reply_t *reply;
34 Eina_Bool _shape_avail;
35
36 _shape_avail = EINA_FALSE;
37 cookie = xcb_shape_query_version_unchecked(_ecore_xcb_conn);
38 reply = xcb_shape_query_version_reply(_ecore_xcb_conn, cookie, NULL);
39 if (reply)
40 {
41 _shape_avail = EINA_TRUE;
42 free(reply);
43 }
44
45 if (_shape_avail)
46 _ecore_xcb_event_shape = ext_reply->first_event;
47 }
48#endif
49}
50
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c
new file mode 100644
index 0000000..75f4e4f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_sync.c
@@ -0,0 +1,338 @@
1#include "ecore_xcb_private.h"
2# ifdef ECORE_XCB_SYNC
3# include <xcb/sync.h>
4# endif
5
6/* local variables */
7static Eina_Bool _sync_avail = EINA_FALSE;
8
9/* external variables */
10int _ecore_xcb_event_sync = -1;
11
12void
13_ecore_xcb_sync_init(void)
14{
15 LOGFN(__FILE__, __LINE__, __FUNCTION__);
16
17#ifdef ECORE_XCB_SYNC
18 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_sync_id);
19#endif
20}
21
22void
23_ecore_xcb_sync_finalize(void)
24{
25#ifdef ECORE_XCB_SYNC
26 const xcb_query_extension_reply_t *ext_reply;
27#endif
28
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
30
31#ifdef ECORE_XCB_SYNC
32 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_sync_id);
33 if ((ext_reply) && (ext_reply->present))
34 {
35 xcb_sync_initialize_cookie_t cookie;
36 xcb_sync_initialize_reply_t *reply;
37
38 cookie =
39 xcb_sync_initialize_unchecked(_ecore_xcb_conn,
40 XCB_SYNC_MAJOR_VERSION,
41 XCB_SYNC_MINOR_VERSION);
42 reply = xcb_sync_initialize_reply(_ecore_xcb_conn, cookie, NULL);
43 if (reply)
44 {
45 if (reply->major_version >= 3) _sync_avail = EINA_TRUE;
46 free(reply);
47 }
48
49 if (_sync_avail)
50 _ecore_xcb_event_sync = ext_reply->first_event;
51 }
52#endif
53}
54
55void
56_ecore_xcb_sync_magic_send(int val,
57 Ecore_X_Window win)
58{
59 xcb_client_message_event_t ev;
60
61 LOGFN(__FILE__, __LINE__, __FUNCTION__);
62
63 memset(&ev, 0, sizeof(xcb_client_message_event_t));
64 ev.response_type = XCB_CLIENT_MESSAGE;
65 ev.format = 32;
66 ev.window = win;
67 ev.type = 27777;
68 ev.data.data32[0] = 0x7162534;
69 ev.data.data32[1] = (0x10000000 + val);
70 ev.data.data32[2] = win;
71
72 xcb_send_event(_ecore_xcb_conn, 0, win, XCB_EVENT_MASK_NO_EVENT,
73 (const char *)&ev);
74// ecore_x_flush();
75}
76
77/* public functions */
78EAPI Ecore_X_Sync_Alarm
79ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
80{
81#ifdef ECORE_XCB_SYNC
82 uint32_t list[6], mask;
83 xcb_sync_int64_t init;
84 Ecore_X_Sync_Alarm alarm;
85#endif
86
87 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 CHECK_XCB_CONN;
89
90 if ((!_sync_avail) || (!counter)) return 0;
91
92#ifdef ECORE_XCB_SYNC
93 init.lo = 0;
94 init.hi = 0;
95 xcb_sync_set_counter(_ecore_xcb_conn, counter, init);
96
97 mask = (XCB_SYNC_CA_COUNTER | XCB_SYNC_CA_VALUE_TYPE |
98 XCB_SYNC_CA_VALUE | XCB_SYNC_CA_TEST_TYPE |
99 XCB_SYNC_CA_DELTA | XCB_SYNC_CA_EVENTS);
100 list[0] = counter;
101 list[1] = XCB_SYNC_VALUETYPE_ABSOLUTE;
102 list[2] = 1;
103 list[3] = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
104 list[4] = 1;
105 list[5] = 1;
106 alarm = xcb_generate_id(_ecore_xcb_conn);
107
108 xcb_sync_create_alarm(_ecore_xcb_conn, alarm, mask, list);
109 ecore_x_sync(); // needed
110
111 return alarm;
112#endif
113 return 0;
114}
115
116EAPI Eina_Bool
117ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)
118{
119 LOGFN(__FILE__, __LINE__, __FUNCTION__);
120 CHECK_XCB_CONN;
121
122 if ((!_sync_avail) || (!alarm)) return EINA_FALSE;
123
124#ifdef ECORE_XCB_SYNC
125 xcb_sync_destroy_alarm(_ecore_xcb_conn, alarm);
126// ecore_x_flush();
127 return EINA_TRUE;
128#endif
129
130 return EINA_FALSE;
131}
132
133EAPI Eina_Bool
134ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
135 unsigned int *val)
136{
137#ifdef ECORE_XCB_SYNC
138 xcb_sync_query_counter_cookie_t cookie;
139 xcb_sync_query_counter_reply_t *reply;
140#endif
141
142 LOGFN(__FILE__, __LINE__, __FUNCTION__);
143 CHECK_XCB_CONN;
144
145 if ((!_sync_avail) || (!counter)) return EINA_FALSE;
146
147#ifdef ECORE_XCB_SYNC
148 cookie = xcb_sync_query_counter_unchecked(_ecore_xcb_conn, counter);
149 reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
150 if (reply)
151 {
152 if (val) *val = (unsigned int)reply->counter_value.lo;
153 free(reply);
154 return EINA_TRUE;
155 }
156#endif
157 return EINA_FALSE;
158}
159
160EAPI void
161ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
162 int by)
163{
164#ifdef ECORE_XCB_SYNC
165 xcb_sync_int64_t v;
166#endif
167
168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
169 CHECK_XCB_CONN;
170
171 if ((!_sync_avail) || (!counter)) return;
172
173#ifdef ECORE_XCB_SYNC
174 v.hi = (by < 0) ? ~0 : 0;
175 v.lo = by;
176
177 xcb_sync_change_counter(_ecore_xcb_conn, counter, v);
178// ecore_x_flush();
179#endif
180}
181
182EAPI void
183ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
184 int val)
185{
186#ifdef ECORE_XCB_SYNC
187 xcb_sync_query_counter_cookie_t cookie;
188 xcb_sync_query_counter_reply_t *reply;
189 xcb_sync_int64_t v1, v2;
190 xcb_sync_waitcondition_t cond;
191#endif
192
193 LOGFN(__FILE__, __LINE__, __FUNCTION__);
194 CHECK_XCB_CONN;
195
196 if ((!_sync_avail) || (!counter)) return;
197
198#ifdef ECORE_XCB_SYNC
199 cookie = xcb_sync_query_counter_unchecked(_ecore_xcb_conn, counter);
200 reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
201 if (!reply) return;
202 v1 = reply->counter_value;
203 free(reply);
204
205 v1.hi = (val < 0) ? ~0 : 0;
206 v1.lo = val;
207 v2.hi = ((val + 1) < 0) ? ~0 : 0;
208 v2.lo = (val + 1);
209
210 cond.trigger.counter = counter;
211 cond.trigger.wait_type = XCB_SYNC_VALUETYPE_ABSOLUTE;
212 cond.trigger.wait_value = v1;
213 cond.trigger.test_type = XCB_SYNC_TESTTYPE_POSITIVE_COMPARISON;
214 cond.event_threshold = v2;
215
216 xcb_sync_await(_ecore_xcb_conn, 1, &cond);
217// ecore_x_flush();
218#endif
219}
220
221EAPI Ecore_X_Sync_Counter
222ecore_x_sync_counter_new(int val)
223{
224#ifdef ECORE_XCB_SYNC
225 xcb_sync_counter_t counter;
226 xcb_sync_int64_t v;
227#endif
228
229 LOGFN(__FILE__, __LINE__, __FUNCTION__);
230 CHECK_XCB_CONN;
231
232 if (!_sync_avail) return 0;
233
234#ifdef ECORE_XCB_SYNC
235 v.hi = (val < 0) ? ~0 : 0;
236 v.lo = val;
237
238 counter = xcb_generate_id(_ecore_xcb_conn);
239 xcb_sync_create_counter(_ecore_xcb_conn, counter, v);
240// ecore_x_flush();
241
242 return counter;
243#endif
244
245 return 0;
246}
247
248EAPI void
249ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
250{
251 LOGFN(__FILE__, __LINE__, __FUNCTION__);
252 CHECK_XCB_CONN;
253
254 if ((!_sync_avail) || (!counter)) return;
255
256#ifdef ECORE_XCB_SYNC
257 xcb_sync_destroy_counter(_ecore_xcb_conn, counter);
258// ecore_x_flush();
259#endif
260}
261
262EAPI void
263ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
264 int val)
265{
266#ifdef ECORE_XCB_SYNC
267 xcb_sync_int64_t v;
268#endif
269
270 LOGFN(__FILE__, __LINE__, __FUNCTION__);
271 CHECK_XCB_CONN;
272
273 if ((!_sync_avail) || (!counter)) return;
274
275#ifdef ECORE_XCB_SYNC
276 v.hi = (val < 0) ? ~0 : 0;
277 v.lo = val;
278
279 xcb_sync_set_counter(_ecore_xcb_conn, counter, v);
280// ecore_x_flush();
281#endif
282}
283
284EAPI void
285ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
286 int val_hi,
287 unsigned int val_lo)
288{
289#ifdef ECORE_XCB_SYNC
290 xcb_sync_int64_t v;
291#endif
292
293 LOGFN(__FILE__, __LINE__, __FUNCTION__);
294 CHECK_XCB_CONN;
295
296 if ((!_sync_avail) || (!counter)) return;
297
298#ifdef ECORE_XCB_SYNC
299 v.hi = val_hi;
300 v.lo = val_lo;
301
302 xcb_sync_set_counter(_ecore_xcb_conn, counter, v);
303// ecore_x_flush();
304#endif
305}
306
307EAPI Eina_Bool
308ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
309 int *val_hi,
310 unsigned int *val_lo)
311{
312#ifdef ECORE_XCB_SYNC
313 xcb_sync_query_counter_cookie_t cookie;
314 xcb_sync_query_counter_reply_t *reply;
315 xcb_sync_int64_t value;
316#endif
317
318 LOGFN(__FILE__, __LINE__, __FUNCTION__);
319 CHECK_XCB_CONN;
320
321 if ((!_sync_avail) || (!counter)) return EINA_FALSE;
322
323#ifdef ECORE_XCB_SYNC
324 cookie =
325 xcb_sync_query_counter_unchecked(_ecore_xcb_conn,
326 (xcb_sync_counter_t)counter);
327 reply = xcb_sync_query_counter_reply(_ecore_xcb_conn, cookie, NULL);
328 if (!reply) return EINA_FALSE;
329 value = reply->counter_value;
330 free(reply);
331 if (val_hi) *val_hi = (int)value.hi;
332 if (val_lo) *val_lo = (unsigned int)value.lo;
333 return EINA_TRUE;
334#endif
335
336 return EINA_FALSE;
337}
338
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_textlist.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_textlist.c
new file mode 100644
index 0000000..2a5c854
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_textlist.c
@@ -0,0 +1,509 @@
1#include "ecore_xcb_private.h"
2//#include "Ecore_X_Atoms.h"
3#include <langinfo.h>
4#ifdef HAVE_ICONV
5# include <iconv.h>
6#endif
7#ifndef CODESET
8# define CODESET "INVALID"
9#endif
10
11static int _ecore_xcb_textlist_get_buffer_size(Eina_Bool is_wide,
12 void *list,
13 int count);
14static int _ecore_xcb_textlist_get_wc_len(wchar_t *wstr);
15static void *_ecore_xcb_textlist_alloc_list(Eina_Bool is_wide,
16 int count,
17 int nitems);
18static void _ecore_xcb_textlist_copy_list(Eina_Bool is_wide,
19 void *text,
20 char **list,
21 int count);
22static wchar_t *_ecore_xcb_textlist_copy_wchar(wchar_t *str1,
23 wchar_t *str2);
24static int _ecore_xcb_textlist_len_wchar(wchar_t *str);
25
26#ifdef HAVE_ICONV
27Eina_Bool
28_ecore_xcb_utf8_textlist_to_textproperty(char **list,
29 int count,
30 Ecore_Xcb_Encoding_Style style,
31 Ecore_Xcb_Textproperty *ret)
32{
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
34
35 return _ecore_xcb_textlist_to_textproperty("utf8string", list, count,
36 style, ret);
37}
38
39#endif
40
41Eina_Bool
42_ecore_xcb_mb_textlist_to_textproperty(char **list,
43 int count,
44 Ecore_Xcb_Encoding_Style style,
45 Ecore_Xcb_Textproperty *ret)
46{
47 LOGFN(__FILE__, __LINE__, __FUNCTION__);
48
49 return _ecore_xcb_textlist_to_textproperty("multiByte", list, count,
50 style, ret);
51}
52
53/* NB: This Function May Not Be Correct !!!
54 * (as I do not know text conversion, locales, etc, etc very well)
55 *
56 * Portions were ripped from libX11 XTextListToTextProperty
57 */
58Eina_Bool
59_ecore_xcb_textlist_to_textproperty(const char *type,
60 char **list,
61 int count,
62 Ecore_Xcb_Encoding_Style style,
63 Ecore_Xcb_Textproperty *ret)
64{
65 Eina_Bool is_wide = EINA_FALSE;
66 Ecore_X_Atom encoding;
67 int len = 0, nitems = 0, i = 0;
68 size_t from_left = 0, to_left = 0;
69 int unconv_num = 0, val = 0;
70 char *buff, *to, *value, *from;
71 const char *to_type, *from_type;
72 char **mb = NULL;
73 wchar_t **wc = NULL;
74#ifdef HAVE_ICONV
75 iconv_t conv;
76#endif
77
78 LOGFN(__FILE__, __LINE__, __FUNCTION__);
79
80 if (!strcmp("wideChar", type)) is_wide = EINA_TRUE;
81 len = _ecore_xcb_textlist_get_buffer_size(is_wide, list, count);
82 if (!(buff = (char *)malloc(len * sizeof(char)))) return EINA_FALSE;
83 from_type = nl_langinfo(CODESET);
84 switch (style)
85 {
86 case XcbStringStyle:
87 case XcbStdICCTextStyle:
88 encoding = ECORE_X_ATOM_STRING;
89 to_type = nl_langinfo(CODESET);
90// to_type = "string";
91 break;
92
93 case XcbUTF8StringStyle:
94 encoding = ECORE_X_ATOM_UTF8_STRING;
95 to_type = "UTF-8";
96 break;
97
98 case XcbCompoundTextStyle:
99 encoding = ECORE_X_ATOM_COMPOUND_TEXT;
100 to_type = nl_langinfo(CODESET);
101// to_type = "compoundText";
102 break;
103
104 case XcbTextStyle:
105 encoding = ECORE_X_ATOM_TEXT;
106 to_type = nl_langinfo(CODESET);
107// to_type = "multiByte";
108 if (!is_wide)
109 {
110 nitems = 0;
111 mb = (char **)list;
112 to = buff;
113 for (i = 0; ((i < count) && (len > 0)); i++)
114 {
115 if (*mb) strcpy(to, *mb);
116 else *to = '\0';
117 from_left = (*mb ? strlen(*mb) : 0) + 1;
118 nitems += from_left;
119 to += from_left;
120 mb++;
121 }
122 unconv_num = 0;
123 goto done;
124 }
125 break;
126
127 default:
128 free(buff);
129 return EINA_FALSE;
130 break;
131 }
132
133 if (count < 1)
134 {
135 nitems = 0;
136 goto done;
137 }
138
139retry:
140#ifdef HAVE_ICONV
141 conv = iconv_open(to_type, from_type);
142#endif
143
144 if (is_wide)
145 wc = (wchar_t **)list;
146 else
147 mb = (char **)list;
148
149 to = buff;
150 to_left = len;
151 unconv_num = 0;
152 for (i = 1; to_left > 0; i++)
153 {
154 if (is_wide)
155 {
156 from = (char *)*wc;
157 from_left = _ecore_xcb_textlist_get_wc_len(*wc);
158 wc++;
159 }
160 else
161 {
162 from = *mb;
163 from_left = (*mb ? strlen(*mb) : 0);
164 mb++;
165 }
166
167#ifdef HAVE_ICONV
168 val = iconv(conv, &from, &from_left, &to, &to_left);
169#endif
170 if (val < 0) continue;
171 if ((val > 0) && (style == XcbStdICCTextStyle) &&
172 (encoding == ECORE_X_ATOM_STRING))
173 {
174#ifdef HAVE_ICONV
175 iconv_close(conv);
176#endif
177 encoding = ECORE_X_ATOM_COMPOUND_TEXT;
178 goto retry;
179 }
180
181 unconv_num += val;
182 *to++ = '\0';
183 to_left--;
184 if (i >= count) break;
185 }
186
187#ifdef HAVE_ICONV
188 iconv_close(conv);
189#endif
190 nitems = (to - buff);
191
192done:
193 if (nitems <= 0) nitems = 1;
194 if (!(value = (char *)malloc(nitems * sizeof(char))))
195 {
196 free(buff);
197 return EINA_FALSE;
198 }
199 if (nitems == 1)
200 *value = 0;
201 else
202 memcpy(value, buff, nitems);
203 nitems--;
204 free(buff);
205
206 ret->value = value;
207 ret->encoding = encoding;
208 ret->format = 8;
209 ret->nitems = nitems;
210
211 return EINA_TRUE;
212}
213
214#ifdef HAVE_ICONV
215Eina_Bool
216_ecore_xcb_utf8_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
217 char ***list_ret,
218 int *count_ret)
219{
220 LOGFN(__FILE__, __LINE__, __FUNCTION__);
221
222 return _ecore_xcb_textproperty_to_textlist(text_prop, "utf8String",
223 list_ret, count_ret);
224}
225
226#endif
227
228Eina_Bool
229_ecore_xcb_mb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
230 char ***list_ret,
231 int *count_ret)
232{
233 LOGFN(__FILE__, __LINE__, __FUNCTION__);
234
235 return _ecore_xcb_textproperty_to_textlist(text_prop, "multiByte",
236 list_ret, count_ret);
237}
238
239Eina_Bool
240_ecore_xcb_textproperty_to_textlist(const Ecore_Xcb_Textproperty *text_prop,
241 const char *type,
242 char ***list_ret,
243 int *count_ret)
244{
245 Eina_Bool is_wide = EINA_FALSE;
246 Eina_Bool do_strcpy = EINA_FALSE;
247 const char *from_type;
248 char *buff, *to, *from;
249 char *lptr, *sptr;
250 int nitems = 0, len = 0, num = 0, ret = 0;
251 size_t from_left = 0, to_left = 0;
252#ifdef HAVE_ICONV
253 iconv_t conv = 0;
254#endif
255
256 *list_ret = NULL;
257 *count_ret = 0;
258 if (!strcmp("wideChar", type)) is_wide = EINA_TRUE;
259
260 nitems = text_prop->nitems;
261 if (nitems <= 0) return EINA_TRUE;
262
263 if (text_prop->format != 8) return EINA_FALSE;
264
265 from_type = nl_langinfo(CODESET);
266 if (text_prop->encoding == ECORE_X_ATOM_UTF8_STRING)
267 from_type = "UTF-8";
268
269 if (is_wide)
270 len = (text_prop->nitems + 1) * sizeof(wchar_t);
271 else
272 {
273 if (!strcmp(type, "utf8String"))
274 len = text_prop->nitems * 6 + 1;
275 else
276 len = text_prop->nitems * MB_CUR_MAX + 1;
277 }
278
279 buff = (char *)malloc(len * sizeof(char));
280 if (!buff) return EINA_FALSE;
281
282 to = buff;
283 to_left = len;
284
285 if (!strcmp(from_type, type))
286 do_strcpy = EINA_TRUE;
287 else
288 {
289#ifdef HAVE_ICONV
290 conv = iconv_open(type, from_type);
291#endif
292 if (!conv)
293 {
294 free(buff);
295 return EINA_FALSE;
296 }
297 }
298
299 lptr = sptr = text_prop->value;
300 num = *count_ret = 0;
301 while (1)
302 {
303 if ((nitems == 0) || (*sptr == 0))
304 {
305 from = lptr;
306 from_left = sptr - lptr;
307 lptr = sptr;
308 if (do_strcpy)
309 {
310 int l = 0;
311
312 l = MIN(from_left, to_left);
313 strncpy(to, from, l);
314 from += len;
315 to += len;
316 from_left -= l;
317 to_left -= l;
318 ret = 0;
319 }
320 else
321 ret = iconv(conv, &from, &from_left, &to, &to_left);
322
323 if (ret < 0) continue;
324 num += ret;
325 (*count_ret)++;
326 if (nitems == 0) break;
327 lptr = ++sptr;
328 if (is_wide)
329 {
330 *((wchar_t *)to) = (wchar_t)0;
331 to += sizeof(wchar_t);
332 to_left -= sizeof(wchar_t);
333 }
334 else
335 {
336 *((char *)to) = '\0';
337 to++;
338 to_left--;
339 }
340 }
341 else
342 sptr++;
343
344 nitems--;
345 }
346
347#if HAVE_ICONV
348 if (!do_strcpy) iconv_close(conv);
349#endif
350
351 if (is_wide)
352 {
353 *((wchar_t *)to) = (wchar_t)0;
354 to_left -= sizeof(wchar_t);
355 }
356 else
357 {
358 *((char *)to) = '\0';
359 to_left--;
360 }
361
362 *list_ret =
363 _ecore_xcb_textlist_alloc_list(is_wide, *count_ret, (len - to_left));
364 if (*list_ret)
365 _ecore_xcb_textlist_copy_list(is_wide, buff, *list_ret, *count_ret);
366
367 free(buff);
368
369 return EINA_TRUE;
370}
371
372static int
373_ecore_xcb_textlist_get_buffer_size(Eina_Bool is_wide,
374 void *list,
375 int count)
376{
377 int len = 0;
378 char **mb;
379 wchar_t **wc;
380
381 if (!list) return 0;
382 if (is_wide)
383 {
384 wc = (wchar_t **)list;
385 for (; count-- > 0; wc++)
386 if (*wc) len += _ecore_xcb_textlist_get_wc_len(*wc) + 1;
387 len *= 5;
388 }
389 else
390 {
391 mb = (char **)list;
392 for (; count-- > 0; mb++)
393 if (*mb) len += strlen(*mb) + 1;
394 len *= 3;
395 }
396 len = (len / 2048 + 1) * 2048;
397 return len;
398}
399
400static int
401_ecore_xcb_textlist_get_wc_len(wchar_t *wstr)
402{
403 wchar_t *ptr;
404
405 ptr = wstr;
406 while (*ptr)
407 ptr++;
408
409 return ptr - wstr;
410}
411
412static void *
413_ecore_xcb_textlist_alloc_list(Eina_Bool is_wide,
414 int count,
415 int nitems)
416{
417 if (is_wide)
418 {
419 wchar_t **list;
420
421 list = (wchar_t **)malloc(count * sizeof(wchar_t *));
422 if (!list) return NULL;
423 *list = (wchar_t *)malloc(nitems * sizeof(wchar_t));
424 if (!*list)
425 {
426 free(list);
427 return NULL;
428 }
429 return *list;
430 }
431 else
432 {
433 char **list;
434
435 list = (char **)malloc(count * sizeof(char *));
436 if (!list) return NULL;
437 *list = (char *)malloc(nitems * sizeof(char));
438 if (!*list)
439 {
440 free(list);
441 return NULL;
442 }
443 return *list;
444 }
445}
446
447static void
448_ecore_xcb_textlist_copy_list(Eina_Bool is_wide,
449 void *text,
450 char **list,
451 int count)
452{
453 int len = 0;
454
455 if (is_wide)
456 {
457 wchar_t *txt, *str, **wlist;
458
459 txt = (wchar_t *)text;
460 wlist = (wchar_t **)list;
461 for (str = *wlist; count > 0; count--, wlist++)
462 {
463 _ecore_xcb_textlist_copy_wchar(str, txt);
464 *wlist = str;
465 len = (_ecore_xcb_textlist_len_wchar(str) + 1);
466 str += len;
467 txt += len;
468 }
469 }
470 else
471 {
472 char *txt, *str, **slist;
473
474 txt = (char *)text;
475 slist = (char **)list;
476 for (str = *slist; count > 0; count--, slist++)
477 {
478 strcpy(str, txt);
479 *slist = str;
480 len = strlen(str) + 1;
481 str += len;
482 txt += len;
483 }
484 }
485}
486
487static wchar_t *
488_ecore_xcb_textlist_copy_wchar(wchar_t *str1,
489 wchar_t *str2)
490{
491 wchar_t *tmp;
492
493 tmp = str1;
494 while ((*str1++ = *str2++))
495 ;
496 return tmp;
497}
498
499static int
500_ecore_xcb_textlist_len_wchar(wchar_t *str)
501{
502 wchar_t *ptr;
503
504 ptr = str;
505 while (*ptr)
506 ptr++;
507 return ptr - str;
508}
509
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_vsync.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_vsync.c
new file mode 100644
index 0000000..47efefc
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_vsync.c
@@ -0,0 +1,375 @@
1#include "ecore_xcb_private.h"
2# include <fcntl.h>
3# include <dlfcn.h>
4# include <X11/Xlib-xcb.h>
5
6#define ECORE_XCB_VSYNC_DRI2 1
7#define DRM_EVENT_CONTEXT_VERSION 2
8
9#ifdef ECORE_XCB_VSYNC_DRI2
10
11/* relevant header bits of dri/drm inlined here to avoid needing external */
12/* headers to build drm */
13typedef unsigned int drm_magic_t;
14
15typedef enum
16{
17 DRM_VBLANK_ABSOLUTE = 0x00000000,
18 DRM_VBLANK_RELATIVE = 0x00000001,
19 DRM_VBLANK_EVENT = 0x04000000,
20 DRM_VBLANK_FLIP = 0x08000000,
21 DRM_VBLANK_NEXTONMISS = 0x10000000,
22 DRM_VBLANK_SECONDARY = 0x20000000,
23 DRM_VBLANK_SIGNAL = 0x40000000
24} drmVBlankSeqType;
25
26typedef struct _drmVBlankReq
27{
28 drmVBlankSeqType type;
29 unsigned int sequence;
30 unsigned long signal;
31} drmVBlankReq;
32
33typedef struct _drmVBlankReply
34{
35 drmVBlankSeqType type;
36 unsigned int sequence;
37 long tval_sec, tval_usec;
38} drmVBlankReply;
39
40typedef union _drmVBlank
41{
42 drmVBlankReq request;
43 drmVBlankReply reply;
44} drmVBlank;
45
46typedef struct _drmEventContext
47{
48 int version;
49 void (*vblank_handler)(int fd,
50 unsigned int sequence,
51 unsigned int tv_sec,
52 unsigned int tv_usec,
53 void *user_data);
54 void (*page_flip_handler)(int fd,
55 unsigned int sequence,
56 unsigned int tv_sec,
57 unsigned int tv_usec,
58 void *user_data);
59} drmEventContext;
60
61static int (*sym_drmClose)(int fd) = NULL;
62static int (*sym_drmGetMagic)(int fd,
63 drm_magic_t *magic) = NULL;
64static int (*sym_drmWaitVBlank)(int fd,
65 drmVBlank *vbl) = NULL;
66static int (*sym_drmHandleEvent)(int fd,
67 drmEventContext *evctx) = NULL;
68
69/* dri */
70static Bool (*sym_DRI2QueryExtension)(Display *display,
71 int *eventBase,
72 int *errorBase) = NULL;
73static Bool (*sym_DRI2QueryVersion)(Display *display,
74 int *major,
75 int *minor) = NULL;
76static Bool (*sym_DRI2Connect)(Display *display,
77 XID window,
78 char **driverName,
79 char **deviceName) = NULL;
80static Bool (*sym_DRI2Authenticate)(Display *display,
81 XID window,
82 drm_magic_t magic) = NULL;
83
84/* local function prototypes */
85static Eina_Bool _ecore_xcb_dri_link(void);
86static Eina_Bool _ecore_xcb_dri_start(void);
87static void _ecore_xcb_dri_shutdown(void);
88
89static Eina_Bool _ecore_xcb_dri_cb(void *data __UNUSED__,
90 Ecore_Fd_Handler *fdh __UNUSED__);
91static void _ecore_xcb_dri_tick_begin(void *data __UNUSED__);
92static void _ecore_xcb_dri_tick_end(void *data __UNUSED__);
93static void _ecore_xcb_dri_tick_schedule(void);
94static void _ecore_xcb_dri_vblank_handler(int fd __UNUSED__,
95 unsigned int frame __UNUSED__,
96 unsigned int sec __UNUSED__,
97 unsigned int usec __UNUSED__,
98 void *data __UNUSED__);
99
100/* local variables */
101static Ecore_X_Window _vsync_root = 0;
102static int _drm_fd = -1;
103static Ecore_Fd_Handler *_drm_fdh = NULL;
104static unsigned int _drm_magic = 0;
105static Eina_Bool _drm_event_busy = EINA_FALSE;
106static void *_drm_lib = NULL;
107static void *_dri_lib = NULL;
108static drmEventContext _drm_evctx;
109#endif
110
111void
112_ecore_xcb_dri_init(void)
113{
114 LOGFN(__FILE__, __LINE__, __FUNCTION__);
115}
116
117void
118_ecore_xcb_dri_finalize(void)
119{
120 LOGFN(__FILE__, __LINE__, __FUNCTION__);
121}
122
123EAPI Eina_Bool
124ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win)
125{
126#ifdef ECORE_XCB_VSYNC_DRI2
127 Ecore_X_Window root;
128#endif
129
130 LOGFN(__FILE__, __LINE__, __FUNCTION__);
131 CHECK_XCB_CONN;
132
133#ifdef ECORE_XCB_VSYNC_DRI2
134 root = ecore_x_window_root_get(win);
135 if (root != _vsync_root)
136 {
137 _vsync_root = root;
138 if (_vsync_root)
139 {
140 if (!_ecore_xcb_dri_link())
141 {
142 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
143 return EINA_FALSE;
144 }
145 _ecore_xcb_dri_shutdown();
146 if (!_ecore_xcb_dri_start())
147 {
148 _vsync_root = 0;
149 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
150 return EINA_FALSE;
151 }
152 ecore_animator_custom_source_tick_begin_callback_set
153 (_ecore_xcb_dri_tick_begin, NULL);
154 ecore_animator_custom_source_tick_end_callback_set
155 (_ecore_xcb_dri_tick_end, NULL);
156 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
157 }
158 else
159 {
160 if (_drm_fd >= 0)
161 {
162 _ecore_xcb_dri_shutdown();
163 ecore_animator_custom_source_tick_begin_callback_set
164 (NULL, NULL);
165 ecore_animator_custom_source_tick_end_callback_set
166 (NULL, NULL);
167 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
168 }
169 }
170 }
171 return EINA_TRUE;
172#else
173 return EINA_FALSE;
174 win = 0;
175#endif
176}
177
178/* local functions */
179#ifdef ECORE_XCB_VSYNC_DRI2
180static Eina_Bool
181_ecore_xcb_dri_link(void)
182{
183 const char *_drm_libs[] =
184 {
185 "libdrm.so.2",
186 "libdrm.so.1",
187 "libdrm.so.0",
188 "libdrm.so",
189 NULL,
190 };
191 const char *_dri_libs[] =
192 {
193 "libdri2.so.2",
194 "libdri2.so.1",
195 "libdri2.so.0",
196 "libdri2.so",
197 "libGL.so.4",
198 "libGL.so.3",
199 "libGL.so.2",
200 "libGL.so.1",
201 "libGL.so.0",
202 "libGL.so",
203 NULL,
204 };
205 int i = 0, fail = 0;
206
207 LOGFN(__FILE__, __LINE__, __FUNCTION__);
208
209# define SYM(lib, xx) \
210 do { \
211 sym_## xx = dlsym(lib, #xx); \
212 if (!(sym_## xx)) { \
213 fprintf(stderr, "%s\n", dlerror()); \
214 fail = 1; \
215 } \
216 } while (0);
217
218 if (_drm_lib) return EINA_TRUE;
219
220 for (i = 0; _drm_libs[i]; i++)
221 {
222 _drm_lib = dlopen(_drm_libs[i], (RTLD_LOCAL | RTLD_LAZY));
223 if (_drm_lib)
224 {
225 fail = 0;
226 SYM(_drm_lib, drmClose);
227 SYM(_drm_lib, drmGetMagic);
228 SYM(_drm_lib, drmWaitVBlank);
229 SYM(_drm_lib, drmHandleEvent);
230 if (fail)
231 {
232 dlclose(_drm_lib);
233 _drm_lib = NULL;
234 }
235 else
236 break;
237 }
238 }
239 if (!_drm_lib) return EINA_FALSE;
240 for (i = 0; _dri_libs[i]; i++)
241 {
242 if ((_dri_lib = dlopen(_dri_libs[i], (RTLD_LOCAL | RTLD_LAZY))))
243 {
244 fail = 0;
245 SYM(_dri_lib, DRI2QueryExtension);
246 SYM(_dri_lib, DRI2QueryVersion);
247 SYM(_dri_lib, DRI2Connect);
248 SYM(_dri_lib, DRI2Authenticate);
249 if (fail)
250 {
251 dlclose(_dri_lib);
252 _dri_lib = NULL;
253 }
254 else
255 break;
256 }
257 }
258 if (!_dri_lib)
259 {
260 dlclose(_drm_lib);
261 _drm_lib = NULL;
262 return EINA_FALSE;
263 }
264
265 return EINA_TRUE;
266}
267
268static Eina_Bool
269_ecore_xcb_dri_start(void)
270{
271 Ecore_X_Display *disp;
272 int _dri2_event = 0, _dri2_error = 0;
273 int _dri2_major = 0, _dri2_minor = 0;
274 char *device = NULL, *driver = NULL;
275
276 disp = ecore_x_display_get();
277 if (!sym_DRI2QueryExtension(disp, &_dri2_event, &_dri2_error))
278 return 0;
279 if (!sym_DRI2QueryVersion(disp, &_dri2_major, &_dri2_minor))
280 return 0;
281 if (_dri2_major < 2) return 0;
282 if (!sym_DRI2Connect(disp, _vsync_root, &driver, &device))
283 return 0;
284
285 _drm_fd = open(device, O_RDWR);
286 if (_drm_fd < 0) return 0;
287
288 sym_drmGetMagic(_drm_fd, &_drm_magic);
289 if (!sym_DRI2Authenticate(disp, _vsync_root, _drm_magic))
290 {
291 close(_drm_fd);
292 _drm_fd = -1;
293 return EINA_FALSE;
294 }
295
296 memset(&_drm_evctx, 0, sizeof(_drm_evctx));
297 _drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
298 _drm_evctx.vblank_handler = _ecore_xcb_dri_vblank_handler;
299 _drm_evctx.page_flip_handler = NULL;
300
301 _drm_fdh = ecore_main_fd_handler_add(_drm_fd, ECORE_FD_READ,
302 _ecore_xcb_dri_cb, NULL, NULL, NULL);
303 if (!_drm_fdh)
304 {
305 close(_drm_fd);
306 _drm_fd = -1;
307 return EINA_FALSE;
308 }
309
310 return EINA_TRUE;
311}
312
313static void
314_ecore_xcb_dri_shutdown(void)
315{
316 if (_drm_fd >= 0)
317 {
318 close(_drm_fd);
319 _drm_fd = -1;
320 }
321 if (_drm_fdh)
322 {
323 ecore_main_fd_handler_del(_drm_fdh);
324 _drm_fdh = NULL;
325 }
326}
327
328static Eina_Bool
329_ecore_xcb_dri_cb(void *data __UNUSED__,
330 Ecore_Fd_Handler *fdh __UNUSED__)
331{
332 sym_drmHandleEvent(_drm_fd, &_drm_evctx);
333 return ECORE_CALLBACK_RENEW;
334}
335
336static void
337_ecore_xcb_dri_tick_begin(void *data __UNUSED__)
338{
339 _drm_event_busy = EINA_TRUE;
340 _ecore_xcb_dri_tick_schedule();
341}
342
343static void
344_ecore_xcb_dri_tick_end(void *data __UNUSED__)
345{
346 _drm_event_busy = EINA_FALSE;
347}
348
349static void
350_ecore_xcb_dri_tick_schedule(void)
351{
352 drmVBlank vbl;
353
354 LOGFN(__FILE__, __LINE__, __FUNCTION__);
355 CHECK_XCB_CONN;
356
357 vbl.request.type = (DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT);
358 vbl.request.sequence = 1;
359 vbl.request.signal = 0;
360
361 sym_drmWaitVBlank(_drm_fd, &vbl);
362}
363
364static void
365_ecore_xcb_dri_vblank_handler(int fd __UNUSED__,
366 unsigned int frame __UNUSED__,
367 unsigned int sec __UNUSED__,
368 unsigned int usec __UNUSED__,
369 void *data __UNUSED__)
370{
371 ecore_animator_custom_tick();
372 if (_drm_event_busy) _ecore_xcb_dri_tick_schedule();
373}
374
375#endif
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window.c
new file mode 100644
index 0000000..2616c93
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window.c
@@ -0,0 +1,2233 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_RENDER
3# include <xcb/render.h>
4#endif
5#ifdef ECORE_XCB_SHAPE
6# include <xcb/shape.h>
7#endif
8#ifdef ECORE_XCB_XPRINT
9#include <xcb/xprint.h>
10#endif
11
12/* local function prototypes */
13static Ecore_X_Window _ecore_xcb_window_argb_internal_new(Ecore_X_Window parent,
14 int x,
15 int y,
16 int w,
17 int h,
18 uint8_t override_redirect,
19 uint8_t save_under);
20static Ecore_X_Window _ecore_xcb_window_at_xy_get(Ecore_X_Window base,
21 int bx,
22 int by,
23 int x,
24 int y,
25 Ecore_X_Window *skip,
26 int skip_num);
27static int _ecore_xcb_window_modifiers_get(unsigned int state);
28static xcb_visualtype_t *_ecore_xcb_window_find_visual_by_id(xcb_visualid_t id);
29#ifdef ECORE_XCB_XPRINT
30static xcb_screen_t *_ecore_xcb_window_screen_of_display(int screen);
31#endif
32
33/* local variables */
34static int ignore_num = 0;
35static Ecore_X_Window *ignore_list = NULL;
36
37/* external variables */
38int _ecore_xcb_button_grabs_num = 0;
39int _ecore_xcb_key_grabs_num = 0;
40Ecore_X_Window *_ecore_xcb_button_grabs = NULL;
41Ecore_X_Window *_ecore_xcb_key_grabs = NULL;
42Eina_Bool (*_ecore_xcb_window_grab_replay_func)(void *data,
43 int type,
44 void *event);
45void *_ecore_xcb_window_grab_replay_data;
46
47/**
48 * @defgroup Ecore_X_Window_Create_Group X Window Creation Functions
49 *
50 * Functions that can be used to create an X window.
51 */
52
53/**
54 * Creates a new window.
55 * @param parent The parent window to use. If @p parent is @c 0, the root
56 * window of the default display is used.
57 * @param x X position.
58 * @param y Y position.
59 * @param w Width.
60 * @param h Height.
61 * @return The new window handle.
62 * @ingroup Ecore_X_Window_Create_Group
63 */
64EAPI Ecore_X_Window
65ecore_x_window_new(Ecore_X_Window parent,
66 int x,
67 int y,
68 int w,
69 int h)
70{
71 Ecore_X_Window win;
72 uint32_t mask, mask_list[9];
73
74 LOGFN(__FILE__, __LINE__, __FUNCTION__);
75 CHECK_XCB_CONN;
76
77 if (parent == 0)
78 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
79
80 /* NB: Order here is very important due to xcb_cw_t enum */
81 mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
82 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
83 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER | XCB_CW_EVENT_MASK |
84 XCB_CW_DONT_PROPAGATE);
85
86 mask_list[0] = XCB_BACK_PIXMAP_NONE;
87 mask_list[1] = 0;
88 mask_list[2] = XCB_GRAVITY_NORTH_WEST;
89 mask_list[3] = XCB_GRAVITY_NORTH_WEST;
90 mask_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
91 mask_list[5] = 0;
92 mask_list[6] = 0;
93 mask_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
94 XCB_EVENT_MASK_BUTTON_PRESS |
95 XCB_EVENT_MASK_BUTTON_RELEASE |
96 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
97 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
98 XCB_EVENT_MASK_VISIBILITY_CHANGE |
99 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
100 XCB_EVENT_MASK_FOCUS_CHANGE |
101 XCB_EVENT_MASK_PROPERTY_CHANGE |
102 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
103 mask_list[8] = XCB_EVENT_MASK_NO_EVENT;
104
105 win = xcb_generate_id(_ecore_xcb_conn);
106 xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
107 win, parent, x, y, w, h, 0,
108 XCB_WINDOW_CLASS_INPUT_OUTPUT,
109 XCB_COPY_FROM_PARENT, mask, mask_list);
110
111 if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
112 ecore_x_window_defaults_set(win);
113
114 return win;
115}
116
117/**
118 * Creates a window with the override redirect attribute set to @c True.
119 * @param parent The parent window to use. If @p parent is @c 0, the root
120 * window of the default display is used.
121 * @param x X position.
122 * @param y Y position.
123 * @param w Width.
124 * @param h Height.
125 * @return The new window handle.
126 * @ingroup Ecore_X_Window_Create_Group
127 */
128EAPI Ecore_X_Window
129ecore_x_window_override_new(Ecore_X_Window parent,
130 int x,
131 int y,
132 int w,
133 int h)
134{
135 Ecore_X_Window win;
136 uint32_t mask, mask_list[9];
137
138 LOGFN(__FILE__, __LINE__, __FUNCTION__);
139 CHECK_XCB_CONN;
140
141 if (parent == 0)
142 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
143
144 /* NB: Order here is very important due to xcb_cw_t enum */
145 mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
146 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
147 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER | XCB_CW_EVENT_MASK |
148 XCB_CW_DONT_PROPAGATE);
149
150 mask_list[0] = XCB_BACK_PIXMAP_NONE;
151 mask_list[1] = 0;
152 mask_list[2] = XCB_GRAVITY_NORTH_WEST;
153 mask_list[3] = XCB_GRAVITY_NORTH_WEST;
154 mask_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
155 mask_list[5] = 1;
156 mask_list[6] = 0;
157 mask_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
158 XCB_EVENT_MASK_BUTTON_PRESS |
159 XCB_EVENT_MASK_BUTTON_RELEASE |
160 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
161 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
162 XCB_EVENT_MASK_VISIBILITY_CHANGE |
163 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
164 XCB_EVENT_MASK_FOCUS_CHANGE |
165 XCB_EVENT_MASK_PROPERTY_CHANGE |
166 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
167 mask_list[8] = XCB_EVENT_MASK_NO_EVENT;
168
169 win = xcb_generate_id(_ecore_xcb_conn);
170 xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
171 win, parent, x, y, w, h, 0,
172 XCB_WINDOW_CLASS_INPUT_OUTPUT,
173 XCB_COPY_FROM_PARENT, mask, mask_list);
174
175 return win;
176}
177
178/**
179 * Creates a new input window.
180 * @param parent The parent window to use. If @p parent is @c 0, the root
181 * window of the default display is used.
182 * @param x X position.
183 * @param y Y position.
184 * @param w Width.
185 * @param h Height.
186 * @return The new window.
187 * @ingroup Ecore_X_Window_Create_Group
188 */
189EAPI Ecore_X_Window
190ecore_x_window_input_new(Ecore_X_Window parent,
191 int x,
192 int y,
193 int w,
194 int h)
195{
196 Ecore_X_Window win;
197 uint32_t mask, mask_list[3];
198
199 LOGFN(__FILE__, __LINE__, __FUNCTION__)
200 CHECK_XCB_CONN;
201
202 if (parent == 0)
203 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
204
205 /* NB: Order here is very important due to xcb_cw_t enum */
206 mask = (XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK |
207 XCB_CW_DONT_PROPAGATE);
208
209 mask_list[0] = 1;
210 mask_list[1] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
211 XCB_EVENT_MASK_BUTTON_PRESS |
212 XCB_EVENT_MASK_BUTTON_RELEASE |
213 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
214 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
215 XCB_EVENT_MASK_VISIBILITY_CHANGE |
216 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
217 XCB_EVENT_MASK_FOCUS_CHANGE |
218 XCB_EVENT_MASK_PROPERTY_CHANGE |
219 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
220 mask_list[2] = XCB_EVENT_MASK_NO_EVENT;
221
222 win = xcb_generate_id(_ecore_xcb_conn);
223 xcb_create_window(_ecore_xcb_conn, XCB_COPY_FROM_PARENT,
224 win, parent, x, y, w, h, 0,
225 XCB_WINDOW_CLASS_INPUT_ONLY,
226 XCB_COPY_FROM_PARENT, mask, mask_list);
227
228 return win;
229}
230
231/**
232 * Creates a new window.
233 * @param parent The parent window to use. If @p parent is @c 0, the root
234 * window of the default display is used.
235 * @param x X position.
236 * @param y Y position.
237 * @param w Width.
238 * @param h Height.
239 * @return The new window handle.
240 * @ingroup Ecore_X_Window_Create_Group
241 */
242EAPI Ecore_X_Window
243ecore_x_window_manager_argb_new(Ecore_X_Window parent,
244 int x,
245 int y,
246 int w,
247 int h)
248{
249 Ecore_X_Window win = 0;
250
251 LOGFN(__FILE__, __LINE__, __FUNCTION__);
252
253 win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 1, 0);
254
255 return win;
256}
257
258/**
259 * Creates a new window.
260 * @param parent The parent window to use. If @p parent is @c 0, the root
261 * window of the default display is used.
262 * @param x X position.
263 * @param y Y position.
264 * @param w Width.
265 * @param h Height.
266 * @return The new window handle.
267 * @ingroup Ecore_X_Window_Create_Group
268 */
269EAPI Ecore_X_Window
270ecore_x_window_argb_new(Ecore_X_Window parent,
271 int x,
272 int y,
273 int w,
274 int h)
275{
276 Ecore_X_Window win = 0;
277
278 LOGFN(__FILE__, __LINE__, __FUNCTION__);
279
280 win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 0, 0);
281
282 return win;
283}
284
285/**
286 * Creates a window with the override redirect attribute set to @c True.
287 * @param parent The parent window to use. If @p parent is @c 0, the root
288 * window of the default display is used.
289 * @param x X position.
290 * @param y Y position.
291 * @param w Width.
292 * @param h Height.
293 * @return The new window handle.
294 * @ingroup Ecore_X_Window_Create_Group
295 */
296EAPI Ecore_X_Window
297ecore_x_window_override_argb_new(Ecore_X_Window parent,
298 int x,
299 int y,
300 int w,
301 int h)
302{
303 Ecore_X_Window win = 0;
304
305 LOGFN(__FILE__, __LINE__, __FUNCTION__);
306
307 win = _ecore_xcb_window_argb_internal_new(parent, x, y, w, h, 1, 0);
308
309 return win;
310}
311
312/**
313 * @defgroup Ecore_X_Window_Destroy_Group X Window Destroy Functions
314 *
315 * Functions to destroy X windows.
316 */
317
318/**
319 * Deletes the given window.
320 * @param win The given window.
321 * @ingroup Ecore_X_Window_Destroy_Group
322 */
323EAPI void
324ecore_x_window_free(Ecore_X_Window win)
325{
326 LOGFN(__FILE__, __LINE__, __FUNCTION__);
327 CHECK_XCB_CONN;
328
329 if (win)
330 {
331 /* xcb_destroy_notify_event_t ev; */
332 /* Ecore_X_Window root; */
333
334 /* if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1) */
335 /* root = ((xcb_screen_t *)_ecore_xcb_screen)->root; */
336 /* else */
337 /* { */
338 /* xcb_get_geometry_cookie_t cookie; */
339 /* xcb_get_geometry_reply_t *reply; */
340
341 /* cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win); */
342 /* reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL); */
343 /* if (!reply) return; */
344 /* root = reply->root; */
345 /* free(reply); */
346 /* } */
347
348 /* memset(&ev, 0, sizeof(xcb_destroy_notify_event_t)); */
349
350 /* ev.response_type = XCB_DESTROY_NOTIFY; */
351 /* ev.window = win; */
352 /* ev.event = root; */
353
354 /* xcb_send_event(_ecore_xcb_conn, 0, root, */
355 /* XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | */
356 /* XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, */
357 /* (const char *)&ev); */
358
359 xcb_destroy_window(_ecore_xcb_conn, win);
360// ecore_x_flush();
361 }
362}
363
364/**
365 * Sends a delete request to the given window.
366 * @param win The given window.
367 * @ingroup Ecore_X_Window_Destroy_Group
368 */
369EAPI void
370ecore_x_window_delete_request_send(Ecore_X_Window win)
371{
372 LOGFN(__FILE__, __LINE__, __FUNCTION__);
373
374 if (!win) return;
375 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
376 XCB_EVENT_MASK_NO_EVENT,
377 ECORE_X_ATOM_WM_DELETE_WINDOW,
378 XCB_CURRENT_TIME, 0, 0, 0);
379}
380
381EAPI void
382ecore_x_window_configure(Ecore_X_Window win,
383 Ecore_X_Window_Configure_Mask mask,
384 int x,
385 int y,
386 int w,
387 int h,
388 int border_width,
389 Ecore_X_Window sibling,
390 int stack_mode)
391{
392 uint16_t vmask = 0;
393 uint32_t vlist[7];
394 unsigned int i = 0;
395
396 LOGFN(__FILE__, __LINE__, __FUNCTION__);
397 CHECK_XCB_CONN;
398
399 if (!win) return;
400
401 if (mask & XCB_CONFIG_WINDOW_X)
402 {
403 vmask |= XCB_CONFIG_WINDOW_X;
404 vlist[i++] = x;
405 }
406 if (mask & XCB_CONFIG_WINDOW_Y)
407 {
408 vmask |= XCB_CONFIG_WINDOW_Y;
409 vlist[i++] = y;
410 }
411 if (mask & XCB_CONFIG_WINDOW_WIDTH)
412 {
413 vmask |= XCB_CONFIG_WINDOW_WIDTH;
414 vlist[i++] = w;
415 }
416 if (mask & XCB_CONFIG_WINDOW_HEIGHT)
417 {
418 vmask |= XCB_CONFIG_WINDOW_HEIGHT;
419 vlist[i++] = h;
420 }
421 if (mask & XCB_CONFIG_WINDOW_BORDER_WIDTH)
422 {
423 vmask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
424 vlist[i++] = border_width;
425 }
426 if (mask & XCB_CONFIG_WINDOW_SIBLING)
427 {
428 vmask |= XCB_CONFIG_WINDOW_SIBLING;
429 vlist[i++] = sibling;
430 }
431 if (mask & XCB_CONFIG_WINDOW_STACK_MODE)
432 {
433 vmask |= XCB_CONFIG_WINDOW_STACK_MODE;
434 vlist[i++] = stack_mode;
435 }
436
437 xcb_configure_window(_ecore_xcb_conn, win, vmask,
438 (const uint32_t *)&vlist);
439// ecore_x_flush();
440}
441
442/**
443 * @defgroup Ecore_X_Window_Geometry_Group X Window Geometry Functions
444 *
445 * Functions that change or retrieve the geometry of X windows.
446 */
447
448/**
449 * Moves a window to the position @p x, @p y.
450 *
451 * The position is relative to the upper left hand corner of the
452 * parent window.
453 *
454 * @param win The window to move.
455 * @param x X position.
456 * @param y Y position.
457 * @ingroup Ecore_X_Window_Geometry_Group
458 */
459EAPI void
460ecore_x_window_move(Ecore_X_Window win,
461 int x,
462 int y)
463{
464 uint32_t list[2], mask;
465
466 LOGFN(__FILE__, __LINE__, __FUNCTION__);
467 CHECK_XCB_CONN;
468
469 if (!win) return;
470
471 mask = (XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y);
472 list[0] = x;
473 list[1] = y;
474
475 xcb_configure_window(_ecore_xcb_conn, win, mask,
476 (const uint32_t *)&list);
477// ecore_x_flush();
478}
479
480/**
481 * Resizes a window.
482 * @param win The window to resize.
483 * @param w New width of the window.
484 * @param h New height of the window.
485 * @ingroup Ecore_X_Window_Geometry_Group
486 */
487EAPI void
488ecore_x_window_resize(Ecore_X_Window win,
489 int w,
490 int h)
491{
492 uint32_t list[2], mask;
493
494 LOGFN(__FILE__, __LINE__, __FUNCTION__);
495 CHECK_XCB_CONN;
496
497 if (!win) return;
498 if (w < 1) w = 1;
499 if (h < 1) h = 1;
500
501 mask = (XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT);
502 list[0] = w;
503 list[1] = h;
504
505 xcb_configure_window(_ecore_xcb_conn, win, mask,
506 (const uint32_t *)&list);
507// ecore_x_flush();
508}
509
510/**
511 * Moves and resizes a window.
512 * @param win The window to move and resize.
513 * @param x New X position of the window.
514 * @param y New Y position of the window.
515 * @param w New width of the window.
516 * @param h New height of the window.
517 * @ingroup Ecore_X_Window_Geometry_Group
518 */
519EAPI void
520ecore_x_window_move_resize(Ecore_X_Window win,
521 int x,
522 int y,
523 int w,
524 int h)
525{
526 uint32_t list[4], mask;
527
528 LOGFN(__FILE__, __LINE__, __FUNCTION__);
529 CHECK_XCB_CONN;
530
531 if (!win) return;
532 if (w < 1) w = 1;
533 if (h < 1) h = 1;
534
535 mask = (XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y |
536 XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT);
537 list[0] = x;
538 list[1] = y;
539 list[2] = w;
540 list[3] = h;
541
542 xcb_configure_window(_ecore_xcb_conn, win, mask,
543 (const uint32_t *)&list);
544// ecore_x_flush();
545}
546
547/**
548 * Retrieves the width of the border of the given window.
549 * @param win The given window.
550 * @return Width of the border of @p win.
551 * @ingroup Ecore_X_Window_Geometry_Group
552 */
553EAPI int
554ecore_x_window_border_width_get(Ecore_X_Window win)
555{
556 LOGFN(__FILE__, __LINE__, __FUNCTION__);
557
558 if (!win) return 0;
559 return ecore_x_drawable_border_width_get(win);
560}
561
562/**
563 * Sets the width of the border of the given window.
564 * @param win The given window.
565 * @param width The new border width.
566 * @ingroup Ecore_X_Window_Geometry_Group
567 */
568EAPI void
569ecore_x_window_border_width_set(Ecore_X_Window win,
570 int border_width)
571{
572 uint32_t list;
573
574 LOGFN(__FILE__, __LINE__, __FUNCTION__);
575 CHECK_XCB_CONN;
576
577 if (!win) return;
578
579 list = border_width;
580
581 xcb_configure_window(_ecore_xcb_conn, win,
582 XCB_CONFIG_WINDOW_BORDER_WIDTH, &list);
583// ecore_x_flush();
584}
585
586/**
587 * @defgroup Ecore_X_Window_Z_Order_Group X Window Z Order Functions
588 *
589 * Functions that change the Z order of X windows.
590 */
591
592/**
593 * Raises the given window.
594 * @param win The window to raise.
595 * @ingroup Ecore_X_Window_Z_Order_Group
596 */
597EAPI void
598ecore_x_window_raise(Ecore_X_Window win)
599{
600 uint32_t list[] = { XCB_STACK_MODE_ABOVE };
601
602 LOGFN(__FILE__, __LINE__, __FUNCTION__);
603 CHECK_XCB_CONN;
604
605 xcb_configure_window(_ecore_xcb_conn, win,
606 XCB_CONFIG_WINDOW_STACK_MODE, list);
607// ecore_x_flush();
608}
609
610/**
611 * Lowers the given window.
612 * @param win The window to lower.
613 * @ingroup Ecore_X_Window_Z_Order_Group
614 */
615EAPI void
616ecore_x_window_lower(Ecore_X_Window win)
617{
618 uint32_t list[] = { XCB_STACK_MODE_BELOW };
619
620 LOGFN(__FILE__, __LINE__, __FUNCTION__);
621 CHECK_XCB_CONN;
622
623 xcb_configure_window(_ecore_xcb_conn, win,
624 XCB_CONFIG_WINDOW_STACK_MODE, list);
625// ecore_x_flush();
626}
627
628/**
629 * Retrieves the depth of the given window.
630 * @param win The given window.
631 * @return Depth of the window.
632 */
633EAPI int
634ecore_x_window_depth_get(Ecore_X_Window win)
635{
636 LOGFN(__FILE__, __LINE__, __FUNCTION__);
637
638 return ecore_x_drawable_depth_get(win);
639}
640
641/**
642 * @defgroup Ecore_X_Window_Properties_Group X Window Property Functions
643 *
644 * Functions that set window properties.
645 */
646
647/**
648 * Sets the default properties for the given window.
649 *
650 * The default properties set for the window are @c WM_CLIENT_MACHINE and
651 * @c _NET_WM_PID.
652 *
653 * @param win The given window.
654 * @ingroup Ecore_X_Window_Properties_Groups
655 */
656EAPI void
657ecore_x_window_defaults_set(Ecore_X_Window win)
658{
659 char buff[MAXHOSTNAMELEN], **argv;
660 int argc;
661 pid_t pid;
662
663 LOGFN(__FILE__, __LINE__, __FUNCTION__);
664 CHECK_XCB_CONN;
665
666 gethostname(buff, MAXHOSTNAMELEN);
667 buff[MAXHOSTNAMELEN - 1] = '\0';
668
669 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
670 ECORE_X_ATOM_WM_CLIENT_MACHINE, ECORE_X_ATOM_STRING,
671 8, strlen(buff), buff);
672
673 pid = getpid();
674 ecore_x_netwm_pid_set(win, pid);
675 ecore_x_netwm_window_type_set(win, ECORE_X_WINDOW_TYPE_NORMAL);
676 ecore_app_args_get(&argc, &argv);
677 ecore_x_icccm_command_set(win, argc, argv);
678}
679
680/**
681 * @defgroup Ecore_X_Window_Visibility_Group X Window Visibility Functions
682 *
683 * Functions to access and change the visibility of X windows.
684 */
685
686/**
687 * Shows a window.
688 *
689 * Synonymous to "mapping" a window in X Window System terminology.
690 *
691 * @param win The window to show.
692 * @ingroup Ecore_X_Window_Visibility
693 */
694EAPI void
695ecore_x_window_show(Ecore_X_Window win)
696{
697 LOGFN(__FILE__, __LINE__, __FUNCTION__);
698 CHECK_XCB_CONN;
699
700 if (win)
701 xcb_map_window(_ecore_xcb_conn, win);
702}
703
704/**
705 * Hides a window.
706 *
707 * Synonymous to "unmapping" a window in X Window System terminology.
708 *
709 * @param win The window to hide.
710 * @ingroup Ecore_X_Window_Visibility
711 */
712EAPI void
713ecore_x_window_hide(Ecore_X_Window win)
714{
715 LOGFN(__FILE__, __LINE__, __FUNCTION__);
716 CHECK_XCB_CONN;
717
718 if (win)
719 {
720 xcb_unmap_notify_event_t ev;
721 Ecore_X_Window root;
722
723 if (xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn)).rem == 1)
724 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
725 else
726 {
727 xcb_get_geometry_cookie_t cookie;
728 xcb_get_geometry_reply_t *reply;
729
730 cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
731 reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
732 if (!reply) return;
733 root = reply->root;
734 free(reply);
735 }
736
737 memset(&ev, 0, sizeof(xcb_unmap_notify_event_t));
738
739 ev.response_type = XCB_UNMAP_NOTIFY;
740 ev.window = win;
741 ev.event = root;
742 ev.from_configure = 0;
743
744 xcb_send_event(_ecore_xcb_conn, 0, root,
745 (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
746 XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT),
747 (const char *)&ev);
748
749 xcb_unmap_window(_ecore_xcb_conn, win);
750// ecore_x_flush();
751 }
752}
753
754/**
755 * @defgroup Ecore_X_Window_Focus_Functions X Window Focus Functions
756 *
757 * Functions that give the focus to an X Window.
758 */
759
760/**
761 * Sets the focus to the window @p win.
762 * @param win The window to focus.
763 * @ingroup Ecore_X_Window_Focus_Functions
764 */
765EAPI void
766ecore_x_window_focus(Ecore_X_Window win)
767{
768 LOGFN(__FILE__, __LINE__, __FUNCTION__);
769 CHECK_XCB_CONN;
770
771 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
772
773 xcb_set_input_focus(_ecore_xcb_conn,
774 XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME);
775// ecore_x_flush();
776}
777
778/**
779 * Sets the focus to the given window at a specific time.
780 * @param win The window to focus.
781 * @param t When to set the focus to the window.
782 * @ingroup Ecore_X_Window_Focus_Functions
783 */
784EAPI void
785ecore_x_window_focus_at_time(Ecore_X_Window win,
786 Ecore_X_Time time)
787{
788 LOGFN(__FILE__, __LINE__, __FUNCTION__);
789 CHECK_XCB_CONN;
790
791 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
792 xcb_set_input_focus(_ecore_xcb_conn, XCB_INPUT_FOCUS_PARENT, win, time);
793// ecore_x_flush();
794}
795
796/**
797 * @defgroup Ecore_X_Window_Parent_Group X Window Parent Functions
798 *
799 * Functions that retrieve or changes the parent window of a window.
800 */
801
802/**
803 * Moves a window to within another window at a given position.
804 * @param win The window to reparent.
805 * @param new_parent The new parent window.
806 * @param x X position within new parent window.
807 * @param y Y position within new parent window.
808 * @ingroup Ecore_X_Window_Parent_Group
809 */
810EAPI void
811ecore_x_window_reparent(Ecore_X_Window win,
812 Ecore_X_Window parent,
813 int x,
814 int y)
815{
816 LOGFN(__FILE__, __LINE__, __FUNCTION__);
817 CHECK_XCB_CONN;
818
819 if (parent == 0)
820 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
821
822 xcb_reparent_window(_ecore_xcb_conn, win, parent, x, y);
823// ecore_x_flush();
824}
825
826EAPI void
827ecore_x_window_pixmap_set(Ecore_X_Window win,
828 Ecore_X_Pixmap pixmap)
829{
830 uint32_t list;
831
832 LOGFN(__FILE__, __LINE__, __FUNCTION__);
833 CHECK_XCB_CONN;
834
835 list = pixmap;
836
837 xcb_change_window_attributes(_ecore_xcb_conn, win,
838 XCB_CW_BACK_PIXMAP, &list);
839// ecore_x_flush();
840}
841
842/**
843 * Sets the background color of the given window.
844 * @param win The given window
845 * @param r red value (0...65536, 16 bits)
846 * @param g green value (0...65536, 16 bits)
847 * @param b blue value (0...65536, 16 bits)
848 */
849EAPI void
850ecore_x_window_background_color_set(Ecore_X_Window win,
851 unsigned short red,
852 unsigned short green,
853 unsigned short blue)
854{
855 xcb_alloc_color_cookie_t cookie;
856 xcb_alloc_color_reply_t *reply;
857 uint32_t list;
858
859 LOGFN(__FILE__, __LINE__, __FUNCTION__);
860 CHECK_XCB_CONN;
861
862 cookie =
863 xcb_alloc_color_unchecked(_ecore_xcb_conn,
864 ((xcb_screen_t *)_ecore_xcb_screen)->default_colormap,
865 red, green, blue);
866 reply = xcb_alloc_color_reply(_ecore_xcb_conn, cookie, NULL);
867 if (!reply) return;
868 list = reply->pixel;
869 free(reply);
870
871 xcb_change_window_attributes(_ecore_xcb_conn, win,
872 XCB_CW_BACK_PIXEL, &list);
873// ecore_x_flush();
874}
875
876EAPI void
877ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
878 Ecore_X_Gravity gravity)
879{
880 uint32_t list;
881
882 LOGFN(__FILE__, __LINE__, __FUNCTION__);
883 CHECK_XCB_CONN;
884
885 list = gravity;
886
887 xcb_change_window_attributes(_ecore_xcb_conn, win,
888 XCB_CW_BIT_GRAVITY, &list);
889// ecore_x_flush();
890}
891
892EAPI void
893ecore_x_window_gravity_set(Ecore_X_Window win,
894 Ecore_X_Gravity gravity)
895{
896 uint32_t list;
897
898 LOGFN(__FILE__, __LINE__, __FUNCTION__);
899 CHECK_XCB_CONN;
900
901 list = gravity;
902
903 xcb_change_window_attributes(_ecore_xcb_conn, win,
904 XCB_CW_WIN_GRAVITY, &list);
905// ecore_x_flush();
906}
907
908EAPI void
909ecore_x_window_override_set(Ecore_X_Window win,
910 Eina_Bool override)
911{
912 uint32_t list;
913
914 LOGFN(__FILE__, __LINE__, __FUNCTION__);
915 CHECK_XCB_CONN;
916
917 list = override;
918
919 xcb_change_window_attributes(_ecore_xcb_conn, win,
920 XCB_CW_OVERRIDE_REDIRECT, &list);
921// ecore_x_flush();
922}
923
924/**
925 * To be documented.
926 *
927 * FIXME: To be fixed.
928 */
929EAPI void
930ecore_x_window_cursor_show(Ecore_X_Window win,
931 Eina_Bool show)
932{
933 uint32_t list = 0;
934
935 LOGFN(__FILE__, __LINE__, __FUNCTION__);
936 CHECK_XCB_CONN;
937
938 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
939
940 if (!show)
941 {
942 Ecore_X_Cursor cursor;
943 Ecore_X_Pixmap p, m;
944 Ecore_X_GC gc;
945 xcb_point_t point;
946
947 p = xcb_generate_id(_ecore_xcb_conn);
948 xcb_create_pixmap(_ecore_xcb_conn, 1, p, win, 1, 1);
949 m = xcb_generate_id(_ecore_xcb_conn);
950 xcb_create_pixmap(_ecore_xcb_conn, 1, m, win, 1, 1);
951 gc = xcb_generate_id(_ecore_xcb_conn);
952 xcb_create_gc(_ecore_xcb_conn, gc, win, 0, NULL);
953 xcb_change_gc(_ecore_xcb_conn, gc, XCB_GC_FOREGROUND, &list);
954 point.x = 0;
955 point.y = 0;
956 xcb_poly_point(_ecore_xcb_conn, XCB_COORD_MODE_ORIGIN,
957 win, gc, 1, &point);
958 xcb_free_gc(_ecore_xcb_conn, gc);
959
960 cursor = xcb_generate_id(_ecore_xcb_conn);
961 xcb_create_cursor(_ecore_xcb_conn, cursor,
962 p, m, 0, 0, 0, 0, 0, 0, 0, 0);
963 list = cursor;
964
965 xcb_change_window_attributes(_ecore_xcb_conn, win,
966 XCB_CW_CURSOR, &list);
967
968 xcb_free_cursor(_ecore_xcb_conn, cursor);
969 xcb_free_pixmap(_ecore_xcb_conn, m);
970 xcb_free_pixmap(_ecore_xcb_conn, p);
971 }
972 else
973 {
974 xcb_change_window_attributes(_ecore_xcb_conn, win,
975 XCB_CW_CURSOR, &list);
976 }
977// ecore_x_flush();
978}
979
980EAPI void
981ecore_x_window_cursor_set(Ecore_X_Window win,
982 Ecore_X_Cursor cursor)
983{
984 uint32_t list;
985
986 LOGFN(__FILE__, __LINE__, __FUNCTION__);
987 CHECK_XCB_CONN;
988
989 list = cursor;
990
991 xcb_change_window_attributes(_ecore_xcb_conn, win, XCB_CW_CURSOR, &list);
992// ecore_x_flush();
993}
994
995EAPI void
996ecore_x_window_container_manage(Ecore_X_Window win)
997{
998 uint32_t list;
999
1000 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1001 CHECK_XCB_CONN;
1002
1003 list = (XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
1004 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
1005
1006 xcb_change_window_attributes(_ecore_xcb_conn, win,
1007 XCB_CW_EVENT_MASK, &list);
1008// ecore_x_flush();
1009}
1010
1011EAPI void
1012ecore_x_window_client_manage(Ecore_X_Window win)
1013{
1014 uint32_t list;
1015
1016 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1017 CHECK_XCB_CONN;
1018
1019 list = (XCB_EVENT_MASK_VISIBILITY_CHANGE |
1020 XCB_EVENT_MASK_FOCUS_CHANGE |
1021 XCB_EVENT_MASK_PROPERTY_CHANGE |
1022 XCB_EVENT_MASK_COLOR_MAP_CHANGE |
1023 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1024 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY);
1025
1026 xcb_change_window_attributes(_ecore_xcb_conn, win,
1027 XCB_CW_EVENT_MASK, &list);
1028
1029#ifdef ECORE_XCB_SHAPE
1030 xcb_shape_select_input(_ecore_xcb_conn, win, EINA_TRUE);
1031#endif
1032// ecore_x_flush();
1033}
1034
1035EAPI void
1036ecore_x_window_sniff(Ecore_X_Window win)
1037{
1038 uint32_t list;
1039
1040 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1041 CHECK_XCB_CONN;
1042
1043 list = (XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
1044 XCB_EVENT_MASK_PROPERTY_CHANGE);
1045
1046 xcb_change_window_attributes(_ecore_xcb_conn, win,
1047 XCB_CW_EVENT_MASK, &list);
1048// ecore_x_flush();
1049}
1050
1051EAPI void
1052ecore_x_window_client_sniff(Ecore_X_Window win)
1053{
1054 uint32_t list;
1055
1056 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1057 CHECK_XCB_CONN;
1058
1059 list = (XCB_EVENT_MASK_VISIBILITY_CHANGE |
1060 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1061 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
1062 XCB_EVENT_MASK_FOCUS_CHANGE |
1063 XCB_EVENT_MASK_PROPERTY_CHANGE |
1064 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
1065
1066 xcb_change_window_attributes(_ecore_xcb_conn, win,
1067 XCB_CW_EVENT_MASK, &list);
1068#ifdef ECORE_XCB_SHAPE
1069 xcb_shape_select_input(_ecore_xcb_conn, win, EINA_TRUE);
1070#endif
1071// ecore_x_flush();
1072}
1073
1074EAPI void
1075ecore_x_window_area_clear(Ecore_X_Window win,
1076 int x,
1077 int y,
1078 int w,
1079 int h)
1080{
1081 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1082 CHECK_XCB_CONN;
1083
1084 xcb_clear_area(_ecore_xcb_conn, 0, win, x, y, w, h);
1085// ecore_x_flush();
1086}
1087
1088EAPI void
1089ecore_x_window_area_expose(Ecore_X_Window win,
1090 int x,
1091 int y,
1092 int w,
1093 int h)
1094{
1095 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1096 CHECK_XCB_CONN;
1097
1098 xcb_clear_area(_ecore_xcb_conn, 1, win, x, y, w, h);
1099// ecore_x_flush();
1100}
1101
1102EAPI void
1103ecore_x_window_save_set_add(Ecore_X_Window win)
1104{
1105 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1106 CHECK_XCB_CONN;
1107
1108 xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_INSERT, win);
1109}
1110
1111EAPI void
1112ecore_x_window_save_set_del(Ecore_X_Window win)
1113{
1114 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1115 CHECK_XCB_CONN;
1116
1117 xcb_change_save_set(_ecore_xcb_conn, XCB_SET_MODE_DELETE, win);
1118}
1119
1120/**
1121 * gets the focus to the window @p win.
1122 * @return The window that has focus.
1123 * @ingroup Ecore_X_Window_Focus_Functions
1124 */
1125EAPI Ecore_X_Window
1126ecore_x_window_focus_get(void)
1127{
1128 xcb_get_input_focus_cookie_t cookie;
1129 xcb_get_input_focus_reply_t *reply;
1130 Ecore_X_Window focus = 0;
1131
1132 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1133 CHECK_XCB_CONN;
1134
1135 cookie = xcb_get_input_focus_unchecked(_ecore_xcb_conn);
1136 reply = xcb_get_input_focus_reply(_ecore_xcb_conn, cookie, NULL);
1137 if (!reply) return 0;
1138 focus = reply->focus;
1139 free(reply);
1140 return focus;
1141}
1142
1143EAPI int
1144ecore_x_window_argb_get(Ecore_X_Window win)
1145{
1146 uint8_t ret = 0;
1147#ifdef ECORE_XCB_RENDER
1148 Ecore_X_Visual visual;
1149#endif
1150
1151 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1152 CHECK_XCB_CONN;
1153
1154// if (!win) return ret;
1155
1156#ifdef ECORE_XCB_RENDER
1157 /* grab the window's visual */
1158 visual = _ecore_xcb_window_visual_get(win);
1159
1160 /* check if this visual supports alpha */
1161 ret = _ecore_xcb_render_visual_supports_alpha(visual);
1162#endif
1163
1164 return ret;
1165}
1166
1167EAPI Eina_Bool
1168ecore_x_window_manage(Ecore_X_Window win)
1169{
1170 xcb_get_window_attributes_cookie_t cookie;
1171 xcb_get_window_attributes_reply_t *reply;
1172 xcb_void_cookie_t change_cookie;
1173 xcb_generic_error_t *err;
1174 uint32_t list;
1175
1176 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1177 CHECK_XCB_CONN;
1178
1179 cookie = xcb_get_window_attributes(_ecore_xcb_conn, win);
1180 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
1181 if (!reply) return EINA_FALSE;
1182
1183 ecore_x_sync(); // needed
1184
1185 list = (XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
1186 XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_RESIZE_REDIRECT |
1187 XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
1188 XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
1189 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1190 XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
1191 reply->your_event_mask);
1192 free(reply);
1193
1194 change_cookie = xcb_change_window_attributes(_ecore_xcb_conn, win,
1195 XCB_CW_EVENT_MASK, &list);
1196
1197 ecore_x_sync(); // needed
1198
1199 err = xcb_request_check(_ecore_xcb_conn, change_cookie);
1200 if (err)
1201 {
1202 _ecore_xcb_error_handle(err);
1203 free(err);
1204 return EINA_FALSE;
1205 }
1206
1207 return EINA_TRUE;
1208}
1209
1210EAPI Eina_Bool
1211ecore_x_window_attributes_get(Ecore_X_Window win,
1212 Ecore_X_Window_Attributes *att_ret)
1213{
1214 xcb_get_window_attributes_cookie_t cookie;
1215 xcb_get_window_attributes_reply_t *reply;
1216 xcb_get_geometry_cookie_t gcookie;
1217 xcb_get_geometry_reply_t *greply;
1218
1219 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1220 CHECK_XCB_CONN;
1221
1222 cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
1223 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
1224 if (!reply) return EINA_FALSE;
1225
1226 memset(att_ret, 0, sizeof(Ecore_X_Window_Attributes));
1227
1228 if (reply->map_state != XCB_MAP_STATE_UNMAPPED)
1229 att_ret->visible = EINA_TRUE;
1230
1231 if (reply->map_state == XCB_MAP_STATE_VIEWABLE)
1232 att_ret->viewable = EINA_TRUE;
1233
1234 if (reply->override_redirect)
1235 att_ret->override = EINA_TRUE;
1236
1237 if (reply->_class == XCB_WINDOW_CLASS_INPUT_ONLY)
1238 att_ret->input_only = EINA_TRUE;
1239
1240 if (reply->save_under)
1241 att_ret->save_under = EINA_TRUE;
1242
1243 att_ret->event_mask.mine = reply->your_event_mask;
1244 att_ret->event_mask.all = reply->all_event_masks;
1245 att_ret->event_mask.no_propagate = reply->do_not_propagate_mask;
1246 att_ret->window_gravity = reply->win_gravity;
1247 att_ret->pixel_gravity = reply->bit_gravity;
1248 att_ret->colormap = reply->colormap;
1249 att_ret->visual = _ecore_xcb_window_find_visual_by_id(reply->visual);
1250
1251 free(reply);
1252
1253 gcookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
1254 greply = xcb_get_geometry_reply(_ecore_xcb_conn, gcookie, NULL);
1255 if (!greply) return EINA_TRUE;
1256
1257 /* xcb_translate_coordinates_reply_t *trans; */
1258 /* xcb_query_tree_cookie_t tcookie; */
1259 /* xcb_query_tree_reply_t *treply; */
1260
1261 /* tcookie = xcb_query_tree(_ecore_xcb_conn, win); */
1262 /* treply = xcb_query_tree_reply(_ecore_xcb_conn, tcookie, NULL); */
1263
1264 /* trans = */
1265 /* xcb_translate_coordinates_reply(_ecore_xcb_conn, */
1266 /* xcb_translate_coordinates(_ecore_xcb_conn, */
1267 /* win, treply->parent, greply->x, greply->y), NULL); */
1268 /* free(treply); */
1269
1270 att_ret->root = greply->root;
1271 att_ret->depth = greply->depth;
1272// att_ret->x = trans->dst_x;
1273// att_ret->y = trans->dst_y;
1274 att_ret->x = greply->x;
1275 att_ret->y = greply->y;
1276 att_ret->w = greply->width;
1277 att_ret->h = greply->height;
1278 att_ret->border = greply->border_width;
1279
1280// free(trans);
1281
1282 free(greply);
1283 return EINA_TRUE;
1284}
1285
1286/**
1287 * Retrieves the size of the given window.
1288 * @param win The given window.
1289 * @param w Pointer to an integer into which the width is to be stored.
1290 * @param h Pointer to an integer into which the height is to be stored.
1291 * @ingroup Ecore_X_Window_Geometry_Group
1292 */
1293EAPI void
1294ecore_x_window_size_get(Ecore_X_Window win,
1295 int *width,
1296 int *height)
1297{
1298 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1299 CHECK_XCB_CONN;
1300
1301 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1302 ecore_x_drawable_geometry_get(win, NULL, NULL, width, height);
1303}
1304
1305/**
1306 * Set if a window should be ignored.
1307 * @param win The given window.
1308 * @param ignore if to ignore
1309 */
1310EAPI void
1311ecore_x_window_ignore_set(Ecore_X_Window win,
1312 int ignore)
1313{
1314 int i = 0, j = 0, count = 0;
1315
1316 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1317 CHECK_XCB_CONN;
1318
1319 if (ignore)
1320 {
1321 if (ignore_list)
1322 {
1323 for (i = 0; i < ignore_num; i++)
1324 if (win == ignore_list[i]) return;
1325
1326 ignore_list =
1327 realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
1328 if (!ignore_list) return;
1329
1330 ignore_list[ignore_num++] = win;
1331 }
1332 else
1333 {
1334 ignore_num = 0;
1335 ignore_list = malloc(sizeof(Ecore_X_Window));
1336 if (!ignore_list) return;
1337 ignore_list[ignore_num++] = win;
1338 }
1339 }
1340 else
1341 {
1342 if (!ignore_list) return;
1343 for (count = ignore_num, i = 0, j = 0; i < count; i++)
1344 {
1345 if (win != ignore_list[i])
1346 ignore_list[j++] = ignore_list[i];
1347 else
1348 ignore_num--;
1349 }
1350 if (ignore_num <= 0)
1351 {
1352 free(ignore_list);
1353 ignore_list = NULL;
1354 return;
1355 }
1356
1357 ignore_list =
1358 realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
1359 }
1360}
1361
1362/**
1363 * Get the ignore list
1364 * @param num number of windows in the list
1365 * @return list of windows to ignore
1366 */
1367EAPI Ecore_X_Window *
1368ecore_x_window_ignore_list(int *num)
1369{
1370 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1371
1372 if (num) *num = ignore_num;
1373 return ignore_list;
1374}
1375
1376/**
1377 * Get a list of all the root windows on the server.
1378 *
1379 * @note The returned array will need to be freed after use.
1380 * @param num_ret Pointer to integer to put number of windows returned in.
1381 * @return An array of all the root windows. @c NULL is returned if memory
1382 * could not be allocated for the list, or if @p num_ret is @c NULL.
1383 */
1384EAPI Ecore_X_Window *
1385ecore_x_window_root_list(int *num_ret)
1386{
1387 xcb_screen_iterator_t iter;
1388 uint8_t i, num;
1389 Ecore_X_Window *roots = NULL;
1390#ifdef ECORE_XCB_XPRINT
1391 const xcb_query_extension_reply_t *ext_reply;
1392#endif
1393
1394 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1395 CHECK_XCB_CONN;
1396
1397 if (!num_ret) return NULL;
1398 if (num_ret) *num_ret = 0;
1399
1400 /* if (xcb_connection_has_error(_ecore_xcb_conn)) */
1401 /* { */
1402 /* DBG("XCB Connection Has Error !!!"); */
1403 /* return NULL; */
1404 /* } */
1405
1406 num = ecore_x_screen_count_get();
1407
1408#ifdef ECORE_XCB_XPRINT
1409 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_x_print_id);
1410 if ((ext_reply) && (ext_reply->present))
1411 {
1412 xcb_x_print_print_query_screens_cookie_t cookie;
1413 xcb_x_print_print_query_screens_reply_t *reply;
1414
1415 cookie = xcb_x_print_print_query_screens_unchecked(_ecore_xcb_conn);
1416 reply =
1417 xcb_x_print_print_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
1418 if (reply)
1419 {
1420 xcb_window_t *screens;
1421 int psnum = 0, overlap = 0, j = 0, k = 0;
1422
1423 psnum = xcb_x_print_print_query_screens_roots_length(reply);
1424 screens = xcb_x_print_print_query_screens_roots(reply);
1425 for (i = 0; i < num; i++)
1426 {
1427 for (j = 0; j < psnum; j++)
1428 {
1429 xcb_screen_t *s;
1430
1431 if ((s = _ecore_xcb_window_screen_of_display(i)))
1432 {
1433 if (s->root == screens[j])
1434 overlap++;
1435 }
1436 }
1437 }
1438 if (!(roots = malloc((num - overlap)
1439 * sizeof(Ecore_X_Window)))) return NULL;
1440 for (i = 0; i < num; i++)
1441 {
1442 Eina_Bool is_print = EINA_FALSE;
1443
1444 for (j = 0; j < psnum; j++)
1445 {
1446 xcb_screen_t *s;
1447
1448 if ((s = _ecore_xcb_window_screen_of_display(i)))
1449 {
1450 if (s->root == screens[j])
1451 {
1452 is_print = EINA_TRUE;
1453 break;
1454 }
1455 }
1456 }
1457 if (!is_print)
1458 {
1459 xcb_screen_t *s;
1460
1461 if ((s = _ecore_xcb_window_screen_of_display(i)))
1462 {
1463 roots[k] = s->root;
1464 k++;
1465 }
1466 }
1467 }
1468 if (num_ret) *num_ret = k;
1469 free(reply);
1470 }
1471 else
1472 {
1473 /* Fallback to default method */
1474 iter =
1475 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1476 if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
1477 if (num_ret) *num_ret = num;
1478 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1479 roots[i] = iter.data->root;
1480 }
1481 }
1482 else
1483 {
1484 /* Fallback to default method */
1485 iter =
1486 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1487 if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
1488 if (num_ret) *num_ret = num;
1489 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1490 roots[i] = iter.data->root;
1491 }
1492#else
1493 iter =
1494 xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1495 if (!(roots = malloc(num * sizeof(Ecore_X_Window)))) return NULL;
1496 if (num_ret) *num_ret = num;
1497 for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
1498 roots[i] = iter.data->root;
1499#endif
1500
1501 return roots;
1502}
1503
1504EAPI Ecore_X_Window *
1505ecore_x_window_children_get(Ecore_X_Window win,
1506 int *num)
1507{
1508 xcb_query_tree_cookie_t cookie;
1509 xcb_query_tree_reply_t *reply;
1510 Ecore_X_Window *windows = NULL;
1511
1512 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1513 CHECK_XCB_CONN;
1514
1515 if (num) *num = 0;
1516 cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, win);
1517 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
1518 if (!reply) return NULL;
1519
1520 if (num) *num = reply->children_len;
1521 if (reply->children_len > 0)
1522 {
1523 windows = malloc(sizeof(Ecore_X_Window) * reply->children_len);
1524 if (windows)
1525 {
1526 unsigned int i = 0;
1527 xcb_window_t *w;
1528
1529 w = xcb_query_tree_children(reply);
1530 for (i = 0; i < reply->children_len; i++)
1531 windows[i] = w[i];
1532 }
1533 }
1534
1535 free(reply);
1536 return windows;
1537}
1538
1539/**
1540 * Retrieves the root window a given window is on.
1541 * @param win The window to get the root window of
1542 * @return The root window of @p win
1543 * @ingroup Ecore_X_Window_Geometry_Group
1544 */
1545EAPI Ecore_X_Window
1546ecore_x_window_root_get(Ecore_X_Window win)
1547{
1548 xcb_get_geometry_cookie_t gcookie;
1549 xcb_get_geometry_reply_t *greply;
1550 Ecore_X_Window window = 0;
1551
1552 /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
1553 CHECK_XCB_CONN;
1554
1555 gcookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
1556 greply = xcb_get_geometry_reply(_ecore_xcb_conn, gcookie, NULL);
1557 if (!greply) return 0;
1558 window = greply->root;
1559 free(greply);
1560
1561 return window;
1562}
1563
1564EAPI Ecore_X_Window
1565ecore_x_window_root_first_get(void)
1566{
1567 return ((xcb_screen_t *)_ecore_xcb_screen)->root;
1568}
1569
1570/**
1571 * Retrieves the geometry of the given window.
1572 *
1573 * Note that the x & y coordingates are relative to your parent. In
1574 * particular for reparenting window managers - relative to you window border.
1575 * If you want screen coordinates either walk the window tree to the root,
1576 * else for ecore_evas applications see ecore_evas_geometry_get(). Elementary
1577 * applications can use elm_win_screen_position_get().
1578 *
1579 * @param win The given window.
1580 * @param x Pointer to an integer in which the X position is to be stored.
1581 * @param y Pointer to an integer in which the Y position is to be stored.
1582 * @param w Pointer to an integer in which the width is to be stored.
1583 * @param h Pointer to an integer in which the height is to be stored.
1584 * @ingroup Ecore_X_Window_Geometry_Group
1585 */
1586EAPI void
1587ecore_x_window_geometry_get(Ecore_X_Window win,
1588 int *x,
1589 int *y,
1590 int *w,
1591 int *h)
1592{
1593 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1594 CHECK_XCB_CONN;
1595
1596 if (!win) win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1597 ecore_x_drawable_geometry_get(win, x, y, w, h);
1598}
1599
1600/**
1601 * Retrieves the top, visible window at the given location.
1602 * @param x The given X position.
1603 * @param y The given Y position.
1604 * @return The window at that position.
1605 * @ingroup Ecore_X_Window_Geometry_Group
1606 */
1607EAPI Ecore_X_Window
1608ecore_x_window_at_xy_get(int x,
1609 int y)
1610{
1611 Ecore_X_Window root, win = 0;
1612
1613 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1614 CHECK_XCB_CONN;
1615
1616 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1617
1618 ecore_x_grab();
1619 win = _ecore_xcb_window_at_xy_get(root, 0, 0, x, y, NULL, 0);
1620 ecore_x_ungrab();
1621
1622 return win ? win : root;
1623}
1624
1625/**
1626 * Retrieves the top, visible window at the given location,
1627 * but skips the windows in the list.
1628 * @param x The given X position.
1629 * @param y The given Y position.
1630 * @return The window at that position.
1631 * @ingroup Ecore_X_Window_Geometry_Group
1632 */
1633EAPI Ecore_X_Window
1634ecore_x_window_at_xy_with_skip_get(int x,
1635 int y,
1636 Ecore_X_Window *skip,
1637 int skip_num)
1638{
1639 Ecore_X_Window root, win = 0;
1640
1641 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1642 CHECK_XCB_CONN;
1643
1644 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1645
1646 ecore_x_grab();
1647 win = _ecore_xcb_window_at_xy_get(root, 0, 0, x, y, skip, skip_num);
1648 ecore_x_ungrab();
1649
1650 return win ? win : root;
1651}
1652
1653EAPI Ecore_X_Window
1654ecore_x_window_at_xy_begin_get(Ecore_X_Window begin,
1655 int x,
1656 int y)
1657{
1658 Ecore_X_Window win = 0;
1659
1660 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1661 CHECK_XCB_CONN;
1662
1663 ecore_x_grab();
1664 win = _ecore_xcb_window_at_xy_get(begin, 0, 0, x, y, NULL, 0);
1665 ecore_x_ungrab();
1666
1667 return win ? win : begin;
1668}
1669
1670/**
1671 * Retrieves the parent window of the given window.
1672 * @param win The given window.
1673 * @return The parent window of @p win.
1674 * @ingroup Ecore_X_Window_Parent_Group
1675 */
1676EAPI Ecore_X_Window
1677ecore_x_window_parent_get(Ecore_X_Window win)
1678{
1679 xcb_query_tree_cookie_t cookie;
1680 xcb_query_tree_reply_t *reply;
1681 Ecore_X_Window window = 0;
1682
1683 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1684 CHECK_XCB_CONN;
1685
1686// if (!win) return 0;
1687 cookie = xcb_query_tree(_ecore_xcb_conn, win);
1688 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
1689 if (!reply) return 0;
1690 window = reply->parent;
1691 free(reply);
1692
1693 return window;
1694}
1695
1696/**
1697 * Finds out whether the given window is currently visible.
1698 * @param win The given window.
1699 * @return 1 if the window is visible, otherwise 0.
1700 * @ingroup Ecore_X_Window_Visibility_Group
1701 */
1702EAPI int
1703ecore_x_window_visible_get(Ecore_X_Window win)
1704{
1705 xcb_get_window_attributes_cookie_t cookie;
1706 xcb_get_window_attributes_reply_t *reply;
1707 int ret = EINA_FALSE;
1708
1709 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1710 CHECK_XCB_CONN;
1711
1712 cookie = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, win);
1713 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
1714 if (!reply) return EINA_FALSE;
1715
1716 if (reply->map_state == XCB_MAP_STATE_VIEWABLE)
1717 ret = EINA_TRUE;
1718
1719 free(reply);
1720 return ret;
1721}
1722
1723EAPI void
1724ecore_x_window_button_grab(Ecore_X_Window win,
1725 int button,
1726 Ecore_X_Event_Mask mask,
1727 int mod,
1728 int any_mod)
1729{
1730 int i = 0;
1731 uint16_t m, locks[8], ev;
1732 uint8_t b;
1733 Ecore_X_Window *t;
1734
1735 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1736 CHECK_XCB_CONN;
1737
1738 b = button;
1739 if (b == 0)
1740 b = XCB_BUTTON_INDEX_ANY;
1741
1742 m = _ecore_xcb_window_modifiers_get(mod);
1743 if (any_mod) m = XCB_MOD_MASK_ANY;
1744
1745 locks[0] = 0;
1746 locks[1] = ECORE_X_LOCK_CAPS;
1747 locks[2] = ECORE_X_LOCK_NUM;
1748 locks[3] = ECORE_X_LOCK_SCROLL;
1749 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1750 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1751 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1752 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1753
1754 ev = mask;
1755 for (i = 0; i < 8; i++)
1756 xcb_grab_button(_ecore_xcb_conn, 0, win, ev,
1757 XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC,
1758 XCB_NONE, XCB_NONE, b, m | locks[i]);
1759
1760 _ecore_xcb_button_grabs_num++;
1761 t = realloc(_ecore_xcb_button_grabs,
1762 _ecore_xcb_button_grabs_num * sizeof(Ecore_X_Window));
1763 if (!t) return;
1764
1765 _ecore_xcb_button_grabs = t;
1766 _ecore_xcb_button_grabs[_ecore_xcb_button_grabs_num - 1] = win;
1767}
1768
1769EAPI void
1770ecore_x_window_button_ungrab(Ecore_X_Window win,
1771 int button,
1772 int mod,
1773 int any_mod)
1774{
1775 int i = 0;
1776 uint16_t m = 0, locks[8];
1777 uint8_t b;
1778
1779 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1780 CHECK_XCB_CONN;
1781
1782 b = button;
1783 if (b == 0) b = XCB_BUTTON_INDEX_ANY;
1784
1785 m = _ecore_xcb_window_modifiers_get(mod);
1786 if (any_mod) m = XCB_MOD_MASK_ANY;
1787
1788 locks[0] = 0;
1789 locks[1] = ECORE_X_LOCK_CAPS;
1790 locks[2] = ECORE_X_LOCK_NUM;
1791 locks[3] = ECORE_X_LOCK_SCROLL;
1792 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1793 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1794 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1795 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1796
1797 for (i = 0; i < 8; i++)
1798 xcb_ungrab_button(_ecore_xcb_conn, b, win, m | locks[i]);
1799
1800 _ecore_xcb_sync_magic_send(1, win);
1801}
1802
1803EAPI void
1804ecore_x_window_key_grab(Ecore_X_Window win,
1805 const char *key,
1806 int mod,
1807 int any_mod)
1808{
1809 xcb_keycode_t keycode = XCB_NO_SYMBOL;
1810 uint16_t m = 0, locks[8];
1811 int i = 0;
1812 Ecore_X_Window *t;
1813
1814 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1815 CHECK_XCB_CONN;
1816
1817 keycode = _ecore_xcb_keymap_string_to_keycode(key);
1818 if (keycode == XCB_NO_SYMBOL) return;
1819
1820 m = _ecore_xcb_window_modifiers_get(mod);
1821 if (any_mod) m = XCB_MOD_MASK_ANY;
1822
1823 locks[0] = 0;
1824 locks[1] = ECORE_X_LOCK_CAPS;
1825 locks[2] = ECORE_X_LOCK_NUM;
1826 locks[3] = ECORE_X_LOCK_SCROLL;
1827 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1828 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1829 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1830 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1831
1832 for (i = 0; i < 8; i++)
1833 xcb_grab_key(_ecore_xcb_conn, 0, win, m | locks[i],
1834 keycode, XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC);
1835 _ecore_xcb_key_grabs_num++;
1836 t = realloc(_ecore_xcb_key_grabs,
1837 _ecore_xcb_key_grabs_num * sizeof(Ecore_X_Window));
1838 if (!t) return;
1839 _ecore_xcb_key_grabs = t;
1840 _ecore_xcb_key_grabs[_ecore_xcb_key_grabs_num - 1] = win;
1841}
1842
1843EAPI void
1844ecore_x_window_key_ungrab(Ecore_X_Window win,
1845 const char *key,
1846 int mod,
1847 int any_mod)
1848{
1849 xcb_keycode_t keycode = XCB_NO_SYMBOL;
1850 uint16_t m = 0, locks[8];
1851 int i = 0;
1852
1853 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1854 CHECK_XCB_CONN;
1855
1856 keycode = _ecore_xcb_keymap_string_to_keycode(key);
1857 if (keycode == XCB_NO_SYMBOL) return;
1858
1859 m = _ecore_xcb_window_modifiers_get(mod);
1860 if (any_mod) m = XCB_MOD_MASK_ANY;
1861
1862 locks[0] = 0;
1863 locks[1] = ECORE_X_LOCK_CAPS;
1864 locks[2] = ECORE_X_LOCK_NUM;
1865 locks[3] = ECORE_X_LOCK_SCROLL;
1866 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1867 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1868 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1869 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1870
1871 for (i = 0; i < 8; i++)
1872 xcb_ungrab_key(_ecore_xcb_conn, keycode, win, m | locks[i]);
1873
1874 _ecore_xcb_sync_magic_send(2, win);
1875}
1876
1877/* local functions */
1878Ecore_X_Window
1879_ecore_xcb_window_root_of_screen_get(int screen)
1880{
1881 xcb_screen_iterator_t iter;
1882
1883 CHECK_XCB_CONN;
1884 iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
1885 for (; iter.rem; --screen, xcb_screen_next(&iter))
1886 if (screen == 0)
1887 {
1888 xcb_screen_t *s;
1889
1890 if ((s = iter.data))
1891 return s->root;
1892 }
1893 return 0;
1894}
1895
1896static Ecore_X_Window
1897_ecore_xcb_window_argb_internal_new(Ecore_X_Window parent,
1898 int x,
1899 int y,
1900 int w,
1901 int h,
1902 uint8_t override_redirect,
1903 uint8_t save_under)
1904{
1905 Ecore_X_Window win = 0;
1906#ifdef ECORE_XCB_RENDER
1907 uint32_t value_list[10];
1908 uint32_t value_mask;
1909 uint32_t vis;
1910 Ecore_X_Colormap colormap;
1911#endif
1912
1913 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1914 CHECK_XCB_CONN;
1915
1916#ifdef ECORE_XCB_RENDER
1917 if (parent == 0)
1918 parent = ((xcb_screen_t *)_ecore_xcb_screen)->root;
1919
1920 vis =
1921 _ecore_xcb_render_find_visual_id(XCB_RENDER_PICT_TYPE_DIRECT, EINA_TRUE);
1922
1923 colormap = xcb_generate_id(_ecore_xcb_conn);
1924 xcb_create_colormap(_ecore_xcb_conn, XCB_COLORMAP_ALLOC_NONE,
1925 colormap, parent, vis);
1926
1927 value_mask = (XCB_CW_BACK_PIXMAP | XCB_CW_BORDER_PIXEL | XCB_CW_BIT_GRAVITY |
1928 XCB_CW_WIN_GRAVITY | XCB_CW_BACKING_STORE |
1929 XCB_CW_OVERRIDE_REDIRECT | XCB_CW_SAVE_UNDER |
1930 XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE | XCB_CW_COLORMAP);
1931
1932 value_list[0] = XCB_BACK_PIXMAP_NONE;
1933 value_list[1] = 0;
1934 value_list[2] = XCB_GRAVITY_NORTH_WEST;
1935 value_list[3] = XCB_GRAVITY_NORTH_WEST;
1936 value_list[4] = XCB_BACKING_STORE_NOT_USEFUL;
1937 value_list[5] = override_redirect;
1938 value_list[6] = save_under;
1939 value_list[7] = (XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE |
1940 XCB_EVENT_MASK_BUTTON_PRESS |
1941 XCB_EVENT_MASK_BUTTON_RELEASE |
1942 XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW |
1943 XCB_EVENT_MASK_POINTER_MOTION | XCB_EVENT_MASK_EXPOSURE |
1944 XCB_EVENT_MASK_VISIBILITY_CHANGE |
1945 XCB_EVENT_MASK_STRUCTURE_NOTIFY |
1946 XCB_EVENT_MASK_FOCUS_CHANGE |
1947 XCB_EVENT_MASK_PROPERTY_CHANGE |
1948 XCB_EVENT_MASK_COLOR_MAP_CHANGE);
1949 value_list[8] = XCB_EVENT_MASK_NO_EVENT;
1950 value_list[9] = colormap;
1951
1952 win = xcb_generate_id(_ecore_xcb_conn);
1953 xcb_create_window(_ecore_xcb_conn, 32, win, parent, x, y, w, h, 0,
1954 XCB_WINDOW_CLASS_INPUT_OUTPUT, vis, value_mask,
1955 value_list);
1956
1957 xcb_free_colormap(_ecore_xcb_conn, colormap);
1958
1959 if (parent == ((xcb_screen_t *)_ecore_xcb_screen)->root)
1960 ecore_x_window_defaults_set(win);
1961#endif
1962
1963 return win;
1964}
1965
1966static Ecore_X_Window
1967_ecore_xcb_window_at_xy_get(Ecore_X_Window base,
1968 int bx,
1969 int by,
1970 int x,
1971 int y,
1972 Ecore_X_Window *skip,
1973 int skip_num)
1974{
1975 xcb_query_tree_cookie_t cookie;
1976 xcb_query_tree_reply_t *reply;
1977 Ecore_X_Window *windows = NULL;
1978 int wx, wy, ww, wh, num, i = 0;
1979 Eina_Bool skipit = EINA_FALSE;
1980
1981 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1982 CHECK_XCB_CONN;
1983
1984 if (!ecore_x_window_visible_get(base)) return 0;
1985
1986 ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh);
1987 wx += bx;
1988 wy += by;
1989
1990 if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh))))
1991 return 0;
1992
1993 cookie = xcb_query_tree_unchecked(_ecore_xcb_conn, base);
1994 reply = xcb_query_tree_reply(_ecore_xcb_conn, cookie, NULL);
1995 if (!reply) return 0;
1996
1997 num = reply->children_len;
1998 windows = xcb_query_tree_children(reply);
1999
2000 for (i = (num - 1); i >= 0; --i)
2001 {
2002 skipit = EINA_FALSE;
2003
2004 if (skip)
2005 {
2006 int j = 0;
2007
2008 for (j = 0; j < skip_num; j++)
2009 {
2010 if (windows[i] == skip[j])
2011 {
2012 skipit = EINA_TRUE;
2013 goto onward;
2014 }
2015 }
2016 }
2017onward:
2018 if (!skipit)
2019 {
2020 Ecore_X_Window child = 0;
2021
2022 child =
2023 _ecore_xcb_window_at_xy_get(windows[i],
2024 wx, wy, x, y, skip, skip_num);
2025 if (child)
2026 {
2027 if (reply) free(reply);
2028 return child;
2029 }
2030 }
2031 }
2032
2033 if (reply) free(reply);
2034 return base;
2035}
2036
2037Ecore_X_Visual
2038_ecore_xcb_window_visual_get(Ecore_X_Window win)
2039{
2040 xcb_get_window_attributes_cookie_t cookie;
2041 xcb_get_window_attributes_reply_t *reply;
2042 Ecore_X_Visual visual = 0;
2043
2044 CHECK_XCB_CONN;
2045
2046 cookie = xcb_get_window_attributes(_ecore_xcb_conn, win);
2047 reply = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie, NULL);
2048 if (!reply) return 0;
2049 visual = _ecore_xcb_window_find_visual_by_id(reply->visual);
2050 free(reply);
2051
2052 return visual;
2053}
2054
2055void
2056_ecore_xcb_window_button_grab_remove(Ecore_X_Window win)
2057{
2058 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2059 CHECK_XCB_CONN;
2060
2061 if (_ecore_xcb_button_grabs_num > 0)
2062 {
2063 int i = 0, shuffle = 0;
2064
2065 for (i = 0; i < _ecore_xcb_button_grabs_num; i++)
2066 {
2067 if (shuffle)
2068 _ecore_xcb_button_grabs[i - 1] = _ecore_xcb_button_grabs[i];
2069
2070 if ((!shuffle) && (_ecore_xcb_button_grabs[i] == win))
2071 shuffle = 1;
2072 }
2073
2074 if (shuffle)
2075 {
2076 Ecore_X_Window *t;
2077
2078 _ecore_xcb_button_grabs_num--;
2079 if (_ecore_xcb_button_grabs_num <= 0)
2080 {
2081 free(_ecore_xcb_button_grabs);
2082 _ecore_xcb_button_grabs = NULL;
2083 return;
2084 }
2085
2086 t = realloc(_ecore_xcb_button_grabs,
2087 _ecore_xcb_button_grabs_num * sizeof(Ecore_X_Window));
2088 if (!t) return;
2089 _ecore_xcb_button_grabs = t;
2090 }
2091 }
2092}
2093
2094void
2095_ecore_xcb_window_key_grab_remove(Ecore_X_Window win)
2096{
2097 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2098 CHECK_XCB_CONN;
2099
2100 if (_ecore_xcb_key_grabs_num > 0)
2101 {
2102 int i = 0, shuffle = 0;
2103
2104 for (i = 0; i < _ecore_xcb_key_grabs_num; i++)
2105 {
2106 if (shuffle)
2107 _ecore_xcb_key_grabs[i - 1] = _ecore_xcb_key_grabs[i];
2108
2109 if ((!shuffle) && (_ecore_xcb_key_grabs[i] == win))
2110 shuffle = 1;
2111 }
2112
2113 if (shuffle)
2114 {
2115 Ecore_X_Window *t;
2116
2117 _ecore_xcb_key_grabs_num--;
2118 if (_ecore_xcb_key_grabs_num <= 0)
2119 {
2120 free(_ecore_xcb_key_grabs);
2121 _ecore_xcb_key_grabs = NULL;
2122 return;
2123 }
2124
2125 t = realloc(_ecore_xcb_key_grabs,
2126 _ecore_xcb_key_grabs_num * sizeof(Ecore_X_Window));
2127 if (!t) return;
2128 _ecore_xcb_key_grabs = t;
2129 }
2130 }
2131}
2132
2133void
2134_ecore_xcb_window_grab_allow_events(Ecore_X_Window event_win,
2135 Ecore_X_Window child_win,
2136 int type,
2137 void *event,
2138 Ecore_X_Time timestamp)
2139{
2140 int i = 0;
2141
2142 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2143 CHECK_XCB_CONN;
2144
2145 for (i = 0; i < _ecore_xcb_button_grabs_num; i++)
2146 {
2147 if ((_ecore_xcb_button_grabs[i] == event_win) ||
2148 (_ecore_xcb_button_grabs[i] == child_win))
2149 {
2150 Eina_Bool replay = EINA_FALSE;
2151
2152 if (_ecore_xcb_window_grab_replay_func)
2153 {
2154 replay =
2155 _ecore_xcb_window_grab_replay_func(_ecore_xcb_window_grab_replay_data,
2156 type, event);
2157 }
2158 if (replay)
2159 {
2160 xcb_allow_events(_ecore_xcb_conn,
2161 XCB_ALLOW_REPLAY_POINTER, timestamp);
2162 }
2163 else
2164 {
2165 xcb_allow_events(_ecore_xcb_conn,
2166 XCB_ALLOW_ASYNC_POINTER, timestamp);
2167 }
2168 break;
2169 }
2170 }
2171}
2172
2173static int
2174_ecore_xcb_window_modifiers_get(unsigned int state)
2175{
2176 int xmodifiers = 0;
2177
2178 if (state & ECORE_EVENT_MODIFIER_SHIFT)
2179 xmodifiers |= ECORE_X_MODIFIER_SHIFT;
2180 if (state & ECORE_EVENT_MODIFIER_CTRL)
2181 xmodifiers |= ECORE_X_MODIFIER_CTRL;
2182 if (state & ECORE_EVENT_MODIFIER_ALT)
2183 xmodifiers |= ECORE_X_MODIFIER_ALT;
2184 if (state & ECORE_EVENT_MODIFIER_WIN)
2185 xmodifiers |= ECORE_X_MODIFIER_WIN;
2186 if (state & ECORE_EVENT_LOCK_SCROLL)
2187 xmodifiers |= ECORE_X_LOCK_SCROLL;
2188 if (state & ECORE_EVENT_LOCK_NUM)
2189 xmodifiers |= ECORE_X_LOCK_NUM;
2190 if (state & ECORE_EVENT_LOCK_CAPS)
2191 xmodifiers |= ECORE_X_LOCK_CAPS;
2192 if (state & ECORE_EVENT_LOCK_SHIFT)
2193 xmodifiers |= ECORE_X_LOCK_SHIFT;
2194
2195 return xmodifiers;
2196}
2197
2198static xcb_visualtype_t *
2199_ecore_xcb_window_find_visual_by_id(xcb_visualid_t id)
2200{
2201 xcb_depth_iterator_t diter;
2202 xcb_visualtype_iterator_t viter;
2203
2204 CHECK_XCB_CONN;
2205 diter = xcb_screen_allowed_depths_iterator(_ecore_xcb_screen);
2206 for (; diter.rem; xcb_depth_next(&diter))
2207 {
2208 viter = xcb_depth_visuals_iterator(diter.data);
2209 for (; viter.rem; xcb_visualtype_next(&viter))
2210 {
2211 if (viter.data->visual_id == id)
2212 return viter.data;
2213 }
2214 }
2215 return 0;
2216}
2217
2218#ifdef ECORE_XCB_XPRINT
2219static xcb_screen_t *
2220_ecore_xcb_window_screen_of_display(int screen)
2221{
2222 xcb_screen_iterator_t iter;
2223
2224 CHECK_XCB_CONN;
2225 iter = xcb_setup_roots_iterator(xcb_get_setup(_ecore_xcb_conn));
2226 for (; iter.rem; --screen, xcb_screen_next(&iter))
2227 if (screen == 0)
2228 return iter.data;
2229
2230 return NULL;
2231}
2232
2233#endif
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_prop.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_prop.c
new file mode 100644
index 0000000..e00fdc1
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_prop.c
@@ -0,0 +1,720 @@
1#include "ecore_xcb_private.h"
2#include <xcb/xcb_icccm.h>
3
4EAPI int
5ecore_x_window_prop_card32_get(Ecore_X_Window win,
6 Ecore_X_Atom atom,
7 unsigned int *val,
8 unsigned int len)
9{
10 xcb_get_property_cookie_t cookie;
11 xcb_get_property_reply_t *reply;
12 int num = 0;
13
14 LOGFN(__FILE__, __LINE__, __FUNCTION__);
15 CHECK_XCB_CONN;
16
17 cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom,
18 ECORE_X_ATOM_CARDINAL, 0, 0x7fffffff);
19 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
20 if (!reply) return -1;
21
22 if ((reply->type != ECORE_X_ATOM_CARDINAL) || (reply->format != 32))
23 num = -1;
24 else if (reply->value_len == 0)
25 num = 0;
26 else
27 {
28 if (reply->value_len < len)
29 len = reply->value_len;
30
31 if (val)
32 {
33 unsigned int i = 0;
34 unsigned char *v;
35
36 v = xcb_get_property_value(reply);
37 for (i = 0; i < len; i++)
38 val[i] = ((uint32_t *)v)[i];
39 num = len;
40 }
41 }
42
43 if (reply) free(reply);
44 return num;
45}
46
47EAPI void
48ecore_x_window_prop_card32_set(Ecore_X_Window win,
49 Ecore_X_Atom atom,
50 unsigned int *val,
51 unsigned int num)
52{
53 LOGFN(__FILE__, __LINE__, __FUNCTION__);
54 CHECK_XCB_CONN;
55
56#if SIZEOF_INT == SIZEOF_LONG
57 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
58 ECORE_X_ATOM_CARDINAL, 32, num, (unsigned char *)val);
59// ecore_x_flush();
60#else
61 long *v2;
62 unsigned int i;
63
64 v2 = malloc(num * sizeof(long));
65 if (!v2) return;
66 for (i = 0; i < num; i++)
67 v2[i] = val[i];
68
69 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
70 ECORE_X_ATOM_CARDINAL, 32, num, (unsigned char *)v2);
71 free(v2);
72// ecore_x_flush();
73#endif
74}
75
76EAPI int
77ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
78 Ecore_X_Atom atom,
79 unsigned int **list)
80{
81 xcb_get_property_cookie_t cookie;
82 xcb_get_property_reply_t *reply;
83 int num = -1;
84
85 LOGFN(__FILE__, __LINE__, __FUNCTION__);
86 CHECK_XCB_CONN;
87
88 if (list) *list = NULL;
89
90 cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom,
91 XCB_ATOM_CARDINAL, 0, 0x7fffffff);
92 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
93 if (!reply) return -1;
94
95 if ((reply->type != XCB_ATOM_CARDINAL) || (reply->format != 32))
96 num = -1;
97 else if ((reply->value_len == 0) || (!xcb_get_property_value(reply)))
98 num = 0;
99 else
100 {
101 num = reply->value_len;
102 if (list)
103 {
104 unsigned int *val;
105 void *data;
106 int i = 0;
107
108 val = malloc(num * sizeof(unsigned int));
109 if (!val)
110 {
111 free(reply);
112 return -1;
113 }
114 data = xcb_get_property_value(reply);
115 for (i = 0; i < num; i++)
116 val[i] = ((uint32_t *)data)[i];
117 *list = val;
118 }
119 }
120
121 free(reply);
122 return num;
123}
124
125EAPI int
126ecore_x_window_prop_atom_get(Ecore_X_Window win,
127 Ecore_X_Atom atom,
128 Ecore_X_Atom *list,
129 unsigned int len)
130{
131 LOGFN(__FILE__, __LINE__, __FUNCTION__);
132
133 return ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_ATOM, list, len);
134}
135
136EAPI void
137ecore_x_window_prop_atom_set(Ecore_X_Window win,
138 Ecore_X_Atom atom,
139 Ecore_X_Atom *list,
140 unsigned int num)
141{
142 LOGFN(__FILE__, __LINE__, __FUNCTION__);
143
144 /* xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom, */
145 /* ECORE_X_ATOM_ATOM, 32, num, list); */
146 ecore_x_window_prop_xid_set(win, atom, ECORE_X_ATOM_ATOM, list, num);
147}
148
149EAPI void
150ecore_x_window_prop_xid_set(Ecore_X_Window win,
151 Ecore_X_Atom atom,
152 Ecore_X_Atom type,
153 Ecore_X_ID *xids,
154 unsigned int num)
155{
156 LOGFN(__FILE__, __LINE__, __FUNCTION__);
157 CHECK_XCB_CONN;
158
159#if SIZEOF_INT == SIZEOF_LONG
160 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
161 type, 32, num, (unsigned char *)xids);
162// ecore_x_flush();
163#else
164 long *v2;
165 unsigned int i;
166
167 v2 = malloc(num * sizeof(long));
168 if (!v2) return;
169 for (i = 0; i < num; i++)
170 v2[i] = xids[i];
171
172 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, atom,
173 type, 32, num, (unsigned char *)v2);
174 free(v2);
175// ecore_x_flush();
176#endif
177}
178
179EAPI int
180ecore_x_window_prop_xid_get(Ecore_X_Window win,
181 Ecore_X_Atom atom,
182 Ecore_X_Atom type,
183 Ecore_X_ID *xids,
184 unsigned int len)
185{
186 xcb_get_property_cookie_t cookie;
187 xcb_get_property_reply_t *reply;
188 int num = 0;
189
190 LOGFN(__FILE__, __LINE__, __FUNCTION__);
191 CHECK_XCB_CONN;
192
193 num = len;
194 cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom, type,
195 0, 0x7fffffff);
196 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
197 if (!reply) return -1;
198
199 if ((reply->type != type) || (reply->format != 32))
200 num = -1;
201 else if (reply->value_len == 0)
202 num = 0;
203 else
204 {
205 unsigned int i = 0;
206 unsigned char *v;
207
208 if (reply->value_len < len)
209 len = reply->value_len;
210
211 v = xcb_get_property_value(reply);
212 for (i = 0; i < len; i++)
213 xids[i] = ((uint32_t *)v)[i];
214
215 num = len;
216 }
217
218 if (reply) free(reply);
219 return num;
220}
221
222EAPI void
223ecore_x_window_prop_string_set(Ecore_X_Window win,
224 Ecore_X_Atom type,
225 const char *str)
226{
227 LOGFN(__FILE__, __LINE__, __FUNCTION__);
228 CHECK_XCB_CONN;
229
230 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win, type,
231 ECORE_X_ATOM_UTF8_STRING, 8, strlen(str), str);
232// ecore_x_flush();
233}
234
235EAPI char *
236ecore_x_window_prop_string_get(Ecore_X_Window win,
237 Ecore_X_Atom type)
238{
239 xcb_get_property_cookie_t cookie;
240 xcb_get_property_reply_t *reply;
241 char *str = NULL;
242 int len = 0;
243
244 LOGFN(__FILE__, __LINE__, __FUNCTION__);
245 CHECK_XCB_CONN;
246
247 cookie =
248 xcb_get_property_unchecked(_ecore_xcb_conn, 0,
249 win ? win : ((xcb_screen_t *)_ecore_xcb_screen)->root,
250 type, XCB_GET_PROPERTY_TYPE_ANY, 0, 1000000L);
251 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
252 if (!reply) return NULL;
253
254 len = ((reply->value_len * reply->format) / 8);
255 str = (char *)malloc((len + 1) * sizeof(char));
256 memcpy(str, xcb_get_property_value(reply), len);
257 str[len] = '\0';
258
259 if (reply->type != ECORE_X_ATOM_UTF8_STRING)
260 {
261 Ecore_Xcb_Textproperty prop;
262 int count = 0;
263 char **list = NULL;
264 Eina_Bool ret = EINA_FALSE;
265
266 prop.value = strdup(str);
267 prop.nitems = len;
268 prop.encoding = reply->type;
269
270#ifdef HAVE_ICONV
271 ret = _ecore_xcb_utf8_textproperty_to_textlist(&prop, &list, &count);
272#else
273 ret = _ecore_xcb_mb_textproperty_to_textlist(&prop, &list, &count);
274#endif
275 if (ret)
276 {
277 if (count > 0)
278 str = strdup(list[0]);
279 else
280 str = strdup((char *)prop.value);
281
282 if (list) free(list);
283 }
284 else
285 str = strdup((char *)prop.value);
286 }
287
288 free(reply);
289 return str;
290}
291
292EAPI int
293ecore_x_window_prop_window_get(Ecore_X_Window win,
294 Ecore_X_Atom atom,
295 Ecore_X_Window *list,
296 unsigned int len)
297{
298 LOGFN(__FILE__, __LINE__, __FUNCTION__);
299
300 return ecore_x_window_prop_xid_get(win, atom, ECORE_X_ATOM_WINDOW, list, len);
301}
302
303EAPI void
304ecore_x_window_prop_window_set(Ecore_X_Window win,
305 Ecore_X_Atom atom,
306 Ecore_X_Window *list,
307 unsigned int num)
308{
309 LOGFN(__FILE__, __LINE__, __FUNCTION__);
310
311 ecore_x_window_prop_xid_set(win, atom, ECORE_X_ATOM_WINDOW, list, num);
312}
313
314EAPI int
315ecore_x_window_prop_window_list_get(Ecore_X_Window win,
316 Ecore_X_Atom atom,
317 Ecore_X_Window **plst)
318{
319 LOGFN(__FILE__, __LINE__, __FUNCTION__);
320
321 return ecore_x_window_prop_xid_list_get(win, atom, ECORE_X_ATOM_WINDOW, plst);
322}
323
324EAPI Ecore_X_Atom
325ecore_x_window_prop_any_type(void)
326{
327 return XCB_ATOM_ANY;
328}
329
330EAPI void
331ecore_x_window_prop_property_del(Ecore_X_Window win,
332 Ecore_X_Atom property)
333{
334 LOGFN(__FILE__, __LINE__, __FUNCTION__);
335 CHECK_XCB_CONN;
336
337 xcb_delete_property(_ecore_xcb_conn, win, property);
338}
339
340EAPI void
341ecore_x_window_prop_property_set(Ecore_X_Window win,
342 Ecore_X_Atom property,
343 Ecore_X_Atom type,
344 int size,
345 void *data,
346 int num)
347{
348 LOGFN(__FILE__, __LINE__, __FUNCTION__);
349 CHECK_XCB_CONN;
350
351 if (win == 0)
352 win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
353
354 if (size != 32)
355 {
356 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
357 property, type, size, num, (unsigned char *)data);
358// ecore_x_flush();
359 }
360 else
361 {
362 uint32_t *dat;
363 int i = 0, *ptr;
364
365 dat = malloc(sizeof(uint32_t) * num);
366 if (dat)
367 {
368 for (ptr = (int *)data, i = 0; i < num; i++)
369 dat[i] = ptr[i];
370 xcb_change_property(_ecore_xcb_conn, XCB_PROP_MODE_REPLACE, win,
371 property, type, size, num,
372 (unsigned char *)dat);
373 free(dat);
374// ecore_x_flush();
375 }
376 }
377}
378
379EAPI int
380ecore_x_window_prop_property_get(Ecore_X_Window win,
381 Ecore_X_Atom property,
382 Ecore_X_Atom type,
383 int size,
384 unsigned char **data,
385 int *num)
386{
387 xcb_get_property_cookie_t cookie;
388 xcb_get_property_reply_t *reply;
389 int format = 0;
390 unsigned int i = 0;
391 void *value;
392
393 LOGFN(__FILE__, __LINE__, __FUNCTION__);
394 CHECK_XCB_CONN;
395
396 if (num) *num = 0;
397
398 if (data)
399 *data = NULL;
400 else
401 return 0;
402
403 if (win == 0)
404 win = ((xcb_screen_t *)_ecore_xcb_screen)->root;
405
406 cookie =
407 xcb_get_property_unchecked(_ecore_xcb_conn, 0, win,
408 property, type, 0, UINT_MAX);
409 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
410 if (!reply) return 0;
411 if ((reply->format != size) || (reply->value_len == 0))
412 {
413 free(reply);
414 return 0;
415 }
416
417 if (!(*data = malloc(reply->value_len * reply->format / 8)))
418 {
419 free(reply);
420 return 0;
421 }
422
423 value = xcb_get_property_value(reply);
424 switch (reply->format)
425 {
426 case 8:
427 for (i = 0; i < reply->value_len; i++)
428 (*data)[i] = ((unsigned char *)value)[i];
429 break;
430
431 case 16:
432 for (i = 0; i < reply->value_len; i++)
433 ((unsigned short *)*data)[i] = ((unsigned short *)value)[i];
434 break;
435
436 case 32:
437 for (i = 0; i < reply->value_len; i++)
438 ((unsigned int *)*data)[i] = ((uint32_t *)value)[i];
439 break;
440 }
441
442 if (num) *num = reply->value_len;
443 format = reply->format;
444 free(reply);
445 return format;
446}
447
448EAPI int
449ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
450 Ecore_X_Atom atom,
451 Ecore_X_Atom **list)
452{
453 LOGFN(__FILE__, __LINE__, __FUNCTION__);
454
455 return ecore_x_window_prop_xid_list_get(win, atom, ECORE_X_ATOM_ATOM, list);
456}
457
458EAPI void
459ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
460 Ecore_X_Atom atom,
461 Ecore_X_Atom item,
462 int op)
463{
464 LOGFN(__FILE__, __LINE__, __FUNCTION__);
465 ecore_x_window_prop_xid_list_change(win, atom, ECORE_X_ATOM_ATOM, item, op);
466}
467
468EAPI int
469ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
470 Ecore_X_Atom atom,
471 Ecore_X_Atom type,
472 Ecore_X_ID **xids)
473{
474 xcb_get_property_cookie_t cookie;
475 xcb_get_property_reply_t *reply;
476 int num = -1;
477
478 LOGFN(__FILE__, __LINE__, __FUNCTION__);
479 CHECK_XCB_CONN;
480
481 if (xids) *xids = NULL;
482
483 cookie = xcb_get_property_unchecked(_ecore_xcb_conn, 0, win, atom, type,
484 0, 0x7fffffff);
485 reply = xcb_get_property_reply(_ecore_xcb_conn, cookie, NULL);
486 if (!reply) return -1;
487
488 if ((reply->type != type) || (reply->format != 32))
489 num = -1;
490 else if ((reply->value_len == 0) || (!xcb_get_property_value(reply)))
491 num = 0;
492 else
493 {
494 Ecore_X_Atom *alst;
495 void *val;
496
497 num = xcb_get_property_value_length(reply);
498 val = xcb_get_property_value(reply);
499 alst = malloc(num * sizeof(Ecore_X_ID));
500 if (alst)
501 {
502 int i = 0;
503
504 for (i = 0; i < num; i++)
505 alst[i] = ((uint32_t *)val)[i];
506 *xids = alst;
507 }
508 }
509
510 free(reply);
511 return num;
512}
513
514EAPI void
515ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
516 Ecore_X_Atom atom,
517 Ecore_X_Atom type,
518 Ecore_X_ID item,
519 int op)
520{
521 Ecore_X_ID *lst;
522 int i = 0, num = 0;
523
524 LOGFN(__FILE__, __LINE__, __FUNCTION__);
525 CHECK_XCB_CONN;
526
527 num = ecore_x_window_prop_xid_list_get(win, atom, type, &lst);
528 if (num < 0) return;
529
530 for (i = 0; i < num; i++)
531 {
532 if (lst[i] == item) break;
533 }
534
535 if (i < num)
536 {
537 if (op == ECORE_X_PROP_LIST_ADD)
538 goto done;
539 num--;
540 for (; i < num; i++)
541 lst[i] = lst[i + 1];
542 }
543 else
544 {
545 if (op == ECORE_X_PROP_LIST_REMOVE)
546 goto done;
547 num++;
548 lst = realloc(lst, num * sizeof(Ecore_X_ID));
549 lst[i] = item;
550 }
551 ecore_x_window_prop_xid_set(win, atom, type, lst, num);
552
553done:
554 if (lst) free(lst);
555}
556
557EAPI Eina_Bool
558ecore_x_window_prop_protocol_isset(Ecore_X_Window win,
559 Ecore_X_WM_Protocol protocol)
560{
561 Eina_Bool ret = EINA_FALSE;
562 Ecore_X_Atom proto;
563#ifdef OLD_XCB_VERSION
564 xcb_get_wm_protocols_reply_t protos;
565#else
566 xcb_icccm_get_wm_protocols_reply_t protos;
567#endif
568 xcb_get_property_cookie_t cookie;
569 uint8_t reply;
570 uint32_t count = 0, i = 0;
571
572 LOGFN(__FILE__, __LINE__, __FUNCTION__);
573 CHECK_XCB_CONN;
574
575 if (protocol >= ECORE_X_WM_PROTOCOL_NUM) return EINA_FALSE;
576
577 proto = _ecore_xcb_atoms_wm_protocol[protocol];
578#ifdef OLD_XCB_VERSION
579 cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
580 ECORE_X_ATOM_WM_PROTOCOLS);
581 reply = xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL);
582#else
583 cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
584 ECORE_X_ATOM_WM_PROTOCOLS);
585 reply = xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie,
586 &protos, NULL);
587#endif
588 if (!reply) return EINA_FALSE;
589
590 count = protos.atoms_len;
591 for (i = 0; i < count; i++)
592 {
593 if (protos.atoms[i] == proto)
594 {
595 ret = EINA_TRUE;
596 break;
597 }
598 }
599
600#ifdef OLD_XCB_VERSION
601 xcb_get_wm_protocols_reply_wipe(&protos);
602#else
603 xcb_icccm_get_wm_protocols_reply_wipe(&protos);
604#endif
605 return ret;
606}
607
608EAPI Ecore_X_WM_Protocol *
609ecore_x_window_prop_protocol_list_get(Ecore_X_Window win,
610 int *num_ret)
611{
612#ifdef OLD_XCB_VERSION
613 xcb_get_wm_protocols_reply_t protos;
614#else
615 xcb_icccm_get_wm_protocols_reply_t protos;
616#endif
617 xcb_get_property_cookie_t cookie;
618 uint8_t reply;
619 uint32_t count = 0, i = 0;
620 Ecore_X_WM_Protocol *prot_ret = NULL;
621
622 LOGFN(__FILE__, __LINE__, __FUNCTION__);
623 CHECK_XCB_CONN;
624
625 if (!num_ret) return NULL;
626
627 *num_ret = 0;
628
629#ifdef OLD_XCB_VERSION
630 cookie = xcb_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
631 ECORE_X_ATOM_WM_PROTOCOLS);
632 reply = xcb_get_wm_protocols_reply(_ecore_xcb_conn, cookie, &protos, NULL);
633#else
634 cookie = xcb_icccm_get_wm_protocols_unchecked(_ecore_xcb_conn, win,
635 ECORE_X_ATOM_WM_PROTOCOLS);
636 reply = xcb_icccm_get_wm_protocols_reply(_ecore_xcb_conn, cookie,
637 &protos, NULL);
638#endif
639 if (!reply) return NULL;
640
641 count = protos.atoms_len;
642 if (count <= 0)
643 {
644#ifdef OLD_XCB_VERSION
645 xcb_get_wm_protocols_reply_wipe(&protos);
646#else
647 xcb_icccm_get_wm_protocols_reply_wipe(&protos);
648#endif
649 return NULL;
650 }
651
652 prot_ret = calloc(1, count * sizeof(Ecore_X_WM_Protocol));
653 if (!prot_ret)
654 {
655#ifdef OLD_XCB_VERSION
656 xcb_get_wm_protocols_reply_wipe(&protos);
657#else
658 xcb_icccm_get_wm_protocols_reply_wipe(&protos);
659#endif
660 return NULL;
661 }
662
663 for (i = 0; i < count; i++)
664 {
665 Ecore_X_WM_Protocol j;
666
667 prot_ret[i] = -1;
668 for (j = 0; j < ECORE_X_WM_PROTOCOL_NUM; j++)
669 {
670 if (_ecore_xcb_atoms_wm_protocol[j] == protos.atoms[i])
671 prot_ret[i] = j;
672 }
673 }
674
675 if (num_ret) *num_ret = count;
676
677#ifdef OLD_XCB_VERSION
678 xcb_get_wm_protocols_reply_wipe(&protos);
679#else
680 xcb_icccm_get_wm_protocols_reply_wipe(&protos);
681#endif
682 return prot_ret;
683}
684
685EAPI Ecore_X_Atom *
686ecore_x_window_prop_list(Ecore_X_Window win,
687 int *num)
688{
689 xcb_list_properties_cookie_t cookie;
690 xcb_list_properties_reply_t *reply;
691 xcb_atom_t *atm;
692 Ecore_X_Atom *atoms;
693 int i = 0;
694
695 LOGFN(__FILE__, __LINE__, __FUNCTION__);
696 CHECK_XCB_CONN;
697
698 if (num) *num = 0;
699
700 cookie = xcb_list_properties_unchecked(_ecore_xcb_conn, win);
701 reply = xcb_list_properties_reply(_ecore_xcb_conn, cookie, NULL);
702 if (!reply) return NULL;
703
704 atoms = (Ecore_X_Atom *)malloc(reply->atoms_len * sizeof(Ecore_X_Atom));
705 if (!atoms)
706 {
707 free(reply);
708 return NULL;
709 }
710
711 atm = xcb_list_properties_atoms(reply);
712 for (i = 0; i < reply->atoms_len; i++)
713 atoms[i] = atm[i];
714
715 if (num) *num = reply->atoms_len;
716 free(reply);
717
718 return atoms;
719}
720
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shadow.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shadow.c
new file mode 100644
index 0000000..4f24d62
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shadow.c
@@ -0,0 +1,408 @@
1#include "ecore_xcb_private.h"
2
3typedef struct _Shadow Shadow;
4struct _Shadow
5{
6 Shadow *parent, **children;
7 Ecore_X_Window win;
8 int children_num;
9 short x, y;
10 unsigned short w, h;
11};
12
13static Eina_Bool _inside_rects(Shadow *s,
14 int x,
15 int y,
16 int bx,
17 int by,
18 Ecore_X_Rectangle *rects,
19 int num);
20
21//static int shadow_count = 0;
22static Shadow **shadow_base = NULL;
23static int shadow_num = 0;
24
25/* FIXME: round trips */
26static Shadow *
27_ecore_x_window_tree_walk(Ecore_X_Window window)
28{
29 Shadow *s, **sl;
30 xcb_get_window_attributes_reply_t *reply_attr;
31 xcb_get_geometry_reply_t *reply_geom;
32 xcb_query_tree_reply_t *reply_tree;
33 xcb_get_window_attributes_cookie_t cookie_attr;
34 xcb_get_geometry_cookie_t cookie_geom;
35 xcb_query_tree_cookie_t cookie_tree;
36 int i, j;
37
38 CHECK_XCB_CONN;
39
40 cookie_attr = xcb_get_window_attributes_unchecked(_ecore_xcb_conn, window);
41 reply_attr = xcb_get_window_attributes_reply(_ecore_xcb_conn, cookie_attr, NULL);
42 if (!reply_attr) return NULL;
43 if (reply_attr->map_state != XCB_MAP_STATE_VIEWABLE)
44 {
45 free(reply_attr);
46 return NULL;
47 }
48
49 free(reply_attr);
50
51 cookie_geom = xcb_get_geometry_unchecked(_ecore_xcb_conn, window);
52 reply_geom = xcb_get_geometry_reply(_ecore_xcb_conn, cookie_geom, NULL);
53 if (!reply_geom) return NULL;
54
55 if (!(s = calloc(1, sizeof(Shadow))))
56 {
57 free(reply_geom);
58 return NULL;
59 }
60
61 s->win = window;
62 s->x = reply_geom->x;
63 s->y = reply_geom->y;
64 s->w = reply_geom->width;
65 s->h = reply_geom->height;
66
67 free(reply_geom);
68
69 cookie_tree = xcb_query_tree_unchecked(_ecore_xcb_conn, window);
70 reply_tree = xcb_query_tree_reply(_ecore_xcb_conn, cookie_tree, NULL);
71 if (reply_tree)
72 {
73 xcb_window_t *list;
74 int num;
75
76 num = xcb_query_tree_children_length(reply_tree);
77 list = xcb_query_tree_children(reply_tree);
78
79 s->children = calloc(1, sizeof(Shadow *) * num);
80 if (s->children)
81 {
82 s->children_num = num;
83 for (i = 0; i < num; i++)
84 {
85 s->children[i] = _ecore_x_window_tree_walk(list[i]);
86 if (s->children[i])
87 s->children[i]->parent = s;
88 }
89 /* compress list down */
90 j = 0;
91 for (i = 0; i < num; i++)
92 {
93 if (s->children[i])
94 {
95 s->children[j] = s->children[i];
96 j++;
97 }
98 }
99 if (j == 0)
100 {
101 free(s->children);
102 s->children = NULL;
103 s->children_num = 0;
104 }
105 else
106 {
107 s->children_num = j;
108 sl = realloc(s->children, sizeof(Shadow *) * j);
109 if (sl) s->children = sl;
110 }
111 }
112
113 free(reply_tree);
114 }
115
116 return s;
117}
118
119static void
120_ecore_x_window_tree_shadow_free1(Shadow *s)
121{
122 int i = 0;
123
124 if (!s) return;
125 if (s->children)
126 {
127 for (i = 0; i < s->children_num; i++)
128 {
129 if (s->children[i])
130 _ecore_x_window_tree_shadow_free1(s->children[i]);
131 }
132 free(s->children);
133 }
134
135 free(s);
136}
137
138static void
139_ecore_x_window_tree_shadow_free(void)
140{
141 int i = 0;
142
143 if (!shadow_base) return;
144
145 for (i = 0; i < shadow_num; i++)
146 {
147 if (!shadow_base[i]) continue;
148 _ecore_x_window_tree_shadow_free1(shadow_base[i]);
149 }
150 free(shadow_base);
151 shadow_base = NULL;
152 shadow_num = 0;
153}
154
155static void
156_ecore_x_window_tree_shadow_populate(void)
157{
158 Ecore_X_Window *roots = NULL;
159 int i = 0, num = 0;
160
161 if ((roots = ecore_x_window_root_list(&num)))
162 {
163 shadow_base = calloc(1, sizeof(Shadow *) * num);
164 if (shadow_base)
165 {
166 shadow_num = num;
167 for (i = 0; i < num; i++)
168 shadow_base[i] = _ecore_x_window_tree_walk(roots[i]);
169 }
170
171 free(roots);
172 }
173}
174
175/*
176 static void
177 _ecore_x_window_tree_shadow_start(void)
178 {
179 shadow_count++;
180 if (shadow_count > 1) return;
181 _ecore_x_window_tree_shadow_populate();
182 }
183
184 static void
185 _ecore_x_window_tree_shadow_stop(void)
186 {
187 shadow_count--;
188 if (shadow_count != 0) return;
189 _ecore_x_window_tree_shadow_free();
190 }
191 */
192
193Shadow *
194_ecore_x_window_shadow_tree_find_shadow(Shadow *s,
195 Ecore_X_Window win)
196{
197 Shadow *ss;
198 int i = 0;
199
200 if (s->win == win) return s;
201
202 if (s->children)
203 {
204 for (i = 0; i < s->children_num; i++)
205 {
206 if (!s->children[i]) continue;
207
208 if ((ss =
209 _ecore_x_window_shadow_tree_find_shadow(s->children[i], win)))
210 return ss;
211 }
212 }
213
214 return NULL;
215}
216
217Shadow *
218_ecore_x_window_shadow_tree_find(Ecore_X_Window base)
219{
220 Shadow *s;
221 int i = 0;
222
223 for (i = 0; i < shadow_num; i++)
224 {
225 if (!shadow_base[i]) continue;
226
227 if ((s =
228 _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], base)))
229 return s;
230 }
231 return NULL;
232}
233
234static Ecore_X_Window
235_ecore_x_window_shadow_tree_at_xy_get_shadow(Shadow *s,
236 int bx,
237 int by,
238 int x,
239 int y,
240 Ecore_X_Window *skip,
241 int skip_num)
242{
243 Ecore_X_Window child;
244 Ecore_X_Rectangle *rects;
245 int i = 0, j = 0, wx = 0, wy = 0, num = 0;
246
247 wx = s->x + bx;
248 wy = s->y + by;
249 if (!((x >= wx) && (y >= wy) && (x < (wx + s->w)) && (y < (wy + s->h))))
250 return 0;
251
252 rects = ecore_x_window_shape_rectangles_get(s->win, &num);
253 if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
254 num = 0;
255 rects = ecore_x_window_shape_input_rectangles_get(s->win, &num);
256 if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
257
258 if (s->children)
259 {
260 int skipit = 0;
261
262 for (i = s->children_num - 1; i >= 0; --i)
263 {
264 if (!s->children[i]) continue;
265
266 skipit = 0;
267 if (skip)
268 {
269 for (j = 0; j < skip_num; j++)
270 {
271 if (s->children[i]->win == skip[j])
272 {
273 skipit = 1;
274 goto onward;
275 }
276 }
277 }
278onward:
279 if (!skipit)
280 {
281 if ((child =
282 _ecore_x_window_shadow_tree_at_xy_get_shadow(s->children[i], wx, wy, x, y, skip, skip_num)))
283 return child;
284 }
285 }
286 }
287
288 return s->win;
289}
290
291static Ecore_X_Window
292_ecore_x_window_shadow_tree_at_xy_get(Ecore_X_Window base,
293 int bx,
294 int by,
295 int x,
296 int y,
297 Ecore_X_Window *skip,
298 int skip_num)
299{
300 Shadow *s;
301
302 if (!shadow_base)
303 {
304 _ecore_x_window_tree_shadow_populate();
305 if (!shadow_base) return 0;
306 }
307
308 s = _ecore_x_window_shadow_tree_find(base);
309 if (!s) return 0;
310
311 return _ecore_x_window_shadow_tree_at_xy_get_shadow(s, bx, by, x, y, skip, skip_num);
312}
313
314static Eina_Bool
315_inside_rects(Shadow *s,
316 int x,
317 int y,
318 int bx,
319 int by,
320 Ecore_X_Rectangle *rects,
321 int num)
322{
323 Eina_Bool inside = EINA_FALSE;
324 int i = 0;
325
326 if (!rects) return EINA_FALSE;
327 for (i = 0; i < num; i++)
328 {
329 if ((x >= s->x + bx + rects[i].x) &&
330 (y >= s->y + by + rects[i].y) &&
331 (x < (int)(s->x + bx + rects[i].x + rects[i].width)) &&
332 (y < (int)(s->y + by + rects[i].y + rects[i].height)))
333 {
334 inside = EINA_TRUE;
335 break;
336 }
337 }
338 free(rects);
339 return inside;
340}
341
342/**
343 * Retrieves the top, visible window at the given location,
344 * but skips the windows in the list. This uses a shadow tree built from the
345 * window tree that is only updated the first time
346 * ecore_x_window_shadow_tree_at_xy_with_skip_get() is called, or the next time
347 * it is called after a ecore_x_window_shadow_tree_flush()
348 * @param base The base window to start searching from (normally root).
349 * @param x The given X position.
350 * @param y The given Y position.
351 * @return The window at that position.
352 * @ingroup Ecore_X_Window_Geometry_Group
353 */
354EAPI Ecore_X_Window
355ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base,
356 int x,
357 int y,
358 Ecore_X_Window *skip,
359 int skip_num)
360{
361 return _ecore_x_window_shadow_tree_at_xy_get(base, 0, 0, x, y, skip, skip_num);
362}
363
364/**
365 * Retrieves the parent window a given window has. This uses the shadow window
366 * tree.
367 * @param root The root window of @p win - if 0, this will be automatically determined with extra processing overhead
368 * @param win The window to get the parent window of
369 * @return The parent window of @p win
370 * @ingroup Ecore_X_Window_Geometry_Group
371 */
372EAPI Ecore_X_Window
373ecore_x_window_shadow_parent_get(Ecore_X_Window root __UNUSED__,
374 Ecore_X_Window win)
375{
376 Shadow *s;
377 int i = 0;
378
379 if (!shadow_base)
380 {
381 _ecore_x_window_tree_shadow_populate();
382 if (!shadow_base) return 0;
383 }
384
385 for (i = 0; i < shadow_num; i++)
386 {
387 if (!shadow_base[i]) continue;
388
389 s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], win);
390 if (s)
391 {
392 if (!s->parent) return 0;
393 return s->parent->win;
394 }
395 }
396 return 0;
397}
398
399/**
400 * Flushes the window shadow tree so nothing is stored.
401 * @ingroup Ecore_X_Window_Geometry_Group
402 */
403EAPI void
404ecore_x_window_shadow_tree_flush(void)
405{
406 _ecore_x_window_tree_shadow_free();
407}
408
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shape.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shape.c
new file mode 100644
index 0000000..6206a51
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_window_shape.c
@@ -0,0 +1,790 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_SHAPE
3# include <xcb/shape.h>
4#endif
5
6/**
7 * @defgroup Ecore_X_Window_Shape X Window Shape Functions
8 *
9 * These functions use the shape extension of the X server to change
10 * shape of given windows.
11 */
12
13/**
14 * Sets the input shape of the given window to that given by the pixmap @p mask.
15 * @param win The given window.
16 * @param mask A 1-bit depth pixmap that provides the new input shape of the
17 * window.
18 * @ingroup Ecore_X_Window_Shape
19 */
20EAPI void
21ecore_x_window_shape_input_mask_set(Ecore_X_Window win,
22 Ecore_X_Pixmap mask)
23{
24 LOGFN(__FILE__, __LINE__, __FUNCTION__);
25 CHECK_XCB_CONN;
26
27#ifdef ECORE_XCB_SHAPE
28 xcb_shape_mask(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT,
29 win, 0, 0, mask);
30// ecore_x_flush();
31#else
32 return;
33 win = 0;
34 mask = 0;
35#endif
36}
37
38/**
39 * Sets the shape of the given window to that given by the pixmap @p mask.
40 * @param win The given window.
41 * @param mask A 2-bit depth pixmap that provides the new shape of the
42 * window.
43 * @ingroup Ecore_X_Window_Shape
44 */
45EAPI void
46ecore_x_window_shape_mask_set(Ecore_X_Window win,
47 Ecore_X_Pixmap mask)
48{
49 LOGFN(__FILE__, __LINE__, __FUNCTION__);
50 CHECK_XCB_CONN;
51
52#ifdef ECORE_XCB_SHAPE
53 xcb_shape_mask(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
54 win, 0, 0, mask);
55// ecore_x_flush();
56#else
57 return;
58 win = 0;
59 mask = 0;
60#endif
61}
62
63EAPI void
64ecore_x_window_shape_window_set(Ecore_X_Window win,
65 Ecore_X_Window shape_win)
66{
67 LOGFN(__FILE__, __LINE__, __FUNCTION__);
68 CHECK_XCB_CONN;
69
70#ifdef ECORE_XCB_SHAPE
71 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
72 XCB_SHAPE_SK_BOUNDING, win, 0, 0, shape_win);
73// ecore_x_flush();
74#else
75 return;
76 win = 0;
77 shape_win = 0;
78#endif
79}
80
81EAPI void
82ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
83 Ecore_X_Window shape_win,
84 int x,
85 int y)
86{
87 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 CHECK_XCB_CONN;
89
90#ifdef ECORE_XCB_SHAPE
91 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_BOUNDING,
92 XCB_SHAPE_SK_BOUNDING, win, x, y, shape_win);
93// ecore_x_flush();
94#else
95 return;
96 win = 0;
97 shape_win = 0;
98 x = 0;
99 y = 0;
100#endif
101}
102
103EAPI void
104ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
105 int x,
106 int y,
107 int w,
108 int h)
109{
110#ifdef ECORE_XCB_SHAPE
111 xcb_rectangle_t rect;
112#endif
113
114 LOGFN(__FILE__, __LINE__, __FUNCTION__);
115 CHECK_XCB_CONN;
116
117#ifdef ECORE_XCB_SHAPE
118 rect.x = x;
119 rect.y = y;
120 rect.width = w;
121 rect.height = h;
122 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
123 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
124 win, 0, 0, 1, &rect);
125// ecore_x_flush();
126#else
127 return;
128 win = 0;
129 x = 0;
130 y = 0;
131 w = 0;
132 h = 0;
133#endif
134}
135
136EAPI void
137ecore_x_window_shape_rectangles_set(Ecore_X_Window win,
138 Ecore_X_Rectangle *rects,
139 int num)
140{
141#ifdef ECORE_XCB_SHAPE
142 xcb_rectangle_t *rect = NULL;
143#endif
144
145 LOGFN(__FILE__, __LINE__, __FUNCTION__);
146 CHECK_XCB_CONN;
147
148 if (!rects) return;
149
150#ifdef ECORE_XCB_SHAPE
151 if (num > 0)
152 {
153 int i = 0;
154
155 if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
156 return;
157
158 for (i = 0; i < num; i++)
159 {
160 rect[i].x = rects[i].x;
161 rect[i].y = rects[i].y;
162 rect[i].width = rects[i].width;
163 rect[i].height = rects[i].height;
164 }
165 }
166 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
167 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
168 win, 0, 0, num, (xcb_rectangle_t *)rect);
169
170 if (rect) free(rect);
171// ecore_x_flush();
172#else
173 return;
174 win = 0;
175 num = 0;
176 rects = NULL;
177#endif
178}
179
180EAPI void
181ecore_x_window_shape_window_add(Ecore_X_Window win,
182 Ecore_X_Window shape_win)
183{
184 LOGFN(__FILE__, __LINE__, __FUNCTION__);
185 CHECK_XCB_CONN;
186
187#ifdef ECORE_XCB_SHAPE
188 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
189 XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING,
190 win, 0, 0, shape_win);
191// ecore_x_flush();
192#else
193 return;
194 win = 0;
195 shape_win = 0;
196#endif
197}
198
199EAPI void
200ecore_x_window_shape_window_add_xy(Ecore_X_Window win,
201 Ecore_X_Window shape_win,
202 int x,
203 int y)
204{
205 LOGFN(__FILE__, __LINE__, __FUNCTION__);
206 CHECK_XCB_CONN;
207
208#ifdef ECORE_XCB_SHAPE
209 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
210 XCB_SHAPE_SK_BOUNDING, XCB_SHAPE_SK_BOUNDING,
211 win, x, y, shape_win);
212// ecore_x_flush();
213#else
214 return;
215 win = 0;
216 shape_win = 0;
217 x = 0;
218 y = 0;
219#endif
220}
221
222EAPI void
223ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
224 int x,
225 int y,
226 int w,
227 int h)
228{
229#ifdef ECORE_XCB_SHAPE
230 xcb_rectangle_t rect;
231#endif
232
233 LOGFN(__FILE__, __LINE__, __FUNCTION__);
234 CHECK_XCB_CONN;
235
236#ifdef ECORE_XCB_SHAPE
237 rect.x = x;
238 rect.y = y;
239 rect.width = w;
240 rect.height = h;
241 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
242 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
243 win, 0, 0, 1, &rect);
244// ecore_x_flush();
245#else
246 return;
247 win = 0;
248 x = 0;
249 y = 0;
250 w = 0;
251 h = 0;
252#endif
253}
254
255EAPI void
256ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win,
257 int x,
258 int y,
259 int w,
260 int h)
261{
262#ifdef ECORE_XCB_SHAPE
263 xcb_rectangle_t rect;
264#endif
265
266 LOGFN(__FILE__, __LINE__, __FUNCTION__);
267 CHECK_XCB_CONN;
268
269#ifdef ECORE_XCB_SHAPE
270 rect.x = x;
271 rect.y = y;
272 rect.width = w;
273 rect.height = h;
274 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SUBTRACT,
275 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
276 win, 0, 0, 1, &rect);
277// ecore_x_flush();
278#else
279 return;
280 win = 0;
281 x = 0;
282 y = 0;
283 w = 0;
284 h = 0;
285#endif
286}
287
288EAPI void
289ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
290 int x,
291 int y,
292 int w,
293 int h)
294{
295#ifdef ECORE_XCB_SHAPE
296 xcb_rectangle_t rect;
297#endif
298
299 LOGFN(__FILE__, __LINE__, __FUNCTION__);
300 CHECK_XCB_CONN;
301
302#ifdef ECORE_XCB_SHAPE
303 rect.x = x;
304 rect.y = y;
305 rect.width = w;
306 rect.height = h;
307 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_INTERSECT,
308 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
309 win, 0, 0, 1, &rect);
310// ecore_x_flush();
311#else
312 return;
313 win = 0;
314 x = 0;
315 y = 0;
316 w = 0;
317 h = 0;
318#endif
319}
320
321EAPI void
322ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
323 Ecore_X_Rectangle *rects,
324 int num)
325{
326#ifdef ECORE_XCB_SHAPE
327 xcb_rectangle_t *rect = NULL;
328#endif
329
330 LOGFN(__FILE__, __LINE__, __FUNCTION__);
331 CHECK_XCB_CONN;
332
333#ifdef ECORE_XCB_SHAPE
334 if (num > 0)
335 {
336 int i = 0;
337
338 if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
339 return;
340
341 for (i = 0; i < num; i++)
342 {
343 rect[i].x = rects[i].x;
344 rect[i].y = rects[i].y;
345 rect[i].width = rects[i].width;
346 rect[i].height = rects[i].height;
347 }
348 }
349
350 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
351 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_UNSORTED,
352 win, 0, 0, num, (xcb_rectangle_t *)&rect);
353
354 if (rect) free(rect);
355// ecore_x_flush();
356#else
357 return;
358 win = 0;
359 num = 0;
360 rects = NULL;
361#endif
362}
363
364EAPI Ecore_X_Rectangle *
365ecore_x_window_shape_rectangles_get(Ecore_X_Window win,
366 int *num_ret)
367{
368 Ecore_X_Rectangle *rects = NULL;
369#ifdef ECORE_XCB_SHAPE
370 xcb_shape_get_rectangles_cookie_t cookie;
371 xcb_shape_get_rectangles_reply_t *reply;
372 xcb_rectangle_t *r;
373 unsigned int i = 0;
374#endif
375
376 LOGFN(__FILE__, __LINE__, __FUNCTION__);
377 CHECK_XCB_CONN;
378
379 if (num_ret) *num_ret = 0;
380
381#ifdef ECORE_XCB_SHAPE
382 cookie =
383 xcb_shape_get_rectangles(_ecore_xcb_conn, win, XCB_SHAPE_SK_BOUNDING);
384 reply = xcb_shape_get_rectangles_reply(_ecore_xcb_conn, cookie, NULL);
385 if (!reply) return NULL;
386 if (num_ret) *num_ret = reply->rectangles_len;
387
388 if (reply->rectangles_len < 1)
389 {
390 free(reply);
391 if (num_ret) *num_ret = 0;
392 return NULL;
393 }
394
395 rects = malloc(sizeof(Ecore_X_Rectangle) * reply->rectangles_len);
396 if (!rects)
397 {
398 free(reply);
399 if (num_ret) *num_ret = 0;
400 return NULL;
401 }
402 r = xcb_shape_get_rectangles_rectangles(reply);
403 for (i = 0; i < reply->rectangles_len; i++)
404 {
405 rects[i].x = r[i].x;
406 rects[i].y = r[i].y;
407 rects[i].width = r[i].width;
408 rects[i].height = r[i].height;
409 }
410
411 free(reply);
412
413 return rects;
414#else
415 return rects;
416 win = 0;
417#endif
418}
419
420EAPI void
421ecore_x_window_shape_events_select(Ecore_X_Window win,
422 Eina_Bool on)
423{
424 LOGFN(__FILE__, __LINE__, __FUNCTION__);
425 CHECK_XCB_CONN;
426
427#ifdef ECORE_XCB_SHAPE
428 xcb_shape_select_input(_ecore_xcb_conn, win, on);
429// ecore_x_flush();
430#else
431 return;
432 win = 0;
433 on = 0;
434#endif
435}
436
437EAPI Ecore_X_Rectangle *
438ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win,
439 int *num_ret)
440{
441 Ecore_X_Rectangle *rects = NULL;
442#ifdef ECORE_XCB_SHAPE
443 xcb_shape_get_rectangles_cookie_t cookie;
444 xcb_shape_get_rectangles_reply_t *reply;
445 xcb_rectangle_t *r;
446 unsigned int i = 0;
447#endif
448
449 LOGFN(__FILE__, __LINE__, __FUNCTION__);
450 CHECK_XCB_CONN;
451
452 if (num_ret) *num_ret = 0;
453
454#ifdef ECORE_XCB_SHAPE
455 cookie =
456 xcb_shape_get_rectangles(_ecore_xcb_conn, win, XCB_SHAPE_SK_INPUT);
457 reply = xcb_shape_get_rectangles_reply(_ecore_xcb_conn, cookie, NULL);
458 if (!reply) return NULL;
459 if (num_ret) *num_ret = reply->rectangles_len;
460
461 if (reply->rectangles_len < 1)
462 {
463 free(reply);
464 if (num_ret) *num_ret = 0;
465 return NULL;
466 }
467
468 rects = malloc(sizeof(Ecore_X_Rectangle) * reply->rectangles_len);
469 if (!rects)
470 {
471 free(reply);
472 if (num_ret) *num_ret = 0;
473 return NULL;
474 }
475 r = xcb_shape_get_rectangles_rectangles(reply);
476 for (i = 0; i < reply->rectangles_len; i++)
477 {
478 rects[i].x = r[i].x;
479 rects[i].y = r[i].y;
480 rects[i].width = r[i].width;
481 rects[i].height = r[i].height;
482 }
483
484 free(reply);
485
486 return rects;
487#else
488 xcb_get_geometry_cookie_t cookie;
489 xcb_get_geometry_reply_t *reply;
490
491 if (!(rects = malloc(sizeof(Ecore_X_Rectangle))))
492 return NULL;
493
494 /* get geometry */
495 cookie = xcb_get_geometry_unchecked(_ecore_xcb_conn, win);
496 reply = xcb_get_geometry_reply(_ecore_xcb_conn, cookie, NULL);
497 if (reply)
498 {
499 rects[0].x = reply->x;
500 rects[0].y = reply->y;
501 rects[0].width = reply->width;
502 rects[0].height = reply->height;
503 free(reply);
504 }
505 if (num_ret) *num_ret = 1;
506 return rects;
507#endif
508}
509
510EAPI void
511ecore_x_window_shape_input_rectangles_set(Ecore_X_Window win,
512 Ecore_X_Rectangle *rects,
513 int num)
514{
515#ifdef ECORE_XCB_SHAPE
516 xcb_rectangle_t *rect = NULL;
517#endif
518
519 LOGFN(__FILE__, __LINE__, __FUNCTION__);
520 CHECK_XCB_CONN;
521
522 if (!rects) return;
523
524#ifdef ECORE_XCB_SHAPE
525 if (num > 0)
526 {
527 int i = 0;
528
529 if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
530 return;
531
532 for (i = 0; i < num; i++)
533 {
534 rect[i].x = rects[i].x;
535 rect[i].y = rects[i].y;
536 rect[i].width = rects[i].width;
537 rect[i].height = rects[i].height;
538 }
539 }
540 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
541 XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
542 win, 0, 0, num, (xcb_rectangle_t *)rect);
543
544 if (rect) free(rect);
545// ecore_x_flush();
546#else
547 return;
548 win = 0;
549 num = 0;
550 rects = NULL;
551#endif
552}
553
554EAPI void
555ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win,
556 int x,
557 int y,
558 int w,
559 int h)
560{
561#ifdef ECORE_XCB_SHAPE
562 xcb_rectangle_t rect;
563#endif
564
565 LOGFN(__FILE__, __LINE__, __FUNCTION__);
566 CHECK_XCB_CONN;
567
568#ifdef ECORE_XCB_SHAPE
569 rect.x = x;
570 rect.y = y;
571 rect.width = w;
572 rect.height = h;
573 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SUBTRACT,
574 XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
575 win, 0, 0, 1, &rect);
576// ecore_x_flush();
577#else
578 return;
579 win = 0;
580 x = 0;
581 y = 0;
582 w = 0;
583 h = 0;
584#endif
585}
586
587EAPI void
588ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win,
589 int x,
590 int y,
591 int w,
592 int h)
593{
594#ifdef ECORE_XCB_SHAPE
595 xcb_rectangle_t rect;
596#endif
597
598 LOGFN(__FILE__, __LINE__, __FUNCTION__);
599 CHECK_XCB_CONN;
600
601#ifdef ECORE_XCB_SHAPE
602 rect.x = x;
603 rect.y = y;
604 rect.width = w;
605 rect.height = h;
606 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
607 XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
608 win, 0, 0, 1, &rect);
609// ecore_x_flush();
610#else
611 return;
612 win = 0;
613 x = 0;
614 y = 0;
615 w = 0;
616 h = 0;
617#endif
618}
619
620EAPI void
621ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win,
622 int x,
623 int y,
624 int w,
625 int h)
626{
627#ifdef ECORE_XCB_SHAPE
628 xcb_rectangle_t rect;
629#endif
630
631 LOGFN(__FILE__, __LINE__, __FUNCTION__);
632 CHECK_XCB_CONN;
633
634#ifdef ECORE_XCB_SHAPE
635 rect.x = x;
636 rect.y = y;
637 rect.width = w;
638 rect.height = h;
639 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_SET,
640 XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
641 win, 0, 0, 1, &rect);
642// ecore_x_flush();
643#else
644 return;
645 win = 0;
646 x = 0;
647 y = 0;
648 w = 0;
649 h = 0;
650#endif
651}
652
653EAPI void
654ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win,
655 Ecore_X_Window shape_win,
656 int x,
657 int y)
658{
659 LOGFN(__FILE__, __LINE__, __FUNCTION__);
660 CHECK_XCB_CONN;
661
662#ifdef ECORE_XCB_SHAPE
663 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT,
664 XCB_SHAPE_SK_INPUT, win, x, y, shape_win);
665// ecore_x_flush();
666#else
667 return;
668 win = 0;
669 shape_win = 0;
670 x = 0;
671 y = 0;
672#endif
673}
674
675EAPI void
676ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win,
677 Ecore_X_Window shape_win,
678 int x,
679 int y)
680{
681 LOGFN(__FILE__, __LINE__, __FUNCTION__);
682 CHECK_XCB_CONN;
683
684#ifdef ECORE_XCB_SHAPE
685 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_UNION, XCB_SHAPE_SK_INPUT,
686 XCB_SHAPE_SK_INPUT, win, x, y, shape_win);
687// ecore_x_flush();
688#else
689 return;
690 win = 0;
691 shape_win = 0;
692 x = 0;
693 y = 0;
694#endif
695}
696
697EAPI void
698ecore_x_window_shape_input_window_set(Ecore_X_Window win,
699 Ecore_X_Window shape_win)
700{
701 LOGFN(__FILE__, __LINE__, __FUNCTION__);
702 CHECK_XCB_CONN;
703
704#ifdef ECORE_XCB_SHAPE
705 xcb_shape_combine(_ecore_xcb_conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT,
706 XCB_SHAPE_SK_INPUT, win, 0, 0, shape_win);
707// ecore_x_flush();
708#else
709 return;
710 win = 0;
711 shape_win = 0;
712#endif
713}
714
715EAPI void
716ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win,
717 int x,
718 int y,
719 int w,
720 int h)
721{
722#ifdef ECORE_XCB_SHAPE
723 xcb_rectangle_t rect;
724#endif
725
726 LOGFN(__FILE__, __LINE__, __FUNCTION__);
727 CHECK_XCB_CONN;
728
729#ifdef ECORE_XCB_SHAPE
730 rect.x = x;
731 rect.y = y;
732 rect.width = w;
733 rect.height = h;
734 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_INTERSECT,
735 XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
736 win, 0, 0, 1, &rect);
737// ecore_x_flush();
738#else
739 return;
740 win = 0;
741 x = 0;
742 y = 0;
743 w = 0;
744 h = 0;
745#endif
746}
747
748EAPI void
749ecore_x_window_shape_input_rectangles_add(Ecore_X_Window win,
750 Ecore_X_Rectangle *rects,
751 int num)
752{
753#ifdef ECORE_XCB_SHAPE
754 xcb_rectangle_t *rect = NULL;
755#endif
756
757 LOGFN(__FILE__, __LINE__, __FUNCTION__);
758 CHECK_XCB_CONN;
759
760#ifdef ECORE_XCB_SHAPE
761 if (num > 0)
762 {
763 int i = 0;
764
765 if (!(rect = malloc(sizeof(xcb_rectangle_t) * num)))
766 return;
767
768 for (i = 0; i < num; i++)
769 {
770 rect[i].x = rects[i].x;
771 rect[i].y = rects[i].y;
772 rect[i].width = rects[i].width;
773 rect[i].height = rects[i].height;
774 }
775 }
776
777 xcb_shape_rectangles(_ecore_xcb_conn, XCB_SHAPE_SO_UNION,
778 XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED,
779 win, 0, 0, num, (xcb_rectangle_t *)&rect);
780
781 if (rect) free(rect);
782// ecore_x_flush();
783#else
784 return;
785 win = 0;
786 num = 0;
787 rects = NULL;
788#endif
789}
790
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c
new file mode 100644
index 0000000..e0e5610
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xdefaults.c
@@ -0,0 +1,116 @@
1#include "ecore_xcb_private.h"
2#include <fnmatch.h>
3
4/* local function prototypes */
5static Eina_Bool _ecore_xcb_xdefaults_glob_match(const char *str,
6 const char *glob);
7
8/* local variables */
9static Eina_File *_ecore_xcb_xdefaults_file = NULL;
10static char *_ecore_xcb_xdefaults_data = NULL;
11
12void
13_ecore_xcb_xdefaults_init(void)
14{
15 char buff[PATH_MAX];
16
17 LOGFN(__FILE__, __LINE__, __FUNCTION__);
18
19 snprintf(buff, sizeof(buff), "%s/.Xdefaults", getenv("HOME"));
20 if ((_ecore_xcb_xdefaults_file = eina_file_open(buff, EINA_FALSE)))
21 {
22 eina_mmap_safety_enabled_set(EINA_TRUE);
23
24 _ecore_xcb_xdefaults_data =
25 eina_file_map_all(_ecore_xcb_xdefaults_file, EINA_FILE_SEQUENTIAL);
26 }
27}
28
29void
30_ecore_xcb_xdefaults_shutdown(void)
31{
32 LOGFN(__FILE__, __LINE__, __FUNCTION__);
33
34 if (!_ecore_xcb_xdefaults_file) return;
35 if (_ecore_xcb_xdefaults_data)
36 eina_file_map_free(_ecore_xcb_xdefaults_file, _ecore_xcb_xdefaults_data);
37 if (_ecore_xcb_xdefaults_file) eina_file_close(_ecore_xcb_xdefaults_file);
38}
39
40char *
41_ecore_xcb_xdefaults_string_get(const char *prog,
42 const char *param)
43{
44 char buff[1024], ret[1024];
45 char *str = NULL;
46 char **ea = NULL;
47 unsigned int count = 0, i = 0;
48
49 if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
50 return NULL;
51
52 snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
53
54 str = _ecore_xcb_xdefaults_data;
55 ea = eina_str_split_full(str, "\n", -1, &count);
56 for (i = 0; i < count; i++)
57 {
58 if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
59 sscanf(ea[i], "%*[^:]:%*[ ]%s", ret);
60 }
61 if ((ea) && (ea[0]))
62 {
63 free(ea[0]);
64 free(ea);
65 }
66
67 return strdup(ret);
68}
69
70int
71_ecore_xcb_xdefaults_int_get(const char *prog,
72 const char *param)
73{
74 char buff[1024];
75 char *str = NULL;
76 char **ea = NULL;
77 unsigned int count = 0, i = 0;
78 int ret = -1;
79
80 if ((!_ecore_xcb_xdefaults_data) || (!_ecore_xcb_xdefaults_file))
81 return 0;
82
83 snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
84
85 str = _ecore_xcb_xdefaults_data;
86 ea = eina_str_split_full(str, "\n", -1, &count);
87 for (i = 0; i < count; i++)
88 {
89 if (_ecore_xcb_xdefaults_glob_match(ea[i], buff))
90 sscanf(ea[i], "%*[^:]:%*[ ]%d", &ret);
91 }
92 if ((ea) && (ea[0]))
93 {
94 free(ea[0]);
95 free(ea);
96 }
97
98 return ret;
99}
100
101/* local functions */
102static Eina_Bool
103_ecore_xcb_xdefaults_glob_match(const char *str,
104 const char *glob)
105{
106 if ((!str) || (!glob)) return EINA_FALSE;
107 if (glob[0] == 0)
108 {
109 if (str[0] == 0) return EINA_TRUE;
110 return EINA_FALSE;
111 }
112 if (!strcmp(glob, "*")) return EINA_TRUE;
113 if (!fnmatch(glob, str, 0)) return EINA_TRUE;
114 return EINA_FALSE;
115}
116
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xfixes.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xfixes.c
new file mode 100644
index 0000000..bf9d5ee
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xfixes.c
@@ -0,0 +1,750 @@
1#include "ecore_xcb_private.h"
2# ifdef ECORE_XCB_XFIXES
3# include <xcb/xfixes.h>
4# endif
5
6/* local function prototypes */
7static xcb_rectangle_t *_ecore_xcb_rect_to_xcb(Ecore_X_Rectangle *rects,
8 int num);
9static Ecore_X_Rectangle *_ecore_xcb_rect_to_ecore(xcb_rectangle_t *rects,
10 int num);
11
12/* local variables */
13static Eina_Bool _xfixes_avail = EINA_FALSE;
14
15/* external variables */
16int _ecore_xcb_event_xfixes = -1;
17
18void
19_ecore_xcb_xfixes_init(void)
20{
21 LOGFN(__FILE__, __LINE__, __FUNCTION__);
22
23#ifdef ECORE_XCB_XFIXES
24 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_xfixes_id);
25#endif
26}
27
28void
29_ecore_xcb_xfixes_finalize(void)
30{
31#ifdef ECORE_XCB_XFIXES
32 const xcb_query_extension_reply_t *ext_reply;
33#endif
34
35 LOGFN(__FILE__, __LINE__, __FUNCTION__);
36
37#ifdef ECORE_XCB_XFIXES
38 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_xfixes_id);
39 if ((ext_reply) && (ext_reply->present))
40 {
41 xcb_xfixes_query_version_cookie_t cookie;
42 xcb_xfixes_query_version_reply_t *reply;
43
44 cookie =
45 xcb_xfixes_query_version_unchecked(_ecore_xcb_conn,
46 XCB_XFIXES_MAJOR_VERSION,
47 XCB_XFIXES_MINOR_VERSION);
48 reply = xcb_xfixes_query_version_reply(_ecore_xcb_conn, cookie, NULL);
49 if (reply)
50 {
51 /* NB: XFixes Extension >= 3 needed for shape stuff.
52 * for now, I am removing this check so that it matches the
53 * xlib code closer. If the extension version ends up being
54 * that important, then re-enable this */
55
56 /* if (reply->major_version >= 3) */
57 _xfixes_avail = EINA_TRUE;
58 free(reply);
59 }
60
61 if (_xfixes_avail)
62 _ecore_xcb_event_xfixes = ext_reply->first_event;
63 }
64#endif
65}
66
67EAPI Eina_Bool
68ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection)
69{
70#ifdef ECORE_XCB_XFIXES
71 Ecore_X_Window root = 0;
72 xcb_void_cookie_t cookie;
73 xcb_generic_error_t *err;
74 int mask = 0;
75#endif
76
77 CHECK_XCB_CONN;
78
79 if (!_xfixes_avail) return EINA_FALSE;
80
81#ifdef ECORE_XCB_XFIXES
82 root = ((xcb_screen_t *)_ecore_xcb_screen)->root;
83
84 mask = (XCB_XFIXES_SELECTION_EVENT_MASK_SET_SELECTION_OWNER |
85 XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_WINDOW_DESTROY |
86 XCB_XFIXES_SELECTION_EVENT_MASK_SELECTION_CLIENT_CLOSE);
87
88 cookie =
89 xcb_xfixes_select_selection_input_checked(_ecore_xcb_conn, root,
90 selection, mask);
91 err = xcb_request_check(_ecore_xcb_conn, cookie);
92 if (err)
93 {
94 free(err);
95 return EINA_FALSE;
96 }
97
98 return EINA_TRUE;
99#endif
100 return EINA_FALSE;
101}
102
103Eina_Bool
104_ecore_xcb_xfixes_avail_get(void)
105{
106 return _xfixes_avail;
107}
108
109/**
110 * @defgroup Ecore_X_Fixes_Group X Fixes Extension Functions
111 *
112 * Functions related to the X Fixes extension.
113 */
114
115/**
116 * Create a region from rectangles.
117 * @param rects The rectangles used to initialize the region.
118 * @param num The number of rectangles.
119 * @return The newly created region.
120 *
121 * Create a region initialized to the specified list of rectangles
122 * @p rects. The rectangles may be specified in any order, their union
123 * becomes the region.
124 * @ingroup Ecore_X_Fixes_Group
125 */
126EAPI Ecore_X_Region
127ecore_x_region_new(Ecore_X_Rectangle *rects,
128 int num)
129{
130 Ecore_X_Region region = 0;
131#ifdef ECORE_XCB_XFIXES
132 xcb_rectangle_t *xrects;
133#endif
134
135 LOGFN(__FILE__, __LINE__, __FUNCTION__);
136 CHECK_XCB_CONN;
137
138 if (!_xfixes_avail) return 0;
139
140#ifdef ECORE_XCB_XFIXES
141 xrects = _ecore_xcb_rect_to_xcb(rects, num);
142 region = xcb_generate_id(_ecore_xcb_conn);
143 xcb_xfixes_create_region(_ecore_xcb_conn, region, num, xrects);
144 free(xrects);
145// ecore_x_flush();
146#endif
147
148 return region;
149}
150
151/**
152 * Create a region from a pixmap.
153 * @param bitmap The bitmap used to initialize the region.
154 * @return The newly created region.
155 *
156 * Creates a region initialized to the set of 'one' pixels in @p bitmap
157 * (which must be of depth 1, else Match error).
158 * @ingroup Ecore_X_Fixes_Group
159 */
160EAPI Ecore_X_Region
161ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap)
162{
163 Ecore_X_Region region = 0;
164
165 LOGFN(__FILE__, __LINE__, __FUNCTION__);
166 CHECK_XCB_CONN;
167
168 if (!_xfixes_avail) return 0;
169
170#ifdef ECORE_XCB_XFIXES
171 region = xcb_generate_id(_ecore_xcb_conn);
172 xcb_xfixes_create_region_from_bitmap(_ecore_xcb_conn, region, bitmap);
173// ecore_x_flush();
174#endif
175
176 return region;
177}
178
179/**
180 * Create a region from a window.
181 * @param window The window used to initialize the region.
182 * @param type The type of the region.
183 * @return The newly created region.
184 *
185 * Creates a region initialized to the specified @p window region. See
186 * the Shape extension for the definition of Bounding and Clip
187 * regions.
188 * @ingroup Ecore_X_Fixes_Group
189 */
190EAPI Ecore_X_Region
191ecore_x_region_new_from_window(Ecore_X_Window win,
192 Ecore_X_Region_Type type)
193{
194 Ecore_X_Region region = 0;
195
196 LOGFN(__FILE__, __LINE__, __FUNCTION__);
197 CHECK_XCB_CONN;
198
199 if (!_xfixes_avail) return 0;
200
201#ifdef ECORE_XCB_XFIXES
202 region = xcb_generate_id(_ecore_xcb_conn);
203 xcb_xfixes_create_region_from_window(_ecore_xcb_conn, region, win, type);
204// ecore_x_flush();
205#endif
206
207 return region;
208}
209
210/**
211 * Create a region from a graphic context.
212 * @param gc The graphic context used to initialize the region.
213 * @return The newly created region.
214 *
215 * Creates a region initialized from the clip list of @p gc.
216 * @ingroup Ecore_X_Fixes_Group
217 */
218EAPI Ecore_X_Region
219ecore_x_region_new_from_gc(Ecore_X_GC gc)
220{
221 Ecore_X_Region region = 0;
222
223 LOGFN(__FILE__, __LINE__, __FUNCTION__);
224 CHECK_XCB_CONN;
225
226 if (!_xfixes_avail) return 0;
227
228#ifdef ECORE_XCB_XFIXES
229 region = xcb_generate_id(_ecore_xcb_conn);
230 xcb_xfixes_create_region_from_gc(_ecore_xcb_conn, region, gc);
231// ecore_x_flush();
232#endif
233
234 return region;
235}
236
237/**
238 * Create a region from a picture.
239 * @param picture The picture used to initialize the region.
240 * @return The newly created region.
241 *
242 * Creates a region initialized from the clip list of @p picture.
243 * @ingroup Ecore_X_Fixes_Group
244 */
245EAPI Ecore_X_Region
246ecore_x_region_new_from_picture(Ecore_X_Picture picture)
247{
248 Ecore_X_Region region = 0;
249
250 LOGFN(__FILE__, __LINE__, __FUNCTION__);
251 CHECK_XCB_CONN;
252
253 if (!_xfixes_avail) return 0;
254
255#ifdef ECORE_XCB_XFIXES
256 region = xcb_generate_id(_ecore_xcb_conn);
257 xcb_xfixes_create_region_from_picture(_ecore_xcb_conn, region, picture);
258// ecore_x_flush();
259#endif
260
261 return region;
262}
263
264/**
265 * Destroy a region.
266 * @param region The region to destroy.
267 *
268 * Destroy the specified @p region.
269 * @ingroup Ecore_X_Fixes_Group
270 */
271EAPI void
272ecore_x_region_free(Ecore_X_Region region)
273{
274 LOGFN(__FILE__, __LINE__, __FUNCTION__);
275 CHECK_XCB_CONN;
276
277 if (!_xfixes_avail) return;
278
279#ifdef ECORE_XCB_XFIXES
280 xcb_xfixes_destroy_region(_ecore_xcb_conn, region);
281// ecore_x_flush();
282#endif
283}
284
285/**
286 * Set the content of a region.
287 * @param region The region to destroy.
288 * @param rects The rectangles used to set the region.
289 * @param num The number of rectangles.
290 *
291 * Replace the current contents of @p region with the region formed
292 * by the union of the rectangles @p rects.
293 * @ingroup Ecore_X_Fixes_Group
294 */
295EAPI void
296ecore_x_region_set(Ecore_X_Region region,
297 Ecore_X_Rectangle *rects,
298 int num)
299{
300#ifdef ECORE_XCB_XFIXES
301 xcb_rectangle_t *xrects;
302#endif
303
304 LOGFN(__FILE__, __LINE__, __FUNCTION__);
305 CHECK_XCB_CONN;
306
307 if (!_xfixes_avail) return;
308
309#ifdef ECORE_XCB_XFIXES
310 xrects = _ecore_xcb_rect_to_xcb(rects, num);
311 xcb_xfixes_set_region(_ecore_xcb_conn, region, num, xrects);
312 free(xrects);
313// ecore_x_flush();
314#endif
315}
316
317/**
318 * Copy the content of a region.
319 * @param dest The destination region.
320 * @param source The source region.
321 *
322 * Replace the contents of @p dest with the contents of @p source.
323 * @ingroup Ecore_X_Fixes_Group
324 */
325EAPI void
326ecore_x_region_copy(Ecore_X_Region dest,
327 Ecore_X_Region source)
328{
329 LOGFN(__FILE__, __LINE__, __FUNCTION__);
330 CHECK_XCB_CONN;
331
332 if (!_xfixes_avail) return;
333
334 // NB: Hmmmm...this may need converting to/fro xcb_rectangle_t
335#ifdef ECORE_XCB_XFIXES
336 xcb_xfixes_copy_region(_ecore_xcb_conn, source, dest);
337// ecore_x_flush();
338#endif
339}
340
341/**
342 * Make the union of two regions.
343 * @param dest The destination region.
344 * @param source1 The first source region.
345 * @param source2 The second source region.
346 *
347 * Replace the contents of @p dest with the union of @p source1 and
348 * @p source2.
349 * @ingroup Ecore_X_Fixes_Group
350 */
351EAPI void
352ecore_x_region_combine(Ecore_X_Region dest,
353 Ecore_X_Region source1,
354 Ecore_X_Region source2)
355{
356 LOGFN(__FILE__, __LINE__, __FUNCTION__);
357 CHECK_XCB_CONN;
358
359 if (!_xfixes_avail) return;
360
361#ifdef ECORE_XCB_XFIXES
362 xcb_xfixes_union_region(_ecore_xcb_conn, source1, source2, dest);
363// ecore_x_flush();
364#endif
365}
366
367/**
368 * Make the intersection of two regions.
369 * @param dest The destination region.
370 * @param source1 The first source region.
371 * @param source2 The second source region.
372 *
373 * Replace the contents of @p dest with the intersection of @p source1 and
374 * @p source2.
375 * @ingroup Ecore_X_Fixes_Group
376 */
377EAPI void
378ecore_x_region_intersect(Ecore_X_Region dest,
379 Ecore_X_Region source1,
380 Ecore_X_Region source2)
381{
382 LOGFN(__FILE__, __LINE__, __FUNCTION__);
383 CHECK_XCB_CONN;
384
385 if (!_xfixes_avail) return;
386
387#ifdef ECORE_XCB_XFIXES
388 xcb_xfixes_intersect_region(_ecore_xcb_conn, source1, source2, dest);
389// ecore_x_flush();
390#endif
391}
392
393/**
394 * Make the subtraction of two regions.
395 * @param dest The destination region.
396 * @param source1 The first source region.
397 * @param source2 The second source region.
398 *
399 * Replace the contents of @p dest with the subtraction of @p source1 by
400 * @p source2.
401 * @ingroup Ecore_X_Fixes_Group
402 */
403EAPI void
404ecore_x_region_subtract(Ecore_X_Region dest,
405 Ecore_X_Region source1,
406 Ecore_X_Region source2)
407{
408 LOGFN(__FILE__, __LINE__, __FUNCTION__);
409 CHECK_XCB_CONN;
410
411 if (!_xfixes_avail) return;
412
413#ifdef ECORE_XCB_XFIXES
414 xcb_xfixes_subtract_region(_ecore_xcb_conn, source1, source2, dest);
415// ecore_x_flush();
416#endif
417}
418
419/**
420 * Make the subtraction of regions by bounds.
421 * @param dest The destination region.
422 * @param bounds The bounds.
423 * @param source The source region.
424 *
425 * The @p source region is subtracted from the region specified by
426 * @p bounds. The result is placed in @p dest, replacing its
427 * contents.
428 * @ingroup Ecore_X_Fixes_Group
429 */
430EAPI void
431ecore_x_region_invert(Ecore_X_Region dest,
432 Ecore_X_Rectangle *bounds,
433 Ecore_X_Region source)
434{
435#ifdef ECORE_XCB_XFIXES
436 xcb_rectangle_t xrects;
437#endif
438
439 LOGFN(__FILE__, __LINE__, __FUNCTION__);
440 CHECK_XCB_CONN;
441
442 if (!_xfixes_avail) return;
443
444#ifdef ECORE_XCB_XFIXES
445 xrects.x = bounds->x;
446 xrects.y = bounds->y;
447 xrects.width = bounds->width;
448 xrects.height = bounds->height;
449
450 xcb_xfixes_invert_region(_ecore_xcb_conn, source, xrects, dest);
451// ecore_x_flush();
452#endif
453}
454
455/**
456 * Translate a region.
457 * @param region The region to translate.
458 * @param dx The horizontal translation.
459 * @param dy The vertical translation.
460 *
461 * The @p region is translated by @p dx and @p dy in place.
462 * @ingroup Ecore_X_Fixes_Group
463 */
464EAPI void
465ecore_x_region_translate(Ecore_X_Region region,
466 int dx,
467 int dy)
468{
469 LOGFN(__FILE__, __LINE__, __FUNCTION__);
470 CHECK_XCB_CONN;
471
472 if (!_xfixes_avail) return;
473
474#ifdef ECORE_XCB_XFIXES
475 xcb_xfixes_translate_region(_ecore_xcb_conn, region, dx, dy);
476// ecore_x_flush();
477#endif
478}
479
480/**
481 * Extent a region.
482 * @param dest The destination region.
483 * @param source The source region.
484 *
485 * The extents of the @p source region are placed in @p dest.
486 * @ingroup Ecore_X_Fixes_Group
487 */
488EAPI void
489ecore_x_region_extents(Ecore_X_Region dest,
490 Ecore_X_Region source)
491{
492 LOGFN(__FILE__, __LINE__, __FUNCTION__);
493 CHECK_XCB_CONN;
494
495 if (!_xfixes_avail) return;
496
497#ifdef ECORE_XCB_XFIXES
498 xcb_xfixes_region_extents(_ecore_xcb_conn, source, dest);
499// ecore_x_flush();
500#endif
501}
502
503/**
504 * Return the rectangles that compose a region.
505 * @param region The region (Unused).
506 * @param num The number of returned rectangles.
507 * @param bounds The returned bounds of the region.
508 * @return The returned rectangles.
509 *
510 * The @p region passed to ecore_xcb_region_fetch_prefetch() is
511 * returned as a list of rectagles in XY-banded order.
512 *
513 * To use this function, you must call before, and in order,
514 * ecore_xcb_region_fetch_prefetch(), which sends the XFixesFetchRegion request,
515 * then ecore_xcb_region_fetch_fetch(), which gets the reply.
516 * @ingroup Ecore_X_Fixes_Group
517 */
518EAPI Ecore_X_Rectangle *
519ecore_x_region_fetch(Ecore_X_Region region,
520 int *num,
521 Ecore_X_Rectangle *bounds)
522{
523 Ecore_X_Rectangle extents = { 0, 0, 0, 0 };
524 Ecore_X_Rectangle *rects = NULL;
525#ifdef ECORE_XCB_XFIXES
526 xcb_xfixes_fetch_region_cookie_t cookie;
527 xcb_xfixes_fetch_region_reply_t *reply;
528 xcb_rectangle_t *r;
529 int n = 0;
530#endif
531
532 LOGFN(__FILE__, __LINE__, __FUNCTION__);
533 CHECK_XCB_CONN;
534
535 if (num) *num = 0;
536 if (bounds) *bounds = extents;
537 if (!_xfixes_avail) return NULL;
538
539#ifdef ECORE_XCB_XFIXES
540 cookie = xcb_xfixes_fetch_region_unchecked(_ecore_xcb_conn, region);
541 reply = xcb_xfixes_fetch_region_reply(_ecore_xcb_conn, cookie, NULL);
542 if (!reply) return NULL;
543
544 r = xcb_xfixes_fetch_region_rectangles(reply);
545 n = xcb_xfixes_fetch_region_rectangles_length(reply);
546 rects = _ecore_xcb_rect_to_ecore(r, n);
547 if (num) *num = n;
548
549 /* rects = (Ecore_X_Rectangle *)malloc(n * sizeof(Ecore_X_Rectangle)); */
550 /* if (!rects) */
551 /* { */
552 /* free(reply); */
553 /* return NULL; */
554 /* } */
555
556 /* for (i = 0; i < n; i++) */
557 /* { */
558 /* rects[i].x = r[i].x; */
559 /* rects[i].y = r[i].y; */
560 /* rects[i].width = r[i].width; */
561 /* rects[i].height = r[i].height; */
562 /* } */
563
564 (*bounds).x = reply->extents.x;
565 (*bounds).y = reply->extents.y;
566 (*bounds).width = reply->extents.width;
567 (*bounds).height = reply->extents.height;
568
569 free(reply);
570#endif
571
572 return rects;
573}
574
575/**
576 * Expand a region.
577 * @param dest The destination region.
578 * @param source The source region.
579 * @param left The number of pixels to add on the left.
580 * @param right The number of pixels to add on the right.
581 * @param top The number of pixels to add at the top.
582 * @param bottom The number of pixels to add at the bottom.
583 *
584 * Put in @p dest the area specified by expanding each rectangle in
585 * the @p source region by the specified number of pixels to the
586 * @p left, @p right, @p top and @p bottom.
587 * @ingroup Ecore_X_Fixes_Group
588 */
589EAPI void
590ecore_x_region_expand(Ecore_X_Region dest,
591 Ecore_X_Region source,
592 unsigned int left,
593 unsigned int right,
594 unsigned int top,
595 unsigned int bottom)
596{
597 LOGFN(__FILE__, __LINE__, __FUNCTION__);
598 CHECK_XCB_CONN;
599
600 if (!_xfixes_avail) return;
601
602#ifdef ECORE_XCB_XFIXES
603 xcb_xfixes_expand_region(_ecore_xcb_conn, source, dest, left, right, top, bottom);
604// ecore_x_flush();
605#endif
606}
607
608/**
609 * Change clip-mask in a graphic context to the specified region.
610 * @param region The region to change.
611 * @param gc The clip-mask graphic context.
612 * @param x_origin The horizontal translation.
613 * @param y_origin The vertical translation.
614 *
615 * Changes clip-mask in @p gc to the specified @p region and
616 * sets the clip origin with the values of @p x_origin and @p y_origin.
617 * Output will be clippped to remain contained within the region. The
618 * clip origin is interpreted relative to the origin of whatever
619 * destination drawable is specified in a graphics request. The
620 * region is interpreted relative to the clip origin. Future changes
621 * to region have no effect on the gc clip-mask.
622 * @ingroup Ecore_X_Fixes_Group
623 */
624EAPI void
625ecore_x_region_gc_clip_set(Ecore_X_Region region,
626 Ecore_X_GC gc,
627 int x,
628 int y)
629{
630 LOGFN(__FILE__, __LINE__, __FUNCTION__);
631 CHECK_XCB_CONN;
632
633 if (!_xfixes_avail) return;
634
635#ifdef ECORE_XCB_XFIXES
636 xcb_xfixes_set_gc_clip_region(_ecore_xcb_conn, gc, region, x, y);
637// ecore_x_flush();
638#endif
639}
640
641/**
642 * Change the shape extension of a window.
643 * @param region The region.
644 * @param dest The window whose shape is changed.
645 * @param type The kind of shape.
646 * @param x_offset The horizontal offset.
647 * @param y_offset The vertical offset.
648 *
649 * Set the specified Shape extension region of @p window to @p region,
650 * offset by @p x_offset and @p y_offset. Future changes to region
651 * have no effect on the window shape.
652 * @ingroup Ecore_X_Fixes_Group
653 */
654EAPI void
655ecore_x_region_window_shape_set(Ecore_X_Region region,
656 Ecore_X_Window dest,
657 Ecore_X_Shape_Type type,
658 int x,
659 int y)
660{
661 LOGFN(__FILE__, __LINE__, __FUNCTION__);
662 CHECK_XCB_CONN;
663
664 if (!_xfixes_avail) return;
665
666#ifdef ECORE_XCB_XFIXES
667 xcb_xfixes_set_window_shape_region(_ecore_xcb_conn, dest, type, x, y, region);
668// ecore_x_flush();
669#endif
670}
671
672/**
673 * Change clip-mask in picture to the specified region.
674 * @param region The region.
675 * @param picture The picture.
676 * @param x_origin The X coordinate of the origin.
677 * @param y_origin The Y coordinate of the origin.
678 *
679 * Changes clip-mask in picture to the specified @p region
680 * and sets the clip origin. Input and output will be clipped to
681 * remain contained within the region. The clip origin is interpreted
682 * relative to the origin of the drawable associated with @p picture. The
683 * region is interpreted relative to the clip origin. Future changes
684 * to region have no effect on the picture clip-mask.
685 * @ingroup Ecore_X_Fixes_Group
686 */
687EAPI void
688ecore_x_region_picture_clip_set(Ecore_X_Region region,
689 Ecore_X_Picture picture,
690 int x,
691 int y)
692{
693 LOGFN(__FILE__, __LINE__, __FUNCTION__);
694 CHECK_XCB_CONN;
695
696 if (!_xfixes_avail) return;
697
698#ifdef ECORE_XCB_XFIXES
699 xcb_xfixes_set_picture_clip_region(_ecore_xcb_conn, picture, region, x, y);
700// ecore_x_flush();
701#endif
702}
703
704/* local function prototypes */
705static xcb_rectangle_t *
706_ecore_xcb_rect_to_xcb(Ecore_X_Rectangle *rects,
707 int num)
708{
709 xcb_rectangle_t *xrect;
710 int i = 0;
711
712 if (!num) return NULL;
713
714 xrect = malloc(sizeof(xcb_rectangle_t) * num);
715 if (!xrect) return NULL;
716
717 for (i = 0; i < num; i++)
718 {
719 xrect[i].x = rects[i].x;
720 xrect[i].y = rects[i].y;
721 xrect[i].width = rects[i].width;
722 xrect[i].height = rects[i].height;
723 }
724
725 return xrect;
726}
727
728static Ecore_X_Rectangle *
729_ecore_xcb_rect_to_ecore(xcb_rectangle_t *rects,
730 int num)
731{
732 Ecore_X_Rectangle *erect;
733 int i = 0;
734
735 if (!num) return NULL;
736
737 erect = malloc(sizeof(Ecore_X_Rectangle) * num);
738 if (!erect) return NULL;
739
740 for (i = 0; i < num; i++)
741 {
742 erect[i].x = rects[i].x;
743 erect[i].y = rects[i].y;
744 erect[i].width = rects[i].width;
745 erect[i].height = rects[i].height;
746 }
747
748 return erect;
749}
750
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xinerama.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xinerama.c
new file mode 100644
index 0000000..37a2339
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xinerama.c
@@ -0,0 +1,139 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_XINERAMA
3# include <xcb/xinerama.h>
4#endif
5
6/* local variables */
7static Eina_Bool _xinerama_avail = EINA_FALSE;
8static Eina_Bool _xinerama_active = EINA_FALSE;
9
10void
11_ecore_xcb_xinerama_init(void)
12{
13 LOGFN(__FILE__, __LINE__, __FUNCTION__);
14
15#ifdef ECORE_XCB_XINERAMA
16 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_xinerama_id);
17#endif
18}
19
20void
21_ecore_xcb_xinerama_finalize(void)
22{
23#ifdef ECORE_XCB_XINERAMA
24 const xcb_query_extension_reply_t *ext_reply;
25#endif
26
27 LOGFN(__FILE__, __LINE__, __FUNCTION__);
28
29#ifdef ECORE_XCB_XINERAMA
30 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_xinerama_id);
31 if ((ext_reply) && (ext_reply->present))
32 {
33 xcb_xinerama_query_version_cookie_t cookie;
34 xcb_xinerama_query_version_reply_t *reply;
35
36 cookie =
37 xcb_xinerama_query_version_unchecked(_ecore_xcb_conn,
38 XCB_XINERAMA_MAJOR_VERSION,
39 XCB_XINERAMA_MINOR_VERSION);
40 reply =
41 xcb_xinerama_query_version_reply(_ecore_xcb_conn, cookie, NULL);
42 if (reply)
43 {
44 _xinerama_avail = EINA_TRUE;
45 // NB: Do we need to compare version numbers here ?
46 free(reply);
47 }
48
49 if (_xinerama_avail)
50 {
51 xcb_xinerama_is_active_cookie_t acookie;
52 xcb_xinerama_is_active_reply_t *areply;
53
54 acookie = xcb_xinerama_is_active_unchecked(_ecore_xcb_conn);
55 areply =
56 xcb_xinerama_is_active_reply(_ecore_xcb_conn, acookie, NULL);
57 if (areply)
58 {
59 _xinerama_active = areply->state;
60 free(areply);
61 }
62 }
63 }
64#endif
65}
66
67EAPI int
68ecore_x_xinerama_screen_count_get(void)
69{
70 int count = 0;
71#ifdef ECORE_XCB_XINERAMA
72 xcb_xinerama_query_screens_cookie_t cookie;
73 xcb_xinerama_query_screens_reply_t *reply;
74#endif
75
76 LOGFN(__FILE__, __LINE__, __FUNCTION__);
77 CHECK_XCB_CONN;
78
79 if (!_xinerama_avail) return 0;
80
81#ifdef ECORE_XCB_XINERAMA
82 cookie = xcb_xinerama_query_screens_unchecked(_ecore_xcb_conn);
83 reply =
84 xcb_xinerama_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
85 if (!reply) return 0;
86 count = reply->number;
87#endif
88
89 return count;
90}
91
92EAPI Eina_Bool
93ecore_x_xinerama_screen_geometry_get(int screen,
94 int *x,
95 int *y,
96 int *w,
97 int *h)
98{
99#ifdef ECORE_XCB_XINERAMA
100 xcb_xinerama_query_screens_cookie_t cookie;
101 xcb_xinerama_query_screens_reply_t *reply;
102 xcb_xinerama_screen_info_t *info;
103#endif
104
105 LOGFN(__FILE__, __LINE__, __FUNCTION__);
106 CHECK_XCB_CONN;
107
108 if (x) *x = 0;
109 if (y) *y = 0;
110 if (w) *w = ((xcb_screen_t *)_ecore_xcb_screen)->width_in_pixels;
111 if (h) *h = ((xcb_screen_t *)_ecore_xcb_screen)->height_in_pixels;
112
113 if (!_xinerama_avail) return EINA_FALSE;
114
115#ifdef ECORE_XCB_XINERAMA
116 cookie = xcb_xinerama_query_screens_unchecked(_ecore_xcb_conn);
117 reply =
118 xcb_xinerama_query_screens_reply(_ecore_xcb_conn, cookie, NULL);
119 if (!reply) return EINA_FALSE;
120
121 info = xcb_xinerama_query_screens_screen_info(reply);
122 if (!info)
123 {
124 free(reply);
125 return EINA_FALSE;
126 }
127
128 if (x) *x = info[screen].x_org;
129 if (y) *y = info[screen].y_org;
130 if (w) *w = info[screen].width;
131 if (h) *h = info[screen].height;
132
133 free(reply);
134 return EINA_TRUE;
135#endif
136
137 return EINA_FALSE;
138}
139
diff --git a/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xtest.c b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xtest.c
new file mode 100644
index 0000000..b664dc9
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xcb/ecore_xcb_xtest.c
@@ -0,0 +1,215 @@
1#include "ecore_xcb_private.h"
2#ifdef ECORE_XCB_XTEST
3# include <xcb/xtest.h>
4# include <X11/keysym.h>
5#endif
6
7/* local variables */
8static Eina_Bool _test_avail = EINA_FALSE;
9
10void
11_ecore_xcb_xtest_init(void)
12{
13 LOGFN(__FILE__, __LINE__, __FUNCTION__);
14
15#ifdef ECORE_XCB_XTEST
16 xcb_prefetch_extension_data(_ecore_xcb_conn, &xcb_test_id);
17#endif
18}
19
20void
21_ecore_xcb_xtest_finalize(void)
22{
23#ifdef ECORE_XCB_XTEST
24 const xcb_query_extension_reply_t *ext_reply;
25#endif
26
27 LOGFN(__FILE__, __LINE__, __FUNCTION__);
28
29#ifdef ECORE_XCB_XTEST
30 ext_reply = xcb_get_extension_data(_ecore_xcb_conn, &xcb_test_id);
31 if ((ext_reply) && (ext_reply->present))
32 _test_avail = EINA_TRUE;
33#endif
34}
35
36EAPI Eina_Bool
37#ifdef ECORE_XCB_XTEST
38ecore_x_test_fake_key_down(const char *key)
39#else
40ecore_x_test_fake_key_down(const char *key __UNUSED__)
41#endif
42{
43#ifdef ECORE_XCB_XTEST
44 xcb_keycode_t keycode = 0;
45 xcb_void_cookie_t cookie;
46 xcb_generic_error_t *err;
47#endif
48
49 LOGFN(__FILE__, __LINE__, __FUNCTION__);
50 CHECK_XCB_CONN;
51
52 if (!_test_avail) return EINA_FALSE;
53
54#ifdef ECORE_XCB_XTEST
55 keycode = _ecore_xcb_keymap_string_to_keycode(key);
56 if (keycode == XCB_NO_SYMBOL) return EINA_FALSE;
57
58 cookie =
59 xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_PRESS,
60 keycode, XCB_CURRENT_TIME,
61 ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
62 err = xcb_request_check(_ecore_xcb_conn, cookie);
63 if (err)
64 {
65 free(err);
66 return EINA_FALSE;
67 }
68 return EINA_TRUE;
69#endif
70
71 return EINA_FALSE;
72}
73
74EAPI Eina_Bool
75#ifdef ECORE_XCB_XTEST
76ecore_x_test_fake_key_up(const char *key)
77#else
78ecore_x_test_fake_key_up(const char *key __UNUSED__)
79#endif
80{
81#ifdef ECORE_XCB_XTEST
82 xcb_keycode_t keycode = 0;
83 xcb_void_cookie_t cookie;
84 xcb_generic_error_t *err;
85#endif
86
87 LOGFN(__FILE__, __LINE__, __FUNCTION__);
88 CHECK_XCB_CONN;
89
90 if (!_test_avail) return EINA_FALSE;
91
92#ifdef ECORE_XCB_XTEST
93 keycode = _ecore_xcb_keymap_string_to_keycode(key);
94 if (keycode == XCB_NO_SYMBOL) return EINA_FALSE;
95
96 cookie =
97 xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_RELEASE,
98 keycode, XCB_CURRENT_TIME,
99 ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
100 err = xcb_request_check(_ecore_xcb_conn, cookie);
101 if (err)
102 {
103 free(err);
104 return EINA_FALSE;
105 }
106 return EINA_TRUE;
107#endif
108
109 return EINA_FALSE;
110}
111
112EAPI Eina_Bool
113#ifdef ECORE_XCB_XTEST
114ecore_x_test_fake_key_press(const char *key)
115#else
116ecore_x_test_fake_key_press(const char *key __UNUSED__)
117#endif
118{
119#ifdef ECORE_XCB_XTEST
120 xcb_keycode_t keycode = 0;
121 xcb_keysym_t keysym = 0;
122 xcb_keycode_t shift_code = 0;
123 xcb_void_cookie_t cookie;
124 xcb_generic_error_t *err;
125 Eina_Bool shift = EINA_FALSE;
126#endif
127
128 LOGFN(__FILE__, __LINE__, __FUNCTION__);
129 CHECK_XCB_CONN;
130
131 if (!_test_avail) return EINA_FALSE;
132
133#ifdef ECORE_XCB_XTEST
134 keycode = _ecore_xcb_keymap_string_to_keycode(key);
135 keysym = _ecore_xcb_keymap_keycode_to_keysym(keycode, 0);
136 if (keysym == XCB_NO_SYMBOL)
137 {
138 keysym = _ecore_xcb_keymap_keycode_to_keysym(keycode, 1);
139 if (keysym != XCB_NO_SYMBOL)
140 shift = EINA_TRUE;
141 }
142
143 if (shift)
144 {
145 xcb_keycode_t *keycodes;
146 int i = 0;
147
148 keycodes = _ecore_xcb_keymap_keysym_to_keycode(XK_Shift_L);
149 while (keycodes[i] != XCB_NO_SYMBOL)
150 {
151 if (keycodes[i] != 0)
152 {
153 shift_code = keycodes[i];
154 break;
155 }
156 i++;
157 }
158 }
159
160 if (shift)
161 {
162 cookie =
163 xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_PRESS,
164 shift_code, XCB_CURRENT_TIME,
165 ((xcb_screen_t *)_ecore_xcb_screen)->root,
166 0, 0, 0);
167 err = xcb_request_check(_ecore_xcb_conn, cookie);
168 if (err)
169 {
170 free(err);
171 return EINA_FALSE;
172 }
173 }
174
175 cookie =
176 xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_PRESS,
177 keycode, XCB_CURRENT_TIME,
178 ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
179 err = xcb_request_check(_ecore_xcb_conn, cookie);
180 if (err)
181 {
182 free(err);
183 return EINA_FALSE;
184 }
185 cookie =
186 xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_RELEASE,
187 keycode, XCB_CURRENT_TIME,
188 ((xcb_screen_t *)_ecore_xcb_screen)->root, 0, 0, 0);
189 err = xcb_request_check(_ecore_xcb_conn, cookie);
190 if (err)
191 {
192 free(err);
193 return EINA_FALSE;
194 }
195
196 if (shift)
197 {
198 cookie =
199 xcb_test_fake_input(_ecore_xcb_conn, XCB_KEY_RELEASE,
200 shift_code, XCB_CURRENT_TIME,
201 ((xcb_screen_t *)_ecore_xcb_screen)->root,
202 0, 0, 0);
203 err = xcb_request_check(_ecore_xcb_conn, cookie);
204 if (err)
205 {
206 free(err);
207 return EINA_FALSE;
208 }
209 }
210
211 return EINA_TRUE;
212#endif
213
214 return EINA_FALSE;
215}
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/Makefile.am b/libraries/ecore/src/lib/ecore_x/xlib/Makefile.am
new file mode 100644
index 0000000..3c7364c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/Makefile.am
@@ -0,0 +1,94 @@
1
2MAINTAINERCLEANFILES = Makefile.in
3
4if BUILD_ECORE_X_XLIB
5
6AM_CPPFLAGS = \
7@Xcursor_cflags@ \
8@XKB_CFLAGS@ \
9@XDAMAGE_CFLAGS@ \
10@XCOMPOSITE_CFLAGS@ \
11@XGESTURE_CFLAGS@ \
12@XDPMS_CFLAGS@ \
13@XFIXES_CFLAGS@ \
14@XI2_CFLAGS@ \
15@XINERAMA_CFLAGS@ \
16@XPRINT_CFLAGS@ \
17@XRANDR_CFLAGS@ \
18@XRENDER_CFLAGS@ \
19@XSS_CFLAGS@ \
20@XTEST_CFLAGS@ \
21@x_cflags@ \
22-I$(top_srcdir)/src/lib/ecore \
23-I$(top_srcdir)/src/lib/ecore_x \
24-I$(top_srcdir)/src/lib/ecore_input \
25-I$(top_builddir)/src/lib/ecore \
26-I$(top_builddir)/src/lib/ecore_x \
27-I$(top_builddir)/src/lib/ecore_input \
28@EVAS_CFLAGS@ \
29@EINA_CFLAGS@
30
31noinst_LTLIBRARIES = libecore_x_xlib.la
32
33libecore_x_xlib_la_SOURCES = \
34ecore_x.c \
35ecore_x_dnd.c \
36ecore_x_sync.c \
37ecore_x_randr.c \
38ecore_x_randr_11.c \
39ecore_x_randr_12.c \
40ecore_x_randr_12_edid.c \
41ecore_x_randr_13.c \
42ecore_x_fixes.c \
43ecore_x_damage.c \
44ecore_x_composite.c \
45ecore_x_error.c \
46ecore_x_events.c \
47ecore_x_icccm.c \
48ecore_x_netwm.c \
49ecore_x_mwm.c \
50ecore_x_e.c \
51ecore_x_selection.c \
52ecore_x_window.c \
53ecore_x_window_prop.c \
54ecore_x_window_shape.c \
55ecore_x_pixmap.c \
56ecore_x_gc.c \
57ecore_x_xinerama.c \
58ecore_x_screensaver.c \
59ecore_x_dpms.c \
60ecore_x_drawable.c \
61ecore_x_cursor.c \
62ecore_x_test.c \
63ecore_x_atoms.c \
64ecore_x_region.c \
65ecore_x_image.c \
66ecore_x_xi2.c \
67ecore_x_vsync.c \
68ecore_x_randr.h \
69ecore_x_gesture.c
70
71libecore_x_xlib_la_LIBADD = \
72@Xcursor_libs@ \
73@XKB_LIBS@ \
74@XDAMAGE_LIBS@ \
75@XCOMPOSITE_LIBS@ \
76@XGESTURE_LIBS@ \
77@XDPMS_LIBS@ \
78@XFIXES_LIBS@ \
79@XI2_LIBS@ \
80@XINERAMA_LIBS@ \
81@XPRINT_LIBS@ \
82@XRANDR_LIBS@ \
83@XRENDER_LIBS@ \
84@XSS_LIBS@ \
85@XTEST_LIBS@ \
86@x_libs@ \
87$(top_builddir)/src/lib/ecore/libecore.la \
88$(top_builddir)/src/lib/ecore_input/libecore_input.la \
89@EINA_LIBS@ \
90@dlopen_libs@
91
92endif
93
94EXTRA_DIST = ecore_x_private.h
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/Makefile.in b/libraries/ecore/src/lib/ecore_x/xlib/Makefile.in
new file mode 100644
index 0000000..e1026e5
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/Makefile.in
@@ -0,0 +1,874 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18VPATH = @srcdir@
19pkgdatadir = $(datadir)/@PACKAGE@
20pkgincludedir = $(includedir)/@PACKAGE@
21pkglibdir = $(libdir)/@PACKAGE@
22pkglibexecdir = $(libexecdir)/@PACKAGE@
23am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
24install_sh_DATA = $(install_sh) -c -m 644
25install_sh_PROGRAM = $(install_sh) -c
26install_sh_SCRIPT = $(install_sh) -c
27INSTALL_HEADER = $(INSTALL_DATA)
28transform = $(program_transform_name)
29NORMAL_INSTALL = :
30PRE_INSTALL = :
31POST_INSTALL = :
32NORMAL_UNINSTALL = :
33PRE_UNINSTALL = :
34POST_UNINSTALL = :
35build_triplet = @build@
36host_triplet = @host@
37subdir = src/lib/ecore_x/xlib
38DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
39ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
40am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
41 $(top_srcdir)/m4/ac_path_generic.m4 \
42 $(top_srcdir)/m4/check_x_extension.m4 \
43 $(top_srcdir)/m4/ecore_check_module.m4 \
44 $(top_srcdir)/m4/ecore_check_options.m4 \
45 $(top_srcdir)/m4/efl_compiler_flag.m4 \
46 $(top_srcdir)/m4/efl_doxygen.m4 \
47 $(top_srcdir)/m4/efl_examples.m4 \
48 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
49 $(top_srcdir)/m4/efl_threads.m4 $(top_srcdir)/m4/gettext.m4 \
50 $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
51 $(top_srcdir)/m4/isc-posix.m4 $(top_srcdir)/m4/lib-ld.m4 \
52 $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
53 $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
54 $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
55 $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
56 $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
57 $(top_srcdir)/configure.ac
58am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
59 $(ACLOCAL_M4)
60mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
61CONFIG_HEADER = $(top_builddir)/config.h
62CONFIG_CLEAN_FILES =
63CONFIG_CLEAN_VPATH_FILES =
64LTLIBRARIES = $(noinst_LTLIBRARIES)
65@BUILD_ECORE_X_XLIB_TRUE@libecore_x_xlib_la_DEPENDENCIES = $(top_builddir)/src/lib/ecore/libecore.la \
66@BUILD_ECORE_X_XLIB_TRUE@ $(top_builddir)/src/lib/ecore_input/libecore_input.la
67am__libecore_x_xlib_la_SOURCES_DIST = ecore_x.c ecore_x_dnd.c \
68 ecore_x_sync.c ecore_x_randr.c ecore_x_randr_11.c \
69 ecore_x_randr_12.c ecore_x_randr_12_edid.c ecore_x_randr_13.c \
70 ecore_x_fixes.c ecore_x_damage.c ecore_x_composite.c \
71 ecore_x_error.c ecore_x_events.c ecore_x_icccm.c \
72 ecore_x_netwm.c ecore_x_mwm.c ecore_x_e.c ecore_x_selection.c \
73 ecore_x_window.c ecore_x_window_prop.c ecore_x_window_shape.c \
74 ecore_x_pixmap.c ecore_x_gc.c ecore_x_xinerama.c \
75 ecore_x_screensaver.c ecore_x_dpms.c ecore_x_drawable.c \
76 ecore_x_cursor.c ecore_x_test.c ecore_x_atoms.c \
77 ecore_x_region.c ecore_x_image.c ecore_x_xi2.c ecore_x_vsync.c \
78 ecore_x_randr.h ecore_x_gesture.c
79@BUILD_ECORE_X_XLIB_TRUE@am_libecore_x_xlib_la_OBJECTS = ecore_x.lo \
80@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_dnd.lo ecore_x_sync.lo \
81@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_randr.lo ecore_x_randr_11.lo \
82@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_randr_12.lo \
83@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_randr_12_edid.lo \
84@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_randr_13.lo ecore_x_fixes.lo \
85@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_damage.lo \
86@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_composite.lo ecore_x_error.lo \
87@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_events.lo ecore_x_icccm.lo \
88@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_netwm.lo ecore_x_mwm.lo \
89@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_e.lo ecore_x_selection.lo \
90@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_window.lo \
91@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_window_prop.lo \
92@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_window_shape.lo \
93@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_pixmap.lo ecore_x_gc.lo \
94@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_xinerama.lo \
95@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_screensaver.lo \
96@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_dpms.lo ecore_x_drawable.lo \
97@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_cursor.lo ecore_x_test.lo \
98@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_atoms.lo ecore_x_region.lo \
99@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_image.lo ecore_x_xi2.lo \
100@BUILD_ECORE_X_XLIB_TRUE@ ecore_x_vsync.lo ecore_x_gesture.lo
101libecore_x_xlib_la_OBJECTS = $(am_libecore_x_xlib_la_OBJECTS)
102AM_V_lt = $(am__v_lt_$(V))
103am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
104am__v_lt_0 = --silent
105@BUILD_ECORE_X_XLIB_TRUE@am_libecore_x_xlib_la_rpath =
106DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
107depcomp = $(SHELL) $(top_srcdir)/depcomp
108am__depfiles_maybe = depfiles
109am__mv = mv -f
110COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
111 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
112LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
113 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
114 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
115 $(AM_CFLAGS) $(CFLAGS)
116AM_V_CC = $(am__v_CC_$(V))
117am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
118am__v_CC_0 = @echo " CC " $@;
119AM_V_at = $(am__v_at_$(V))
120am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
121am__v_at_0 = @
122CCLD = $(CC)
123LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
124 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
125 $(AM_LDFLAGS) $(LDFLAGS) -o $@
126AM_V_CCLD = $(am__v_CCLD_$(V))
127am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
128am__v_CCLD_0 = @echo " CCLD " $@;
129AM_V_GEN = $(am__v_GEN_$(V))
130am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
131am__v_GEN_0 = @echo " GEN " $@;
132SOURCES = $(libecore_x_xlib_la_SOURCES)
133DIST_SOURCES = $(am__libecore_x_xlib_la_SOURCES_DIST)
134ETAGS = etags
135CTAGS = ctags
136DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
137ACLOCAL = @ACLOCAL@
138ALLOCA = @ALLOCA@
139AMTAR = @AMTAR@
140AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
141AR = @AR@
142AS = @AS@
143AUTOCONF = @AUTOCONF@
144AUTOHEADER = @AUTOHEADER@
145AUTOMAKE = @AUTOMAKE@
146AWK = @AWK@
147CARES_CFLAGS = @CARES_CFLAGS@
148CARES_LIBS = @CARES_LIBS@
149CC = @CC@
150CCDEPMODE = @CCDEPMODE@
151CFLAGS = @CFLAGS@
152CHECK_CFLAGS = @CHECK_CFLAGS@
153CHECK_LIBS = @CHECK_LIBS@
154CPP = @CPP@
155CPPFLAGS = @CPPFLAGS@
156CURL_CFLAGS = @CURL_CFLAGS@
157CURL_LIBS = @CURL_LIBS@
158CXX = @CXX@
159CXXCPP = @CXXCPP@
160CXXDEPMODE = @CXXDEPMODE@
161CXXFLAGS = @CXXFLAGS@
162CYGPATH_W = @CYGPATH_W@
163DEFS = @DEFS@
164DEPDIR = @DEPDIR@
165DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
166DIRECTFB_LIBS = @DIRECTFB_LIBS@
167DLLTOOL = @DLLTOOL@
168DSYMUTIL = @DSYMUTIL@
169DUMPBIN = @DUMPBIN@
170ECHO_C = @ECHO_C@
171ECHO_N = @ECHO_N@
172ECHO_T = @ECHO_T@
173ECORE_XCB_CFLAGS = @ECORE_XCB_CFLAGS@
174ECORE_XCB_LIBS = @ECORE_XCB_LIBS@
175EFL_ECORE_BUILD = @EFL_ECORE_BUILD@
176EFL_ECORE_CON_BUILD = @EFL_ECORE_CON_BUILD@
177EFL_ECORE_EVAS_BUILD = @EFL_ECORE_EVAS_BUILD@
178EFL_ECORE_FILE_BUILD = @EFL_ECORE_FILE_BUILD@
179EFL_ECORE_IMF_BUILD = @EFL_ECORE_IMF_BUILD@
180EFL_ECORE_IMF_EVAS_BUILD = @EFL_ECORE_IMF_EVAS_BUILD@
181EFL_ECORE_INPUT_BUILD = @EFL_ECORE_INPUT_BUILD@
182EFL_ECORE_INPUT_EVAS_BUILD = @EFL_ECORE_INPUT_EVAS_BUILD@
183EFL_ECORE_IPC_BUILD = @EFL_ECORE_IPC_BUILD@
184EFL_ECORE_PSL1GHT_BUILD = @EFL_ECORE_PSL1GHT_BUILD@
185EFL_ECORE_SDL_BUILD = @EFL_ECORE_SDL_BUILD@
186EFL_ECORE_WIN32_BUILD = @EFL_ECORE_WIN32_BUILD@
187EFL_ECORE_WINCE_BUILD = @EFL_ECORE_WINCE_BUILD@
188EFL_PTHREAD_CFLAGS = @EFL_PTHREAD_CFLAGS@
189EFL_PTHREAD_LIBS = @EFL_PTHREAD_LIBS@
190EGREP = @EGREP@
191EINA_CFLAGS = @EINA_CFLAGS@
192EINA_LIBS = @EINA_LIBS@
193ESCAPE_CFLAGS = @ESCAPE_CFLAGS@
194ESCAPE_LIBS = @ESCAPE_LIBS@
195EVAS_CFLAGS = @EVAS_CFLAGS@
196EVAS_LIBS = @EVAS_LIBS@
197EVIL_CFLAGS = @EVIL_CFLAGS@
198EVIL_LIBS = @EVIL_LIBS@
199EXEEXT = @EXEEXT@
200FGREP = @FGREP@
201GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
202GLIB_CFLAGS = @GLIB_CFLAGS@
203GLIB_LIBS = @GLIB_LIBS@
204GMSGFMT = @GMSGFMT@
205GMSGFMT_015 = @GMSGFMT_015@
206GREP = @GREP@
207INSTALL = @INSTALL@
208INSTALL_DATA = @INSTALL_DATA@
209INSTALL_PROGRAM = @INSTALL_PROGRAM@
210INSTALL_SCRIPT = @INSTALL_SCRIPT@
211INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
212INTLLIBS = @INTLLIBS@
213INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
214KEYSYMDEFS = @KEYSYMDEFS@
215LD = @LD@
216LDFLAGS = @LDFLAGS@
217LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
218LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
219LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
220LIBICONV = @LIBICONV@
221LIBINTL = @LIBINTL@
222LIBOBJS = @LIBOBJS@
223LIBS = @LIBS@
224LIBTOOL = @LIBTOOL@
225LIPO = @LIPO@
226LN_S = @LN_S@
227LTLIBICONV = @LTLIBICONV@
228LTLIBINTL = @LTLIBINTL@
229LTLIBOBJS = @LTLIBOBJS@
230MAKEINFO = @MAKEINFO@
231MKDIR_P = @MKDIR_P@
232MSGFMT = @MSGFMT@
233MSGFMT_015 = @MSGFMT_015@
234MSGMERGE = @MSGMERGE@
235NM = @NM@
236NMEDIT = @NMEDIT@
237OBJC = @OBJC@
238OBJCDEPMODE = @OBJCDEPMODE@
239OBJCFLAGS = @OBJCFLAGS@
240OBJDUMP = @OBJDUMP@
241OBJEXT = @OBJEXT@
242OTOOL = @OTOOL@
243OTOOL64 = @OTOOL64@
244PACKAGE = @PACKAGE@
245PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
246PACKAGE_NAME = @PACKAGE_NAME@
247PACKAGE_STRING = @PACKAGE_STRING@
248PACKAGE_TARNAME = @PACKAGE_TARNAME@
249PACKAGE_URL = @PACKAGE_URL@
250PACKAGE_VERSION = @PACKAGE_VERSION@
251PATH_SEPARATOR = @PATH_SEPARATOR@
252PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
253PIXMAN_LIBS = @PIXMAN_LIBS@
254PKG_CONFIG = @PKG_CONFIG@
255PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
256PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
257POSUB = @POSUB@
258RANLIB = @RANLIB@
259SDL_CFLAGS = @SDL_CFLAGS@
260SDL_CONFIG = @SDL_CONFIG@
261SDL_LIBS = @SDL_LIBS@
262SED = @SED@
263SET_MAKE = @SET_MAKE@
264SHELL = @SHELL@
265SSL_CFLAGS = @SSL_CFLAGS@
266SSL_LIBS = @SSL_LIBS@
267STRIP = @STRIP@
268TLS2_CFLAGS = @TLS2_CFLAGS@
269TLS2_LIBS = @TLS2_LIBS@
270TLS_CFLAGS = @TLS_CFLAGS@
271TLS_LIBS = @TLS_LIBS@
272TSLIB_CFLAGS = @TSLIB_CFLAGS@
273TSLIB_LIBS = @TSLIB_LIBS@
274USE_NLS = @USE_NLS@
275VERSION = @VERSION@
276VMAJ = @VMAJ@
277WIN32_CFLAGS = @WIN32_CFLAGS@
278WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
279WIN32_LIBS = @WIN32_LIBS@
280XCB_COMPOSITE_CFLAGS = @XCB_COMPOSITE_CFLAGS@
281XCB_COMPOSITE_LIBS = @XCB_COMPOSITE_LIBS@
282XCB_CURSOR_CFLAGS = @XCB_CURSOR_CFLAGS@
283XCB_CURSOR_LIBS = @XCB_CURSOR_LIBS@
284XCB_DAMAGE_CFLAGS = @XCB_DAMAGE_CFLAGS@
285XCB_DAMAGE_LIBS = @XCB_DAMAGE_LIBS@
286XCB_DPMS_CFLAGS = @XCB_DPMS_CFLAGS@
287XCB_DPMS_LIBS = @XCB_DPMS_LIBS@
288XCB_RANDR_CFLAGS = @XCB_RANDR_CFLAGS@
289XCB_RANDR_LIBS = @XCB_RANDR_LIBS@
290XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
291XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
292XCB_SCREENSAVER_CFLAGS = @XCB_SCREENSAVER_CFLAGS@
293XCB_SCREENSAVER_LIBS = @XCB_SCREENSAVER_LIBS@
294XCB_SHAPE_CFLAGS = @XCB_SHAPE_CFLAGS@
295XCB_SHAPE_LIBS = @XCB_SHAPE_LIBS@
296XCB_SYNC_CFLAGS = @XCB_SYNC_CFLAGS@
297XCB_SYNC_LIBS = @XCB_SYNC_LIBS@
298XCB_X11_CFLAGS = @XCB_X11_CFLAGS@
299XCB_X11_LIBS = @XCB_X11_LIBS@
300XCB_XFIXES_CFLAGS = @XCB_XFIXES_CFLAGS@
301XCB_XFIXES_LIBS = @XCB_XFIXES_LIBS@
302XCB_XGESTURE_CFLAGS = @XCB_XGESTURE_CFLAGS@
303XCB_XGESTURE_LIBS = @XCB_XGESTURE_LIBS@
304XCB_XINERAMA_CFLAGS = @XCB_XINERAMA_CFLAGS@
305XCB_XINERAMA_LIBS = @XCB_XINERAMA_LIBS@
306XCB_XINPUT_CFLAGS = @XCB_XINPUT_CFLAGS@
307XCB_XINPUT_LIBS = @XCB_XINPUT_LIBS@
308XCB_XPRINT_CFLAGS = @XCB_XPRINT_CFLAGS@
309XCB_XPRINT_LIBS = @XCB_XPRINT_LIBS@
310XCB_XTEST_CFLAGS = @XCB_XTEST_CFLAGS@
311XCB_XTEST_LIBS = @XCB_XTEST_LIBS@
312XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
313XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
314XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@
315XDAMAGE_LIBS = @XDAMAGE_LIBS@
316XDPMS_CFLAGS = @XDPMS_CFLAGS@
317XDPMS_LIBS = @XDPMS_LIBS@
318XFIXES_CFLAGS = @XFIXES_CFLAGS@
319XFIXES_LIBS = @XFIXES_LIBS@
320XGESTURE_CFLAGS = @XGESTURE_CFLAGS@
321XGESTURE_LIBS = @XGESTURE_LIBS@
322XGETTEXT = @XGETTEXT@
323XGETTEXT_015 = @XGETTEXT_015@
324XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
325XI2_CFLAGS = @XI2_CFLAGS@
326XI2_LIBS = @XI2_LIBS@
327XINERAMA_CFLAGS = @XINERAMA_CFLAGS@
328XINERAMA_LIBS = @XINERAMA_LIBS@
329XKB_CFLAGS = @XKB_CFLAGS@
330XKB_LIBS = @XKB_LIBS@
331XMKMF = @XMKMF@
332XPRINT_CFLAGS = @XPRINT_CFLAGS@
333XPRINT_LIBS = @XPRINT_LIBS@
334XRANDR_CFLAGS = @XRANDR_CFLAGS@
335XRANDR_LIBS = @XRANDR_LIBS@
336XRENDER_CFLAGS = @XRENDER_CFLAGS@
337XRENDER_LIBS = @XRENDER_LIBS@
338XSS_CFLAGS = @XSS_CFLAGS@
339XSS_LIBS = @XSS_LIBS@
340XTEST_CFLAGS = @XTEST_CFLAGS@
341XTEST_LIBS = @XTEST_LIBS@
342X_CFLAGS = @X_CFLAGS@
343X_EXTRA_LIBS = @X_EXTRA_LIBS@
344X_LIBS = @X_LIBS@
345X_PRE_LIBS = @X_PRE_LIBS@
346Xcursor_cflags = @Xcursor_cflags@
347Xcursor_libs = @Xcursor_libs@
348abs_builddir = @abs_builddir@
349abs_srcdir = @abs_srcdir@
350abs_top_builddir = @abs_top_builddir@
351abs_top_srcdir = @abs_top_srcdir@
352ac_ct_CC = @ac_ct_CC@
353ac_ct_CXX = @ac_ct_CXX@
354ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
355ac_ct_OBJC = @ac_ct_OBJC@
356am__include = @am__include@
357am__leading_dot = @am__leading_dot@
358am__quote = @am__quote@
359am__tar = @am__tar@
360am__untar = @am__untar@
361bindir = @bindir@
362build = @build@
363build_alias = @build_alias@
364build_cpu = @build_cpu@
365build_os = @build_os@
366build_vendor = @build_vendor@
367builddir = @builddir@
368cocoa_ldflags = @cocoa_ldflags@
369datadir = @datadir@
370datarootdir = @datarootdir@
371dlopen_libs = @dlopen_libs@
372docdir = @docdir@
373dvidir = @dvidir@
374ecore_cocoa_cflags = @ecore_cocoa_cflags@
375ecore_cocoa_libs = @ecore_cocoa_libs@
376ecore_con_cflags = @ecore_con_cflags@
377ecore_con_libs = @ecore_con_libs@
378ecore_directfb_cflags = @ecore_directfb_cflags@
379ecore_directfb_libs = @ecore_directfb_libs@
380ecore_evas_cflags = @ecore_evas_cflags@
381ecore_evas_libs = @ecore_evas_libs@
382ecore_fb_cflags = @ecore_fb_cflags@
383ecore_fb_libs = @ecore_fb_libs@
384ecore_file_cflags = @ecore_file_cflags@
385ecore_file_libs = @ecore_file_libs@
386ecore_imf_cflags = @ecore_imf_cflags@
387ecore_imf_evas_cflags = @ecore_imf_evas_cflags@
388ecore_imf_evas_libs = @ecore_imf_evas_libs@
389ecore_imf_libs = @ecore_imf_libs@
390ecore_imf_xim_cflags = @ecore_imf_xim_cflags@
391ecore_imf_xim_libs = @ecore_imf_xim_libs@
392ecore_input_cflags = @ecore_input_cflags@
393ecore_input_evas_cflags = @ecore_input_evas_cflags@
394ecore_input_evas_libs = @ecore_input_evas_libs@
395ecore_input_libs = @ecore_input_libs@
396ecore_ipc_cflags = @ecore_ipc_cflags@
397ecore_ipc_libs = @ecore_ipc_libs@
398ecore_psl1ght_cflags = @ecore_psl1ght_cflags@
399ecore_psl1ght_libs = @ecore_psl1ght_libs@
400ecore_sdl_cflags = @ecore_sdl_cflags@
401ecore_sdl_libs = @ecore_sdl_libs@
402ecore_win32_cflags = @ecore_win32_cflags@
403ecore_win32_libs = @ecore_win32_libs@
404ecore_wince_cflags = @ecore_wince_cflags@
405ecore_wince_libs = @ecore_wince_libs@
406ecore_x_cflags = @ecore_x_cflags@
407ecore_x_libs = @ecore_x_libs@
408ecore_x_libs_private = @ecore_x_libs_private@
409efl_doxygen = @efl_doxygen@
410efl_have_doxygen = @efl_have_doxygen@
411exec_prefix = @exec_prefix@
412have_ecore_x_xcb_define = @have_ecore_x_xcb_define@
413host = @host@
414host_alias = @host_alias@
415host_cpu = @host_cpu@
416host_os = @host_os@
417host_vendor = @host_vendor@
418htmldir = @htmldir@
419includedir = @includedir@
420infodir = @infodir@
421install_sh = @install_sh@
422libdir = @libdir@
423libexecdir = @libexecdir@
424localedir = @localedir@
425localstatedir = @localstatedir@
426lt_ECHO = @lt_ECHO@
427lt_enable_auto_import = @lt_enable_auto_import@
428mandir = @mandir@
429mkdir_p = @mkdir_p@
430oldincludedir = @oldincludedir@
431pdfdir = @pdfdir@
432pkgconfig_requires_private = @pkgconfig_requires_private@
433prefix = @prefix@
434program_transform_name = @program_transform_name@
435psdir = @psdir@
436release_info = @release_info@
437requirements_ecore = @requirements_ecore@
438requirements_ecore_cocoa = @requirements_ecore_cocoa@
439requirements_ecore_con = @requirements_ecore_con@
440requirements_ecore_directfb = @requirements_ecore_directfb@
441requirements_ecore_evas = @requirements_ecore_evas@
442requirements_ecore_fb = @requirements_ecore_fb@
443requirements_ecore_file = @requirements_ecore_file@
444requirements_ecore_imf = @requirements_ecore_imf@
445requirements_ecore_imf_evas = @requirements_ecore_imf_evas@
446requirements_ecore_imf_xim = @requirements_ecore_imf_xim@
447requirements_ecore_input = @requirements_ecore_input@
448requirements_ecore_input_evas = @requirements_ecore_input_evas@
449requirements_ecore_ipc = @requirements_ecore_ipc@
450requirements_ecore_psl1ght = @requirements_ecore_psl1ght@
451requirements_ecore_sdl = @requirements_ecore_sdl@
452requirements_ecore_win32 = @requirements_ecore_win32@
453requirements_ecore_wince = @requirements_ecore_wince@
454requirements_ecore_x = @requirements_ecore_x@
455rt_libs = @rt_libs@
456sbindir = @sbindir@
457sharedstatedir = @sharedstatedir@
458srcdir = @srcdir@
459sysconfdir = @sysconfdir@
460target_alias = @target_alias@
461top_build_prefix = @top_build_prefix@
462top_builddir = @top_builddir@
463top_srcdir = @top_srcdir@
464version_info = @version_info@
465x_cflags = @x_cflags@
466x_includes = @x_includes@
467x_libs = @x_libs@
468MAINTAINERCLEANFILES = Makefile.in
469@BUILD_ECORE_X_XLIB_TRUE@AM_CPPFLAGS = \
470@BUILD_ECORE_X_XLIB_TRUE@@Xcursor_cflags@ \
471@BUILD_ECORE_X_XLIB_TRUE@@XKB_CFLAGS@ \
472@BUILD_ECORE_X_XLIB_TRUE@@XDAMAGE_CFLAGS@ \
473@BUILD_ECORE_X_XLIB_TRUE@@XCOMPOSITE_CFLAGS@ \
474@BUILD_ECORE_X_XLIB_TRUE@@XGESTURE_CFLAGS@ \
475@BUILD_ECORE_X_XLIB_TRUE@@XDPMS_CFLAGS@ \
476@BUILD_ECORE_X_XLIB_TRUE@@XFIXES_CFLAGS@ \
477@BUILD_ECORE_X_XLIB_TRUE@@XI2_CFLAGS@ \
478@BUILD_ECORE_X_XLIB_TRUE@@XINERAMA_CFLAGS@ \
479@BUILD_ECORE_X_XLIB_TRUE@@XPRINT_CFLAGS@ \
480@BUILD_ECORE_X_XLIB_TRUE@@XRANDR_CFLAGS@ \
481@BUILD_ECORE_X_XLIB_TRUE@@XRENDER_CFLAGS@ \
482@BUILD_ECORE_X_XLIB_TRUE@@XSS_CFLAGS@ \
483@BUILD_ECORE_X_XLIB_TRUE@@XTEST_CFLAGS@ \
484@BUILD_ECORE_X_XLIB_TRUE@@x_cflags@ \
485@BUILD_ECORE_X_XLIB_TRUE@-I$(top_srcdir)/src/lib/ecore \
486@BUILD_ECORE_X_XLIB_TRUE@-I$(top_srcdir)/src/lib/ecore_x \
487@BUILD_ECORE_X_XLIB_TRUE@-I$(top_srcdir)/src/lib/ecore_input \
488@BUILD_ECORE_X_XLIB_TRUE@-I$(top_builddir)/src/lib/ecore \
489@BUILD_ECORE_X_XLIB_TRUE@-I$(top_builddir)/src/lib/ecore_x \
490@BUILD_ECORE_X_XLIB_TRUE@-I$(top_builddir)/src/lib/ecore_input \
491@BUILD_ECORE_X_XLIB_TRUE@@EVAS_CFLAGS@ \
492@BUILD_ECORE_X_XLIB_TRUE@@EINA_CFLAGS@
493
494@BUILD_ECORE_X_XLIB_TRUE@noinst_LTLIBRARIES = libecore_x_xlib.la
495@BUILD_ECORE_X_XLIB_TRUE@libecore_x_xlib_la_SOURCES = \
496@BUILD_ECORE_X_XLIB_TRUE@ecore_x.c \
497@BUILD_ECORE_X_XLIB_TRUE@ecore_x_dnd.c \
498@BUILD_ECORE_X_XLIB_TRUE@ecore_x_sync.c \
499@BUILD_ECORE_X_XLIB_TRUE@ecore_x_randr.c \
500@BUILD_ECORE_X_XLIB_TRUE@ecore_x_randr_11.c \
501@BUILD_ECORE_X_XLIB_TRUE@ecore_x_randr_12.c \
502@BUILD_ECORE_X_XLIB_TRUE@ecore_x_randr_12_edid.c \
503@BUILD_ECORE_X_XLIB_TRUE@ecore_x_randr_13.c \
504@BUILD_ECORE_X_XLIB_TRUE@ecore_x_fixes.c \
505@BUILD_ECORE_X_XLIB_TRUE@ecore_x_damage.c \
506@BUILD_ECORE_X_XLIB_TRUE@ecore_x_composite.c \
507@BUILD_ECORE_X_XLIB_TRUE@ecore_x_error.c \
508@BUILD_ECORE_X_XLIB_TRUE@ecore_x_events.c \
509@BUILD_ECORE_X_XLIB_TRUE@ecore_x_icccm.c \
510@BUILD_ECORE_X_XLIB_TRUE@ecore_x_netwm.c \
511@BUILD_ECORE_X_XLIB_TRUE@ecore_x_mwm.c \
512@BUILD_ECORE_X_XLIB_TRUE@ecore_x_e.c \
513@BUILD_ECORE_X_XLIB_TRUE@ecore_x_selection.c \
514@BUILD_ECORE_X_XLIB_TRUE@ecore_x_window.c \
515@BUILD_ECORE_X_XLIB_TRUE@ecore_x_window_prop.c \
516@BUILD_ECORE_X_XLIB_TRUE@ecore_x_window_shape.c \
517@BUILD_ECORE_X_XLIB_TRUE@ecore_x_pixmap.c \
518@BUILD_ECORE_X_XLIB_TRUE@ecore_x_gc.c \
519@BUILD_ECORE_X_XLIB_TRUE@ecore_x_xinerama.c \
520@BUILD_ECORE_X_XLIB_TRUE@ecore_x_screensaver.c \
521@BUILD_ECORE_X_XLIB_TRUE@ecore_x_dpms.c \
522@BUILD_ECORE_X_XLIB_TRUE@ecore_x_drawable.c \
523@BUILD_ECORE_X_XLIB_TRUE@ecore_x_cursor.c \
524@BUILD_ECORE_X_XLIB_TRUE@ecore_x_test.c \
525@BUILD_ECORE_X_XLIB_TRUE@ecore_x_atoms.c \
526@BUILD_ECORE_X_XLIB_TRUE@ecore_x_region.c \
527@BUILD_ECORE_X_XLIB_TRUE@ecore_x_image.c \
528@BUILD_ECORE_X_XLIB_TRUE@ecore_x_xi2.c \
529@BUILD_ECORE_X_XLIB_TRUE@ecore_x_vsync.c \
530@BUILD_ECORE_X_XLIB_TRUE@ecore_x_randr.h \
531@BUILD_ECORE_X_XLIB_TRUE@ecore_x_gesture.c
532
533@BUILD_ECORE_X_XLIB_TRUE@libecore_x_xlib_la_LIBADD = \
534@BUILD_ECORE_X_XLIB_TRUE@@Xcursor_libs@ \
535@BUILD_ECORE_X_XLIB_TRUE@@XKB_LIBS@ \
536@BUILD_ECORE_X_XLIB_TRUE@@XDAMAGE_LIBS@ \
537@BUILD_ECORE_X_XLIB_TRUE@@XCOMPOSITE_LIBS@ \
538@BUILD_ECORE_X_XLIB_TRUE@@XGESTURE_LIBS@ \
539@BUILD_ECORE_X_XLIB_TRUE@@XDPMS_LIBS@ \
540@BUILD_ECORE_X_XLIB_TRUE@@XFIXES_LIBS@ \
541@BUILD_ECORE_X_XLIB_TRUE@@XI2_LIBS@ \
542@BUILD_ECORE_X_XLIB_TRUE@@XINERAMA_LIBS@ \
543@BUILD_ECORE_X_XLIB_TRUE@@XPRINT_LIBS@ \
544@BUILD_ECORE_X_XLIB_TRUE@@XRANDR_LIBS@ \
545@BUILD_ECORE_X_XLIB_TRUE@@XRENDER_LIBS@ \
546@BUILD_ECORE_X_XLIB_TRUE@@XSS_LIBS@ \
547@BUILD_ECORE_X_XLIB_TRUE@@XTEST_LIBS@ \
548@BUILD_ECORE_X_XLIB_TRUE@@x_libs@ \
549@BUILD_ECORE_X_XLIB_TRUE@$(top_builddir)/src/lib/ecore/libecore.la \
550@BUILD_ECORE_X_XLIB_TRUE@$(top_builddir)/src/lib/ecore_input/libecore_input.la \
551@BUILD_ECORE_X_XLIB_TRUE@@EINA_LIBS@ \
552@BUILD_ECORE_X_XLIB_TRUE@@dlopen_libs@
553
554EXTRA_DIST = ecore_x_private.h
555all: all-am
556
557.SUFFIXES:
558.SUFFIXES: .c .lo .o .obj
559$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
560 @for dep in $?; do \
561 case '$(am__configure_deps)' in \
562 *$$dep*) \
563 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
564 && { if test -f $@; then exit 0; else break; fi; }; \
565 exit 1;; \
566 esac; \
567 done; \
568 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/ecore_x/xlib/Makefile'; \
569 $(am__cd) $(top_srcdir) && \
570 $(AUTOMAKE) --gnu src/lib/ecore_x/xlib/Makefile
571.PRECIOUS: Makefile
572Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
573 @case '$?' in \
574 *config.status*) \
575 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
576 *) \
577 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
578 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
579 esac;
580
581$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
582 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
583
584$(top_srcdir)/configure: $(am__configure_deps)
585 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
586$(ACLOCAL_M4): $(am__aclocal_m4_deps)
587 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
588$(am__aclocal_m4_deps):
589
590clean-noinstLTLIBRARIES:
591 -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
592 @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
593 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
594 test "$$dir" != "$$p" || dir=.; \
595 echo "rm -f \"$${dir}/so_locations\""; \
596 rm -f "$${dir}/so_locations"; \
597 done
598libecore_x_xlib.la: $(libecore_x_xlib_la_OBJECTS) $(libecore_x_xlib_la_DEPENDENCIES)
599 $(AM_V_CCLD)$(LINK) $(am_libecore_x_xlib_la_rpath) $(libecore_x_xlib_la_OBJECTS) $(libecore_x_xlib_la_LIBADD) $(LIBS)
600
601mostlyclean-compile:
602 -rm -f *.$(OBJEXT)
603
604distclean-compile:
605 -rm -f *.tab.c
606
607@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x.Plo@am__quote@
608@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_atoms.Plo@am__quote@
609@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_composite.Plo@am__quote@
610@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_cursor.Plo@am__quote@
611@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_damage.Plo@am__quote@
612@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_dnd.Plo@am__quote@
613@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_dpms.Plo@am__quote@
614@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_drawable.Plo@am__quote@
615@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_e.Plo@am__quote@
616@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_error.Plo@am__quote@
617@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_events.Plo@am__quote@
618@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_fixes.Plo@am__quote@
619@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_gc.Plo@am__quote@
620@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_gesture.Plo@am__quote@
621@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_icccm.Plo@am__quote@
622@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_image.Plo@am__quote@
623@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_mwm.Plo@am__quote@
624@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_netwm.Plo@am__quote@
625@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_pixmap.Plo@am__quote@
626@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_randr.Plo@am__quote@
627@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_randr_11.Plo@am__quote@
628@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_randr_12.Plo@am__quote@
629@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_randr_12_edid.Plo@am__quote@
630@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_randr_13.Plo@am__quote@
631@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_region.Plo@am__quote@
632@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_screensaver.Plo@am__quote@
633@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_selection.Plo@am__quote@
634@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_sync.Plo@am__quote@
635@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_test.Plo@am__quote@
636@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_vsync.Plo@am__quote@
637@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_window.Plo@am__quote@
638@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_window_prop.Plo@am__quote@
639@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_window_shape.Plo@am__quote@
640@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_xi2.Plo@am__quote@
641@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ecore_x_xinerama.Plo@am__quote@
642
643.c.o:
644@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
645@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
646@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
647@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
648@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
649@am__fastdepCC_FALSE@ $(COMPILE) -c $<
650
651.c.obj:
652@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
653@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
654@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
655@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
656@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
657@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
658
659.c.lo:
660@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
661@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
662@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
663@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
664@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
665@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
666
667mostlyclean-libtool:
668 -rm -f *.lo
669
670clean-libtool:
671 -rm -rf .libs _libs
672
673ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
674 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
675 unique=`for i in $$list; do \
676 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
677 done | \
678 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
679 END { if (nonempty) { for (i in files) print i; }; }'`; \
680 mkid -fID $$unique
681tags: TAGS
682
683TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
684 $(TAGS_FILES) $(LISP)
685 set x; \
686 here=`pwd`; \
687 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
688 unique=`for i in $$list; do \
689 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
690 done | \
691 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
692 END { if (nonempty) { for (i in files) print i; }; }'`; \
693 shift; \
694 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
695 test -n "$$unique" || unique=$$empty_fix; \
696 if test $$# -gt 0; then \
697 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
698 "$$@" $$unique; \
699 else \
700 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
701 $$unique; \
702 fi; \
703 fi
704ctags: CTAGS
705CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
706 $(TAGS_FILES) $(LISP)
707 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
708 unique=`for i in $$list; do \
709 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
710 done | \
711 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
712 END { if (nonempty) { for (i in files) print i; }; }'`; \
713 test -z "$(CTAGS_ARGS)$$unique" \
714 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
715 $$unique
716
717GTAGS:
718 here=`$(am__cd) $(top_builddir) && pwd` \
719 && $(am__cd) $(top_srcdir) \
720 && gtags -i $(GTAGS_ARGS) "$$here"
721
722distclean-tags:
723 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
724
725distdir: $(DISTFILES)
726 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
727 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
728 list='$(DISTFILES)'; \
729 dist_files=`for file in $$list; do echo $$file; done | \
730 sed -e "s|^$$srcdirstrip/||;t" \
731 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
732 case $$dist_files in \
733 */*) $(MKDIR_P) `echo "$$dist_files" | \
734 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
735 sort -u` ;; \
736 esac; \
737 for file in $$dist_files; do \
738 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
739 if test -d $$d/$$file; then \
740 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
741 if test -d "$(distdir)/$$file"; then \
742 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
743 fi; \
744 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
745 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
746 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
747 fi; \
748 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
749 else \
750 test -f "$(distdir)/$$file" \
751 || cp -p $$d/$$file "$(distdir)/$$file" \
752 || exit 1; \
753 fi; \
754 done
755check-am: all-am
756check: check-am
757all-am: Makefile $(LTLIBRARIES)
758installdirs:
759install: install-am
760install-exec: install-exec-am
761install-data: install-data-am
762uninstall: uninstall-am
763
764install-am: all-am
765 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
766
767installcheck: installcheck-am
768install-strip:
769 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
770 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
771 `test -z '$(STRIP)' || \
772 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
773mostlyclean-generic:
774
775clean-generic:
776
777distclean-generic:
778 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
779 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
780
781maintainer-clean-generic:
782 @echo "This command is intended for maintainers to use"
783 @echo "it deletes files that may require special tools to rebuild."
784 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
785clean: clean-am
786
787clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
788 mostlyclean-am
789
790distclean: distclean-am
791 -rm -rf ./$(DEPDIR)
792 -rm -f Makefile
793distclean-am: clean-am distclean-compile distclean-generic \
794 distclean-tags
795
796dvi: dvi-am
797
798dvi-am:
799
800html: html-am
801
802html-am:
803
804info: info-am
805
806info-am:
807
808install-data-am:
809
810install-dvi: install-dvi-am
811
812install-dvi-am:
813
814install-exec-am:
815
816install-html: install-html-am
817
818install-html-am:
819
820install-info: install-info-am
821
822install-info-am:
823
824install-man:
825
826install-pdf: install-pdf-am
827
828install-pdf-am:
829
830install-ps: install-ps-am
831
832install-ps-am:
833
834installcheck-am:
835
836maintainer-clean: maintainer-clean-am
837 -rm -rf ./$(DEPDIR)
838 -rm -f Makefile
839maintainer-clean-am: distclean-am maintainer-clean-generic
840
841mostlyclean: mostlyclean-am
842
843mostlyclean-am: mostlyclean-compile mostlyclean-generic \
844 mostlyclean-libtool
845
846pdf: pdf-am
847
848pdf-am:
849
850ps: ps-am
851
852ps-am:
853
854uninstall-am:
855
856.MAKE: install-am install-strip
857
858.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
859 clean-libtool clean-noinstLTLIBRARIES ctags distclean \
860 distclean-compile distclean-generic distclean-libtool \
861 distclean-tags distdir dvi dvi-am html html-am info info-am \
862 install install-am install-data install-data-am install-dvi \
863 install-dvi-am install-exec install-exec-am install-html \
864 install-html-am install-info install-info-am install-man \
865 install-pdf install-pdf-am install-ps install-ps-am \
866 install-strip installcheck installcheck-am installdirs \
867 maintainer-clean maintainer-clean-generic mostlyclean \
868 mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
869 pdf pdf-am ps ps-am tags uninstall uninstall-am
870
871
872# Tell versions [3.59,3.63) of GNU make to not export all variables.
873# Otherwise a system limit (for SysV at least) may be exceeded.
874.NOEXPORT:
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c
new file mode 100644
index 0000000..844ab04
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x.c
@@ -0,0 +1,2098 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6#include <string.h>
7#include <unistd.h>
8
9//#define LOGRT 1
10
11#ifdef LOGRT
12#include <dlfcn.h>
13#endif /* ifdef LOGRT */
14
15#include "Ecore.h"
16#include "ecore_private.h"
17#include "ecore_x_private.h"
18#include "Ecore_X.h"
19#include "Ecore_X_Atoms.h"
20#include "Ecore_Input.h"
21
22static Eina_Bool _ecore_x_fd_handler(void *data,
23 Ecore_Fd_Handler *fd_handler);
24static Eina_Bool _ecore_x_fd_handler_buf(void *data,
25 Ecore_Fd_Handler *fd_handler);
26static int _ecore_x_key_mask_get(KeySym sym);
27static int _ecore_x_event_modifier(unsigned int state);
28
29static Ecore_Fd_Handler *_ecore_x_fd_handler_handle = NULL;
30
31static const int AnyXEvent = 0; /* 0 can be used as there are no event types
32 * with index 0 and 1 as they are used for
33 * errors
34 */
35
36static int _ecore_x_event_shape_id = 0;
37static int _ecore_x_event_screensaver_id = 0;
38static int _ecore_x_event_sync_id = 0;
39int _ecore_xlib_log_dom = -1;
40
41#ifdef ECORE_XRANDR
42static int _ecore_x_event_randr_id = 0;
43#endif /* ifdef ECORE_XRANDR */
44#ifdef ECORE_XFIXES
45static int _ecore_x_event_fixes_selection_id = 0;
46#endif /* ifdef ECORE_XFIXES */
47#ifdef ECORE_XDAMAGE
48static int _ecore_x_event_damage_id = 0;
49#endif /* ifdef ECORE_XDAMAGE */
50#ifdef ECORE_XGESTURE
51static int _ecore_x_event_gesture_id = 0;
52#endif /* ifdef ECORE_XGESTURE */
53static int _ecore_x_event_handlers_num = 0;
54static void (**_ecore_x_event_handlers) (XEvent * event) = NULL;
55
56static int _ecore_x_init_count = 0;
57static int _ecore_x_grab_count = 0;
58
59Display *_ecore_x_disp = NULL;
60double _ecore_x_double_click_time = 0.25;
61Time _ecore_x_event_last_time = 0;
62Window _ecore_x_event_last_win = 0;
63int _ecore_x_event_last_root_x = 0;
64int _ecore_x_event_last_root_y = 0;
65Eina_Bool _ecore_x_xcursor = EINA_FALSE;
66
67Ecore_X_Window _ecore_x_private_win = 0;
68
69Ecore_X_Atom _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
70
71EAPI int ECORE_X_EVENT_ANY = 0;
72EAPI int ECORE_X_EVENT_MOUSE_IN = 0;
73EAPI int ECORE_X_EVENT_MOUSE_OUT = 0;
74EAPI int ECORE_X_EVENT_WINDOW_FOCUS_IN = 0;
75EAPI int ECORE_X_EVENT_WINDOW_FOCUS_OUT = 0;
76EAPI int ECORE_X_EVENT_WINDOW_KEYMAP = 0;
77EAPI int ECORE_X_EVENT_WINDOW_DAMAGE = 0;
78EAPI int ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = 0;
79EAPI int ECORE_X_EVENT_WINDOW_CREATE = 0;
80EAPI int ECORE_X_EVENT_WINDOW_DESTROY = 0;
81EAPI int ECORE_X_EVENT_WINDOW_HIDE = 0;
82EAPI int ECORE_X_EVENT_WINDOW_SHOW = 0;
83EAPI int ECORE_X_EVENT_WINDOW_SHOW_REQUEST = 0;
84EAPI int ECORE_X_EVENT_WINDOW_REPARENT = 0;
85EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE = 0;
86EAPI int ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = 0;
87EAPI int ECORE_X_EVENT_WINDOW_GRAVITY = 0;
88EAPI int ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = 0;
89EAPI int ECORE_X_EVENT_WINDOW_STACK = 0;
90EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0;
91EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0;
92EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0;
93EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0;
94EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0;
95EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0;
96EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0;
97EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0;
98EAPI int ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = 0;
99EAPI int ECORE_X_EVENT_CLIENT_MESSAGE = 0;
100EAPI int ECORE_X_EVENT_WINDOW_SHAPE = 0;
101EAPI int ECORE_X_EVENT_SCREENSAVER_NOTIFY = 0;
102EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_FLICK;
103EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PAN;
104EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION;
105EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAP;
106EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD;
107EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_HOLD;
108EAPI int ECORE_X_EVENT_GESTURE_NOTIFY_GROUP;
109EAPI int ECORE_X_EVENT_SYNC_COUNTER = 0;
110EAPI int ECORE_X_EVENT_SYNC_ALARM = 0;
111EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0;
112EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0;
113EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0;
114EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0;
115EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0;
116EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0;
117EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0;
118EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0;
119EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0;
120EAPI int ECORE_X_EVENT_PING = 0;
121EAPI int ECORE_X_EVENT_DESKTOP_CHANGE = 0;
122
123EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = 0;
124EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = 0;
125EAPI int ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = 0;
126
127EAPI int ECORE_X_EVENT_GENERIC = 0;
128
129int ECORE_X_MODIFIER_SHIFT = 0;
130int ECORE_X_MODIFIER_CTRL = 0;
131int ECORE_X_MODIFIER_ALT = 0;
132int ECORE_X_MODIFIER_WIN = 0;
133
134EAPI int ECORE_X_LOCK_SCROLL = 0;
135EAPI int ECORE_X_LOCK_NUM = 0;
136EAPI int ECORE_X_LOCK_CAPS = 0;
137EAPI int ECORE_X_LOCK_SHIFT = 0;
138
139#ifdef LOGRT
140static double t0 = 0.0;
141static Status (*_logrt_real_reply)(Display *disp,
142 void *rep,
143 int extra,
144 Bool discard) = NULL;
145static void
146_logrt_init(void)
147{
148 void *lib;
149
150 lib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY);
151 if (!lib)
152 lib = dlopen("libX11.so.6", RTLD_GLOBAL | RTLD_LAZY);
153
154 if (!lib)
155 lib = dlopen("libX11.so.6.3", RTLD_GLOBAL | RTLD_LAZY);
156
157 if (!lib)
158 lib = dlopen("libX11.so.6.3.0", RTLD_GLOBAL | RTLD_LAZY);
159
160 _logrt_real_reply = dlsym(lib, "_XReply");
161 t0 = ecore_time_get();
162} /* _logrt_init */
163
164Status
165_XReply(Display *disp,
166 void *rep,
167 int extra,
168 Bool discard)
169{
170 void *bt[128];
171 int i, n;
172 char **sym;
173
174 n = backtrace(bt, 128);
175 if (n > 0)
176 {
177 sym = backtrace_symbols(bt, n);
178 printf("ROUNDTRIP: %4.4f :", ecore_time_get() - t0);
179 if (sym)
180 {
181 for (i = n - 1; i > 0; i--)
182 {
183 char *fname = strchr(sym[i], '(');
184 if (fname)
185 {
186 char *tsym = alloca(strlen(fname) + 1);
187 char *end;
188 strcpy(tsym, fname + 1);
189 end = strchr(tsym, '+');
190 if (end)
191 {
192 *end = 0;
193 printf("%s", tsym);
194 }
195 else
196 printf("???");
197 }
198 else
199 printf("???");
200
201 if (i > 1)
202 printf(" > ");
203 }
204 printf("\n");
205 }
206 }
207
208 // fixme: logme
209 return _logrt_real_reply(disp, rep, extra, discard);
210} /* _XReply */
211
212#endif /* ifdef LOGRT */
213
214void
215_ecore_x_modifiers_get(void)
216{
217 /* everything has these... unless its like a pda... :) */
218 ECORE_X_MODIFIER_SHIFT = _ecore_x_key_mask_get(XK_Shift_L);
219 ECORE_X_MODIFIER_CTRL = _ecore_x_key_mask_get(XK_Control_L);
220
221 /* apple's xdarwin has no alt!!!! */
222 ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Alt_L);
223 if (!ECORE_X_MODIFIER_ALT)
224 ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Meta_L);
225
226 if (!ECORE_X_MODIFIER_ALT)
227 ECORE_X_MODIFIER_ALT = _ecore_x_key_mask_get(XK_Super_L);
228
229 /* the windows key... a valid modifier :) */
230 ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Super_L);
231 if (!ECORE_X_MODIFIER_WIN)
232 ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Mode_switch);
233
234 if (!ECORE_X_MODIFIER_WIN)
235 ECORE_X_MODIFIER_WIN = _ecore_x_key_mask_get(XK_Meta_L);
236
237 if (ECORE_X_MODIFIER_WIN == ECORE_X_MODIFIER_ALT)
238 ECORE_X_MODIFIER_WIN = 0;
239
240 if (ECORE_X_MODIFIER_ALT == ECORE_X_MODIFIER_CTRL)
241 ECORE_X_MODIFIER_ALT = 0;
242
243 ECORE_X_LOCK_SCROLL = _ecore_x_key_mask_get(XK_Scroll_Lock);
244 ECORE_X_LOCK_NUM = _ecore_x_key_mask_get(XK_Num_Lock);
245 ECORE_X_LOCK_CAPS = _ecore_x_key_mask_get(XK_Caps_Lock);
246 ECORE_X_LOCK_SHIFT = _ecore_x_key_mask_get(XK_Shift_Lock);
247}
248
249/**
250 * @defgroup Ecore_X_Init_Group X Library Init and Shutdown Functions
251 *
252 * Functions that start and shut down the Ecore X Library.
253 */
254
255/**
256 * Initialize the X display connection to the given display.
257 *
258 * @param name Display target name. If @c NULL, the default display is
259 * assumed.
260 * @return The number of times the library has been initialized without
261 * being shut down. 0 is returned if an error occurs.
262 * @ingroup Ecore_X_Init_Group
263 */
264EAPI int
265ecore_x_init(const char *name)
266{
267 int shape_base = 0;
268 int shape_err_base = 0;
269#ifdef ECORE_XSS
270 int screensaver_base = 0;
271 int screensaver_err_base = 0;
272#endif /* ifdef ECORE_XSS */
273 int sync_base = 0;
274 int sync_err_base = 0;
275#ifdef ECORE_XRANDR
276 int randr_base = 0;
277 int randr_err_base = 0;
278#endif /* ifdef ECORE_XRANDR */
279#ifdef ECORE_XFIXES
280 int fixes_base = 0;
281 int fixes_err_base = 0;
282#endif /* ifdef ECORE_XFIXES */
283#ifdef ECORE_XDAMAGE
284 int damage_base = 0;
285 int damage_err_base = 0;
286#endif /* ifdef ECORE_XDAMAGE */
287#ifdef ECORE_XGESTURE
288 int gesture_base = 0;
289 int gesture_err_base = 0;
290#endif /* ifdef ECORE_XGESTURE */
291
292 if (++_ecore_x_init_count != 1)
293 return _ecore_x_init_count;
294
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
296#ifdef LOGRT
297 _logrt_init();
298#endif /* ifdef LOGRT */
299
300 eina_init();
301 _ecore_xlib_log_dom = eina_log_domain_register
302 ("ecore_x", ECORE_XLIB_DEFAULT_LOG_COLOR);
303 if(_ecore_xlib_log_dom < 0)
304 {
305 EINA_LOG_ERR(
306 "Impossible to create a log domain for the Ecore Xlib module.");
307 return --_ecore_x_init_count;
308 }
309
310 if (!ecore_init())
311 goto shutdown_eina;
312 if (!ecore_event_init())
313 goto shutdown_ecore;
314
315#ifdef EVAS_FRAME_QUEUING
316 XInitThreads();
317#endif /* ifdef EVAS_FRAME_QUEUING */
318 _ecore_x_disp = XOpenDisplay((char *)name);
319 if (!_ecore_x_disp)
320 goto shutdown_ecore_event;
321
322 _ecore_x_error_handler_init();
323 _ecore_x_event_handlers_num = LASTEvent;
324
325#define ECORE_X_EVENT_HANDLERS_GROW(ext_base, ext_num_events) \
326 do { \
327 if (_ecore_x_event_handlers_num < (ext_base + ext_num_events)) { \
328 _ecore_x_event_handlers_num = (ext_base + ext_num_events); } \
329 } while (0)
330
331 if (XShapeQueryExtension(_ecore_x_disp, &shape_base, &shape_err_base))
332 _ecore_x_event_shape_id = shape_base;
333
334 ECORE_X_EVENT_HANDLERS_GROW(shape_base, ShapeNumberEvents);
335
336#ifdef ECORE_XSS
337 if (XScreenSaverQueryExtension(_ecore_x_disp, &screensaver_base,
338 &screensaver_err_base))
339 _ecore_x_event_screensaver_id = screensaver_base;
340
341 ECORE_X_EVENT_HANDLERS_GROW(screensaver_base, ScreenSaverNumberEvents);
342#endif /* ifdef ECORE_XSS */
343
344 if (XSyncQueryExtension(_ecore_x_disp, &sync_base, &sync_err_base))
345 {
346 int major, minor;
347
348 _ecore_x_event_sync_id = sync_base;
349 if (!XSyncInitialize(_ecore_x_disp, &major, &minor))
350 _ecore_x_event_sync_id = 0;
351 }
352
353 ECORE_X_EVENT_HANDLERS_GROW(sync_base, XSyncNumberEvents);
354
355#ifdef ECORE_XRANDR
356 if (XRRQueryExtension(_ecore_x_disp, &randr_base, &randr_err_base))
357 _ecore_x_event_randr_id = randr_base;
358
359 ECORE_X_EVENT_HANDLERS_GROW(randr_base, RRNumberEvents);
360#endif /* ifdef ECORE_XRANDR */
361
362#ifdef ECORE_XFIXES
363 if (XFixesQueryExtension(_ecore_x_disp, &fixes_base, &fixes_err_base))
364 _ecore_x_event_fixes_selection_id = fixes_base;
365
366 ECORE_X_EVENT_HANDLERS_GROW(fixes_base, XFixesNumberEvents);
367#endif /* ifdef ECORE_XFIXES */
368
369#ifdef ECORE_XDAMAGE
370 if (XDamageQueryExtension(_ecore_x_disp, &damage_base, &damage_err_base))
371 _ecore_x_event_damage_id = damage_base;
372
373 ECORE_X_EVENT_HANDLERS_GROW(damage_base, XDamageNumberEvents);
374#endif /* ifdef ECORE_XDAMAGE */
375
376#ifdef ECORE_XGESTURE
377 if (XGestureQueryExtension(_ecore_x_disp, &gesture_base, &gesture_err_base))
378 _ecore_x_event_gesture_id = gesture_base;
379
380 ECORE_X_EVENT_HANDLERS_GROW(gesture_base, GestureNumberEvents);
381#endif /* ifdef ECORE_XGESTURE */
382
383 _ecore_x_event_handlers = calloc(_ecore_x_event_handlers_num, sizeof(void *));
384 if (!_ecore_x_event_handlers)
385 goto close_display;
386
387#ifdef ECORE_XCURSOR
388 _ecore_x_xcursor = XcursorSupportsARGB(_ecore_x_disp) ? EINA_TRUE : EINA_FALSE;
389#endif /* ifdef ECORE_XCURSOR */
390 _ecore_x_event_handlers[AnyXEvent] = _ecore_x_event_handle_any_event;
391 _ecore_x_event_handlers[KeyPress] = _ecore_x_event_handle_key_press;
392 _ecore_x_event_handlers[KeyRelease] = _ecore_x_event_handle_key_release;
393 _ecore_x_event_handlers[ButtonPress] = _ecore_x_event_handle_button_press;
394 _ecore_x_event_handlers[ButtonRelease] =
395 _ecore_x_event_handle_button_release;
396 _ecore_x_event_handlers[MotionNotify] = _ecore_x_event_handle_motion_notify;
397 _ecore_x_event_handlers[EnterNotify] = _ecore_x_event_handle_enter_notify;
398 _ecore_x_event_handlers[LeaveNotify] = _ecore_x_event_handle_leave_notify;
399 _ecore_x_event_handlers[FocusIn] = _ecore_x_event_handle_focus_in;
400 _ecore_x_event_handlers[FocusOut] = _ecore_x_event_handle_focus_out;
401 _ecore_x_event_handlers[KeymapNotify] = _ecore_x_event_handle_keymap_notify;
402 _ecore_x_event_handlers[Expose] = _ecore_x_event_handle_expose;
403 _ecore_x_event_handlers[GraphicsExpose] =
404 _ecore_x_event_handle_graphics_expose;
405 _ecore_x_event_handlers[VisibilityNotify] =
406 _ecore_x_event_handle_visibility_notify;
407 _ecore_x_event_handlers[CreateNotify] = _ecore_x_event_handle_create_notify;
408 _ecore_x_event_handlers[DestroyNotify] =
409 _ecore_x_event_handle_destroy_notify;
410 _ecore_x_event_handlers[UnmapNotify] = _ecore_x_event_handle_unmap_notify;
411 _ecore_x_event_handlers[MapNotify] = _ecore_x_event_handle_map_notify;
412 _ecore_x_event_handlers[MapRequest] = _ecore_x_event_handle_map_request;
413 _ecore_x_event_handlers[ReparentNotify] =
414 _ecore_x_event_handle_reparent_notify;
415 _ecore_x_event_handlers[ConfigureNotify] =
416 _ecore_x_event_handle_configure_notify;
417 _ecore_x_event_handlers[ConfigureRequest] =
418 _ecore_x_event_handle_configure_request;
419 _ecore_x_event_handlers[GravityNotify] =
420 _ecore_x_event_handle_gravity_notify;
421 _ecore_x_event_handlers[ResizeRequest] =
422 _ecore_x_event_handle_resize_request;
423 _ecore_x_event_handlers[CirculateNotify] =
424 _ecore_x_event_handle_circulate_notify;
425 _ecore_x_event_handlers[CirculateRequest] =
426 _ecore_x_event_handle_circulate_request;
427 _ecore_x_event_handlers[PropertyNotify] =
428 _ecore_x_event_handle_property_notify;
429 _ecore_x_event_handlers[SelectionClear] =
430 _ecore_x_event_handle_selection_clear;
431 _ecore_x_event_handlers[SelectionRequest] =
432 _ecore_x_event_handle_selection_request;
433 _ecore_x_event_handlers[SelectionNotify] =
434 _ecore_x_event_handle_selection_notify;
435 _ecore_x_event_handlers[ColormapNotify] =
436 _ecore_x_event_handle_colormap_notify;
437 _ecore_x_event_handlers[ClientMessage] =
438 _ecore_x_event_handle_client_message;
439 _ecore_x_event_handlers[MappingNotify] =
440 _ecore_x_event_handle_mapping_notify;
441#ifdef GenericEvent
442 _ecore_x_event_handlers[GenericEvent] = _ecore_x_event_handle_generic_event;
443#endif /* ifdef GenericEvent */
444
445 if (_ecore_x_event_shape_id)
446 _ecore_x_event_handlers[_ecore_x_event_shape_id] =
447 _ecore_x_event_handle_shape_change;
448
449 if (_ecore_x_event_screensaver_id)
450 _ecore_x_event_handlers[_ecore_x_event_screensaver_id] =
451 _ecore_x_event_handle_screensaver_notify;
452
453 if (_ecore_x_event_sync_id)
454 {
455 _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncCounterNotify] =
456 _ecore_x_event_handle_sync_counter;
457 _ecore_x_event_handlers[_ecore_x_event_sync_id + XSyncAlarmNotify] =
458 _ecore_x_event_handle_sync_alarm;
459 }
460
461#ifdef ECORE_XRANDR
462 if (_ecore_x_event_randr_id)
463 {
464 _ecore_x_event_handlers[_ecore_x_event_randr_id +
465 RRScreenChangeNotify] =
466 _ecore_x_event_handle_randr_change;
467 _ecore_x_event_handlers[_ecore_x_event_randr_id +
468 RRNotify] = _ecore_x_event_handle_randr_notify;
469 }
470
471#endif /* ifdef ECORE_XRANDR */
472#ifdef ECORE_XFIXES
473 if (_ecore_x_event_fixes_selection_id)
474 _ecore_x_event_handlers[_ecore_x_event_fixes_selection_id] =
475 _ecore_x_event_handle_fixes_selection_notify;
476
477#endif /* ifdef ECORE_XFIXES */
478#ifdef ECORE_XDAMAGE
479 if (_ecore_x_event_damage_id)
480 _ecore_x_event_handlers[_ecore_x_event_damage_id] =
481 _ecore_x_event_handle_damage_notify;
482
483#endif /* ifdef ECORE_XDAMAGE */
484#ifdef ECORE_XKB
485 // set x autorepeat detection to on. that means instead of
486 // press-release-press-release-press-release
487 // you get
488 // press-press-press-press-press-release
489 do
490 {
491 Bool works = 0;
492 XkbSetDetectableAutoRepeat(_ecore_x_disp, 1, &works);
493 }
494 while (0);
495#endif /* ifdef ECORE_XKB */
496
497#ifdef ECORE_XGESTURE
498 if (_ecore_x_event_gesture_id)
499 {
500 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyFlick] =
501 _ecore_x_event_handle_gesture_notify_flick;
502 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyPan] =
503 _ecore_x_event_handle_gesture_notify_pan;
504 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyPinchRotation] =
505 _ecore_x_event_handle_gesture_notify_pinchrotation;
506 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyTap] =
507 _ecore_x_event_handle_gesture_notify_tap;
508 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyTapNHold] =
509 _ecore_x_event_handle_gesture_notify_tapnhold;
510 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyHold] =
511 _ecore_x_event_handle_gesture_notify_hold;
512 _ecore_x_event_handlers[_ecore_x_event_gesture_id + GestureNotifyGroup] =
513 _ecore_x_event_handle_gesture_notify_group;
514 }
515
516#endif /* ifdef ECORE_XGESTURE */
517
518 if (!ECORE_X_EVENT_ANY)
519 {
520 ECORE_X_EVENT_ANY = ecore_event_type_new();
521 ECORE_X_EVENT_MOUSE_IN = ecore_event_type_new();
522 ECORE_X_EVENT_MOUSE_OUT = ecore_event_type_new();
523 ECORE_X_EVENT_WINDOW_FOCUS_IN = ecore_event_type_new();
524 ECORE_X_EVENT_WINDOW_FOCUS_OUT = ecore_event_type_new();
525 ECORE_X_EVENT_WINDOW_KEYMAP = ecore_event_type_new();
526 ECORE_X_EVENT_WINDOW_DAMAGE = ecore_event_type_new();
527 ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE = ecore_event_type_new();
528 ECORE_X_EVENT_WINDOW_CREATE = ecore_event_type_new();
529 ECORE_X_EVENT_WINDOW_DESTROY = ecore_event_type_new();
530 ECORE_X_EVENT_WINDOW_HIDE = ecore_event_type_new();
531 ECORE_X_EVENT_WINDOW_SHOW = ecore_event_type_new();
532 ECORE_X_EVENT_WINDOW_SHOW_REQUEST = ecore_event_type_new();
533 ECORE_X_EVENT_WINDOW_REPARENT = ecore_event_type_new();
534 ECORE_X_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
535 ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST = ecore_event_type_new();
536 ECORE_X_EVENT_WINDOW_GRAVITY = ecore_event_type_new();
537 ECORE_X_EVENT_WINDOW_RESIZE_REQUEST = ecore_event_type_new();
538 ECORE_X_EVENT_WINDOW_STACK = ecore_event_type_new();
539 ECORE_X_EVENT_WINDOW_STACK_REQUEST = ecore_event_type_new();
540 ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new();
541 ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new();
542 ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new();
543 ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new();
544 ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new();
545 ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new();
546 ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new();
547 ECORE_X_EVENT_CLIENT_MESSAGE = ecore_event_type_new();
548 ECORE_X_EVENT_WINDOW_SHAPE = ecore_event_type_new();
549 ECORE_X_EVENT_SCREENSAVER_NOTIFY = ecore_event_type_new();
550 ECORE_X_EVENT_GESTURE_NOTIFY_FLICK = ecore_event_type_new();
551 ECORE_X_EVENT_GESTURE_NOTIFY_PAN = ecore_event_type_new();
552 ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION = ecore_event_type_new();
553 ECORE_X_EVENT_GESTURE_NOTIFY_TAP = ecore_event_type_new();
554 ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD = ecore_event_type_new();
555 ECORE_X_EVENT_GESTURE_NOTIFY_HOLD = ecore_event_type_new();
556 ECORE_X_EVENT_GESTURE_NOTIFY_GROUP = ecore_event_type_new();
557 ECORE_X_EVENT_SYNC_COUNTER = ecore_event_type_new();
558 ECORE_X_EVENT_SYNC_ALARM = ecore_event_type_new();
559 ECORE_X_EVENT_SCREEN_CHANGE = ecore_event_type_new();
560 ECORE_X_EVENT_RANDR_CRTC_CHANGE = ecore_event_type_new();
561 ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = ecore_event_type_new();
562 ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = ecore_event_type_new();
563 ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new();
564
565 ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new();
566
567 ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new();
568 ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new();
569 ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new();
570 ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = ecore_event_type_new();
571 ECORE_X_EVENT_PING = ecore_event_type_new();
572
573 ECORE_X_EVENT_STARTUP_SEQUENCE_NEW = ecore_event_type_new();
574 ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE = ecore_event_type_new();
575 ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE = ecore_event_type_new();
576
577 ECORE_X_EVENT_GENERIC = ecore_event_type_new();
578 }
579
580 _ecore_x_modifiers_get();
581
582 _ecore_x_fd_handler_handle =
583 ecore_main_fd_handler_add(ConnectionNumber(_ecore_x_disp),
584 ECORE_FD_READ,
585 _ecore_x_fd_handler, _ecore_x_disp,
586 _ecore_x_fd_handler_buf, _ecore_x_disp);
587 if (!_ecore_x_fd_handler_handle)
588 goto free_event_handlers;
589
590 _ecore_x_atoms_init();
591
592 /* Set up the ICCCM hints */
593 ecore_x_icccm_init();
594
595 /* Set up the _NET_... hints */
596 ecore_x_netwm_init();
597
598 /* old e hints init */
599 ecore_x_e_init();
600
601 /* This is just to be anal about naming conventions */
602
603 _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_DELETE_REQUEST] =
604 ECORE_X_ATOM_WM_DELETE_WINDOW;
605 _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_TAKE_FOCUS] =
606 ECORE_X_ATOM_WM_TAKE_FOCUS;
607 _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_PING] =
608 ECORE_X_ATOM_NET_WM_PING;
609 _ecore_x_atoms_wm_protocols[ECORE_X_NET_WM_PROTOCOL_SYNC_REQUEST] =
610 ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
611
612 _ecore_x_selection_data_init();
613 _ecore_x_dnd_init();
614 _ecore_x_fixes_init();
615 _ecore_x_damage_init();
616 _ecore_x_composite_init();
617 _ecore_x_dpms_init();
618 _ecore_x_randr_init();
619 _ecore_x_gesture_init();
620 _ecore_x_input_init();
621 _ecore_x_events_init();
622
623 _ecore_x_private_win = ecore_x_window_override_new(0, -77, -777, 123, 456);
624
625 return _ecore_x_init_count;
626
627free_event_handlers:
628 free(_ecore_x_event_handlers);
629 _ecore_x_event_handlers = NULL;
630close_display:
631 XCloseDisplay(_ecore_x_disp);
632 _ecore_x_fd_handler_handle = NULL;
633 _ecore_x_disp = NULL;
634shutdown_ecore_event:
635 ecore_event_shutdown();
636shutdown_ecore:
637 ecore_shutdown();
638shutdown_eina:
639 eina_log_domain_unregister(_ecore_xlib_log_dom);
640 _ecore_xlib_log_dom = -1;
641 eina_shutdown();
642
643 return --_ecore_x_init_count;
644} /* ecore_x_init */
645
646static int
647_ecore_x_shutdown(int close_display)
648{
649 if (--_ecore_x_init_count != 0)
650 return _ecore_x_init_count;
651
652 if (!_ecore_x_disp)
653 return _ecore_x_init_count;
654
655 LOGFN(__FILE__, __LINE__, __FUNCTION__);
656
657 ecore_main_fd_handler_del(_ecore_x_fd_handler_handle);
658 if (close_display)
659 XCloseDisplay(_ecore_x_disp);
660 else
661 {
662 close(ConnectionNumber(_ecore_x_disp));
663 // FIXME: may have to clean up x display internal here
664// getting segv here? hmmm. odd. disable
665// XFree(_ecore_x_disp);
666 }
667
668 free(_ecore_x_event_handlers);
669 _ecore_x_fd_handler_handle = NULL;
670 _ecore_x_disp = NULL;
671 _ecore_x_event_handlers = NULL;
672 _ecore_x_events_shutdown();
673 _ecore_x_input_shutdown();
674 _ecore_x_selection_shutdown();
675 _ecore_x_dnd_shutdown();
676 ecore_x_netwm_shutdown();
677
678 ecore_event_shutdown();
679 ecore_shutdown();
680
681 eina_log_domain_unregister(_ecore_xlib_log_dom);
682 _ecore_xlib_log_dom = -1;
683 eina_shutdown();
684
685 return _ecore_x_init_count;
686} /* _ecore_x_shutdown */
687
688/**
689 * Shuts down the Ecore X library.
690 *
691 * In shutting down the library, the X display connection is terminated
692 * and any event handlers for it are removed.
693 *
694 * @return The number of times the library has been initialized without
695 * being shut down.
696 * @ingroup Ecore_X_Init_Group
697 */
698EAPI int
699ecore_x_shutdown(void)
700{
701 return _ecore_x_shutdown(1);
702} /* ecore_x_shutdown */
703
704/**
705 * Shuts down the Ecore X library.
706 *
707 * As ecore_x_shutdown, except do not close Display, only connection.
708 *
709 * @ingroup Ecore_X_Init_Group
710 */
711EAPI int
712ecore_x_disconnect(void)
713{
714 return _ecore_x_shutdown(0);
715} /* ecore_x_disconnect */
716
717/**
718 * @defgroup Ecore_X_Display_Attr_Group X Display Attributes
719 *
720 * Functions that set and retrieve X display attributes.
721 */
722
723/**
724 * Retrieves the Ecore_X_Display handle used for the current X connection.
725 * @return The current X display.
726 * @ingroup Ecore_X_Display_Attr_Group
727 */
728EAPI Ecore_X_Display *
729ecore_x_display_get(void)
730{
731 return (Ecore_X_Display *)_ecore_x_disp;
732} /* ecore_x_display_get */
733
734/**
735 * Retrieves the X display file descriptor.
736 * @return The current X display file descriptor.
737 * @ingroup Ecore_X_Display_Attr_Group
738 */
739EAPI int
740ecore_x_fd_get(void)
741{
742 LOGFN(__FILE__, __LINE__, __FUNCTION__);
743 return ConnectionNumber(_ecore_x_disp);
744} /* ecore_x_fd_get */
745
746/**
747 * Retrieves the Ecore_X_Screen handle used for the current X connection.
748 * @return The current default screen.
749 * @ingroup Ecore_X_Display_Attr_Group
750 */
751EAPI Ecore_X_Screen *
752ecore_x_default_screen_get(void)
753{
754 LOGFN(__FILE__, __LINE__, __FUNCTION__);
755 return (Ecore_X_Screen *)DefaultScreenOfDisplay(_ecore_x_disp);
756} /* ecore_x_default_screen_get */
757
758/**
759 * Retrieves the size of an Ecore_X_Screen.
760 * @param screen the handle to the screen to query.
761 * @param w where to return the width. May be NULL. Returns 0 on errors.
762 * @param h where to return the height. May be NULL. Returns 0 on errors.
763 * @ingroup Ecore_X_Display_Attr_Group
764 * @see ecore_x_default_screen_get()
765 *
766 * @since 1.1
767 */
768EAPI void
769ecore_x_screen_size_get(const Ecore_X_Screen *screen,
770 int *w,
771 int *h)
772{
773 Screen *s = (Screen *)screen;
774 LOGFN(__FILE__, __LINE__, __FUNCTION__);
775 if (w) *w = 0;
776 if (h) *h = 0;
777 if (!s) return;
778 if (w) *w = s->width;
779 if (h) *h = s->height;
780}
781
782/**
783 * Retrieves the number of screens.
784 *
785 * @return The count of the number of screens.
786 * @ingroup Ecore_X_Display_Attr_Group
787 *
788 * @since 1.1
789 */
790EAPI int
791ecore_x_screen_count_get(void)
792{
793 LOGFN(__FILE__, __LINE__, __FUNCTION__);
794
795 return ScreenCount(_ecore_x_disp);
796}
797
798/**
799 * Retrieves the index number of the given screen.
800 *
801 * @return The index number of the screen.
802 * @ingroup Ecore_X_Display_Attr_Group
803 *
804 * @since 1.1
805 */
806EAPI int
807ecore_x_screen_index_get(const Ecore_X_Screen *screen)
808{
809 return XScreenNumberOfScreen((Screen *)screen);
810}
811
812/**
813 * Retrieves the screen based on index number.
814 *
815 * @return The Ecore_X_Screen at this index.
816 * @ingroup Ecore_X_Display_Attr_Group
817 *
818 * @since 1.1
819 */
820EAPI Ecore_X_Screen *
821ecore_x_screen_get(int idx)
822{
823 return XScreenOfDisplay(_ecore_x_disp, idx);
824}
825
826/**
827 * Sets the timeout for a double and triple clicks to be flagged.
828 *
829 * This sets the time between clicks before the double_click flag is
830 * set in a button down event. If 3 clicks occur within double this
831 * time, the triple_click flag is also set.
832 *
833 * @param t The time in seconds
834 * @ingroup Ecore_X_Display_Attr_Group
835 */
836EAPI void
837ecore_x_double_click_time_set(double t)
838{
839 if (t < 0.0)
840 t = 0.0;
841
842 _ecore_x_double_click_time = t;
843} /* ecore_x_double_click_time_set */
844
845/**
846 * Retrieves the double and triple click flag timeout.
847 *
848 * See @ref ecore_x_double_click_time_set for more information.
849 *
850 * @return The timeout for double clicks in seconds.
851 * @ingroup Ecore_X_Display_Attr_Group
852 */
853EAPI double
854ecore_x_double_click_time_get(void)
855{
856 return _ecore_x_double_click_time;
857} /* ecore_x_double_click_time_get */
858
859/**
860 * @defgroup Ecore_X_Flush_Group X Synchronization Functions
861 *
862 * Functions that ensure that all commands that have been issued by the
863 * Ecore X library have been sent to the server.
864 */
865
866/**
867 * Sends all X commands in the X Display buffer.
868 * @ingroup Ecore_X_Flush_Group
869 */
870EAPI void
871ecore_x_flush(void)
872{
873 LOGFN(__FILE__, __LINE__, __FUNCTION__);
874 XFlush(_ecore_x_disp);
875} /* ecore_x_flush */
876
877/**
878 * Flushes the command buffer and waits until all requests have been
879 * processed by the server.
880 * @ingroup Ecore_X_Flush_Group
881 */
882EAPI void
883ecore_x_sync(void)
884{
885 LOGFN(__FILE__, __LINE__, __FUNCTION__);
886 XSync(_ecore_x_disp, False);
887} /* ecore_x_sync */
888
889/**
890 * Kill all clients with subwindows under a given window.
891 *
892 * You can kill all clients connected to the X server by using
893 * @ref ecore_x_window_root_list to get a list of root windows, and
894 * then passing each root window to this function.
895 *
896 * @param root The window whose children will be killed.
897 */
898EAPI void
899ecore_x_killall(Ecore_X_Window root)
900{
901 unsigned int j;
902 Window root_r;
903 Window parent_r;
904 Window *children_r = NULL;
905 unsigned int num_children = 0;
906
907 LOGFN(__FILE__, __LINE__, __FUNCTION__);
908 XGrabServer(_ecore_x_disp);
909 /* Tranverse window tree starting from root, and drag each
910 * before the firing squad */
911 while (XQueryTree(_ecore_x_disp, root, &root_r, &parent_r,
912 &children_r, &num_children) && (num_children > 0))
913 {
914 for (j = 0; j < num_children; ++j)
915 {
916 XKillClient(_ecore_x_disp, children_r[j]);
917 }
918
919 XFree(children_r);
920 }
921 XUngrabServer(_ecore_x_disp);
922 XSync(_ecore_x_disp, False);
923} /* ecore_x_killall */
924
925/**
926 * Kill a specific client
927 *
928 * You can kill a specific client owning window @p win
929 *
930 * @param win Window of the client to be killed
931 */
932EAPI void
933ecore_x_kill(Ecore_X_Window win)
934{
935 LOGFN(__FILE__, __LINE__, __FUNCTION__);
936 XKillClient(_ecore_x_disp, win);
937} /* ecore_x_kill */
938
939/**
940 * Return the last event time
941 */
942EAPI Ecore_X_Time
943ecore_x_current_time_get(void)
944{
945 return _ecore_x_event_last_time;
946} /* ecore_x_current_time_get */
947
948/**
949 * Return the screen DPI
950 *
951 * This is a simplistic call to get DPI. It does not account for differing
952 * DPI in the x amd y axes nor does it accoutn for multihead or xinerama and
953 * xrander where different parts of the screen may have differen DPI etc.
954 *
955 * @return the general screen DPI (dots/pixels per inch).
956 */
957EAPI int
958ecore_x_dpi_get(void)
959{
960 Screen *s;
961
962 LOGFN(__FILE__, __LINE__, __FUNCTION__);
963 s = DefaultScreenOfDisplay(_ecore_x_disp);
964 if (s->mwidth <= 0)
965 return 75;
966
967 return (((s->width * 254) / s->mwidth) + 5) / 10;
968} /* ecore_x_dpi_get */
969
970/**
971 * Invoke the standard system beep to alert users
972 *
973 * @param percent The volume at which the bell rings. Must be in the range
974 * [-100,+100]. If percent >= 0, the final volume will be:
975 * base - [(base * percent) / 100] + percent
976 * Otherwise, it's calculated as:
977 * base + [(base * percent) / 100]
978 * where @c base is the bell's base volume as set by XChangeKeyboardControl(3).
979 *
980 * @returns EINA_TRUE on success, EINA_FALSE otherwise.
981 */
982EAPI Eina_Bool
983ecore_x_bell(int percent)
984{
985 int ret;
986
987 ret = XBell(_ecore_x_disp, percent);
988 if (ret == BadValue)
989 return EINA_FALSE;
990
991 return EINA_TRUE;
992} /* ecore_x_bell */
993
994static Eina_Bool
995_ecore_x_fd_handler(void *data,
996 Ecore_Fd_Handler *fd_handler __UNUSED__)
997{
998 Display *d;
999
1000 d = data;
1001 while (XPending(d))
1002 {
1003 XEvent ev;
1004
1005 XNextEvent(d, &ev);
1006
1007#ifdef ENABLE_XIM
1008 /* Filter event for XIM */
1009 if (XFilterEvent(&ev, ev.xkey.window))
1010 continue;
1011
1012#endif /* ifdef ENABLE_XIM */
1013
1014 if ((ev.type >= 0) && (ev.type < _ecore_x_event_handlers_num))
1015 {
1016 if (_ecore_x_event_handlers[AnyXEvent])
1017 _ecore_x_event_handlers[AnyXEvent] (&ev);
1018
1019 if (_ecore_x_event_handlers[ev.type])
1020 _ecore_x_event_handlers[ev.type] (&ev);
1021 }
1022 }
1023 return ECORE_CALLBACK_RENEW;
1024} /* _ecore_x_fd_handler */
1025
1026static Eina_Bool
1027_ecore_x_fd_handler_buf(void *data,
1028 Ecore_Fd_Handler *fd_handler __UNUSED__)
1029{
1030 Display *d;
1031
1032 d = data;
1033 if (XPending(d))
1034 return ECORE_CALLBACK_RENEW;
1035
1036 return ECORE_CALLBACK_CANCEL;
1037} /* _ecore_x_fd_handler_buf */
1038
1039static int
1040_ecore_x_key_mask_get(KeySym sym)
1041{
1042 XModifierKeymap *mod;
1043 KeySym sym2;
1044 int i, j;
1045 const int masks[8] =
1046 {
1047 ShiftMask, LockMask, ControlMask,
1048 Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask
1049 };
1050
1051 mod = XGetModifierMapping(_ecore_x_disp);
1052 if ((mod) && (mod->max_keypermod > 0))
1053 for (i = 0; i < (8 * mod->max_keypermod); i++)
1054 {
1055 for (j = 0; j < 8; j++)
1056 {
1057 sym2 = XKeycodeToKeysym(_ecore_x_disp, mod->modifiermap[i], j);
1058 if (sym2 != 0)
1059 break;
1060 }
1061 if (sym2 == sym)
1062 {
1063 int mask;
1064
1065 mask = masks[i / mod->max_keypermod];
1066 if (mod->modifiermap)
1067 XFree(mod->modifiermap);
1068
1069 XFree(mod);
1070 return mask;
1071 }
1072 }
1073
1074 if (mod)
1075 {
1076 if (mod->modifiermap)
1077 XFree(mod->modifiermap);
1078
1079 XFree(mod);
1080 }
1081
1082 return 0;
1083} /* _ecore_x_key_mask_get */
1084
1085/*****************************************************************************/
1086/*****************************************************************************/
1087/*****************************************************************************/
1088/* FIXME: these funcs need categorising */
1089/*****************************************************************************/
1090
1091/**
1092 * Get a list of all the root windows on the server.
1093 *
1094 * @note The returned array will need to be freed after use.
1095 * @param num_ret Pointer to integer to put number of windows returned in.
1096 * @return An array of all the root windows. @c NULL is returned if memory
1097 * could not be allocated for the list, or if @p num_ret is @c NULL.
1098 */
1099EAPI Ecore_X_Window *
1100ecore_x_window_root_list(int *num_ret)
1101{
1102 int num, i;
1103 Ecore_X_Window *roots;
1104#ifdef ECORE_XPRINT
1105 int xp_base, xp_err_base;
1106#endif /* ifdef ECORE_XPRINT */
1107
1108 if (!num_ret)
1109 return NULL;
1110
1111 *num_ret = 0;
1112
1113 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1114#ifdef ECORE_XPRINT
1115 num = ScreenCount(_ecore_x_disp);
1116 if (XpQueryExtension(_ecore_x_disp, &xp_base, &xp_err_base))
1117 {
1118 Screen **ps = NULL;
1119 int psnum = 0;
1120
1121 ps = XpQueryScreens(_ecore_x_disp, &psnum);
1122 if (ps)
1123 {
1124 int overlap, j;
1125
1126 overlap = 0;
1127 for (i = 0; i < num; i++)
1128 {
1129 for (j = 0; j < psnum; j++)
1130 {
1131 if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j])
1132 overlap++;
1133 }
1134 }
1135 roots = malloc((num - overlap) * sizeof(Window));
1136 if (roots)
1137 {
1138 int k;
1139
1140 k = 0;
1141 for (i = 0; i < num; i++)
1142 {
1143 int is_print;
1144
1145 is_print = 0;
1146 for (j = 0; j < psnum; j++)
1147 {
1148 if (ScreenOfDisplay(_ecore_x_disp, i) == ps[j])
1149 {
1150 is_print = 1;
1151 break;
1152 }
1153 }
1154 if (!is_print)
1155 {
1156 roots[k] = RootWindow(_ecore_x_disp, i);
1157 k++;
1158 }
1159 }
1160 *num_ret = k;
1161 }
1162
1163 XFree(ps);
1164 }
1165 else
1166 {
1167 roots = malloc(num * sizeof(Window));
1168 if (!roots)
1169 return NULL;
1170
1171 *num_ret = num;
1172 for (i = 0; i < num; i++)
1173 roots[i] = RootWindow(_ecore_x_disp, i);
1174 }
1175 }
1176 else
1177 {
1178 roots = malloc(num * sizeof(Window));
1179 if (!roots)
1180 return NULL;
1181
1182 *num_ret = num;
1183 for (i = 0; i < num; i++)
1184 roots[i] = RootWindow(_ecore_x_disp, i);
1185 }
1186
1187#else /* ifdef ECORE_XPRINT */
1188 num = ScreenCount(_ecore_x_disp);
1189 roots = malloc(num * sizeof(Window));
1190 if (!roots)
1191 return NULL;
1192
1193 *num_ret = num;
1194 for (i = 0; i < num; i++)
1195 roots[i] = RootWindow(_ecore_x_disp, i);
1196#endif /* ifdef ECORE_XPRINT */
1197 return roots;
1198} /* ecore_x_window_root_list */
1199
1200EAPI Ecore_X_Window
1201ecore_x_window_root_first_get(void)
1202{
1203 return RootWindow(_ecore_x_disp, 0);
1204/*
1205 int num;
1206 Ecore_X_Window root, *roots = NULL;
1207
1208 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1209 roots = ecore_x_window_root_list(&num);
1210 if (!(roots)) return 0;
1211
1212 if (num > 0)
1213 root = roots[0];
1214 else
1215 root = 0;
1216
1217 free(roots);
1218 return root;
1219 */
1220} /* ecore_x_window_root_first_get */
1221
1222static void _ecore_x_window_manage_error(void *data);
1223
1224static int _ecore_x_window_manage_failed = 0;
1225static void
1226_ecore_x_window_manage_error(void *data __UNUSED__)
1227{
1228 if ((ecore_x_error_request_get() == X_ChangeWindowAttributes) &&
1229 (ecore_x_error_code_get() == BadAccess))
1230 _ecore_x_window_manage_failed = 1;
1231} /* _ecore_x_window_manage_error */
1232
1233EAPI Eina_Bool
1234ecore_x_window_manage(Ecore_X_Window win)
1235{
1236 XWindowAttributes att;
1237
1238 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1239 if (XGetWindowAttributes(_ecore_x_disp, win, &att) != True)
1240 return EINA_FALSE;
1241
1242 ecore_x_sync();
1243 _ecore_x_window_manage_failed = 0;
1244 ecore_x_error_handler_set(_ecore_x_window_manage_error, NULL);
1245 XSelectInput(_ecore_x_disp, win,
1246 EnterWindowMask |
1247 LeaveWindowMask |
1248 PropertyChangeMask |
1249 ResizeRedirectMask |
1250 SubstructureRedirectMask |
1251 SubstructureNotifyMask |
1252 StructureNotifyMask |
1253 KeyPressMask |
1254 KeyReleaseMask |
1255 att.your_event_mask);
1256 ecore_x_sync();
1257 ecore_x_error_handler_set(NULL, NULL);
1258 if (_ecore_x_window_manage_failed)
1259 {
1260 _ecore_x_window_manage_failed = 0;
1261 return EINA_FALSE;
1262 }
1263
1264 return EINA_TRUE;
1265} /* ecore_x_window_manage */
1266
1267EAPI void
1268ecore_x_window_container_manage(Ecore_X_Window win)
1269{
1270 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1271 XSelectInput(_ecore_x_disp, win,
1272 SubstructureRedirectMask |
1273 SubstructureNotifyMask);
1274} /* ecore_x_window_container_manage */
1275
1276EAPI void
1277ecore_x_window_client_manage(Ecore_X_Window win)
1278{
1279 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1280 XSelectInput(_ecore_x_disp, win,
1281 PropertyChangeMask |
1282// ResizeRedirectMask |
1283 FocusChangeMask |
1284 ColormapChangeMask |
1285 VisibilityChangeMask |
1286 StructureNotifyMask |
1287 SubstructureNotifyMask
1288 );
1289 XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask);
1290} /* ecore_x_window_client_manage */
1291
1292EAPI void
1293ecore_x_window_sniff(Ecore_X_Window win)
1294{
1295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1296 XSelectInput(_ecore_x_disp, win,
1297 PropertyChangeMask |
1298 SubstructureNotifyMask);
1299} /* ecore_x_window_sniff */
1300
1301EAPI void
1302ecore_x_window_client_sniff(Ecore_X_Window win)
1303{
1304 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1305 XSelectInput(_ecore_x_disp, win,
1306 PropertyChangeMask |
1307 FocusChangeMask |
1308 ColormapChangeMask |
1309 VisibilityChangeMask |
1310 StructureNotifyMask |
1311 SubstructureNotifyMask);
1312 XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask);
1313} /* ecore_x_window_client_sniff */
1314
1315EAPI Eina_Bool
1316ecore_x_window_attributes_get(Ecore_X_Window win,
1317 Ecore_X_Window_Attributes *att_ret)
1318{
1319 XWindowAttributes att;
1320
1321 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1322 if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
1323 return EINA_FALSE;
1324
1325 memset(att_ret, 0, sizeof(Ecore_X_Window_Attributes));
1326 att_ret->root = att.root;
1327 att_ret->x = att.x;
1328 att_ret->y = att.y;
1329 att_ret->w = att.width;
1330 att_ret->h = att.height;
1331 att_ret->border = att.border_width;
1332 att_ret->depth = att.depth;
1333 if (att.map_state != IsUnmapped)
1334 att_ret->visible = 1;
1335
1336 if (att.map_state == IsViewable)
1337 att_ret->viewable = 1;
1338
1339 if (att.override_redirect)
1340 att_ret->override = 1;
1341
1342 if (att.class == InputOnly)
1343 att_ret->input_only = 1;
1344
1345 if (att.save_under)
1346 att_ret->save_under = 1;
1347
1348 att_ret->event_mask.mine = att.your_event_mask;
1349 att_ret->event_mask.all = att.all_event_masks;
1350 att_ret->event_mask.no_propagate = att.do_not_propagate_mask;
1351 att_ret->window_gravity = att.win_gravity;
1352 att_ret->pixel_gravity = att.bit_gravity;
1353 att_ret->colormap = att.colormap;
1354 att_ret->visual = att.visual;
1355 return EINA_TRUE;
1356} /* ecore_x_window_attributes_get */
1357
1358EAPI void
1359ecore_x_window_save_set_add(Ecore_X_Window win)
1360{
1361 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1362 XAddToSaveSet(_ecore_x_disp, win);
1363} /* ecore_x_window_save_set_add */
1364
1365EAPI void
1366ecore_x_window_save_set_del(Ecore_X_Window win)
1367{
1368 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1369 XRemoveFromSaveSet(_ecore_x_disp, win);
1370} /* ecore_x_window_save_set_del */
1371
1372EAPI Ecore_X_Window *
1373ecore_x_window_children_get(Ecore_X_Window win,
1374 int *num)
1375{
1376 Ecore_X_Window *windows = NULL;
1377 Window root_ret = 0, parent_ret = 0, *children_ret = NULL;
1378 unsigned int children_ret_num = 0;
1379
1380 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1381 if (!XQueryTree(_ecore_x_disp, win, &root_ret, &parent_ret, &children_ret,
1382 &children_ret_num))
1383 return NULL;
1384
1385 if (children_ret)
1386 {
1387 windows = malloc(children_ret_num * sizeof(Ecore_X_Window));
1388 if (windows)
1389 {
1390 unsigned int i;
1391
1392 for (i = 0; i < children_ret_num; i++)
1393 windows[i] = children_ret[i];
1394 *num = children_ret_num;
1395 }
1396
1397 XFree(children_ret);
1398 }
1399
1400 return windows;
1401} /* ecore_x_window_children_get */
1402
1403EAPI Eina_Bool
1404ecore_x_pointer_control_set(int accel_num,
1405 int accel_denom,
1406 int threshold)
1407{
1408 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1409 return XChangePointerControl(_ecore_x_disp, 1, 1,
1410 accel_num, accel_denom, threshold) ? EINA_TRUE : EINA_FALSE;
1411} /* ecore_x_pointer_control_set */
1412
1413EAPI Eina_Bool
1414ecore_x_pointer_control_get(int *accel_num,
1415 int *accel_denom,
1416 int *threshold)
1417{
1418 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1419 return XGetPointerControl(_ecore_x_disp,
1420 accel_num, accel_denom, threshold) ? EINA_TRUE : EINA_FALSE;
1421} /* ecore_x_pointer_control_get */
1422
1423EAPI Eina_Bool
1424ecore_x_pointer_mapping_set(unsigned char *map,
1425 int nmap)
1426{
1427 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1428 return XSetPointerMapping(_ecore_x_disp, map, nmap) ? EINA_TRUE : EINA_FALSE;
1429} /* ecore_x_pointer_mapping_set */
1430
1431EAPI Eina_Bool
1432ecore_x_pointer_mapping_get(unsigned char *map,
1433 int nmap)
1434{
1435 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1436 return XGetPointerMapping(_ecore_x_disp, map, nmap) ? EINA_TRUE : EINA_FALSE;
1437} /* ecore_x_pointer_mapping_get */
1438
1439EAPI Eina_Bool
1440ecore_x_pointer_grab(Ecore_X_Window win)
1441{
1442 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1443 if (XGrabPointer(_ecore_x_disp, win, False,
1444 ButtonPressMask | ButtonReleaseMask |
1445 EnterWindowMask | LeaveWindowMask | PointerMotionMask,
1446 GrabModeAsync, GrabModeAsync,
1447 None, None, CurrentTime) == GrabSuccess)
1448 return EINA_TRUE;
1449
1450 return EINA_FALSE;
1451} /* ecore_x_pointer_grab */
1452
1453EAPI Eina_Bool
1454ecore_x_pointer_confine_grab(Ecore_X_Window win)
1455{
1456 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1457 if (XGrabPointer(_ecore_x_disp, win, False,
1458 ButtonPressMask | ButtonReleaseMask |
1459 EnterWindowMask | LeaveWindowMask | PointerMotionMask,
1460 GrabModeAsync, GrabModeAsync,
1461 win, None, CurrentTime) == GrabSuccess)
1462 return EINA_TRUE;
1463
1464 return EINA_FALSE;
1465} /* ecore_x_pointer_confine_grab */
1466
1467EAPI void
1468ecore_x_pointer_ungrab(void)
1469{
1470 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1471 XUngrabPointer(_ecore_x_disp, CurrentTime);
1472} /* ecore_x_pointer_ungrab */
1473
1474EAPI Eina_Bool
1475ecore_x_pointer_warp(Ecore_X_Window win,
1476 int x,
1477 int y)
1478{
1479 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1480 return XWarpPointer(_ecore_x_disp, None, win, 0, 0, 0, 0, x, y) ? EINA_TRUE : EINA_FALSE;
1481} /* ecore_x_pointer_warp */
1482
1483EAPI Eina_Bool
1484ecore_x_keyboard_grab(Ecore_X_Window win)
1485{
1486 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1487 if (XGrabKeyboard(_ecore_x_disp, win, False,
1488 GrabModeAsync, GrabModeAsync,
1489 CurrentTime) == GrabSuccess)
1490 return EINA_TRUE;
1491
1492 return EINA_FALSE;
1493} /* ecore_x_keyboard_grab */
1494
1495EAPI void
1496ecore_x_keyboard_ungrab(void)
1497{
1498 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1499 XUngrabKeyboard(_ecore_x_disp, CurrentTime);
1500} /* ecore_x_keyboard_ungrab */
1501
1502EAPI void
1503ecore_x_grab(void)
1504{
1505 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1506 _ecore_x_grab_count++;
1507 if (_ecore_x_grab_count == 1)
1508 XGrabServer(_ecore_x_disp);
1509} /* ecore_x_grab */
1510
1511EAPI void
1512ecore_x_ungrab(void)
1513{
1514 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1515 _ecore_x_grab_count--;
1516 if (_ecore_x_grab_count < 0)
1517 _ecore_x_grab_count = 0;
1518
1519 if (_ecore_x_grab_count == 0)
1520 XUngrabServer(_ecore_x_disp);
1521} /* ecore_x_ungrab */
1522
1523int _ecore_window_grabs_num = 0;
1524Window *_ecore_window_grabs = NULL;
1525Eina_Bool (*_ecore_window_grab_replay_func)(void *data,
1526 int event_type,
1527 void *event);
1528void *_ecore_window_grab_replay_data;
1529
1530EAPI void
1531ecore_x_passive_grab_replay_func_set(Eina_Bool (*func)(void *data,
1532 int event_type,
1533 void *event),
1534 void *data)
1535{
1536 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1537 _ecore_window_grab_replay_func = func;
1538 _ecore_window_grab_replay_data = data;
1539} /* ecore_x_passive_grab_replay_func_set */
1540
1541EAPI void
1542ecore_x_window_button_grab(Ecore_X_Window win,
1543 int button,
1544 Ecore_X_Event_Mask event_mask,
1545 int mod,
1546 int any_mod)
1547{
1548 unsigned int b;
1549 unsigned int m;
1550 unsigned int locks[8];
1551 int i, ev;
1552 Window *t;
1553
1554 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1555 b = button;
1556 if (b == 0)
1557 b = AnyButton;
1558
1559 m = _ecore_x_event_modifier(mod);
1560 if (any_mod)
1561 m = AnyModifier;
1562
1563 locks[0] = 0;
1564 locks[1] = ECORE_X_LOCK_CAPS;
1565 locks[2] = ECORE_X_LOCK_NUM;
1566 locks[3] = ECORE_X_LOCK_SCROLL;
1567 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1568 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1569 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1570 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1571 ev = event_mask;
1572 for (i = 0; i < 8; i++)
1573 XGrabButton(_ecore_x_disp, b, m | locks[i],
1574 win, False, ev, GrabModeSync, GrabModeAsync, None, None);
1575 _ecore_window_grabs_num++;
1576 t = realloc(_ecore_window_grabs,
1577 _ecore_window_grabs_num * sizeof(Window));
1578 if (!t) return;
1579 _ecore_window_grabs = t;
1580 _ecore_window_grabs[_ecore_window_grabs_num - 1] = win;
1581} /* ecore_x_window_button_grab */
1582
1583void
1584_ecore_x_sync_magic_send(int val,
1585 Ecore_X_Window swin)
1586{
1587 XEvent xev;
1588
1589 xev.xclient.type = ClientMessage;
1590 xev.xclient.serial = 0;
1591 xev.xclient.send_event = True;
1592 xev.xclient.display = _ecore_x_disp;
1593 xev.xclient.window = _ecore_x_private_win;
1594 xev.xclient.format = 32;
1595 xev.xclient.message_type = 27777;
1596 xev.xclient.data.l[0] = 0x7162534;
1597 xev.xclient.data.l[1] = 0x10000000 + val;
1598 xev.xclient.data.l[2] = swin;
1599 XSendEvent(_ecore_x_disp, _ecore_x_private_win, False, NoEventMask, &xev);
1600} /* _ecore_x_sync_magic_send */
1601
1602void
1603_ecore_x_window_grab_remove(Ecore_X_Window win)
1604{
1605 int i, shuffle = 0;
1606 Window *t;
1607
1608 if (_ecore_window_grabs_num > 0)
1609 {
1610 for (i = 0; i < _ecore_window_grabs_num; i++)
1611 {
1612 if (shuffle)
1613 _ecore_window_grabs[i - 1] = _ecore_window_grabs[i];
1614
1615 if ((!shuffle) && (_ecore_window_grabs[i] == win))
1616 shuffle = 1;
1617 }
1618 if (shuffle)
1619 {
1620 _ecore_window_grabs_num--;
1621 if (_ecore_window_grabs_num <= 0)
1622 {
1623 free(_ecore_window_grabs);
1624 _ecore_window_grabs = NULL;
1625 return;
1626 }
1627 t = realloc(_ecore_window_grabs,
1628 _ecore_window_grabs_num *
1629 sizeof(Window));
1630 if (!t) return;
1631 _ecore_window_grabs = t;
1632 }
1633 }
1634} /* _ecore_x_window_grab_remove */
1635
1636EAPI void
1637ecore_x_window_button_ungrab(Ecore_X_Window win,
1638 int button,
1639 int mod,
1640 int any_mod)
1641{
1642 unsigned int b;
1643 unsigned int m;
1644 unsigned int locks[8];
1645 int i;
1646
1647 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1648 b = button;
1649 if (b == 0)
1650 b = AnyButton;
1651
1652 m = _ecore_x_event_modifier(mod);
1653 if (any_mod)
1654 m = AnyModifier;
1655
1656 locks[0] = 0;
1657 locks[1] = ECORE_X_LOCK_CAPS;
1658 locks[2] = ECORE_X_LOCK_NUM;
1659 locks[3] = ECORE_X_LOCK_SCROLL;
1660 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1661 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1662 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1663 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1664 for (i = 0; i < 8; i++)
1665 XUngrabButton(_ecore_x_disp, b, m | locks[i], win);
1666 _ecore_x_sync_magic_send(1, win);
1667} /* ecore_x_window_button_ungrab */
1668
1669int _ecore_key_grabs_num = 0;
1670Window *_ecore_key_grabs = NULL;
1671
1672EAPI void
1673ecore_x_window_key_grab(Ecore_X_Window win,
1674 const char *key,
1675 int mod,
1676 int any_mod)
1677{
1678 KeyCode keycode = 0;
1679 KeySym keysym;
1680 unsigned int m;
1681 unsigned int locks[8];
1682 int i;
1683 Window *t;
1684
1685 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1686 if (!strncmp(key, "Keycode-", 8))
1687 keycode = atoi(key + 8);
1688 else
1689 {
1690 keysym = XStringToKeysym(key);
1691 if (keysym == NoSymbol)
1692 return;
1693
1694 keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key));
1695 }
1696
1697 if (keycode == 0)
1698 return;
1699
1700 m = _ecore_x_event_modifier(mod);
1701 if (any_mod)
1702 m = AnyModifier;
1703
1704 locks[0] = 0;
1705 locks[1] = ECORE_X_LOCK_CAPS;
1706 locks[2] = ECORE_X_LOCK_NUM;
1707 locks[3] = ECORE_X_LOCK_SCROLL;
1708 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1709 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1710 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1711 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1712 for (i = 0; i < 8; i++)
1713 XGrabKey(_ecore_x_disp, keycode, m | locks[i],
1714 win, False, GrabModeSync, GrabModeAsync);
1715 _ecore_key_grabs_num++;
1716 t = realloc(_ecore_key_grabs,
1717 _ecore_key_grabs_num * sizeof(Window));
1718 if (!t) return;
1719 _ecore_key_grabs = t;
1720 _ecore_key_grabs[_ecore_key_grabs_num - 1] = win;
1721} /* ecore_x_window_key_grab */
1722
1723void
1724_ecore_x_key_grab_remove(Ecore_X_Window win)
1725{
1726 int i, shuffle = 0;
1727 Window *t;
1728
1729 if (_ecore_key_grabs_num > 0)
1730 {
1731 for (i = 0; i < _ecore_key_grabs_num; i++)
1732 {
1733 if (shuffle)
1734 _ecore_key_grabs[i - 1] = _ecore_key_grabs[i];
1735
1736 if ((!shuffle) && (_ecore_key_grabs[i] == win))
1737 shuffle = 1;
1738 }
1739 if (shuffle)
1740 {
1741 _ecore_key_grabs_num--;
1742 if (_ecore_key_grabs_num <= 0)
1743 {
1744 free(_ecore_key_grabs);
1745 _ecore_key_grabs = NULL;
1746 return;
1747 }
1748 t = realloc(_ecore_key_grabs,
1749 _ecore_key_grabs_num * sizeof(Window));
1750 if (!t) return;
1751 _ecore_key_grabs = t;
1752 }
1753 }
1754} /* _ecore_x_key_grab_remove */
1755
1756EAPI void
1757ecore_x_window_key_ungrab(Ecore_X_Window win,
1758 const char *key,
1759 int mod,
1760 int any_mod)
1761{
1762 KeyCode keycode = 0;
1763 KeySym keysym;
1764 unsigned int m;
1765 unsigned int locks[8];
1766 int i;
1767
1768 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1769 if (!strncmp(key, "Keycode-", 8))
1770 keycode = atoi(key + 8);
1771 else
1772 {
1773 keysym = XStringToKeysym(key);
1774 if (keysym == NoSymbol)
1775 return;
1776
1777 keycode = XKeysymToKeycode(_ecore_x_disp, XStringToKeysym(key));
1778 }
1779
1780 if (keycode == 0)
1781 return;
1782
1783 m = _ecore_x_event_modifier(mod);
1784 if (any_mod)
1785 m = AnyModifier;
1786
1787 locks[0] = 0;
1788 locks[1] = ECORE_X_LOCK_CAPS;
1789 locks[2] = ECORE_X_LOCK_NUM;
1790 locks[3] = ECORE_X_LOCK_SCROLL;
1791 locks[4] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM;
1792 locks[5] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_SCROLL;
1793 locks[6] = ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1794 locks[7] = ECORE_X_LOCK_CAPS | ECORE_X_LOCK_NUM | ECORE_X_LOCK_SCROLL;
1795 for (i = 0; i < 8; i++)
1796 XUngrabKey(_ecore_x_disp, keycode, m | locks[i], win);
1797 _ecore_x_sync_magic_send(2, win);
1798} /* ecore_x_window_key_ungrab */
1799
1800/**
1801 * Send client message with given type and format 32.
1802 *
1803 * @param win The window the message is sent to.
1804 * @param type The client message type.
1805 * @param d0 The client message data item 1
1806 * @param d1 The client message data item 2
1807 * @param d2 The client message data item 3
1808 * @param d3 The client message data item 4
1809 * @param d4 The client message data item 5
1810 *
1811 * @return EINA_TRUE on success EINA_FALSE otherwise.
1812 */
1813EAPI Eina_Bool
1814ecore_x_client_message32_send(Ecore_X_Window win,
1815 Ecore_X_Atom type,
1816 Ecore_X_Event_Mask mask,
1817 long d0,
1818 long d1,
1819 long d2,
1820 long d3,
1821 long d4)
1822{
1823 XEvent xev;
1824
1825 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1826 xev.xclient.window = win;
1827 xev.xclient.type = ClientMessage;
1828 xev.xclient.message_type = type;
1829 xev.xclient.format = 32;
1830 xev.xclient.data.l[0] = d0;
1831 xev.xclient.data.l[1] = d1;
1832 xev.xclient.data.l[2] = d2;
1833 xev.xclient.data.l[3] = d3;
1834 xev.xclient.data.l[4] = d4;
1835
1836 return XSendEvent(_ecore_x_disp, win, False, mask, &xev) ? EINA_TRUE : EINA_FALSE;
1837} /* ecore_x_client_message32_send */
1838
1839/**
1840 * Send client message with given type and format 8.
1841 *
1842 * @param win The window the message is sent to.
1843 * @param type The client message type.
1844 * @param data Data to be sent.
1845 * @param len Number of data bytes, max 20.
1846 *
1847 * @return EINA_TRUE on success EINA_FALSE otherwise.
1848 */
1849EAPI Eina_Bool
1850ecore_x_client_message8_send(Ecore_X_Window win,
1851 Ecore_X_Atom type,
1852 const void *data,
1853 int len)
1854{
1855 XEvent xev;
1856
1857 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1858 xev.xclient.window = win;
1859 xev.xclient.type = ClientMessage;
1860 xev.xclient.message_type = type;
1861 xev.xclient.format = 8;
1862 if (len > 20)
1863 len = 20;
1864
1865 memcpy(xev.xclient.data.b, data, len);
1866 memset(xev.xclient.data.b + len, 0, 20 - len);
1867
1868 return XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev) ? EINA_TRUE : EINA_FALSE;
1869} /* ecore_x_client_message8_send */
1870
1871EAPI Eina_Bool
1872ecore_x_mouse_move_send(Ecore_X_Window win,
1873 int x,
1874 int y)
1875{
1876 XEvent xev;
1877 XWindowAttributes att;
1878 Window tw;
1879 int rx, ry;
1880
1881 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1882 XGetWindowAttributes(_ecore_x_disp, win, &att);
1883 XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
1884 xev.xmotion.type = MotionNotify;
1885 xev.xmotion.window = win;
1886 xev.xmotion.root = att.root;
1887 xev.xmotion.subwindow = win;
1888 xev.xmotion.time = _ecore_x_event_last_time;
1889 xev.xmotion.x = x;
1890 xev.xmotion.y = y;
1891 xev.xmotion.x_root = rx;
1892 xev.xmotion.y_root = ry;
1893 xev.xmotion.state = 0;
1894 xev.xmotion.is_hint = 0;
1895 xev.xmotion.same_screen = 1;
1896 return XSendEvent(_ecore_x_disp, win, True, PointerMotionMask, &xev) ? EINA_TRUE : EINA_FALSE;
1897} /* ecore_x_mouse_move_send */
1898
1899EAPI Eina_Bool
1900ecore_x_mouse_down_send(Ecore_X_Window win,
1901 int x,
1902 int y,
1903 int b)
1904{
1905 XEvent xev;
1906 XWindowAttributes att;
1907 Window tw;
1908 int rx, ry;
1909
1910 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1911 XGetWindowAttributes(_ecore_x_disp, win, &att);
1912 XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
1913 xev.xbutton.type = ButtonPress;
1914 xev.xbutton.window = win;
1915 xev.xbutton.root = att.root;
1916 xev.xbutton.subwindow = win;
1917 xev.xbutton.time = _ecore_x_event_last_time;
1918 xev.xbutton.x = x;
1919 xev.xbutton.y = y;
1920 xev.xbutton.x_root = rx;
1921 xev.xbutton.y_root = ry;
1922 xev.xbutton.state = 1 << b;
1923 xev.xbutton.button = b;
1924 xev.xbutton.same_screen = 1;
1925 return XSendEvent(_ecore_x_disp, win, True, ButtonPressMask, &xev) ? EINA_TRUE : EINA_FALSE;
1926} /* ecore_x_mouse_down_send */
1927
1928EAPI Eina_Bool
1929ecore_x_mouse_up_send(Ecore_X_Window win,
1930 int x,
1931 int y,
1932 int b)
1933{
1934 XEvent xev;
1935 XWindowAttributes att;
1936 Window tw;
1937 int rx, ry;
1938
1939 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1940 XGetWindowAttributes(_ecore_x_disp, win, &att);
1941 XTranslateCoordinates(_ecore_x_disp, win, att.root, x, y, &rx, &ry, &tw);
1942 xev.xbutton.type = ButtonRelease;
1943 xev.xbutton.window = win;
1944 xev.xbutton.root = att.root;
1945 xev.xbutton.subwindow = win;
1946 xev.xbutton.time = _ecore_x_event_last_time;
1947 xev.xbutton.x = x;
1948 xev.xbutton.y = y;
1949 xev.xbutton.x_root = rx;
1950 xev.xbutton.y_root = ry;
1951 xev.xbutton.state = 0;
1952 xev.xbutton.button = b;
1953 xev.xbutton.same_screen = 1;
1954 return XSendEvent(_ecore_x_disp, win, True, ButtonReleaseMask, &xev) ? EINA_TRUE : EINA_FALSE;
1955} /* ecore_x_mouse_up_send */
1956
1957EAPI void
1958ecore_x_focus_reset(void)
1959{
1960 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1961 XSetInputFocus(_ecore_x_disp, PointerRoot, RevertToPointerRoot, CurrentTime);
1962} /* ecore_x_focus_reset */
1963
1964EAPI void
1965ecore_x_events_allow_all(void)
1966{
1967 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1968 XAllowEvents(_ecore_x_disp, AsyncBoth, CurrentTime);
1969} /* ecore_x_events_allow_all */
1970
1971EAPI void
1972ecore_x_pointer_last_xy_get(int *x,
1973 int *y)
1974{
1975 if (x)
1976 *x = _ecore_x_event_last_root_x;
1977
1978 if (y)
1979 *y = _ecore_x_event_last_root_y;
1980} /* ecore_x_pointer_last_xy_get */
1981
1982EAPI void
1983ecore_x_pointer_xy_get(Ecore_X_Window win,
1984 int *x,
1985 int *y)
1986{
1987 Window rwin, cwin;
1988 int rx, ry, wx, wy, ret;
1989 unsigned int mask;
1990
1991 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1992 ret = XQueryPointer(_ecore_x_disp, win, &rwin, &cwin,
1993 &rx, &ry, &wx, &wy, &mask);
1994 if (!ret)
1995 wx = wy = -1;
1996
1997 if (x) *x = wx;
1998 if (y) *y = wy;
1999} /* ecore_x_pointer_xy_get */
2000
2001/**
2002 * Retrieve the Visual ID from a given Visual.
2003 *
2004 * @param visual The Visual to get the ID for.
2005 *
2006 * @return The visual id.
2007 * @since 1.1.0
2008 */
2009EAPI unsigned int
2010ecore_x_visual_id_get(Ecore_X_Visual visual)
2011{
2012 return XVisualIDFromVisual(visual);
2013}
2014
2015/**
2016 * Retrieve the default Visual.
2017 *
2018 * @param disp The Display to get the Default Visual from
2019 * @param screen The Screen.
2020 *
2021 * @return The default visual.
2022 * @since 1.1.0
2023 */
2024EAPI Ecore_X_Visual
2025ecore_x_default_visual_get(Ecore_X_Display *disp,
2026 Ecore_X_Screen *screen)
2027{
2028 return DefaultVisual(disp, ecore_x_screen_index_get(screen));
2029}
2030
2031/**
2032 * Retrieve the default Colormap.
2033 *
2034 * @param disp The Display to get the Default Colormap from
2035 * @param screen The Screen.
2036 *
2037 * @return The default colormap.
2038 * @since 1.1.0
2039 */
2040EAPI Ecore_X_Colormap
2041ecore_x_default_colormap_get(Ecore_X_Display *disp,
2042 Ecore_X_Screen *screen)
2043{
2044 return DefaultColormap(disp, ecore_x_screen_index_get(screen));
2045}
2046
2047/**
2048 * Retrieve the default depth.
2049 *
2050 * @param disp The Display to get the Default Depth from
2051 * @param screen The Screen.
2052 *
2053 * @return The default depth.
2054 * @since 1.1.0
2055 */
2056EAPI int
2057ecore_x_default_depth_get(Ecore_X_Display *disp,
2058 Ecore_X_Screen *screen)
2059{
2060 return DefaultDepth(disp, ecore_x_screen_index_get(screen));
2061}
2062
2063/*****************************************************************************/
2064/*****************************************************************************/
2065/*****************************************************************************/
2066
2067static int
2068_ecore_x_event_modifier(unsigned int state)
2069{
2070 int xmodifiers = 0;
2071
2072 if (state & ECORE_EVENT_MODIFIER_SHIFT)
2073 xmodifiers |= ECORE_X_MODIFIER_SHIFT;
2074
2075 if (state & ECORE_EVENT_MODIFIER_CTRL)
2076 xmodifiers |= ECORE_X_MODIFIER_CTRL;
2077
2078 if (state & ECORE_EVENT_MODIFIER_ALT)
2079 xmodifiers |= ECORE_X_MODIFIER_ALT;
2080
2081 if (state & ECORE_EVENT_MODIFIER_WIN)
2082 xmodifiers |= ECORE_X_MODIFIER_WIN;
2083
2084 if (state & ECORE_EVENT_LOCK_SCROLL)
2085 xmodifiers |= ECORE_X_LOCK_SCROLL;
2086
2087 if (state & ECORE_EVENT_LOCK_NUM)
2088 xmodifiers |= ECORE_X_LOCK_NUM;
2089
2090 if (state & ECORE_EVENT_LOCK_CAPS)
2091 xmodifiers |= ECORE_X_LOCK_CAPS;
2092
2093 if (state & ECORE_EVENT_LOCK_SHIFT)
2094 xmodifiers |= ECORE_X_LOCK_SHIFT;
2095
2096 return xmodifiers;
2097} /* _ecore_x_event_modifier */
2098
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_atoms.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_atoms.c
new file mode 100644
index 0000000..fd96d5c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_atoms.c
@@ -0,0 +1,352 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#ifdef HAVE_ALLOCA_H
6# include <alloca.h>
7#elif defined __GNUC__
8# define alloca __builtin_alloca
9#elif defined _AIX
10# define alloca __alloca
11#elif defined _MSC_VER
12# include <malloc.h>
13# define alloca _alloca
14#else /* ifdef HAVE_ALLOCA_H */
15# include <stddef.h>
16# ifdef __cplusplus
17extern "C"
18# endif /* ifdef __cplusplus */
19void *alloca(size_t);
20#endif /* ifdef HAVE_ALLOCA_H */
21
22#include <string.h>
23
24#include "Ecore.h"
25#include "ecore_x_private.h"
26#include "Ecore_X.h"
27#include "Ecore_X_Atoms.h"
28
29#include "ecore_x_atoms_decl.h"
30
31typedef struct
32{
33 const char *name;
34 Ecore_X_Atom *atom;
35} Atom_Item;
36
37void
38_ecore_x_atoms_init(void)
39{
40 const Atom_Item items[] =
41 {
42 { "ATOM", &ECORE_X_ATOM_ATOM },
43 { "CARDINAL", &ECORE_X_ATOM_CARDINAL },
44 { "COMPOUND_TEXT", &ECORE_X_ATOM_COMPOUND_TEXT },
45 { "FILE_NAME", &ECORE_X_ATOM_FILE_NAME },
46 { "STRING", &ECORE_X_ATOM_STRING },
47 { "TEXT", &ECORE_X_ATOM_TEXT },
48 { "UTF8_STRING", &ECORE_X_ATOM_UTF8_STRING },
49 { "WINDOW", &ECORE_X_ATOM_WINDOW },
50 { "PIXMAP", &ECORE_X_ATOM_PIXMAP },
51
52 { "JXSelectionWindowProperty", &ECORE_X_ATOM_SELECTION_PROP_XDND },
53 { "XdndSelection", &ECORE_X_ATOM_SELECTION_XDND },
54 { "XdndAware", &ECORE_X_ATOM_XDND_AWARE },
55 { "XdndEnter", &ECORE_X_ATOM_XDND_ENTER },
56 { "XdndTypeList", &ECORE_X_ATOM_XDND_TYPE_LIST },
57 { "XdndPosition", &ECORE_X_ATOM_XDND_POSITION },
58 { "XdndActionCopy", &ECORE_X_ATOM_XDND_ACTION_COPY },
59 { "XdndActionMove", &ECORE_X_ATOM_XDND_ACTION_MOVE },
60 { "XdndActionPrivate", &ECORE_X_ATOM_XDND_ACTION_PRIVATE },
61 { "XdndActionAsk", &ECORE_X_ATOM_XDND_ACTION_ASK },
62 { "XdndActionList", &ECORE_X_ATOM_XDND_ACTION_LIST },
63 { "XdndActionLink", &ECORE_X_ATOM_XDND_ACTION_LINK },
64 { "XdndActionDescription", &ECORE_X_ATOM_XDND_ACTION_DESCRIPTION },
65 { "XdndProxy", &ECORE_X_ATOM_XDND_PROXY },
66 { "XdndStatus", &ECORE_X_ATOM_XDND_STATUS },
67 { "XdndLeave", &ECORE_X_ATOM_XDND_LEAVE },
68 { "XdndDrop", &ECORE_X_ATOM_XDND_DROP },
69 { "XdndFinished", &ECORE_X_ATOM_XDND_FINISHED },
70
71 { "XdndActionCopy", &ECORE_X_DND_ACTION_COPY },
72 { "XdndActionMove", &ECORE_X_DND_ACTION_MOVE },
73 { "XdndActionLink", &ECORE_X_DND_ACTION_LINK },
74 { "XdndActionAsk", &ECORE_X_DND_ACTION_ASK },
75 { "XdndActionPrivate", &ECORE_X_DND_ACTION_PRIVATE },
76
77 { "_E_FRAME_SIZE", &ECORE_X_ATOM_E_FRAME_SIZE },
78
79 { "_WIN_LAYER", &ECORE_X_ATOM_WIN_LAYER },
80
81 { "WM_NAME", &ECORE_X_ATOM_WM_NAME },
82 { "WM_ICON_NAME", &ECORE_X_ATOM_WM_ICON_NAME },
83 { "WM_NORMAL_HINTS", &ECORE_X_ATOM_WM_NORMAL_HINTS },
84 { "WM_SIZE_HINTS", &ECORE_X_ATOM_WM_SIZE_HINTS },
85 { "WM_HINTS", &ECORE_X_ATOM_WM_HINTS },
86 { "WM_CLASS", &ECORE_X_ATOM_WM_CLASS },
87 { "WM_TRANSIENT_FOR", &ECORE_X_ATOM_WM_TRANSIENT_FOR },
88 { "WM_PROTOCOLS", &ECORE_X_ATOM_WM_PROTOCOLS },
89 { "WM_COLORMAP_WINDOWS", &ECORE_X_ATOM_WM_COLORMAP_WINDOWS },
90 { "WM_COMMAND", &ECORE_X_ATOM_WM_COMMAND },
91 { "WM_CLIENT_MACHINE", &ECORE_X_ATOM_WM_CLIENT_MACHINE },
92
93 { "WM_STATE", &ECORE_X_ATOM_WM_STATE },
94 { "WM_ICON_SIZE", &ECORE_X_ATOM_WM_ICON_SIZE },
95
96 { "WM_CHANGE_STATE", &ECORE_X_ATOM_WM_CHANGE_STATE },
97
98 { "WM_TAKE_FOCUS", &ECORE_X_ATOM_WM_TAKE_FOCUS },
99 { "WM_SAVE_YOURSELF", &ECORE_X_ATOM_WM_SAVE_YOURSELF },
100 { "WM_DELETE_WINDOW", &ECORE_X_ATOM_WM_DELETE_WINDOW },
101
102 { "WM_COLORMAP_NOTIFY", &ECORE_X_ATOM_WM_COLORMAP_NOTIFY },
103
104 { "SM_CLIENT_ID", &ECORE_X_ATOM_SM_CLIENT_ID },
105 { "WM_CLIENT_LEADER", &ECORE_X_ATOM_WM_CLIENT_LEADER },
106 { "WM_WINDOW_ROLE", &ECORE_X_ATOM_WM_WINDOW_ROLE },
107
108 { "_MOTIF_WM_HINTS", &ECORE_X_ATOM_MOTIF_WM_HINTS },
109
110 { "_NET_SUPPORTED", &ECORE_X_ATOM_NET_SUPPORTED },
111 { "_NET_CLIENT_LIST", &ECORE_X_ATOM_NET_CLIENT_LIST },
112 { "_NET_CLIENT_LIST_STACKING", &ECORE_X_ATOM_NET_CLIENT_LIST_STACKING },
113 { "_NET_NUMBER_OF_DESKTOPS", &ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS },
114 { "_NET_DESKTOP_GEOMETRY", &ECORE_X_ATOM_NET_DESKTOP_GEOMETRY },
115 { "_NET_DESKTOP_VIEWPORT", &ECORE_X_ATOM_NET_DESKTOP_VIEWPORT },
116 { "_NET_CURRENT_DESKTOP", &ECORE_X_ATOM_NET_CURRENT_DESKTOP },
117 { "_NET_DESKTOP_NAMES", &ECORE_X_ATOM_NET_DESKTOP_NAMES },
118 { "_NET_ACTIVE_WINDOW", &ECORE_X_ATOM_NET_ACTIVE_WINDOW },
119 { "_NET_WORKAREA", &ECORE_X_ATOM_NET_WORKAREA },
120 { "_NET_SUPPORTING_WM_CHECK", &ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK },
121 { "_NET_VIRTUAL_ROOTS", &ECORE_X_ATOM_NET_VIRTUAL_ROOTS },
122 { "_NET_DESKTOP_LAYOUT", &ECORE_X_ATOM_NET_DESKTOP_LAYOUT },
123 { "_NET_SHOWING_DESKTOP", &ECORE_X_ATOM_NET_SHOWING_DESKTOP },
124
125 { "_NET_CLOSE_WINDOW", &ECORE_X_ATOM_NET_CLOSE_WINDOW },
126 { "_NET_MOVERESIZE_WINDOW", &ECORE_X_ATOM_NET_MOVERESIZE_WINDOW },
127 { "_NET_WM_MOVERESIZE", &ECORE_X_ATOM_NET_WM_MOVERESIZE },
128 { "_NET_RESTACK_WINDOW", &ECORE_X_ATOM_NET_RESTACK_WINDOW },
129
130 { "_NET_REQUEST_FRAME_EXTENTS", &ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS },
131
132 { "_NET_WM_NAME", &ECORE_X_ATOM_NET_WM_NAME },
133 { "_NET_WM_VISIBLE_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_NAME },
134 { "_NET_WM_ICON_NAME", &ECORE_X_ATOM_NET_WM_ICON_NAME },
135 { "_NET_WM_VISIBLE_ICON_NAME", &ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME },
136 { "_NET_WM_DESKTOP", &ECORE_X_ATOM_NET_WM_DESKTOP },
137
138 { "_NET_WM_WINDOW_TYPE", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE },
139 { "_NET_WM_WINDOW_TYPE_DESKTOP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP },
140 { "_NET_WM_WINDOW_TYPE_DOCK", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK },
141 { "_NET_WM_WINDOW_TYPE_TOOLBAR", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR },
142 { "_NET_WM_WINDOW_TYPE_MENU", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU },
143 { "_NET_WM_WINDOW_TYPE_UTILITY", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY },
144 { "_NET_WM_WINDOW_TYPE_SPLASH", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH },
145 { "_NET_WM_WINDOW_TYPE_DIALOG", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG },
146 { "_NET_WM_WINDOW_TYPE_NORMAL", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL },
147 { "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU",
148 &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU },
149 { "_NET_WM_WINDOW_TYPE_POPUP_MENU",
150 &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU },
151 { "_NET_WM_WINDOW_TYPE_TOOLTIP", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP },
152 { "_NET_WM_WINDOW_TYPE_NOTIFICATION",
153 &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION },
154 { "_NET_WM_WINDOW_TYPE_COMBO", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO },
155 { "_NET_WM_WINDOW_TYPE_DND", &ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND },
156
157 { "_NET_WM_STATE", &ECORE_X_ATOM_NET_WM_STATE },
158 { "_NET_WM_STATE_MODAL", &ECORE_X_ATOM_NET_WM_STATE_MODAL },
159 { "_NET_WM_STATE_STICKY", &ECORE_X_ATOM_NET_WM_STATE_STICKY },
160 { "_NET_WM_STATE_MAXIMIZED_VERT",
161 &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT },
162 { "_NET_WM_STATE_MAXIMIZED_HORZ",
163 &ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ },
164 { "_NET_WM_STATE_SHADED", &ECORE_X_ATOM_NET_WM_STATE_SHADED },
165 { "_NET_WM_STATE_SKIP_TASKBAR", &ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR },
166 { "_NET_WM_STATE_SKIP_PAGER", &ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER },
167 { "_NET_WM_STATE_HIDDEN", &ECORE_X_ATOM_NET_WM_STATE_HIDDEN },
168 { "_NET_WM_STATE_FULLSCREEN", &ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN },
169 { "_NET_WM_STATE_ABOVE", &ECORE_X_ATOM_NET_WM_STATE_ABOVE },
170 { "_NET_WM_STATE_BELOW", &ECORE_X_ATOM_NET_WM_STATE_BELOW },
171 { "_NET_WM_STATE_DEMANDS_ATTENTION",
172 &ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION },
173
174 { "_NET_WM_ALLOWED_ACTIONS", &ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS },
175 { "_NET_WM_ACTION_MOVE", &ECORE_X_ATOM_NET_WM_ACTION_MOVE },
176 { "_NET_WM_ACTION_RESIZE", &ECORE_X_ATOM_NET_WM_ACTION_RESIZE },
177 { "_NET_WM_ACTION_MINIMIZE", &ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE },
178 { "_NET_WM_ACTION_SHADE", &ECORE_X_ATOM_NET_WM_ACTION_SHADE },
179 { "_NET_WM_ACTION_STICK", &ECORE_X_ATOM_NET_WM_ACTION_STICK },
180 { "_NET_WM_ACTION_MAXIMIZE_HORZ",
181 &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ },
182 { "_NET_WM_ACTION_MAXIMIZE_VERT",
183 &ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT },
184 { "_NET_WM_ACTION_FULLSCREEN", &ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN },
185 { "_NET_WM_ACTION_CHANGE_DESKTOP",
186 &ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP },
187 { "_NET_WM_ACTION_CLOSE", &ECORE_X_ATOM_NET_WM_ACTION_CLOSE },
188 { "_NET_WM_ACTION_ABOVE", &ECORE_X_ATOM_NET_WM_ACTION_ABOVE },
189 { "_NET_WM_ACTION_BELOW", &ECORE_X_ATOM_NET_WM_ACTION_BELOW },
190
191 { "_NET_WM_STRUT", &ECORE_X_ATOM_NET_WM_STRUT },
192 { "_NET_WM_STRUT_PARTIAL", &ECORE_X_ATOM_NET_WM_STRUT_PARTIAL },
193 { "_NET_WM_ICON_GEOMETRY", &ECORE_X_ATOM_NET_WM_ICON_GEOMETRY },
194 { "_NET_WM_ICON", &ECORE_X_ATOM_NET_WM_ICON },
195 { "_NET_WM_PID", &ECORE_X_ATOM_NET_WM_PID },
196 { "_NET_WM_HANDLED_ICONS", &ECORE_X_ATOM_NET_WM_HANDLED_ICONS },
197 { "_NET_WM_USER_TIME", &ECORE_X_ATOM_NET_WM_USER_TIME },
198 { "_NET_STARTUP_ID", &ECORE_X_ATOM_NET_STARTUP_ID },
199 { "_NET_FRAME_EXTENTS", &ECORE_X_ATOM_NET_FRAME_EXTENTS },
200
201 { "_NET_WM_PING", &ECORE_X_ATOM_NET_WM_PING },
202 { "_NET_WM_SYNC_REQUEST", &ECORE_X_ATOM_NET_WM_SYNC_REQUEST },
203 { "_NET_WM_SYNC_REQUEST_COUNTER",
204 &ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER },
205
206 { "_NET_WM_WINDOW_OPACITY", &ECORE_X_ATOM_NET_WM_WINDOW_OPACITY },
207 { "_NET_WM_WINDOW_SHADOW", &ECORE_X_ATOM_NET_WM_WINDOW_SHADOW },
208 { "_NET_WM_WINDOW_SHADE", &ECORE_X_ATOM_NET_WM_WINDOW_SHADE },
209
210 { "TARGETS", &ECORE_X_ATOM_SELECTION_TARGETS },
211 { "CLIPBOARD", &ECORE_X_ATOM_SELECTION_CLIPBOARD },
212 { "PRIMARY", &ECORE_X_ATOM_SELECTION_PRIMARY },
213 { "SECONDARY", &ECORE_X_ATOM_SELECTION_SECONDARY },
214 { "_ECORE_SELECTION_PRIMARY", &ECORE_X_ATOM_SELECTION_PROP_PRIMARY },
215 { "_ECORE_SELECTION_SECONDARY", &ECORE_X_ATOM_SELECTION_PROP_SECONDARY },
216 { "_ECORE_SELECTION_CLIPBOARD", &ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD },
217
218 { "_E_VIRTUAL_KEYBOARD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD },
219 { "_E_VIRTUAL_KEYBOARD_STATE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE },
220 { "_E_VIRTUAL_KEYBOARD_ON", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON },
221 { "_E_VIRTUAL_KEYBOARD_OFF", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF },
222 { "_E_VIRTUAL_KEYBOARD_ALPHA", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA },
223 { "_E_VIRTUAL_KEYBOARD_NUMERIC", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC },
224 { "_E_VIRTUAL_KEYBOARD_PIN", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN },
225 { "_E_VIRTUAL_KEYBOARD_PHONE_NUMBER",
226 &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER },
227 { "_E_VIRTUAL_KEYBOARD_HEX", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX },
228 { "_E_VIRTUAL_KEYBOARD_TERMINAL",
229 &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL },
230 { "_E_VIRTUAL_KEYBOARD_PASSWORD",
231 &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD },
232 { "_E_VIRTUAL_KEYBOARD_IP", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP },
233 { "_E_VIRTUAL_KEYBOARD_HOST", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST },
234 { "_E_VIRTUAL_KEYBOARD_FILE", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE },
235 { "_E_VIRTUAL_KEYBOARD_URL", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL },
236 { "_E_VIRTUAL_KEYBOARD_KEYPAD", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD },
237 { "_E_VIRTUAL_KEYBOARD_J2ME", &ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME },
238
239 { "_E_ILLUME_ZONE", &ECORE_X_ATOM_E_ILLUME_ZONE },
240 { "_E_ILLUME_ZONE_LIST", &ECORE_X_ATOM_E_ILLUME_ZONE_LIST },
241 { "_E_ILLUME_CONFORMANT", &ECORE_X_ATOM_E_ILLUME_CONFORMANT },
242 { "_E_ILLUME_MODE", &ECORE_X_ATOM_E_ILLUME_MODE },
243 { "_E_ILLUME_MODE_SINGLE", &ECORE_X_ATOM_E_ILLUME_MODE_SINGLE },
244 { "_E_ILLUME_MODE_DUAL_TOP", &ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP },
245 { "_E_ILLUME_MODE_DUAL_LEFT", &ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT },
246 { "_E_ILLUME_FOCUS_BACK", &ECORE_X_ATOM_E_ILLUME_FOCUS_BACK },
247 { "_E_ILLUME_FOCUS_FORWARD", &ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD },
248 { "_E_ILLUME_FOCUS_HOME", &ECORE_X_ATOM_E_ILLUME_FOCUS_HOME },
249 { "_E_ILLUME_CLOSE", &ECORE_X_ATOM_E_ILLUME_CLOSE },
250 { "_E_ILLUME_HOME_NEW", &ECORE_X_ATOM_E_ILLUME_HOME_NEW },
251 { "_E_ILLUME_HOME_DEL", &ECORE_X_ATOM_E_ILLUME_HOME_DEL },
252 { "_E_ILLUME_DRAG", &ECORE_X_ATOM_E_ILLUME_DRAG },
253 { "_E_ILLUME_DRAG_LOCKED", &ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED },
254 { "_E_ILLUME_DRAG_START", &ECORE_X_ATOM_E_ILLUME_DRAG_START },
255 { "_E_ILLUME_DRAG_END", &ECORE_X_ATOM_E_ILLUME_DRAG_END },
256 { "_E_ILLUME_INDICATOR_GEOMETRY",
257 &ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY },
258 { "_E_ILLUME_SOFTKEY_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY },
259 { "_E_ILLUME_KEYBOARD_GEOMETRY", &ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY },
260 { "_E_ILLUME_QUICKPANEL", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL },
261 { "_E_ILLUME_QUICKPANEL_STATE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE },
262 { "_E_ILLUME_QUICKPANEL_STATE_TOGGLE",
263 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE },
264 { "_E_ILLUME_QUICKPANEL_ON", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON },
265 { "_E_ILLUME_QUICKPANEL_OFF", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF },
266 { "_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR",
267 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR },
268 { "_E_ILLUME_QUICKPANEL_PRIORITY_MINOR",
269 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR },
270 { "_E_ILLUME_QUICKPANEL_ZONE", &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE },
271 { "_E_ILLUME_QUICKPANEL_POSITION_UPDATE",
272 &ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE },
273
274 { "_E_COMP_SYNC_COUNTER", &ECORE_X_ATOM_E_COMP_SYNC_COUNTER },
275 { "_E_COMP_SYNC_DRAW_DONE", &ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE },
276 { "_E_COMP_SYNC_SUPPORTED", &ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED },
277 { "_E_COMP_SYNC_BEGIN", &ECORE_X_ATOM_E_COMP_SYNC_BEGIN },
278 { "_E_COMP_SYNC_END", &ECORE_X_ATOM_E_COMP_SYNC_END },
279 { "_E_COMP_SYNC_CANCEL", &ECORE_X_ATOM_E_COMP_SYNC_CANCEL },
280
281 { "_E_COMP_FLUSH", &ECORE_X_ATOM_E_COMP_FLUSH },
282 { "_E_COMP_DUMP", &ECORE_X_ATOM_E_COMP_DUMP },
283 { "_E_COMP_PIXMAP", &ECORE_X_ATOM_E_COMP_PIXMAP },
284 { "_E_VIDEO_PARENT", &ECORE_X_ATOM_E_VIDEO_PARENT },
285 { "_E_VIDEO_POSITION", &ECORE_X_ATOM_E_VIDEO_POSITION }
286 };
287 Atom *atoms;
288 char **names;
289 int i, num;
290
291 num = sizeof(items) / sizeof(Atom_Item);
292 atoms = alloca(num * sizeof(Atom));
293 names = alloca(num * sizeof(char *));
294 for (i = 0; i < num; i++) names[i] = (char *)items[i].name;
295 XInternAtoms(_ecore_x_disp, names, num, False, atoms);
296 for (i = 0; i < num; i++) *(items[i].atom) = atoms[i];
297} /* _ecore_x_atoms_init */
298
299/**
300 * Retrieves the atom value associated with the given name.
301 * @param name The given name.
302 * @return Associated atom value.
303 */
304EAPI Ecore_X_Atom
305ecore_x_atom_get(const char *name)
306{
307 if (!_ecore_x_disp)
308 return 0;
309
310 LOGFN(__FILE__, __LINE__, __FUNCTION__);
311 return XInternAtom(_ecore_x_disp, name, False);
312} /* ecore_x_atom_get */
313
314EAPI void
315ecore_x_atoms_get(const char **names,
316 int num,
317 Ecore_X_Atom *atoms)
318{
319 Atom *atoms_int;
320 int i;
321
322 if (!_ecore_x_disp)
323 return;
324
325 LOGFN(__FILE__, __LINE__, __FUNCTION__);
326 atoms_int = alloca(num * sizeof(Atom));
327 XInternAtoms(_ecore_x_disp, (char **)names, num, False, atoms_int);
328 for (i = 0; i < num; i++)
329 atoms[i] = atoms_int[i];
330} /* ecore_x_atoms_get */
331
332EAPI char *
333ecore_x_atom_name_get(Ecore_X_Atom atom)
334{
335 char *name;
336 char *xname;
337
338 if (!_ecore_x_disp)
339 return NULL;
340
341 LOGFN(__FILE__, __LINE__, __FUNCTION__);
342
343 xname = XGetAtomName(_ecore_x_disp, atom);
344 if (!xname)
345 return NULL;
346
347 name = strdup(xname);
348 XFree(xname);
349
350 return name;
351} /* ecore_x_atom_name_get */
352
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_composite.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_composite.c
new file mode 100644
index 0000000..43153ff
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_composite.c
@@ -0,0 +1,176 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6#include "Ecore_X.h"
7
8static Eina_Bool _composite_available = EINA_FALSE;
9
10void
11_ecore_x_composite_init(void)
12{
13 _composite_available = EINA_FALSE;
14
15#ifdef ECORE_XCOMPOSITE
16 int major, minor;
17
18 if (XCompositeQueryVersion(_ecore_x_disp, &major, &minor))
19 {
20# ifdef ECORE_XRENDER
21 if (XRenderQueryExtension(_ecore_x_disp, &major, &minor))
22 {
23# ifdef ECORE_XFIXES
24 if (XFixesQueryVersion(_ecore_x_disp, &major, &minor))
25 {
26 _composite_available = EINA_TRUE;
27 }
28# endif
29 }
30# endif
31 }
32#endif
33} /* _ecore_x_composite_init */
34
35EAPI Eina_Bool
36ecore_x_composite_query(void)
37{
38 LOGFN(__FILE__, __LINE__, __FUNCTION__);
39 return _composite_available;
40} /* ecore_x_composite_query */
41
42EAPI void
43ecore_x_composite_redirect_window(Ecore_X_Window win,
44 Ecore_X_Composite_Update_Type type)
45{
46#ifdef ECORE_XCOMPOSITE
47 int update = CompositeRedirectAutomatic;
48
49 LOGFN(__FILE__, __LINE__, __FUNCTION__);
50 switch(type)
51 {
52 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
53 update = CompositeRedirectAutomatic;
54 break;
55
56 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
57 update = CompositeRedirectManual;
58 break;
59 } /* switch */
60 XCompositeRedirectWindow(_ecore_x_disp, win, update);
61#endif /* ifdef ECORE_XCOMPOSITE */
62} /* ecore_x_composite_redirect_window */
63
64EAPI void
65ecore_x_composite_redirect_subwindows(Ecore_X_Window win,
66 Ecore_X_Composite_Update_Type type)
67{
68#ifdef ECORE_XCOMPOSITE
69 int update = CompositeRedirectAutomatic;
70
71 LOGFN(__FILE__, __LINE__, __FUNCTION__);
72 switch(type)
73 {
74 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
75 update = CompositeRedirectAutomatic;
76 break;
77
78 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
79 update = CompositeRedirectManual;
80 break;
81 } /* switch */
82 XCompositeRedirectSubwindows(_ecore_x_disp, win, update);
83#endif /* ifdef ECORE_XCOMPOSITE */
84} /* ecore_x_composite_redirect_subwindows */
85
86EAPI void
87ecore_x_composite_unredirect_window(Ecore_X_Window win,
88 Ecore_X_Composite_Update_Type type)
89{
90#ifdef ECORE_XCOMPOSITE
91 int update = CompositeRedirectAutomatic;
92
93 LOGFN(__FILE__, __LINE__, __FUNCTION__);
94 switch(type)
95 {
96 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
97 update = CompositeRedirectAutomatic;
98 break;
99
100 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
101 update = CompositeRedirectManual;
102 break;
103 } /* switch */
104 XCompositeUnredirectWindow(_ecore_x_disp, win, update);
105#endif /* ifdef ECORE_XCOMPOSITE */
106} /* ecore_x_composite_unredirect_window */
107
108EAPI void
109ecore_x_composite_unredirect_subwindows(Ecore_X_Window win,
110 Ecore_X_Composite_Update_Type type)
111{
112#ifdef ECORE_XCOMPOSITE
113 int update = CompositeRedirectAutomatic;
114
115 LOGFN(__FILE__, __LINE__, __FUNCTION__);
116 switch(type)
117 {
118 case ECORE_X_COMPOSITE_UPDATE_AUTOMATIC:
119 update = CompositeRedirectAutomatic;
120 break;
121
122 case ECORE_X_COMPOSITE_UPDATE_MANUAL:
123 update = CompositeRedirectManual;
124 break;
125 } /* switch */
126 XCompositeUnredirectSubwindows(_ecore_x_disp, win, update);
127#endif /* ifdef ECORE_XCOMPOSITE */
128} /* ecore_x_composite_unredirect_subwindows */
129
130EAPI Ecore_X_Pixmap
131ecore_x_composite_name_window_pixmap_get(Ecore_X_Window win)
132{
133 Ecore_X_Pixmap pixmap = None;
134#ifdef ECORE_XCOMPOSITE
135 LOGFN(__FILE__, __LINE__, __FUNCTION__);
136 pixmap = XCompositeNameWindowPixmap(_ecore_x_disp, win);
137#endif /* ifdef ECORE_XCOMPOSITE */
138 return pixmap;
139} /* ecore_x_composite_name_window_pixmap_get */
140
141EAPI void
142ecore_x_composite_window_events_disable(Ecore_X_Window win)
143{
144#ifdef ECORE_XCOMPOSITE
145 ecore_x_window_shape_input_rectangle_set(win, -1, -1, 1, 1);
146#endif /* ifdef ECORE_XCOMPOSITE */
147}
148
149EAPI void
150ecore_x_composite_window_events_enable(Ecore_X_Window win)
151{
152#ifdef ECORE_XCOMPOSITE
153 ecore_x_window_shape_input_rectangle_set(win, 0, 0, 65535, 65535);
154#endif /* ifdef ECORE_XCOMPOSITE */
155}
156
157EAPI Ecore_X_Window
158ecore_x_composite_render_window_enable(Ecore_X_Window root)
159{
160 Ecore_X_Window win = 0;
161#ifdef ECORE_XCOMPOSITE
162 win = XCompositeGetOverlayWindow(_ecore_x_disp, root);
163 ecore_x_composite_window_events_disable(win);
164#endif /* ifdef ECORE_XCOMPOSITE */
165 return win;
166} /* ecore_x_composite_render_window_enable */
167
168EAPI void
169ecore_x_composite_render_window_disable(Ecore_X_Window root)
170{
171#ifdef ECORE_XCOMPOSITE
172 LOGFN(__FILE__, __LINE__, __FUNCTION__);
173 XCompositeReleaseOverlayWindow(_ecore_x_disp, root);
174#endif /* ifdef ECORE_XCOMPOSITE */
175} /* ecore_x_composite_render_window_disable */
176
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_cursor.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_cursor.c
new file mode 100644
index 0000000..434505c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_cursor.c
@@ -0,0 +1,246 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6
7#include "ecore_x_private.h"
8
9EAPI Eina_Bool
10ecore_x_cursor_color_supported_get(void)
11{
12 return _ecore_x_xcursor;
13} /* ecore_x_cursor_color_supported_get */
14
15EAPI Ecore_X_Cursor
16ecore_x_cursor_new(Ecore_X_Window win,
17 int *pixels,
18 int w,
19 int h,
20 int hot_x,
21 int hot_y)
22{
23#ifdef ECORE_XCURSOR
24 LOGFN(__FILE__, __LINE__, __FUNCTION__);
25 if (_ecore_x_xcursor)
26 {
27 Cursor c;
28 XcursorImage *xci;
29
30 xci = XcursorImageCreate(w, h);
31 if (xci)
32 {
33 int i;
34
35 xci->xhot = hot_x;
36 xci->yhot = hot_y;
37 xci->delay = 0;
38 for (i = 0; i < (w * h); i++)
39 {
40// int r, g, b, a;
41//
42// a = (pixels[i] >> 24) & 0xff;
43// r = (((pixels[i] >> 16) & 0xff) * a) / 0xff;
44// g = (((pixels[i] >> 8 ) & 0xff) * a) / 0xff;
45// b = (((pixels[i] ) & 0xff) * a) / 0xff;
46 xci->pixels[i] = pixels[i];
47// (a << 24) | (r << 16) | (g << 8) | (b);
48 }
49 c = XcursorImageLoadCursor(_ecore_x_disp, xci);
50 XcursorImageDestroy(xci);
51 return c;
52 }
53 }
54 else
55#endif /* ifdef ECORE_XCURSOR */
56 {
57 XColor c1, c2;
58 Cursor c;
59 Pixmap pmap, mask;
60 GC gc;
61 XGCValues gcv;
62 XImage *xim;
63 unsigned int *pix;
64 int fr, fg, fb, br, bg, bb;
65 int brightest = 0;
66 int darkest = 255 * 3;
67 int x, y;
68 const int dither[2][2] =
69 {
70 {0, 2},
71 {3, 1}
72 };
73
74 pmap = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
75 mask = XCreatePixmap(_ecore_x_disp, win, w, h, 1);
76 xim = XCreateImage(_ecore_x_disp,
77 DefaultVisual(_ecore_x_disp, 0),
78 1, ZPixmap, 0, NULL, w, h, 32, 0);
79 xim->data = malloc(xim->bytes_per_line * xim->height);
80
81 fr = 0x00; fg = 0x00; fb = 0x00;
82 br = 0xff; bg = 0xff; bb = 0xff;
83 pix = (unsigned int *)pixels;
84 for (y = 0; y < h; y++)
85 {
86 for (x = 0; x < w; x++)
87 {
88 int r, g, b, a;
89
90 a = (pix[0] >> 24) & 0xff;
91 r = (pix[0] >> 16) & 0xff;
92 g = (pix[0] >> 8) & 0xff;
93 b = (pix[0]) & 0xff;
94 if (a > 0)
95 {
96 if ((r + g + b) > brightest)
97 {
98 brightest = r + g + b;
99 br = r;
100 bg = g;
101 bb = b;
102 }
103
104 if ((r + g + b) < darkest)
105 {
106 darkest = r + g + b;
107 fr = r;
108 fg = g;
109 fb = b;
110 }
111 }
112
113 pix++;
114 }
115 }
116
117 pix = (unsigned int *)pixels;
118 for (y = 0; y < h; y++)
119 {
120 for (x = 0; x < w; x++)
121 {
122 int v;
123 int r, g, b;
124 int d1, d2;
125
126 r = (pix[0] >> 16) & 0xff;
127 g = (pix[0] >> 8) & 0xff;
128 b = (pix[0]) & 0xff;
129 d1 =
130 ((r - fr) * (r - fr)) +
131 ((g - fg) * (g - fg)) +
132 ((b - fb) * (b - fb));
133 d2 =
134 ((r - br) * (r - br)) +
135 ((g - bg) * (g - bg)) +
136 ((b - bb) * (b - bb));
137 if (d1 + d2)
138 {
139 v = (((d2 * 255) / (d1 + d2)) * 5) / 256;
140 if (v > dither[x & 0x1][y & 0x1])
141 v = 1;
142 else
143 v = 0;
144 }
145 else
146 v = 0;
147
148 XPutPixel(xim, x, y, v);
149 pix++;
150 }
151 }
152 gc = XCreateGC(_ecore_x_disp, pmap, 0, &gcv);
153 XPutImage(_ecore_x_disp, pmap, gc, xim, 0, 0, 0, 0, w, h);
154 XFreeGC(_ecore_x_disp, gc);
155
156 pix = (unsigned int *)pixels;
157 for (y = 0; y < h; y++)
158 {
159 for (x = 0; x < w; x++)
160 {
161 int v;
162
163 v = (((pix[0] >> 24) & 0xff) * 5) / 256;
164 if (v > dither[x & 0x1][y & 0x1])
165 v = 1;
166 else
167 v = 0;
168
169 XPutPixel(xim, x, y, v);
170 pix++;
171 }
172 }
173 gc = XCreateGC(_ecore_x_disp, mask, 0, &gcv);
174 XPutImage(_ecore_x_disp, mask, gc, xim, 0, 0, 0, 0, w, h);
175 XFreeGC(_ecore_x_disp, gc);
176
177 free(xim->data);
178 xim->data = NULL;
179 XDestroyImage(xim);
180
181 c1.pixel = 0;
182 c1.red = fr << 8 | fr;
183 c1.green = fg << 8 | fg;
184 c1.blue = fb << 8 | fb;
185 c1.flags = DoRed | DoGreen | DoBlue;
186
187 c2.pixel = 0;
188 c2.red = br << 8 | br;
189 c2.green = bg << 8 | bg;
190 c2.blue = bb << 8 | bb;
191 c2.flags = DoRed | DoGreen | DoBlue;
192
193 c = XCreatePixmapCursor(_ecore_x_disp,
194 pmap, mask,
195 &c1, &c2,
196 hot_x, hot_y);
197 XFreePixmap(_ecore_x_disp, pmap);
198 XFreePixmap(_ecore_x_disp, mask);
199 return c;
200 }
201
202 return 0;
203} /* ecore_x_cursor_new */
204
205EAPI void
206ecore_x_cursor_free(Ecore_X_Cursor c)
207{
208 LOGFN(__FILE__, __LINE__, __FUNCTION__);
209 XFreeCursor(_ecore_x_disp, c);
210} /* ecore_x_cursor_free */
211
212/*
213 * Returns the cursor for the given shape.
214 * Note that the return value must not be freed with
215 * ecore_x_cursor_free()!
216 */
217EAPI Ecore_X_Cursor
218ecore_x_cursor_shape_get(int shape)
219{
220 LOGFN(__FILE__, __LINE__, __FUNCTION__);
221 /* Shapes are defined in Ecore_X_Cursor.h */
222 return XCreateFontCursor(_ecore_x_disp, shape);
223} /* ecore_x_cursor_shape_get */
224
225EAPI void
226ecore_x_cursor_size_set(int size)
227{
228#ifdef ECORE_XCURSOR
229 LOGFN(__FILE__, __LINE__, __FUNCTION__);
230 XcursorSetDefaultSize(_ecore_x_disp, size);
231#else /* ifdef ECORE_XCURSOR */
232 size = 0;
233#endif /* ifdef ECORE_XCURSOR */
234} /* ecore_x_cursor_size_set */
235
236EAPI int
237ecore_x_cursor_size_get(void)
238{
239#ifdef ECORE_XCURSOR
240 LOGFN(__FILE__, __LINE__, __FUNCTION__);
241 return XcursorGetDefaultSize(_ecore_x_disp);
242#else /* ifdef ECORE_XCURSOR */
243 return 0;
244#endif /* ifdef ECORE_XCURSOR */
245} /* ecore_x_cursor_size_get */
246
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_damage.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_damage.c
new file mode 100644
index 0000000..5e44d07
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_damage.c
@@ -0,0 +1,71 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6#include "Ecore_X.h"
7
8static Eina_Bool _damage_available = EINA_FALSE;
9#ifdef ECORE_XDAMAGE
10static int _damage_major, _damage_minor;
11#endif /* ifdef ECORE_XDAMAGE */
12
13void
14_ecore_x_damage_init(void)
15{
16#ifdef ECORE_XDAMAGE
17 _damage_major = 1;
18 _damage_minor = 0;
19
20 LOGFN(__FILE__, __LINE__, __FUNCTION__);
21 if (XDamageQueryVersion(_ecore_x_disp, &_damage_major, &_damage_minor))
22 _damage_available = EINA_TRUE;
23 else
24 _damage_available = EINA_FALSE;
25
26#else /* ifdef ECORE_XDAMAGE */
27 _damage_available = EINA_FALSE;
28#endif /* ifdef ECORE_XDAMAGE */
29} /* _ecore_x_damage_init */
30
31EAPI Eina_Bool
32ecore_x_damage_query(void)
33{
34 return _damage_available;
35} /* ecore_x_damage_query */
36
37EAPI Ecore_X_Damage
38ecore_x_damage_new(Ecore_X_Drawable d,
39 Ecore_X_Damage_Report_Level level)
40{
41#ifdef ECORE_XDAMAGE
42 Ecore_X_Damage damage;
43
44 LOGFN(__FILE__, __LINE__, __FUNCTION__);
45 damage = XDamageCreate(_ecore_x_disp, d, level);
46 return damage;
47#else /* ifdef ECORE_XDAMAGE */
48 return 0;
49#endif /* ifdef ECORE_XDAMAGE */
50} /* ecore_x_damage_new */
51
52EAPI void
53ecore_x_damage_free(Ecore_X_Damage damage)
54{
55#ifdef ECORE_XDAMAGE
56 LOGFN(__FILE__, __LINE__, __FUNCTION__);
57 XDamageDestroy(_ecore_x_disp, damage);
58#endif /* ifdef ECORE_XDAMAGE */
59} /* ecore_x_damage_free */
60
61EAPI void
62ecore_x_damage_subtract(Ecore_X_Damage damage,
63 Ecore_X_Region repair,
64 Ecore_X_Region parts)
65{
66#ifdef ECORE_XDAMAGE
67 LOGFN(__FILE__, __LINE__, __FUNCTION__);
68 XDamageSubtract(_ecore_x_disp, damage, repair, parts);
69#endif /* ifdef ECORE_XDAMAGE */
70} /* ecore_x_damage_subtract */
71
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dnd.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dnd.c
new file mode 100644
index 0000000..7908584
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dnd.c
@@ -0,0 +1,706 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6#include <string.h>
7
8#include "Ecore.h"
9#include "ecore_x_private.h"
10#include "Ecore_X.h"
11#include "Ecore_X_Atoms.h"
12
13EAPI int ECORE_X_EVENT_XDND_ENTER = 0;
14EAPI int ECORE_X_EVENT_XDND_POSITION = 0;
15EAPI int ECORE_X_EVENT_XDND_STATUS = 0;
16EAPI int ECORE_X_EVENT_XDND_LEAVE = 0;
17EAPI int ECORE_X_EVENT_XDND_DROP = 0;
18EAPI int ECORE_X_EVENT_XDND_FINISHED = 0;
19
20static Ecore_X_DND_Source *_source = NULL;
21static Ecore_X_DND_Target *_target = NULL;
22static int _ecore_x_dnd_init_count = 0;
23
24typedef struct _Version_Cache_Item
25{
26 Ecore_X_Window win;
27 int ver;
28} Version_Cache_Item;
29static Version_Cache_Item *_version_cache = NULL;
30static int _version_cache_num = 0, _version_cache_alloc = 0;
31static void (*_posupdatecb)(void *,
32 Ecore_X_Xdnd_Position *);
33static void *_posupdatedata;
34
35void
36_ecore_x_dnd_init(void)
37{
38 if (!_ecore_x_dnd_init_count)
39 {
40 _source = calloc(1, sizeof(Ecore_X_DND_Source));
41 if (!_source) return;
42 _source->version = ECORE_X_DND_VERSION;
43 _source->win = None;
44 _source->dest = None;
45 _source->state = ECORE_X_DND_SOURCE_IDLE;
46 _source->prev.window = 0;
47
48 _target = calloc(1, sizeof(Ecore_X_DND_Target));
49 if (!_target)
50 {
51 free(_source);
52 _source = NULL;
53 return;
54 }
55 _target->win = None;
56 _target->source = None;
57 _target->state = ECORE_X_DND_TARGET_IDLE;
58
59 ECORE_X_EVENT_XDND_ENTER = ecore_event_type_new();
60 ECORE_X_EVENT_XDND_POSITION = ecore_event_type_new();
61 ECORE_X_EVENT_XDND_STATUS = ecore_event_type_new();
62 ECORE_X_EVENT_XDND_LEAVE = ecore_event_type_new();
63 ECORE_X_EVENT_XDND_DROP = ecore_event_type_new();
64 ECORE_X_EVENT_XDND_FINISHED = ecore_event_type_new();
65 }
66
67 _ecore_x_dnd_init_count++;
68} /* _ecore_x_dnd_init */
69
70void
71_ecore_x_dnd_shutdown(void)
72{
73 _ecore_x_dnd_init_count--;
74 if (_ecore_x_dnd_init_count > 0)
75 return;
76
77 if (_source)
78 free(_source);
79
80 _source = NULL;
81
82 if (_target)
83 free(_target);
84
85 _target = NULL;
86
87 _ecore_x_dnd_init_count = 0;
88} /* _ecore_x_dnd_shutdown */
89
90static Eina_Bool
91_ecore_x_dnd_converter_copy(char *target __UNUSED__,
92 void *data,
93 int size,
94 void **data_ret,
95 int *size_ret,
96 Ecore_X_Atom *tprop __UNUSED__,
97 int *count __UNUSED__)
98{
99 XTextProperty text_prop;
100 char *mystr;
101 XICCEncodingStyle style = XTextStyle;
102
103 if (!data || !size)
104 return EINA_FALSE;
105
106 mystr = calloc(1, size + 1);
107 if (!mystr)
108 return EINA_FALSE;
109
110 memcpy(mystr, data, size);
111
112 if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style,
113 &text_prop) == Success)
114 {
115 int bufsize = strlen((char *)text_prop.value) + 1;
116 *data_ret = malloc(bufsize);
117 if (!*data_ret)
118 {
119 free(mystr);
120 return EINA_FALSE;
121 }
122 memcpy(*data_ret, text_prop.value, bufsize);
123 *size_ret = bufsize;
124 XFree(text_prop.value);
125 free(mystr);
126 return EINA_TRUE;
127 }
128 else
129 {
130 free(mystr);
131 return EINA_FALSE;
132 }
133} /* _ecore_x_dnd_converter_copy */
134
135EAPI void
136ecore_x_dnd_aware_set(Ecore_X_Window win,
137 Eina_Bool on)
138{
139 Ecore_X_Atom prop_data = ECORE_X_DND_VERSION;
140
141 LOGFN(__FILE__, __LINE__, __FUNCTION__);
142 if (on)
143 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_AWARE,
144 XA_ATOM, 32, &prop_data, 1);
145 else
146 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_AWARE);
147} /* ecore_x_dnd_aware_set */
148
149EAPI int
150ecore_x_dnd_version_get(Ecore_X_Window win)
151{
152 unsigned char *prop_data;
153 int num;
154 Version_Cache_Item *t;
155
156 LOGFN(__FILE__, __LINE__, __FUNCTION__);
157 // this looks hacky - and it is, but we need a way of caching info about
158 // a window while dragging, because we literally query this every mouse
159 // move and going to and from x multiple times per move is EXPENSIVE
160 // and slows things down, puts lots of load on x etc.
161 if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
162 if (_version_cache)
163 {
164 int i;
165
166 for (i = 0; i < _version_cache_num; i++)
167 {
168 if (_version_cache[i].win == win)
169 return _version_cache[i].ver;
170 }
171 }
172
173 if (ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_AWARE,
174 XA_ATOM, 32, &prop_data, &num))
175 {
176 int version = (int)*prop_data;
177 free(prop_data);
178 if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
179 {
180 _version_cache_num++;
181 if (_version_cache_num > _version_cache_alloc)
182 _version_cache_alloc += 16;
183
184 t = realloc(_version_cache,
185 _version_cache_alloc *
186 sizeof(Version_Cache_Item));
187 if (!t) return 0;
188 _version_cache = t;
189 _version_cache[_version_cache_num - 1].win = win;
190 _version_cache[_version_cache_num - 1].ver = version;
191 }
192
193 return version;
194 }
195
196 if (_source->state == ECORE_X_DND_SOURCE_DRAGGING)
197 {
198 _version_cache_num++;
199 if (_version_cache_num > _version_cache_alloc)
200 _version_cache_alloc += 16;
201
202 t = realloc(_version_cache, _version_cache_alloc *
203 sizeof(Version_Cache_Item));
204 if (!t) return 0;
205 _version_cache = t;
206 _version_cache[_version_cache_num - 1].win = win;
207 _version_cache[_version_cache_num - 1].ver = 0;
208 }
209
210 return 0;
211} /* ecore_x_dnd_version_get */
212
213EAPI Eina_Bool
214ecore_x_dnd_type_isset(Ecore_X_Window win,
215 const char *type)
216{
217 int num, i, ret = EINA_FALSE;
218 unsigned char *data;
219 Ecore_X_Atom *atoms, atom;
220
221 LOGFN(__FILE__, __LINE__, __FUNCTION__);
222 if (!ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
223 XA_ATOM, 32, &data, &num))
224 return ret;
225
226 atom = ecore_x_atom_get(type);
227 atoms = (Ecore_X_Atom *)data;
228
229 for (i = 0; i < num; ++i)
230 {
231 if (atom == atoms[i])
232 {
233 ret = EINA_TRUE;
234 break;
235 }
236 }
237
238 XFree(data);
239 return ret;
240} /* ecore_x_dnd_type_isset */
241
242EAPI void
243ecore_x_dnd_type_set(Ecore_X_Window win,
244 const char *type,
245 Eina_Bool on)
246{
247 Ecore_X_Atom atom;
248 Ecore_X_Atom *oldset = NULL, *newset = NULL;
249 int i, j = 0, num = 0;
250 unsigned char *data = NULL;
251 unsigned char *old_data = NULL;
252
253 LOGFN(__FILE__, __LINE__, __FUNCTION__);
254 atom = ecore_x_atom_get(type);
255 ecore_x_window_prop_property_get(win, ECORE_X_ATOM_XDND_TYPE_LIST,
256 XA_ATOM, 32, &old_data, &num);
257 oldset = (Ecore_X_Atom *)old_data;
258
259 LOGFN(__FILE__, __LINE__, __FUNCTION__);
260 if (on)
261 {
262 if (ecore_x_dnd_type_isset(win, type))
263 {
264 XFree(old_data);
265 return;
266 }
267
268 newset = calloc(num + 1, sizeof(Ecore_X_Atom));
269 if (!newset)
270 return;
271
272 data = (unsigned char *)newset;
273
274 for (i = 0; i < num; i++)
275 newset[i + 1] = oldset[i];
276 /* prepend the new type */
277 newset[0] = atom;
278
279 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
280 XA_ATOM, 32, data, num + 1);
281 }
282 else
283 {
284 if (!ecore_x_dnd_type_isset(win, type))
285 {
286 XFree(old_data);
287 return;
288 }
289
290 newset = calloc(num - 1, sizeof(Ecore_X_Atom));
291 if (!newset)
292 {
293 XFree(old_data);
294 return;
295 }
296
297 data = (unsigned char *)newset;
298 for (i = 0; i < num; i++)
299 if (oldset[i] != atom)
300 newset[j++] = oldset[i];
301
302 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
303 XA_ATOM, 32, data, num - 1);
304 }
305
306 XFree(oldset);
307 free(newset);
308} /* ecore_x_dnd_type_set */
309
310EAPI void
311ecore_x_dnd_types_set(Ecore_X_Window win,
312 const char **types,
313 unsigned int num_types)
314{
315 Ecore_X_Atom *newset = NULL;
316 unsigned int i;
317 unsigned char *data = NULL;
318
319 LOGFN(__FILE__, __LINE__, __FUNCTION__);
320 if (!num_types)
321 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_TYPE_LIST);
322 else
323 {
324 newset = calloc(num_types, sizeof(Ecore_X_Atom));
325 if (!newset)
326 return;
327
328 data = (unsigned char *)newset;
329 for (i = 0; i < num_types; i++)
330 {
331 newset[i] = ecore_x_atom_get(types[i]);
332 ecore_x_selection_converter_atom_add(newset[i],
333 _ecore_x_dnd_converter_copy);
334 }
335 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_TYPE_LIST,
336 XA_ATOM, 32, data, num_types);
337 free(newset);
338 }
339} /* ecore_x_dnd_types_set */
340
341EAPI void
342ecore_x_dnd_actions_set(Ecore_X_Window win,
343 Ecore_X_Atom *actions,
344 unsigned int num_actions)
345{
346 unsigned int i;
347 unsigned char *data = NULL;
348
349 LOGFN(__FILE__, __LINE__, __FUNCTION__);
350 if (!num_actions)
351 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_XDND_ACTION_LIST);
352 else
353 {
354 data = (unsigned char *)actions;
355 for (i = 0; i < num_actions; i++)
356 {
357 ecore_x_selection_converter_atom_add(actions[i],
358 _ecore_x_dnd_converter_copy);
359 }
360 ecore_x_window_prop_property_set(win, ECORE_X_ATOM_XDND_ACTION_LIST,
361 XA_ATOM, 32, data, num_actions);
362 }
363} /* ecore_x_dnd_actions_set */
364
365/**
366 * The DND position update cb is called Ecore_X sends a DND position to a
367 * client.
368 *
369 * It essentially mirrors some of the data sent in the position message.
370 * Generally this cb should be set just before position update is called.
371 * Please note well you need to look after your own data pointer if someone
372 * trashes you position update cb set.
373 *
374 * It is considered good form to clear this when the dnd event finishes.
375 *
376 * @param cb Callback to updated each time ecore_x sends a position update.
377 * @param data User data.
378 */
379EAPI void
380ecore_x_dnd_callback_pos_update_set(
381 void (*cb)(void *,
382 Ecore_X_Xdnd_Position *data),
383 const void *data)
384{
385 _posupdatecb = cb;
386 _posupdatedata = (void *)data; /* Discard the const early */
387}
388
389Ecore_X_DND_Source *
390_ecore_x_dnd_source_get(void)
391{
392 return _source;
393} /* _ecore_x_dnd_source_get */
394
395Ecore_X_DND_Target *
396_ecore_x_dnd_target_get(void)
397{
398 return _target;
399} /* _ecore_x_dnd_target_get */
400
401EAPI Eina_Bool
402ecore_x_dnd_begin(Ecore_X_Window source,
403 unsigned char *data,
404 int size)
405{
406 LOGFN(__FILE__, __LINE__, __FUNCTION__);
407 if (!ecore_x_dnd_version_get(source))
408 return EINA_FALSE;
409
410 /* Take ownership of XdndSelection */
411 if (!ecore_x_selection_xdnd_set(source, data, size))
412 return EINA_FALSE;
413
414 if (_version_cache)
415 {
416 free(_version_cache);
417 _version_cache = NULL;
418 _version_cache_num = 0;
419 _version_cache_alloc = 0;
420 }
421
422 ecore_x_window_shadow_tree_flush();
423
424 _source->win = source;
425 ecore_x_window_ignore_set(_source->win, 1);
426 _source->state = ECORE_X_DND_SOURCE_DRAGGING;
427 _source->time = _ecore_x_event_last_time;
428 _source->prev.window = 0;
429
430 /* Default Accepted Action: move */
431 _source->action = ECORE_X_ATOM_XDND_ACTION_MOVE;
432 _source->accepted_action = None;
433 _source->dest = None;
434
435 return EINA_TRUE;
436} /* ecore_x_dnd_begin */
437
438EAPI Eina_Bool
439ecore_x_dnd_drop(void)
440{
441 XEvent xev;
442 int status = EINA_FALSE;
443
444 LOGFN(__FILE__, __LINE__, __FUNCTION__);
445 if (_source->dest)
446 {
447 xev.xany.type = ClientMessage;
448 xev.xany.display = _ecore_x_disp;
449 xev.xclient.format = 32;
450 xev.xclient.window = _source->dest;
451
452 if (_source->will_accept)
453 {
454 xev.xclient.message_type = ECORE_X_ATOM_XDND_DROP;
455 xev.xclient.data.l[0] = _source->win;
456 xev.xclient.data.l[1] = 0;
457 xev.xclient.data.l[2] = _source->time;
458 XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
459 _source->state = ECORE_X_DND_SOURCE_DROPPED;
460 status = EINA_TRUE;
461 }
462 else
463 {
464 xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
465 xev.xclient.data.l[0] = _source->win;
466 xev.xclient.data.l[1] = 0;
467 XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
468 _source->state = ECORE_X_DND_SOURCE_IDLE;
469 }
470 }
471 else
472 {
473 /* Dropping on nothing */
474 ecore_x_selection_xdnd_clear();
475 _source->state = ECORE_X_DND_SOURCE_IDLE;
476 }
477
478 ecore_x_window_ignore_set(_source->win, 0);
479
480 _source->prev.window = 0;
481
482 return status;
483} /* ecore_x_dnd_drop */
484
485EAPI void
486ecore_x_dnd_send_status(Eina_Bool will_accept,
487 Eina_Bool suppress,
488 Ecore_X_Rectangle rectangle,
489 Ecore_X_Atom action)
490{
491 XEvent xev;
492
493 if (_target->state == ECORE_X_DND_TARGET_IDLE)
494 return;
495
496 LOGFN(__FILE__, __LINE__, __FUNCTION__);
497 memset(&xev, 0, sizeof(XEvent));
498
499 _target->will_accept = will_accept;
500
501 xev.xclient.type = ClientMessage;
502 xev.xclient.display = _ecore_x_disp;
503 xev.xclient.message_type = ECORE_X_ATOM_XDND_STATUS;
504 xev.xclient.format = 32;
505 xev.xclient.window = _target->source;
506
507 xev.xclient.data.l[0] = _target->win;
508 xev.xclient.data.l[1] = 0;
509 if (will_accept)
510 xev.xclient.data.l[1] |= 0x1UL;
511
512 if (!suppress)
513 xev.xclient.data.l[1] |= 0x2UL;
514
515 /* Set rectangle information */
516 xev.xclient.data.l[2] = rectangle.x;
517 xev.xclient.data.l[2] <<= 16;
518 xev.xclient.data.l[2] |= rectangle.y;
519 xev.xclient.data.l[3] = rectangle.width;
520 xev.xclient.data.l[3] <<= 16;
521 xev.xclient.data.l[3] |= rectangle.height;
522
523 if (will_accept)
524 {
525 xev.xclient.data.l[4] = action;
526 _target->accepted_action = action;
527 }
528 else
529 {
530 xev.xclient.data.l[4] = None;
531 _target->accepted_action = action;
532 }
533
534 XSendEvent(_ecore_x_disp, _target->source, False, 0, &xev);
535} /* ecore_x_dnd_send_status */
536
537EAPI void
538ecore_x_dnd_send_finished(void)
539{
540 XEvent xev;
541
542 if (_target->state == ECORE_X_DND_TARGET_IDLE)
543 return;
544
545 LOGFN(__FILE__, __LINE__, __FUNCTION__);
546 xev.xany.type = ClientMessage;
547 xev.xany.display = _ecore_x_disp;
548 xev.xclient.message_type = ECORE_X_ATOM_XDND_FINISHED;
549 xev.xclient.format = 32;
550 xev.xclient.window = _target->source;
551
552 xev.xclient.data.l[0] = _target->win;
553 xev.xclient.data.l[1] = 0;
554 xev.xclient.data.l[2] = 0;
555 if (_target->will_accept)
556 {
557 xev.xclient.data.l[1] |= 0x1UL;
558 xev.xclient.data.l[2] = _target->accepted_action;
559 }
560
561 XSendEvent(_ecore_x_disp, _target->source, False, 0, &xev);
562
563 _target->state = ECORE_X_DND_TARGET_IDLE;
564} /* ecore_x_dnd_send_finished */
565
566EAPI void
567ecore_x_dnd_source_action_set(Ecore_X_Atom action)
568{
569 _source->action = action;
570 if (_source->prev.window)
571 _ecore_x_dnd_drag(_source->prev.window, _source->prev.x, _source->prev.y);
572} /* ecore_x_dnd_source_action_set */
573
574EAPI Ecore_X_Atom
575ecore_x_dnd_source_action_get(void)
576{
577 return _source->action;
578} /* ecore_x_dnd_source_action_get */
579
580void
581_ecore_x_dnd_drag(Ecore_X_Window root,
582 int x,
583 int y)
584{
585 XEvent xev;
586 Ecore_X_Window win;
587 Ecore_X_Window *skip;
588 Ecore_X_Xdnd_Position pos;
589 int num;
590
591 if (_source->state != ECORE_X_DND_SOURCE_DRAGGING)
592 return;
593
594 /* Preinitialize XEvent struct */
595 memset(&xev, 0, sizeof(XEvent));
596 xev.xany.type = ClientMessage;
597 xev.xany.display = _ecore_x_disp;
598 xev.xclient.format = 32;
599
600 /* Attempt to find a DND-capable window under the cursor */
601 skip = ecore_x_window_ignore_list(&num);
602// WARNING - this function is HEAVY. it goes to and from x a LOT walking the
603// window tree - use the SHADOW version - makes a 1-off tree copy, then uses
604// that instead.
605// win = ecore_x_window_at_xy_with_skip_get(x, y, skip, num);
606 win = ecore_x_window_shadow_tree_at_xy_with_skip_get(root, x, y, skip, num);
607
608// NOTE: This now uses the shadow version to find parent windows
609// while ((win) && !(ecore_x_dnd_version_get(win)))
610// win = ecore_x_window_parent_get(win);
611 while ((win) && !(ecore_x_dnd_version_get(win)))
612 win = ecore_x_window_shadow_parent_get(root, win);
613
614 /* Send XdndLeave to current destination window if we have left it */
615 if ((_source->dest) && (win != _source->dest))
616 {
617 xev.xclient.window = _source->dest;
618 xev.xclient.message_type = ECORE_X_ATOM_XDND_LEAVE;
619 xev.xclient.data.l[0] = _source->win;
620 xev.xclient.data.l[1] = 0;
621
622 XSendEvent(_ecore_x_disp, _source->dest, False, 0, &xev);
623 _source->suppress = 0;
624 }
625
626 if (win)
627 {
628 int x1, x2, y1, y2;
629
630 _source->version = MIN(ECORE_X_DND_VERSION,
631 ecore_x_dnd_version_get(win));
632 if (win != _source->dest)
633 {
634 int i;
635 unsigned char *data;
636 Ecore_X_Atom *types;
637
638 ecore_x_window_prop_property_get(_source->win,
639 ECORE_X_ATOM_XDND_TYPE_LIST,
640 XA_ATOM,
641 32,
642 &data,
643 &num);
644 types = (Ecore_X_Atom *)data;
645
646 /* Entered new window, send XdndEnter */
647 xev.xclient.window = win;
648 xev.xclient.message_type = ECORE_X_ATOM_XDND_ENTER;
649 xev.xclient.data.l[0] = _source->win;
650 xev.xclient.data.l[1] = 0;
651 if (num > 3)
652 xev.xclient.data.l[1] |= 0x1UL;
653 else
654 xev.xclient.data.l[1] &= 0xfffffffeUL;
655
656 xev.xclient.data.l[1] |= ((unsigned long)_source->version) << 24;
657
658 for (i = 2; i < 5; i++)
659 xev.xclient.data.l[i] = 0;
660 for (i = 0; i < MIN(num, 3); ++i)
661 xev.xclient.data.l[i + 2] = types[i];
662 XFree(data);
663 XSendEvent(_ecore_x_disp, win, False, 0, &xev);
664 _source->await_status = 0;
665 _source->will_accept = 0;
666 }
667
668 /* Determine if we're still in the rectangle from the last status */
669 x1 = _source->rectangle.x;
670 x2 = _source->rectangle.x + _source->rectangle.width;
671 y1 = _source->rectangle.y;
672 y2 = _source->rectangle.y + _source->rectangle.height;
673
674 if ((!_source->await_status) ||
675 (!_source->suppress) ||
676 ((x < x1) || (x > x2) || (y < y1) || (y > y2)))
677 {
678 xev.xclient.window = win;
679 xev.xclient.message_type = ECORE_X_ATOM_XDND_POSITION;
680 xev.xclient.data.l[0] = _source->win;
681 xev.xclient.data.l[1] = 0; /* Reserved */
682 xev.xclient.data.l[2] = ((x << 16) & 0xffff0000) | (y & 0xffff);
683 xev.xclient.data.l[3] = _source->time; /* Version 1 */
684 xev.xclient.data.l[4] = _source->action; /* Version 2, Needs to be pre-set */
685 XSendEvent(_ecore_x_disp, win, False, 0, &xev);
686
687 _source->await_status = 1;
688 }
689 }
690
691 if (_posupdatecb)
692 {
693 pos.position.x = x;
694 pos.position.y = y;
695 pos.win = win;
696 pos.prev = _source->dest;
697 _posupdatecb(_posupdatedata, &pos);
698 }
699
700 _source->prev.x = x;
701 _source->prev.y = y;
702 _source->prev.window = root;
703 _source->dest = win;
704} /* _ecore_x_dnd_drag */
705
706/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dpms.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dpms.c
new file mode 100644
index 0000000..74d5344
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_dpms.c
@@ -0,0 +1,247 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6
7static Eina_Bool _dpms_available = EINA_FALSE;
8
9void
10_ecore_x_dpms_init(void)
11{
12#ifdef ECORE_XDPMS
13 int _dpms_major, _dpms_minor;
14
15 _dpms_major = 1;
16 _dpms_minor = 0;
17
18 if (DPMSGetVersion(_ecore_x_disp, &_dpms_major, &_dpms_minor))
19 _dpms_available = EINA_TRUE;
20 else
21 _dpms_available = EINA_FALSE;
22
23#else /* ifdef ECORE_XDPMS */
24 _dpms_available = EINA_FALSE;
25#endif /* ifdef ECORE_XDPMS */
26} /* _ecore_x_dpms_init */
27
28/**
29 * @defgroup Ecore_X_DPMS_Group X DPMS Extension Functions
30 *
31 * Functions related to the X DPMS extension.
32 */
33
34/**
35 * Checks if the X DPMS extension is available on the server.
36 * @return @c 1 if the X DPMS extension is available, @c 0 otherwise.
37 * @ingroup Ecore_X_DPMS_Group
38 */
39EAPI Eina_Bool
40ecore_x_dpms_query(void)
41{
42 return _dpms_available;
43} /* ecore_x_dpms_query */
44
45/**
46 * Checks if the X server is capable of DPMS.
47 * @return @c 1 if the X server is capable of DPMS, @c 0 otherwise.
48 * @ingroup Ecore_X_DPMS_Group
49 */
50EAPI Eina_Bool
51ecore_x_dpms_capable_get(void)
52{
53#ifdef ECORE_XDPMS
54 LOGFN(__FILE__, __LINE__, __FUNCTION__);
55 return DPMSCapable(_ecore_x_disp) ? EINA_TRUE : EINA_FALSE;
56#else /* ifdef ECORE_XDPMS */
57 return EINA_FALSE;
58#endif /* ifdef ECORE_XDPMS */
59} /* ecore_x_dpms_capable_get */
60
61/**
62 * Checks the DPMS state of the display.
63 * @return @c 1 if DPMS is enabled, @c 0 otherwise.
64 * @ingroup Ecore_X_DPMS_Group
65 */
66EAPI Eina_Bool
67ecore_x_dpms_enabled_get(void)
68{
69#ifdef ECORE_XDPMS
70 unsigned char state;
71 unsigned short power_lvl;
72
73 LOGFN(__FILE__, __LINE__, __FUNCTION__);
74 DPMSInfo(_ecore_x_disp, &power_lvl, &state);
75 return state ? EINA_TRUE : EINA_FALSE;
76#else /* ifdef ECORE_XDPMS */
77 return EINA_FALSE;
78#endif /* ifdef ECORE_XDPMS */
79} /* ecore_x_dpms_enabled_get */
80
81/**
82 * Sets the DPMS state of the display.
83 * @param enabled @c 0 to disable DPMS characteristics of the server, enable it otherwise.
84 * @ingroup Ecore_X_DPMS_Group
85 */
86EAPI void
87ecore_x_dpms_enabled_set(int enabled)
88{
89#ifdef ECORE_XDPMS
90 LOGFN(__FILE__, __LINE__, __FUNCTION__);
91 if (enabled)
92 DPMSEnable(_ecore_x_disp);
93 else
94 DPMSDisable(_ecore_x_disp);
95
96#endif /* ifdef ECORE_XDPMS */
97} /* ecore_x_dpms_enabled_set */
98
99/**
100 * Gets the timeouts. The values are in unit of seconds.
101 * @param standby Amount of time of inactivity before standby mode will be invoked.
102 * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
103 * @param off Amount of time of inactivity before the monitor is shut off.
104 * @ingroup Ecore_X_DPMS_Group
105 */
106EAPI void
107ecore_x_dpms_timeouts_get(unsigned int *standby,
108 unsigned int *suspend,
109 unsigned int *off)
110{
111#ifdef ECORE_XDPMS
112 LOGFN(__FILE__, __LINE__, __FUNCTION__);
113 DPMSGetTimeouts(_ecore_x_disp, (unsigned short *)standby,
114 (unsigned short *)suspend, (unsigned short *)off);
115#endif /* ifdef ECORE_XDPMS */
116} /* ecore_x_dpms_timeouts_get */
117
118/**
119 * Sets the timeouts. The values are in unit of seconds.
120 * @param standby Amount of time of inactivity before standby mode will be invoked.
121 * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
122 * @param off Amount of time of inactivity before the monitor is shut off.
123 * @ingroup Ecore_X_DPMS_Group
124 */
125EAPI Eina_Bool
126ecore_x_dpms_timeouts_set(unsigned int standby,
127 unsigned int suspend,
128 unsigned int off)
129{
130#ifdef ECORE_XDPMS
131 LOGFN(__FILE__, __LINE__, __FUNCTION__);
132 return DPMSSetTimeouts(_ecore_x_disp, standby, suspend, off) ? EINA_TRUE : EINA_FALSE;
133#else /* ifdef ECORE_XDPMS */
134 return EINA_FALSE;
135#endif /* ifdef ECORE_XDPMS */
136} /* ecore_x_dpms_timeouts_set */
137
138/**
139 * Returns the amount of time of inactivity before standby mode is invoked.
140 * @return The standby timeout value.
141 * @ingroup Ecore_X_DPMS_Group
142 */
143EAPI unsigned int
144ecore_x_dpms_timeout_standby_get(void)
145{
146#ifdef ECORE_XDPMS
147 unsigned short standby, suspend, off;
148
149 LOGFN(__FILE__, __LINE__, __FUNCTION__);
150 DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
151 return standby;
152#else /* ifdef ECORE_XDPMS */
153 return 0;
154#endif /* ifdef ECORE_XDPMS */
155} /* ecore_x_dpms_timeout_standby_get */
156
157/**
158 * Returns the amount of time of inactivity before the second level of
159 * power saving is invoked.
160 * @return The suspend timeout value.
161 * @ingroup Ecore_X_DPMS_Group
162 */
163EAPI unsigned int
164ecore_x_dpms_timeout_suspend_get(void)
165{
166#ifdef ECORE_XDPMS
167 unsigned short standby, suspend, off;
168
169 LOGFN(__FILE__, __LINE__, __FUNCTION__);
170 DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
171 return suspend;
172#else /* ifdef ECORE_XDPMS */
173 return 0;
174#endif /* ifdef ECORE_XDPMS */
175} /* ecore_x_dpms_timeout_suspend_get */
176
177/**
178 * Returns the amount of time of inactivity before the third and final
179 * level of power saving is invoked.
180 * @return The off timeout value.
181 * @ingroup Ecore_X_DPMS_Group
182 */
183EAPI unsigned int
184ecore_x_dpms_timeout_off_get(void)
185{
186#ifdef ECORE_XDPMS
187 unsigned short standby, suspend, off;
188
189 LOGFN(__FILE__, __LINE__, __FUNCTION__);
190 DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
191 return off;
192#else /* ifdef ECORE_XDPMS */
193 return 0;
194#endif /* ifdef ECORE_XDPMS */
195} /* ecore_x_dpms_timeout_off_get */
196
197/**
198 * Sets the standby timeout (in unit of seconds).
199 * @param new_standby Amount of time of inactivity before standby mode will be invoked.
200 * @ingroup Ecore_X_DPMS_Group
201 */
202EAPI void
203ecore_x_dpms_timeout_standby_set(unsigned int new_timeout)
204{
205#ifdef ECORE_XDPMS
206 unsigned short standby, suspend, off;
207
208 LOGFN(__FILE__, __LINE__, __FUNCTION__);
209 DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
210 DPMSSetTimeouts(_ecore_x_disp, new_timeout, suspend, off);
211#endif /* ifdef ECORE_XDPMS */
212} /* ecore_x_dpms_timeout_standby_set */
213
214/**
215 * Sets the suspend timeout (in unit of seconds).
216 * @param suspend Amount of time of inactivity before the screen is placed into suspend mode.
217 * @ingroup Ecore_X_DPMS_Group
218 */
219EAPI void
220ecore_x_dpms_timeout_suspend_set(unsigned int new_timeout)
221{
222#ifdef ECORE_XDPMS
223 unsigned short standby, suspend, off;
224
225 LOGFN(__FILE__, __LINE__, __FUNCTION__);
226 DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
227 DPMSSetTimeouts(_ecore_x_disp, standby, new_timeout, off);
228#endif /* ifdef ECORE_XDPMS */
229} /* ecore_x_dpms_timeout_suspend_set */
230
231/**
232 * Sets the off timeout (in unit of seconds).
233 * @param off Amount of time of inactivity before the monitor is shut off.
234 * @ingroup Ecore_X_DPMS_Group
235 */
236EAPI void
237ecore_x_dpms_timeout_off_set(unsigned int new_timeout)
238{
239#ifdef ECORE_XDPMS
240 unsigned short standby, suspend, off;
241
242 LOGFN(__FILE__, __LINE__, __FUNCTION__);
243 DPMSGetTimeouts(_ecore_x_disp, &standby, &suspend, &off);
244 DPMSSetTimeouts(_ecore_x_disp, standby, suspend, new_timeout);
245#endif /* ifdef ECORE_XDPMS */
246} /* ecore_x_dpms_timeout_off_set */
247
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c
new file mode 100644
index 0000000..a64060b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_drawable.c
@@ -0,0 +1,118 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6
7/**
8 * @defgroup Ecore_X_Drawable_Group X Drawable Functions
9 *
10 * Functions that operate on drawables.
11 */
12
13/**
14 * Retrieves the geometry of the given drawable.
15 * @param d The given drawable.
16 * @param x Pointer to an integer into which the X position is to be stored.
17 * @param y Pointer to an integer into which the Y position is to be stored.
18 * @param w Pointer to an integer into which the width is to be stored.
19 * @param h Pointer to an integer into which the height is to be stored.
20 * @ingroup Ecore_X_Drawable_Group
21 */
22EAPI void
23ecore_x_drawable_geometry_get(Ecore_X_Drawable d,
24 int *x,
25 int *y,
26 int *w,
27 int *h)
28{
29 Window dummy_win;
30 int ret_x, ret_y;
31 unsigned int ret_w, ret_h, dummy_border, dummy_depth;
32
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
34 if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &ret_x, &ret_y,
35 &ret_w, &ret_h, &dummy_border, &dummy_depth))
36 {
37 ret_x = 0;
38 ret_y = 0;
39 ret_w = 0;
40 ret_h = 0;
41 }
42
43 if (x)
44 *x = ret_x;
45
46 if (y)
47 *y = ret_y;
48
49 if (w)
50 *w = (int)ret_w;
51
52 if (h)
53 *h = (int)ret_h;
54} /* ecore_x_drawable_geometry_get */
55
56/**
57 * Retrieves the width of the border of the given drawable.
58 * @param d The given drawable.
59 * @return The border width of the given drawable.
60 * @ingroup Ecore_X_Drawable_Group
61 */
62EAPI int
63ecore_x_drawable_border_width_get(Ecore_X_Drawable d)
64{
65 Window dummy_win;
66 int dummy_x, dummy_y;
67 unsigned int dummy_w, dummy_h, border_ret, dummy_depth;
68
69 LOGFN(__FILE__, __LINE__, __FUNCTION__);
70 if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &dummy_x, &dummy_y,
71 &dummy_w, &dummy_h, &border_ret, &dummy_depth))
72 border_ret = 0;
73
74 return (int)border_ret;
75} /* ecore_x_drawable_border_width_get */
76
77/**
78 * Retrieves the depth of the given drawable.
79 * @param d The given drawable.
80 * @return The depth of the given drawable.
81 * @ingroup Ecore_X_Drawable_Group
82 */
83EAPI int
84ecore_x_drawable_depth_get(Ecore_X_Drawable d)
85{
86 Window dummy_win;
87 int dummy_x, dummy_y;
88 unsigned int dummy_w, dummy_h, dummy_border, depth_ret;
89
90 LOGFN(__FILE__, __LINE__, __FUNCTION__);
91 if (!XGetGeometry(_ecore_x_disp, d, &dummy_win, &dummy_x, &dummy_y,
92 &dummy_w, &dummy_h, &dummy_border, &depth_ret))
93 depth_ret = 0;
94
95 return (int)depth_ret;
96} /* ecore_x_drawable_depth_get */
97
98/**
99 * Fill the specified rectangle on a drawable.
100 * @param d The given drawable.
101 * @param gc The graphic context that controls the fill rules.
102 * @param x The X coordinate of the top-left corner of the rectangle.
103 * @param y The Y coordinate of the top-left corner of the rectangle.
104 * @param width The width of the rectangle.
105 * @param height The height of the rectangle.
106 */
107EAPI void
108ecore_x_drawable_rectangle_fill(Ecore_X_Drawable d,
109 Ecore_X_GC gc,
110 int x,
111 int y,
112 int width,
113 int height)
114{
115 LOGFN(__FILE__, __LINE__, __FUNCTION__);
116 XFillRectangle(_ecore_x_disp, d, gc, x, y, width, height);
117} /* ecore_x_drawable_rectangle_fill */
118
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_e.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_e.c
new file mode 100644
index 0000000..d357c9b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_e.c
@@ -0,0 +1,1060 @@
1/*
2 * OLD E hints
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif /* ifdef HAVE_CONFIG_H */
8
9#include "Ecore.h"
10#include "ecore_x_private.h"
11#include "Ecore_X.h"
12#include "Ecore_X_Atoms.h"
13
14EAPI void
15ecore_x_e_init(void)
16{
17} /* ecore_x_e_init */
18
19EAPI void
20ecore_x_e_frame_size_set(Ecore_X_Window win,
21 int fl,
22 int fr,
23 int ft,
24 int fb)
25{
26 unsigned int frames[4];
27
28 LOGFN(__FILE__, __LINE__, __FUNCTION__);
29 frames[0] = fl;
30 frames[1] = fr;
31 frames[2] = ft;
32 frames[3] = fb;
33 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_FRAME_SIZE, frames, 4);
34} /* ecore_x_e_frame_size_set */
35
36EAPI void
37ecore_x_e_virtual_keyboard_set(Ecore_X_Window win,
38 unsigned int is_keyboard)
39{
40 LOGFN(__FILE__, __LINE__, __FUNCTION__);
41 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
42 &is_keyboard, 1);
43} /* ecore_x_e_virtual_keyboard_set */
44
45EAPI Eina_Bool
46ecore_x_e_virtual_keyboard_get(Ecore_X_Window win)
47{
48 unsigned int val;
49
50 LOGFN(__FILE__, __LINE__, __FUNCTION__);
51 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD,
52 &val, 1))
53 return EINA_FALSE;
54
55 return val ? EINA_TRUE : EINA_FALSE;
56} /* ecore_x_e_virtual_keyboard_get */
57
58static Ecore_X_Virtual_Keyboard_State
59_ecore_x_e_vkbd_state_get(Ecore_X_Atom atom)
60{
61 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON)
62 return ECORE_X_VIRTUAL_KEYBOARD_STATE_ON;
63
64 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF)
65 return ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF;
66
67 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA)
68 return ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA;
69
70 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC)
71 return ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC;
72
73 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN)
74 return ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN;
75
76 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER)
77 return ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER;
78
79 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX)
80 return ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX;
81
82 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL)
83 return ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL;
84
85 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD)
86 return ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD;
87
88 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP)
89 return ECORE_X_VIRTUAL_KEYBOARD_STATE_IP;
90
91 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST)
92 return ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST;
93
94 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE)
95 return ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE;
96
97 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL)
98 return ECORE_X_VIRTUAL_KEYBOARD_STATE_URL;
99
100 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD)
101 return ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD;
102
103 if (atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME)
104 return ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME;
105
106 return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
107} /* _ecore_x_e_vkbd_state_get */
108
109static Ecore_X_Atom
110_ecore_x_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state)
111{
112 switch (state)
113 {
114 case ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF:
115 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_OFF;
116
117 case ECORE_X_VIRTUAL_KEYBOARD_STATE_ON:
118 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ON;
119
120 case ECORE_X_VIRTUAL_KEYBOARD_STATE_ALPHA:
121 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_ALPHA;
122
123 case ECORE_X_VIRTUAL_KEYBOARD_STATE_NUMERIC:
124 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_NUMERIC;
125
126 case ECORE_X_VIRTUAL_KEYBOARD_STATE_PIN:
127 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PIN;
128
129 case ECORE_X_VIRTUAL_KEYBOARD_STATE_PHONE_NUMBER:
130 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PHONE_NUMBER;
131
132 case ECORE_X_VIRTUAL_KEYBOARD_STATE_HEX:
133 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HEX;
134
135 case ECORE_X_VIRTUAL_KEYBOARD_STATE_TERMINAL:
136 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_TERMINAL;
137
138 case ECORE_X_VIRTUAL_KEYBOARD_STATE_PASSWORD:
139 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_PASSWORD;
140
141 case ECORE_X_VIRTUAL_KEYBOARD_STATE_IP:
142 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_IP;
143
144 case ECORE_X_VIRTUAL_KEYBOARD_STATE_HOST:
145 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_HOST;
146
147 case ECORE_X_VIRTUAL_KEYBOARD_STATE_FILE:
148 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_FILE;
149
150 case ECORE_X_VIRTUAL_KEYBOARD_STATE_URL:
151 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_URL;
152
153 case ECORE_X_VIRTUAL_KEYBOARD_STATE_KEYPAD:
154 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_KEYPAD;
155
156 case ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME:
157 return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
158
159 default: break;
160 } /* switch */
161 return 0;
162} /* _ecore_x_e_vkbd_atom_get */
163
164EAPI void
165ecore_x_e_virtual_keyboard_state_set(Ecore_X_Window win,
166 Ecore_X_Virtual_Keyboard_State state)
167{
168 Ecore_X_Atom atom = 0;
169
170 LOGFN(__FILE__, __LINE__, __FUNCTION__);
171 atom = _ecore_x_e_vkbd_atom_get(state);
172 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
173 &atom, 1);
174} /* ecore_x_e_virtual_keyboard_state_set */
175
176EAPI Ecore_X_Virtual_Keyboard_State
177ecore_x_e_virtual_keyboard_state_get(Ecore_X_Window win)
178{
179 Ecore_X_Atom atom;
180
181 LOGFN(__FILE__, __LINE__, __FUNCTION__);
182 if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
183 &atom, 1))
184 return ECORE_X_VIRTUAL_KEYBOARD_STATE_UNKNOWN;
185
186 return _ecore_x_e_vkbd_state_get(atom);
187} /* ecore_x_e_virtual_keyboard_state_get */
188
189EAPI void
190ecore_x_e_virtual_keyboard_state_send(Ecore_X_Window win,
191 Ecore_X_Virtual_Keyboard_State state)
192{
193 LOGFN(__FILE__, __LINE__, __FUNCTION__);
194 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE,
195 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
196 _ecore_x_e_vkbd_atom_get(state),
197 0, 0, 0, 0);
198} /* ecore_x_e_virtual_keyboard_state_send */
199
200static Ecore_X_Atom
201_ecore_x_e_illume_atom_get(Ecore_X_Illume_Mode mode)
202{
203 switch (mode)
204 {
205 case ECORE_X_ILLUME_MODE_SINGLE:
206 return ECORE_X_ATOM_E_ILLUME_MODE_SINGLE;
207
208 case ECORE_X_ILLUME_MODE_DUAL_TOP:
209 return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP;
210
211 case ECORE_X_ILLUME_MODE_DUAL_LEFT:
212 return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
213
214 default:
215 break;
216 } /* switch */
217 return ECORE_X_ILLUME_MODE_UNKNOWN;
218} /* _ecore_x_e_illume_atom_get */
219
220static Ecore_X_Illume_Mode
221_ecore_x_e_illume_mode_get(Ecore_X_Atom atom)
222{
223 if (atom == ECORE_X_ATOM_E_ILLUME_MODE_SINGLE)
224 return ECORE_X_ILLUME_MODE_SINGLE;
225
226 if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_TOP)
227 return ECORE_X_ILLUME_MODE_DUAL_TOP;
228
229 if (atom == ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT)
230 return ECORE_X_ILLUME_MODE_DUAL_LEFT;
231
232 return ECORE_X_ILLUME_MODE_UNKNOWN;
233} /* _ecore_x_e_illume_mode_get */
234
235EAPI void
236ecore_x_e_illume_zone_set(Ecore_X_Window win,
237 Ecore_X_Window zone)
238{
239 LOGFN(__FILE__, __LINE__, __FUNCTION__);
240 ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE,
241 &zone, 1);
242} /* ecore_x_e_illume_zone_set */
243
244EAPI Ecore_X_Window
245ecore_x_e_illume_zone_get(Ecore_X_Window win)
246{
247 Ecore_X_Window zone;
248
249 LOGFN(__FILE__, __LINE__, __FUNCTION__);
250 if (!ecore_x_window_prop_window_get(win, ECORE_X_ATOM_E_ILLUME_ZONE,
251 &zone, 1))
252 return 0;
253
254 return zone;
255} /* ecore_x_e_illume_zone_get */
256
257EAPI void
258ecore_x_e_illume_zone_list_set(Ecore_X_Window win,
259 Ecore_X_Window *zones,
260 unsigned int n_zones)
261{
262 LOGFN(__FILE__, __LINE__, __FUNCTION__);
263 ecore_x_window_prop_window_set(win, ECORE_X_ATOM_E_ILLUME_ZONE_LIST,
264 zones, n_zones);
265} /* ecore_x_e_illume_zone_list_set */
266
267EAPI void
268ecore_x_e_illume_conformant_set(Ecore_X_Window win,
269 unsigned int is_conformant)
270{
271 LOGFN(__FILE__, __LINE__, __FUNCTION__);
272 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
273 &is_conformant, 1);
274} /* ecore_x_e_illume_conformant_set */
275
276EAPI Eina_Bool
277ecore_x_e_illume_conformant_get(Ecore_X_Window win)
278{
279 unsigned int val = 0;
280
281 LOGFN(__FILE__, __LINE__, __FUNCTION__);
282 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_CONFORMANT,
283 &val, 1))
284 return EINA_FALSE;
285
286 return val ? EINA_TRUE : EINA_FALSE;
287} /* ecore_x_e_illume_conformant_get */
288
289EAPI void
290ecore_x_e_illume_mode_set(Ecore_X_Window win,
291 Ecore_X_Illume_Mode mode)
292{
293 Ecore_X_Atom atom = 0;
294
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
296 atom = _ecore_x_e_illume_atom_get(mode);
297 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_MODE,
298 &atom, 1);
299} /* ecore_x_e_illume_mode_set */
300
301EAPI Ecore_X_Illume_Mode
302ecore_x_e_illume_mode_get(Ecore_X_Window win)
303{
304 Ecore_X_Atom atom = 0;
305
306 LOGFN(__FILE__, __LINE__, __FUNCTION__);
307 if (!ecore_x_window_prop_atom_get(win, ECORE_X_ATOM_E_ILLUME_MODE, &atom, 1))
308 return ECORE_X_ILLUME_MODE_UNKNOWN;
309
310 return _ecore_x_e_illume_mode_get(atom);
311} /* ecore_x_e_illume_mode_get */
312
313EAPI void
314ecore_x_e_illume_mode_send(Ecore_X_Window win,
315 Ecore_X_Illume_Mode mode)
316{
317 LOGFN(__FILE__, __LINE__, __FUNCTION__);
318 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_MODE,
319 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
320 _ecore_x_e_illume_atom_get(mode),
321 0, 0, 0, 0);
322} /* ecore_x_e_illume_mode_send */
323
324EAPI void
325ecore_x_e_illume_focus_back_send(Ecore_X_Window win)
326{
327 LOGFN(__FILE__, __LINE__, __FUNCTION__);
328 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_BACK,
329 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
330 1, 0, 0, 0, 0);
331} /* ecore_x_e_illume_focus_back_send */
332
333EAPI void
334ecore_x_e_illume_focus_forward_send(Ecore_X_Window win)
335{
336 LOGFN(__FILE__, __LINE__, __FUNCTION__);
337 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_FORWARD,
338 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
339 1, 0, 0, 0, 0);
340} /* ecore_x_e_illume_focus_forward_send */
341
342EAPI void
343ecore_x_e_illume_focus_home_send(Ecore_X_Window win)
344{
345 LOGFN(__FILE__, __LINE__, __FUNCTION__);
346 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_FOCUS_HOME,
347 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
348 1, 0, 0, 0, 0);
349} /* ecore_x_e_illume_focus_home_send */
350
351EAPI void
352ecore_x_e_illume_close_send(Ecore_X_Window win)
353{
354 LOGFN(__FILE__, __LINE__, __FUNCTION__);
355 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_CLOSE,
356 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
357 1, 0, 0, 0, 0);
358} /* ecore_x_e_illume_close_send */
359
360EAPI void
361ecore_x_e_illume_home_new_send(Ecore_X_Window win)
362{
363 LOGFN(__FILE__, __LINE__, __FUNCTION__);
364 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_NEW,
365 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
366 1, 0, 0, 0, 0);
367} /* ecore_x_e_illume_home_new_send */
368
369EAPI void
370ecore_x_e_illume_home_del_send(Ecore_X_Window win)
371{
372 LOGFN(__FILE__, __LINE__, __FUNCTION__);
373 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_HOME_DEL,
374 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
375 1, 0, 0, 0, 0);
376} /* ecore_x_e_illume_home_del_send */
377
378EAPI void
379ecore_x_e_illume_drag_set(Ecore_X_Window win,
380 unsigned int drag)
381{
382 LOGFN(__FILE__, __LINE__, __FUNCTION__);
383 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG, &drag, 1);
384} /* ecore_x_e_illume_drag_set */
385
386EAPI Eina_Bool
387ecore_x_e_illume_drag_get(Ecore_X_Window win)
388{
389 unsigned int val = 0;
390
391 LOGFN(__FILE__, __LINE__, __FUNCTION__);
392 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG, &val, 1))
393 return EINA_FALSE;
394
395 return val ? EINA_TRUE : EINA_FALSE;
396} /* ecore_x_e_illume_drag_get */
397
398EAPI void
399ecore_x_e_illume_drag_locked_set(Ecore_X_Window win,
400 unsigned int is_locked)
401{
402 LOGFN(__FILE__, __LINE__, __FUNCTION__);
403 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
404 &is_locked, 1);
405} /* ecore_x_e_illume_drag_locked_set */
406
407EAPI Eina_Bool
408ecore_x_e_illume_drag_locked_get(Ecore_X_Window win)
409{
410 unsigned int val = 0;
411
412 LOGFN(__FILE__, __LINE__, __FUNCTION__);
413 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED,
414 &val, 1))
415 return EINA_FALSE;
416
417 return val ? EINA_TRUE : EINA_FALSE;
418} /* ecore_x_e_illume_drag_locked_get */
419
420EAPI void
421ecore_x_e_illume_drag_start_send(Ecore_X_Window win)
422{
423 LOGFN(__FILE__, __LINE__, __FUNCTION__);
424 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_START,
425 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
426 1, 0, 0, 0, 0);
427} /* ecore_x_e_illume_drag_start_send */
428
429EAPI void
430ecore_x_e_illume_drag_end_send(Ecore_X_Window win)
431{
432 LOGFN(__FILE__, __LINE__, __FUNCTION__);
433 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_DRAG_END,
434 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
435 1, 0, 0, 0, 0);
436} /* ecore_x_e_illume_drag_end_send */
437
438EAPI void
439ecore_x_e_illume_indicator_geometry_set(Ecore_X_Window win,
440 int x,
441 int y,
442 int w,
443 int h)
444{
445 unsigned int geom[4];
446
447 LOGFN(__FILE__, __LINE__, __FUNCTION__);
448 geom[0] = x;
449 geom[1] = y;
450 geom[2] = w;
451 geom[3] = h;
452 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
453 geom, 4);
454} /* ecore_x_e_illume_indicator_geometry_set */
455
456EAPI Eina_Bool
457ecore_x_e_illume_indicator_geometry_get(Ecore_X_Window win,
458 int *x,
459 int *y,
460 int *w,
461 int *h)
462{
463 int ret = 0;
464 unsigned int geom[4];
465
466 LOGFN(__FILE__, __LINE__, __FUNCTION__);
467 ret =
468 ecore_x_window_prop_card32_get(win,
469 ECORE_X_ATOM_E_ILLUME_INDICATOR_GEOMETRY,
470 geom, 4);
471 if (ret != 4)
472 return EINA_FALSE;
473
474 if (x)
475 *x = geom[0];
476
477 if (y)
478 *y = geom[1];
479
480 if (w)
481 *w = geom[2];
482
483 if (h)
484 *h = geom[3];
485
486 return EINA_TRUE;
487} /* ecore_x_e_illume_indicator_geometry_get */
488
489EAPI void
490ecore_x_e_illume_softkey_geometry_set(Ecore_X_Window win,
491 int x,
492 int y,
493 int w,
494 int h)
495{
496 unsigned int geom[4];
497
498 LOGFN(__FILE__, __LINE__, __FUNCTION__);
499 geom[0] = x;
500 geom[1] = y;
501 geom[2] = w;
502 geom[3] = h;
503 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
504 geom, 4);
505} /* ecore_x_e_illume_softkey_geometry_set */
506
507EAPI Eina_Bool
508ecore_x_e_illume_softkey_geometry_get(Ecore_X_Window win,
509 int *x,
510 int *y,
511 int *w,
512 int *h)
513{
514 int ret = 0;
515 unsigned int geom[4];
516
517 LOGFN(__FILE__, __LINE__, __FUNCTION__);
518 ret =
519 ecore_x_window_prop_card32_get(win,
520 ECORE_X_ATOM_E_ILLUME_SOFTKEY_GEOMETRY,
521 geom, 4);
522 if (ret != 4)
523 return EINA_FALSE;
524
525 if (x)
526 *x = geom[0];
527
528 if (y)
529 *y = geom[1];
530
531 if (w)
532 *w = geom[2];
533
534 if (h)
535 *h = geom[3];
536
537 return EINA_TRUE;
538} /* ecore_x_e_illume_softkey_geometry_get */
539
540EAPI void
541ecore_x_e_illume_keyboard_geometry_set(Ecore_X_Window win,
542 int x,
543 int y,
544 int w,
545 int h)
546{
547 unsigned int geom[4];
548
549 LOGFN(__FILE__, __LINE__, __FUNCTION__);
550 geom[0] = x;
551 geom[1] = y;
552 geom[2] = w;
553 geom[3] = h;
554 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
555 geom, 4);
556} /* ecore_x_e_illume_keyboard_geometry_set */
557
558EAPI Eina_Bool
559ecore_x_e_illume_keyboard_geometry_get(Ecore_X_Window win,
560 int *x,
561 int *y,
562 int *w,
563 int *h)
564{
565 int ret = 0;
566 unsigned int geom[4];
567
568 LOGFN(__FILE__, __LINE__, __FUNCTION__);
569 ret =
570 ecore_x_window_prop_card32_get(win,
571 ECORE_X_ATOM_E_ILLUME_KEYBOARD_GEOMETRY,
572 geom, 4);
573 if (ret != 4)
574 return EINA_FALSE;
575
576 if (x)
577 *x = geom[0];
578
579 if (y)
580 *y = geom[1];
581
582 if (w)
583 *w = geom[2];
584
585 if (h)
586 *h = geom[3];
587
588 return EINA_TRUE;
589} /* ecore_x_e_illume_keyboard_geometry_get */
590
591static Ecore_X_Atom
592_ecore_x_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state)
593{
594 switch (state)
595 {
596 case ECORE_X_ILLUME_QUICKPANEL_STATE_ON:
597 return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON;
598
599 case ECORE_X_ILLUME_QUICKPANEL_STATE_OFF:
600 return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
601
602 default:
603 break;
604 } /* switch */
605 return 0;
606} /* _ecore_x_e_quickpanel_atom_get */
607
608static Ecore_X_Illume_Quickpanel_State
609_ecore_x_e_quickpanel_state_get(Ecore_X_Atom atom)
610{
611 if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON)
612 return ECORE_X_ILLUME_QUICKPANEL_STATE_ON;
613
614 if (atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF)
615 return ECORE_X_ILLUME_QUICKPANEL_STATE_OFF;
616
617 return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
618} /* _ecore_x_e_quickpanel_state_get */
619
620EAPI void
621ecore_x_e_illume_quickpanel_set(Ecore_X_Window win,
622 unsigned int is_quickpanel)
623{
624 LOGFN(__FILE__, __LINE__, __FUNCTION__);
625 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
626 &is_quickpanel, 1);
627} /* ecore_x_e_illume_quickpanel_set */
628
629EAPI Eina_Bool
630ecore_x_e_illume_quickpanel_get(Ecore_X_Window win)
631{
632 unsigned int val = 0;
633
634 LOGFN(__FILE__, __LINE__, __FUNCTION__);
635 if (!ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL,
636 &val, 1))
637 return EINA_FALSE;
638
639 return val ? EINA_TRUE : EINA_FALSE;
640} /* ecore_x_e_illume_quickpanel_get */
641
642EAPI void
643ecore_x_e_illume_quickpanel_state_set(Ecore_X_Window win,
644 Ecore_X_Illume_Quickpanel_State state)
645{
646 Ecore_X_Atom atom = 0;
647
648 LOGFN(__FILE__, __LINE__, __FUNCTION__);
649 atom = _ecore_x_e_quickpanel_atom_get(state);
650 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
651 &atom, 1);
652} /* ecore_x_e_illume_quickpanel_state_set */
653
654EAPI Ecore_X_Illume_Quickpanel_State
655ecore_x_e_illume_quickpanel_state_get(Ecore_X_Window win)
656{
657 Ecore_X_Atom atom;
658
659 LOGFN(__FILE__, __LINE__, __FUNCTION__);
660 if (!ecore_x_window_prop_atom_get(win,
661 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
662 &atom, 1))
663 return ECORE_X_ILLUME_QUICKPANEL_STATE_UNKNOWN;
664
665 return _ecore_x_e_quickpanel_state_get(atom);
666} /* ecore_x_e_illume_quickpanel_state_get */
667
668EAPI void
669ecore_x_e_illume_quickpanel_state_send(Ecore_X_Window win,
670 Ecore_X_Illume_Quickpanel_State state)
671{
672 LOGFN(__FILE__, __LINE__, __FUNCTION__);
673 ecore_x_client_message32_send(win, ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE,
674 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
675 _ecore_x_e_quickpanel_atom_get(state),
676 0, 0, 0, 0);
677} /* ecore_x_e_illume_quickpanel_state_send */
678
679EAPI void
680ecore_x_e_illume_quickpanel_state_toggle(Ecore_X_Window win)
681{
682 LOGFN(__FILE__, __LINE__, __FUNCTION__);
683 ecore_x_client_message32_send(win,
684 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE_TOGGLE,
685 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
686 0, 0, 0, 0, 0);
687} /* ecore_x_e_illume_quickpanel_state_toggle */
688
689EAPI void
690ecore_x_e_illume_quickpanel_priority_major_set(Ecore_X_Window win,
691 unsigned int priority)
692{
693 LOGFN(__FILE__, __LINE__, __FUNCTION__);
694 ecore_x_window_prop_card32_set(win,
695 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
696 &priority, 1);
697} /* ecore_x_e_illume_quickpanel_priority_major_set */
698
699EAPI int
700ecore_x_e_illume_quickpanel_priority_major_get(Ecore_X_Window win)
701{
702 unsigned int val = 0;
703
704 LOGFN(__FILE__, __LINE__, __FUNCTION__);
705 if (!ecore_x_window_prop_card32_get(win,
706 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR,
707 &val, 1))
708 return 0;
709
710 return val;
711} /* ecore_x_e_illume_quickpanel_priority_major_get */
712
713EAPI void
714ecore_x_e_illume_quickpanel_priority_minor_set(Ecore_X_Window win,
715 unsigned int priority)
716{
717 LOGFN(__FILE__, __LINE__, __FUNCTION__);
718 ecore_x_window_prop_card32_set(win,
719 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
720 &priority, 1);
721} /* ecore_x_e_illume_quickpanel_priority_minor_set */
722
723EAPI int
724ecore_x_e_illume_quickpanel_priority_minor_get(Ecore_X_Window win)
725{
726 unsigned int val = 0;
727
728 LOGFN(__FILE__, __LINE__, __FUNCTION__);
729 if (!ecore_x_window_prop_card32_get(win,
730 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR,
731 &val, 1))
732 return 0;
733
734 return val;
735} /* ecore_x_e_illume_quickpanel_priority_minor_get */
736
737EAPI void
738ecore_x_e_illume_quickpanel_zone_set(Ecore_X_Window win,
739 unsigned int zone)
740{
741 LOGFN(__FILE__, __LINE__, __FUNCTION__);
742 ecore_x_window_prop_card32_set(win,
743 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
744 &zone, 1);
745} /* ecore_x_e_illume_quickpanel_zone_set */
746
747EAPI int
748ecore_x_e_illume_quickpanel_zone_get(Ecore_X_Window win)
749{
750 unsigned int val = 0;
751
752 LOGFN(__FILE__, __LINE__, __FUNCTION__);
753 if (!ecore_x_window_prop_card32_get(win,
754 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE,
755 &val, 1))
756 return 0;
757
758 return val;
759} /* ecore_x_e_illume_quickpanel_zone_get */
760
761EAPI void
762ecore_x_e_illume_quickpanel_position_update_send(Ecore_X_Window win)
763{
764 LOGFN(__FILE__, __LINE__, __FUNCTION__);
765 ecore_x_client_message32_send(win,
766 ECORE_X_ATOM_E_ILLUME_QUICKPANEL_POSITION_UPDATE,
767 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
768 1, 0, 0, 0, 0);
769} /* ecore_x_e_illume_quickpanel_position_update_send */
770
771EAPI void
772ecore_x_e_comp_sync_counter_set(Ecore_X_Window win,
773 Ecore_X_Sync_Counter counter)
774{
775 LOGFN(__FILE__, __LINE__, __FUNCTION__);
776 if (counter)
777 ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
778 ECORE_X_ATOM_CARDINAL, &counter, 1);
779 else
780 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_E_COMP_SYNC_COUNTER);
781} /* ecore_x_e_comp_sync_counter_set */
782
783EAPI Ecore_X_Sync_Counter
784ecore_x_e_comp_sync_counter_get(Ecore_X_Window win)
785{
786 int ret = 0;
787 Ecore_X_Sync_Counter counter = 0;
788
789 LOGFN(__FILE__, __LINE__, __FUNCTION__);
790 ret =
791 ecore_x_window_prop_xid_get(win,
792 ECORE_X_ATOM_E_COMP_SYNC_COUNTER,
793 ECORE_X_ATOM_CARDINAL,
794 &counter, 1);
795 if (ret != 1)
796 return 0;
797
798 return counter;
799} /* ecore_x_e_comp_sync_counter_get */
800
801EAPI void
802ecore_x_e_comp_sync_draw_done_send(Ecore_X_Window root,
803 Ecore_X_Window win)
804{
805 XEvent xev;
806
807 LOGFN(__FILE__, __LINE__, __FUNCTION__);
808 if (!root)
809 root = DefaultRootWindow(_ecore_x_disp);
810
811 xev.xclient.type = ClientMessage;
812 xev.xclient.display = _ecore_x_disp;
813 xev.xclient.window = win;
814 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
815 xev.xclient.format = 32;
816 xev.xclient.data.l[0] = win;
817 xev.xclient.data.l[1] = 0; // version
818 xev.xclient.data.l[2] = 0; // later
819 xev.xclient.data.l[3] = 0; // later
820 xev.xclient.data.l[4] = 0; // later
821
822 XSendEvent(_ecore_x_disp, root, False,
823 SubstructureRedirectMask | SubstructureNotifyMask,
824 &xev);
825} /* ecore_x_e_comp_sync_draw_done_send */
826
827EAPI void
828ecore_x_e_comp_sync_draw_size_done_send(Ecore_X_Window root,
829 Ecore_X_Window win,
830 int w,
831 int h)
832{
833 XEvent xev;
834
835 LOGFN(__FILE__, __LINE__, __FUNCTION__);
836 if (!root)
837 root = DefaultRootWindow(_ecore_x_disp);
838
839 xev.xclient.type = ClientMessage;
840 xev.xclient.display = _ecore_x_disp;
841 xev.xclient.window = win;
842 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_DRAW_DONE;
843 xev.xclient.format = 32;
844 xev.xclient.data.l[0] = win;
845 xev.xclient.data.l[1] = 1; // version
846 xev.xclient.data.l[2] = w; // win width at draw time
847 xev.xclient.data.l[3] = h; // win height at draw time
848 xev.xclient.data.l[4] = 0; // later
849
850 XSendEvent(_ecore_x_disp, root, False,
851 SubstructureRedirectMask | SubstructureNotifyMask,
852 &xev);
853} /* ecore_x_e_comp_sync_draw_done_send */
854
855EAPI void
856ecore_x_e_comp_sync_supported_set(Ecore_X_Window root,
857 Eina_Bool enabled)
858{
859 Ecore_X_Window win;
860
861 if (!root)
862 root = DefaultRootWindow(_ecore_x_disp);
863
864 LOGFN(__FILE__, __LINE__, __FUNCTION__);
865 if (enabled)
866 {
867 win = ecore_x_window_new(root, 1, 2, 3, 4);
868 ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
869 ECORE_X_ATOM_WINDOW, &win, 1);
870 ecore_x_window_prop_xid_set(root, ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
871 ECORE_X_ATOM_WINDOW, &win, 1);
872 }
873 else
874 {
875 int ret;
876
877 ret =
878 ecore_x_window_prop_xid_get(root,
879 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
880 ECORE_X_ATOM_WINDOW,
881 &win, 1);
882 if ((ret == 1) && (win))
883 {
884 ecore_x_window_prop_property_del(
885 root,
886 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED);
887 ecore_x_window_free(win);
888 }
889 }
890} /* ecore_x_e_comp_sync_supported_set */
891
892EAPI Eina_Bool
893ecore_x_e_comp_sync_supported_get(Ecore_X_Window root)
894{
895 Ecore_X_Window win, win2;
896 int ret;
897
898 LOGFN(__FILE__, __LINE__, __FUNCTION__);
899 if (!root)
900 root = DefaultRootWindow(_ecore_x_disp);
901
902 ret =
903 ecore_x_window_prop_xid_get(root,
904 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
905 ECORE_X_ATOM_WINDOW,
906 &win, 1);
907 if ((ret == 1) && (win))
908 {
909 ret =
910 ecore_x_window_prop_xid_get(win,
911 ECORE_X_ATOM_E_COMP_SYNC_SUPPORTED,
912 ECORE_X_ATOM_WINDOW,
913 &win2, 1);
914 if ((ret == 1) && (win2 == win))
915 return EINA_TRUE;
916 }
917
918 return EINA_FALSE;
919} /* ecore_x_e_comp_sync_supported_get */
920
921EAPI void
922ecore_x_e_comp_sync_begin_send(Ecore_X_Window win)
923{
924 XEvent xev;
925
926 LOGFN(__FILE__, __LINE__, __FUNCTION__);
927 xev.xclient.type = ClientMessage;
928 xev.xclient.display = _ecore_x_disp;
929 xev.xclient.window = win;
930 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_BEGIN;
931 xev.xclient.format = 32;
932 xev.xclient.data.l[0] = win;
933 xev.xclient.data.l[1] = 0; // later
934 xev.xclient.data.l[2] = 0; // later
935 xev.xclient.data.l[3] = 0; // later
936 xev.xclient.data.l[4] = 0; // later
937
938 XSendEvent(_ecore_x_disp, win, False,
939 NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
940 &xev);
941} /* ecore_x_e_comp_sync_begin_send */
942
943EAPI void
944ecore_x_e_comp_sync_end_send(Ecore_X_Window win)
945{
946 XEvent xev;
947
948 LOGFN(__FILE__, __LINE__, __FUNCTION__);
949 xev.xclient.type = ClientMessage;
950 xev.xclient.display = _ecore_x_disp;
951 xev.xclient.window = win;
952 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_END;
953 xev.xclient.format = 32;
954 xev.xclient.data.l[0] = win;
955 xev.xclient.data.l[1] = 0; // later
956 xev.xclient.data.l[2] = 0; // later
957 xev.xclient.data.l[3] = 0; // later
958 xev.xclient.data.l[4] = 0; // later
959
960 XSendEvent(_ecore_x_disp, win, False,
961 NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
962 &xev);
963} /* ecore_x_e_comp_sync_end_send */
964
965EAPI void
966ecore_x_e_comp_sync_cancel_send(Ecore_X_Window win)
967{
968 XEvent xev;
969
970 LOGFN(__FILE__, __LINE__, __FUNCTION__);
971 xev.xclient.type = ClientMessage;
972 xev.xclient.display = _ecore_x_disp;
973 xev.xclient.window = win;
974 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_SYNC_CANCEL;
975 xev.xclient.format = 32;
976 xev.xclient.data.l[0] = win;
977 xev.xclient.data.l[1] = 0; // later
978 xev.xclient.data.l[2] = 0; // later
979 xev.xclient.data.l[3] = 0; // later
980 xev.xclient.data.l[4] = 0; // later
981
982 XSendEvent(_ecore_x_disp, win, False,
983 NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
984 &xev);
985} /* ecore_x_e_comp_sync_cancel_send */
986
987EAPI void
988ecore_x_e_comp_flush_send(Ecore_X_Window win)
989{
990 XEvent xev;
991
992 LOGFN(__FILE__, __LINE__, __FUNCTION__);
993 xev.xclient.type = ClientMessage;
994 xev.xclient.display = _ecore_x_disp;
995 xev.xclient.window = win;
996 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_FLUSH;
997 xev.xclient.format = 32;
998 xev.xclient.data.l[0] = win;
999 xev.xclient.data.l[1] = 0; // later
1000 xev.xclient.data.l[2] = 0; // later
1001 xev.xclient.data.l[3] = 0; // later
1002 xev.xclient.data.l[4] = 0; // later
1003
1004 XSendEvent(_ecore_x_disp, win, False,
1005 NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
1006 &xev);
1007} /* ecore_x_e_comp_flush_send */
1008
1009EAPI void
1010ecore_x_e_comp_dump_send(Ecore_X_Window win)
1011{
1012 XEvent xev;
1013
1014 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1015 xev.xclient.type = ClientMessage;
1016 xev.xclient.display = _ecore_x_disp;
1017 xev.xclient.window = win;
1018 xev.xclient.message_type = ECORE_X_ATOM_E_COMP_DUMP;
1019 xev.xclient.format = 32;
1020 xev.xclient.data.l[0] = win;
1021 xev.xclient.data.l[1] = 0; // later
1022 xev.xclient.data.l[2] = 0; // later
1023 xev.xclient.data.l[3] = 0; // later
1024 xev.xclient.data.l[4] = 0; // later
1025
1026 XSendEvent(_ecore_x_disp, win, False,
1027 NoEventMask, //SubstructureRedirectMask | SubstructureNotifyMask,
1028 &xev);
1029} /* ecore_x_e_comp_dump_send */
1030
1031EAPI void
1032ecore_x_e_comp_pixmap_set(Ecore_X_Window win,
1033 Ecore_X_Pixmap pixmap)
1034{
1035 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1036 if (pixmap)
1037 ecore_x_window_prop_xid_set(win, ECORE_X_ATOM_E_COMP_PIXMAP,
1038 ECORE_X_ATOM_PIXMAP, &pixmap, 1);
1039 else
1040 ecore_x_window_prop_property_del(win, pixmap);
1041} /* ecore_x_e_comp_pixmap_set */
1042
1043EAPI Ecore_X_Pixmap
1044ecore_x_e_comp_pixmap_get(Ecore_X_Window win)
1045{
1046 int ret = 0;
1047 Ecore_X_Pixmap pixmap = 0;
1048
1049 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1050 ret =
1051 ecore_x_window_prop_xid_get(win,
1052 ECORE_X_ATOM_E_COMP_PIXMAP,
1053 ECORE_X_ATOM_PIXMAP,
1054 &pixmap, 1);
1055 if (ret != 1)
1056 return 0;
1057
1058 return pixmap;
1059} /* ecore_x_e_comp_pixmap_get */
1060
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_error.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_error.c
new file mode 100644
index 0000000..837ff53
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_error.c
@@ -0,0 +1,111 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_private.h"
9#include "ecore_x_private.h"
10#include "Ecore_X.h"
11
12static int _ecore_x_error_handle(Display *d,
13 XErrorEvent *ev);
14static int _ecore_x_io_error_handle(Display *d);
15
16static void (*_error_func)(void *data) = NULL;
17static void *_error_data = NULL;
18static void (*_io_error_func)(void *data) = NULL;
19static void *_io_error_data = NULL;
20static int _error_request_code = 0;
21static int _error_code = 0;
22
23/**
24 * Set the error handler.
25 * @param func The error handler function
26 * @param data The data to be passed to the handler function
27 *
28 * Set the X error handler function
29 */
30EAPI void
31ecore_x_error_handler_set(void (*func)(void *data),
32 const void *data)
33{
34 _error_func = func;
35 _error_data = (void *)data;
36} /* ecore_x_error_handler_set */
37
38/**
39 * Set the I/O error handler.
40 * @param func The I/O error handler function
41 * @param data The data to be passed to the handler function
42 *
43 * Set the X I/O error handler function
44 */
45EAPI void
46ecore_x_io_error_handler_set(void (*func)(void *data),
47 const void *data)
48{
49 _io_error_func = func;
50 _io_error_data = (void *)data;
51} /* ecore_x_io_error_handler_set */
52
53/**
54 * Get the request code that caused the error.
55 * @return The request code causing the X error
56 *
57 * Return the X request code that caused the last X error
58 */
59EAPI int
60ecore_x_error_request_get(void)
61{
62 return _error_request_code;
63} /* ecore_x_error_request_get */
64
65/**
66 * Get the error code from the error.
67 * @return The error code from the X error
68 *
69 * Return the error code from the last X error
70 */
71EAPI int
72ecore_x_error_code_get(void)
73{
74 return _error_code;
75} /* ecore_x_error_code_get */
76
77void
78_ecore_x_error_handler_init(void)
79{
80 XSetErrorHandler((XErrorHandler)_ecore_x_error_handle);
81 XSetIOErrorHandler((XIOErrorHandler)_ecore_x_io_error_handle);
82} /* _ecore_x_error_handler_init */
83
84static int
85_ecore_x_error_handle(Display *d,
86 XErrorEvent *ev)
87{
88 if (d == _ecore_x_disp)
89 {
90 _error_request_code = ev->request_code;
91 _error_code = ev->error_code;
92 if (_error_func)
93 _error_func(_error_data);
94 }
95 return 0;
96} /* _ecore_x_error_handle */
97
98static int
99_ecore_x_io_error_handle(Display *d)
100{
101 if (d == _ecore_x_disp)
102 {
103 if (_io_error_func)
104 _io_error_func(_io_error_data);
105 else
106 exit(-1);
107 }
108
109 return 0;
110} /* _ecore_x_io_error_handle */
111
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_events.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_events.c
new file mode 100644
index 0000000..136cd63
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_events.c
@@ -0,0 +1,2486 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8
9#include <langinfo.h>
10
11#include "Ecore.h"
12#include "ecore_private.h"
13#include "ecore_x_private.h"
14#include "Ecore_X.h"
15#include "Ecore_X_Atoms.h"
16
17/** OpenBSD does not define CODESET
18 * FIXME ??
19 */
20
21#ifndef CODESET
22#define CODESET "INVALID"
23#endif /* ifndef CODESET */
24
25typedef struct _Ecore_X_Mouse_Down_Info
26{
27 EINA_INLIST;
28 int dev;
29 Window last_win;
30 Window last_last_win;
31 Window last_event_win;
32 Window last_last_event_win;
33 Time last_time;
34 Time last_last_time;
35 Eina_Bool did_double : 1;
36 Eina_Bool did_triple : 1;
37} Ecore_X_Mouse_Down_Info;
38
39static int _ecore_x_last_event_mouse_move = 0;
40static Ecore_Event *_ecore_x_last_event_mouse_move_event = NULL;
41static Eina_Inlist *_ecore_x_mouse_down_info_list = NULL;
42
43static void
44_ecore_x_mouse_down_info_clear(void)
45{
46 Eina_Inlist *l = _ecore_x_mouse_down_info_list;
47 Ecore_X_Mouse_Down_Info *info = NULL;
48 while (l)
49 {
50 info = EINA_INLIST_CONTAINER_GET(l, Ecore_X_Mouse_Down_Info);
51 l = eina_inlist_remove(l, l);
52 free(info);
53 }
54 _ecore_x_mouse_down_info_list = NULL;
55}
56
57void
58_ecore_x_events_init(void)
59{
60 //Actually, Nothing to do.
61}
62
63void
64_ecore_x_events_shutdown(void)
65{
66 _ecore_x_mouse_down_info_clear();
67}
68
69static Ecore_X_Mouse_Down_Info *
70_ecore_x_mouse_down_info_get(int dev)
71{
72 Eina_Inlist *l = _ecore_x_mouse_down_info_list;
73 Ecore_X_Mouse_Down_Info *info = NULL;
74
75 //Return the exist info
76 EINA_INLIST_FOREACH(l, info)
77 if (info->dev == dev) return info;
78
79 //New Device. Add it.
80 info = calloc(1, sizeof(Ecore_X_Mouse_Down_Info));
81 if (!info) return NULL;
82
83 info->dev = dev;
84 l = eina_inlist_append(l, (Eina_Inlist *)info);
85 _ecore_x_mouse_down_info_list = l;
86 return info;
87}
88
89static void
90_ecore_x_event_free_mouse_move(void *data __UNUSED__,
91 void *ev)
92{
93 Ecore_Event_Mouse_Move *e;
94
95 e = ev;
96 if (_ecore_x_last_event_mouse_move)
97 {
98 _ecore_x_last_event_mouse_move_event = NULL;
99 _ecore_x_last_event_mouse_move = 0;
100 }
101
102 free(e);
103} /* _ecore_x_event_free_mouse_move */
104
105EAPI void
106ecore_x_event_mask_set(Ecore_X_Window w,
107 Ecore_X_Event_Mask mask)
108{
109 XWindowAttributes attr;
110 XSetWindowAttributes s_attr;
111
112 LOGFN(__FILE__, __LINE__, __FUNCTION__);
113 if (!w)
114 w = DefaultRootWindow(_ecore_x_disp);
115
116 memset(&attr, 0, sizeof(XWindowAttributes));
117 XGetWindowAttributes(_ecore_x_disp, w, &attr);
118 s_attr.event_mask = mask | attr.your_event_mask;
119 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
120} /* ecore_x_event_mask_set */
121
122EAPI void
123ecore_x_event_mask_unset(Ecore_X_Window w,
124 Ecore_X_Event_Mask mask)
125{
126 XWindowAttributes attr;
127 XSetWindowAttributes s_attr;
128
129 LOGFN(__FILE__, __LINE__, __FUNCTION__);
130 if (!w)
131 w = DefaultRootWindow(_ecore_x_disp);
132
133 memset(&attr, 0, sizeof(XWindowAttributes));
134 XGetWindowAttributes(_ecore_x_disp, w, &attr);
135 s_attr.event_mask = attr.your_event_mask & ~mask;
136 XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr);
137} /* ecore_x_event_mask_unset */
138
139static void
140_ecore_x_event_free_xdnd_enter(void *data __UNUSED__,
141 void *ev)
142{
143 Ecore_X_Event_Xdnd_Enter *e;
144 int i;
145
146 e = ev;
147 for (i = 0; i < e->num_types; i++)
148 XFree(e->types[i]);
149 free(e->types);
150 free(e);
151} /* _ecore_x_event_free_xdnd_enter */
152
153static void
154_ecore_x_event_free_selection_notify(void *data __UNUSED__,
155 void *ev)
156{
157 Ecore_X_Event_Selection_Notify *e;
158 Ecore_X_Selection_Data *sel;
159
160 e = ev;
161 sel = e->data;
162 if (sel->free)
163 sel->free(sel);
164
165 free(e->target);
166 free(e);
167} /* _ecore_x_event_free_selection_notify */
168
169static unsigned int
170_ecore_x_event_modifiers(unsigned int state)
171{
172 unsigned int modifiers = 0;
173
174 if (state & ECORE_X_MODIFIER_SHIFT)
175 modifiers |= ECORE_EVENT_MODIFIER_SHIFT;
176
177 if (state & ECORE_X_MODIFIER_CTRL)
178 modifiers |= ECORE_EVENT_MODIFIER_CTRL;
179
180 if (state & ECORE_X_MODIFIER_ALT)
181 modifiers |= ECORE_EVENT_MODIFIER_ALT;
182
183 if (state & ECORE_X_MODIFIER_WIN)
184 modifiers |= ECORE_EVENT_MODIFIER_WIN;
185
186 if (state & ECORE_X_LOCK_SCROLL)
187 modifiers |= ECORE_EVENT_LOCK_SCROLL;
188
189 if (state & ECORE_X_LOCK_NUM)
190 modifiers |= ECORE_EVENT_LOCK_NUM;
191
192 if (state & ECORE_X_LOCK_CAPS)
193 modifiers |= ECORE_EVENT_LOCK_CAPS;
194
195 if (state & ECORE_X_LOCK_SHIFT)
196 modifiers |= ECORE_EVENT_LOCK_SHIFT;
197
198 return modifiers;
199} /* _ecore_x_event_modifiers */
200
201void
202_ecore_mouse_move(unsigned int timestamp,
203 unsigned int xmodifiers,
204 int x,
205 int y,
206 int x_root,
207 int y_root,
208 unsigned int event_window,
209 unsigned int window,
210 unsigned int root_win,
211 int same_screen,
212 int dev,
213 double radx,
214 double rady,
215 double pressure,
216 double angle,
217 double mx,
218 double my,
219 double mrx,
220 double mry)
221{
222 Ecore_Event_Mouse_Move *e;
223 Ecore_Event *event;
224
225 e = malloc(sizeof(Ecore_Event_Mouse_Move));
226 if (!e)
227 return;
228
229 e->window = window;
230 e->root_window = root_win;
231 e->timestamp = timestamp;
232 e->same_screen = same_screen;
233 e->event_window = event_window;
234
235 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
236 e->x = x;
237 e->y = y;
238 e->root.x = x_root;
239 e->root.y = y_root;
240
241 e->multi.device = dev;
242 e->multi.radius = (radx + rady) / 2;
243 e->multi.radius_x = radx;
244 e->multi.radius_y = rady;
245 e->multi.pressure = pressure;
246 e->multi.angle = angle;
247 e->multi.x = mx;
248 e->multi.y = my;
249 e->multi.root.x = mrx;
250 e->multi.root.y = mry;
251
252 event = ecore_event_add(ECORE_EVENT_MOUSE_MOVE,
253 e,
254 _ecore_x_event_free_mouse_move,
255 NULL);
256
257 _ecore_x_event_last_time = timestamp;
258 _ecore_x_event_last_win = window;
259 _ecore_x_event_last_root_x = x_root;
260 _ecore_x_event_last_root_y = y_root;
261
262 _ecore_x_last_event_mouse_move_event = event;
263} /* _ecore_mouse_move */
264
265static void
266_ecore_key_press(int event,
267 XKeyEvent *xevent)
268{
269 Ecore_Event_Key *e;
270 char *compose = NULL;
271 char *tmp = NULL;
272 char *keyname;
273 char *key;
274 char keyname_buffer[256];
275 char compose_buffer[256];
276 KeySym sym;
277 XComposeStatus status;
278 int val;
279
280 _ecore_x_last_event_mouse_move = 0;
281 keyname = XKeysymToString(XKeycodeToKeysym(xevent->display,
282 xevent->keycode, 0));
283 if (!keyname)
284 {
285 snprintf(keyname_buffer,
286 sizeof(keyname_buffer),
287 "Keycode-%i",
288 xevent->keycode);
289 keyname = keyname_buffer;
290 }
291
292 sym = 0;
293 key = NULL;
294 compose = NULL;
295 val = XLookupString(xevent,
296 compose_buffer,
297 sizeof(compose_buffer),
298 &sym,
299 &status);
300 if (val > 0)
301 {
302 compose_buffer[val] = 0;
303 compose = eina_str_convert(nl_langinfo(CODESET), "UTF-8",
304 compose_buffer);
305 if (!compose)
306 ERR("Ecore_X cannot convert input key string '%s' to UTF-8. "
307 "Is Eina built with iconv support?", compose_buffer);
308 tmp = compose;
309 }
310
311 key = XKeysymToString(sym);
312 if (!key)
313 key = keyname;
314
315 e =
316 malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
317 (compose ? strlen(compose) : 0) + 3);
318 if (!e)
319 goto on_error;
320
321 e->keyname = (char *)(e + 1);
322 e->key = e->keyname + strlen(keyname) + 1;
323 e->compose = (compose) ? e->key + strlen(key) + 1 : NULL;
324 e->string = e->compose;
325
326 strcpy((char *)e->keyname, keyname);
327 strcpy((char *)e->key, key);
328 if (compose)
329 strcpy((char *)e->compose, compose);
330
331 e->modifiers = _ecore_x_event_modifiers(xevent->state);
332
333 e->timestamp = xevent->time;
334 e->window = xevent->subwindow ? xevent->subwindow : xevent->window;
335 e->event_window = xevent->window;
336 e->same_screen = xevent->same_screen;
337 e->root_window = xevent->root;
338
339 ecore_event_add(event, e, NULL, NULL);
340
341 _ecore_x_event_last_time = e->timestamp;
342
343on_error:
344 if (tmp)
345 free(tmp);
346} /* _ecore_key_press */
347
348Ecore_Event_Mouse_Button *
349_ecore_mouse_button(int event,
350 unsigned int timestamp,
351 unsigned int xmodifiers,
352 unsigned int buttons,
353 int x,
354 int y,
355 int x_root,
356 int y_root,
357 unsigned int event_window,
358 unsigned int window,
359 unsigned int root_win,
360 int same_screen,
361 int dev,
362 double radx,
363 double rady,
364 double pressure,
365 double angle,
366 double mx,
367 double my,
368 double mrx,
369 double mry)
370{
371 Ecore_Event_Mouse_Button *e;
372
373 e = malloc(sizeof(Ecore_Event_Mouse_Button));
374 if (!e)
375 return NULL;
376
377 e->window = window;
378 e->root_window = root_win;
379 e->timestamp = timestamp;
380 e->same_screen = same_screen;
381 e->event_window = event_window;
382
383 e->buttons = buttons;
384 e->modifiers = _ecore_x_event_modifiers(xmodifiers);
385 e->double_click = 0;
386 e->triple_click = 0;
387 e->x = x;
388 e->y = y;
389 e->root.x = x_root;
390 e->root.y = y_root;
391
392 Ecore_X_Mouse_Down_Info *down_info = _ecore_x_mouse_down_info_get(dev);
393
394 if (down_info)
395 {
396 if ((event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
397 down_info->did_triple)
398 {
399 down_info->last_win = 0;
400 down_info->last_last_win = 0;
401 down_info->last_event_win = 0;
402 down_info->last_last_event_win = 0;
403 down_info->last_time = 0;
404 down_info->last_last_time = 0;
405 }
406 if (event_window == window)
407 {
408 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN)
409 {
410 //Check Double Clicked
411 if (((int)(timestamp - down_info->last_time) <=
412 (int)(1000 * _ecore_x_double_click_time)) &&
413 (window == down_info->last_win) &&
414 (event_window == down_info->last_event_win))
415 {
416 e->double_click = 1;
417 down_info->did_double = EINA_TRUE;
418 }
419 else
420 {
421 down_info->did_double = EINA_FALSE;
422 down_info->did_triple = EINA_FALSE;
423 }
424
425 //Check Triple Clicked
426 if (((int)(timestamp - down_info->last_last_time) <=
427 (int)(2 * 1000 * _ecore_x_double_click_time)) &&
428 (window == down_info->last_win) &&
429 (window == down_info->last_last_win) &&
430 (event_window == down_info->last_event_win) &&
431 (event_window == down_info->last_last_event_win)
432 )
433 {
434 e->triple_click = 1;
435 down_info->did_triple = EINA_TRUE;
436 }
437 else
438 {
439 down_info->did_triple = EINA_FALSE;
440 }
441 }
442 else
443 {
444 if (down_info->did_double)
445 e->double_click = 1;
446 if (down_info->did_triple)
447 e->triple_click = 1;
448 }
449 }
450 }
451
452 /* NB: Block commented out as _ecore_x_mouse_up_count appears to have
453 * no use. The variable is also commented out above. This code block is
454 * the only place that this variable is used, and appears to serve no
455 * purpose. - dh
456 if (event == ECORE_EVENT_MOUSE_BUTTON_DOWN
457 && !e->double_click
458 && !e->triple_click)
459 _ecore_x_mouse_up_count = 0;
460 */
461
462 e->multi.device = dev;
463 e->multi.radius = (radx + rady) / 2;
464 e->multi.radius_x = radx;
465 e->multi.radius_y = rady;
466 e->multi.pressure = pressure;
467 e->multi.angle = angle;
468 e->multi.x = mx;
469 e->multi.y = my;
470 e->multi.root.x = mrx;
471 e->multi.root.y = mry;
472
473 _ecore_x_event_last_time = e->timestamp;
474 _ecore_x_event_last_win = e->window;
475 _ecore_x_event_last_root_x = x_root;
476 _ecore_x_event_last_root_y = y_root;
477
478 ecore_event_add(event, e, NULL, NULL);
479
480 if ((down_info) &&
481 (event == ECORE_EVENT_MOUSE_BUTTON_DOWN) &&
482 (window == event_window) &&
483 (!down_info->did_triple))
484 {
485 down_info->last_last_win = down_info->last_win;
486 down_info->last_win = window;
487 down_info->last_last_event_win = down_info->last_event_win;
488 down_info->last_event_win = event_window;
489 down_info->last_last_time = down_info->last_time;
490 down_info->last_time = timestamp;
491 }
492
493 return e;
494} /* _ecore_mouse_button */
495
496void
497_ecore_x_event_handle_any_event(XEvent *xevent)
498{
499 XEvent *ev = malloc(sizeof(XEvent));
500 if (!ev) return;
501 memcpy(ev, xevent, sizeof(XEvent));
502 ecore_event_add(ECORE_X_EVENT_ANY, ev, NULL, NULL);
503} /* _ecore_x_event_handle_any_event */
504
505void
506_ecore_x_event_handle_key_press(XEvent *xevent)
507{
508 _ecore_key_press(ECORE_EVENT_KEY_DOWN, (XKeyEvent *)xevent);
509} /* _ecore_x_event_handle_key_press */
510
511void
512_ecore_x_event_handle_key_release(XEvent *xevent)
513{
514 _ecore_key_press(ECORE_EVENT_KEY_UP, (XKeyEvent *)xevent);
515} /* _ecore_x_event_handle_key_release */
516
517void
518_ecore_x_event_handle_button_press(XEvent *xevent)
519{
520 int i;
521
522 _ecore_x_last_event_mouse_move = 0;
523 if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8))
524 {
525 Ecore_Event_Mouse_Wheel *e;
526
527 e = malloc(sizeof(Ecore_Event_Mouse_Wheel));
528 if (!e)
529 return;
530
531 e->timestamp = xevent->xbutton.time;
532 e->modifiers = _ecore_x_event_modifiers(xevent->xbutton.state);
533 switch (xevent->xbutton.button)
534 {
535 case 4: e->direction = 0; e->z = -1; break;
536
537 case 5: e->direction = 0; e->z = 1; break;
538
539 case 6: e->direction = 1; e->z = -1; break;
540
541 case 7: e->direction = 1; e->z = 1; break;
542
543 default: e->direction = 0; e->z = 0; break;
544 } /* switch */
545
546 e->x = xevent->xbutton.x;
547 e->y = xevent->xbutton.y;
548 e->root.x = xevent->xbutton.x_root;
549 e->root.y = xevent->xbutton.y_root;
550
551 if (xevent->xbutton.subwindow)
552 e->window = xevent->xbutton.subwindow;
553 else
554 e->window = xevent->xbutton.window;
555
556 e->event_window = xevent->xbutton.window;
557 e->same_screen = xevent->xbutton.same_screen;
558 e->root_window = xevent->xbutton.root;
559
560 _ecore_x_event_last_time = e->timestamp;
561 _ecore_x_event_last_win = e->window;
562 _ecore_x_event_last_root_x = xevent->xbutton.x_root;
563 _ecore_x_event_last_root_y = xevent->xbutton.y_root;
564 ecore_event_add(ECORE_EVENT_MOUSE_WHEEL, e, NULL, NULL);
565
566 for (i = 0; i < _ecore_window_grabs_num; i++)
567 {
568 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
569 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
570 {
571 Eina_Bool replay = EINA_FALSE;
572
573 if (_ecore_window_grab_replay_func)
574 replay = _ecore_window_grab_replay_func(
575 _ecore_window_grab_replay_data,
576 ECORE_EVENT_MOUSE_WHEEL,
577 e);
578
579 if (replay)
580 XAllowEvents(xevent->xbutton.display,
581 ReplayPointer, xevent->xbutton.time);
582 else
583 XAllowEvents(xevent->xbutton.display,
584 AsyncPointer, xevent->xbutton.time);
585
586 break;
587 }
588 }
589 }
590 else
591 {
592 {
593 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
594 xevent->xbutton.x, xevent->xbutton.y,
595 xevent->xbutton.x_root, xevent->xbutton.y_root,
596 xevent->xbutton.window,
597 (xevent->xbutton.subwindow ? xevent->xbutton.
598 subwindow : xevent->xbutton.window),
599 xevent->xbutton.root,
600 xevent->xbutton.same_screen,
601 0, 1, 1,
602 1.0, // pressure
603 0.0, // angle
604 xevent->xbutton.x, xevent->xbutton.y,
605 xevent->xbutton.x_root, xevent->xbutton.y_root);
606 }
607 {
608 Ecore_Event_Mouse_Button *e;
609 int event_window;
610 int window;
611
612 window =
613 (xevent->xbutton.subwindow ? xevent->xbutton.subwindow : xevent->
614 xbutton.window);
615 event_window = xevent->xbutton.window;
616
617 e = _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_DOWN,
618 xevent->xbutton.time,
619 xevent->xbutton.state,
620 xevent->xbutton.button,
621 xevent->xbutton.x,
622 xevent->xbutton.y,
623 xevent->xbutton.x_root,
624 xevent->xbutton.y_root,
625 event_window,
626 window,
627 xevent->xbutton.root,
628 xevent->xbutton.same_screen,
629 0,
630 1,
631 1,
632 1.0,
633// pressure
634 0.0,
635// angle
636 xevent->xbutton.x,
637 xevent->xbutton.y,
638 xevent->xbutton.x_root,
639 xevent->xbutton.y_root);
640 if (e)
641 for (i = 0; i < _ecore_window_grabs_num; i++)
642 {
643 if ((_ecore_window_grabs[i] == xevent->xbutton.window) ||
644 (_ecore_window_grabs[i] == xevent->xbutton.subwindow))
645 {
646 Eina_Bool replay = EINA_FALSE;
647
648 if (_ecore_window_grab_replay_func)
649 replay = _ecore_window_grab_replay_func(
650 _ecore_window_grab_replay_data,
651 ECORE_EVENT_MOUSE_BUTTON_DOWN,
652 e);
653
654 if (replay)
655 XAllowEvents(xevent->xbutton.display,
656 ReplayPointer, xevent->xbutton.time);
657 else
658 XAllowEvents(xevent->xbutton.display,
659 AsyncPointer, xevent->xbutton.time);
660
661 break;
662 }
663 }
664 }
665 }
666} /* _ecore_x_event_handle_button_press */
667
668void
669_ecore_x_event_handle_button_release(XEvent *xevent)
670{
671 _ecore_x_last_event_mouse_move = 0;
672 /* filter out wheel buttons */
673 if ((xevent->xbutton.button <= 3) || (xevent->xbutton.button > 7))
674 {
675 _ecore_mouse_move(xevent->xbutton.time, xevent->xbutton.state,
676 xevent->xbutton.x, xevent->xbutton.y,
677 xevent->xbutton.x_root, xevent->xbutton.y_root,
678 xevent->xbutton.window,
679 (xevent->xbutton.subwindow ? xevent->xbutton.
680 subwindow : xevent->xbutton.window),
681 xevent->xbutton.root,
682 xevent->xbutton.same_screen,
683 0, 1, 1,
684 1.0, // pressure
685 0.0, // angle
686 xevent->xbutton.x, xevent->xbutton.y,
687 xevent->xbutton.x_root, xevent->xbutton.y_root);
688
689 _ecore_mouse_button(ECORE_EVENT_MOUSE_BUTTON_UP,
690 xevent->xbutton.time, xevent->xbutton.state,
691 xevent->xbutton.button,
692 xevent->xbutton.x, xevent->xbutton.y,
693 xevent->xbutton.x_root, xevent->xbutton.y_root,
694 xevent->xbutton.window,
695 (xevent->xbutton.subwindow ? xevent->xbutton.
696 subwindow : xevent->xbutton.window),
697 xevent->xbutton.root,
698 xevent->xbutton.same_screen,
699 0, 1, 1,
700 1.0, // pressure
701 0.0, // angle
702 xevent->xbutton.x, xevent->xbutton.y,
703 xevent->xbutton.x_root, xevent->xbutton.y_root);
704 }
705} /* _ecore_x_event_handle_button_release */
706
707void
708_ecore_x_event_handle_motion_notify(XEvent *xevent)
709{
710/*
711 if (_ecore_x_last_event_mouse_move)
712 {
713 ecore_event_del(_ecore_x_last_event_mouse_move_event);
714 _ecore_x_last_event_mouse_move = 0;
715 _ecore_x_last_event_mouse_move_event = NULL;
716 }
717 */
718 _ecore_mouse_move(xevent->xmotion.time, xevent->xmotion.state,
719 xevent->xmotion.x, xevent->xmotion.y,
720 xevent->xmotion.x_root, xevent->xmotion.y_root,
721 xevent->xmotion.window,
722 (xevent->xmotion.subwindow ? xevent->xmotion.subwindow :
723 xevent->xmotion.window),
724 xevent->xmotion.root,
725 xevent->xmotion.same_screen,
726 0, 1, 1,
727 1.0, // pressure
728 0.0, // angle
729 xevent->xmotion.x, xevent->xmotion.y,
730 xevent->xmotion.x_root, xevent->xmotion.y_root);
731
732 _ecore_x_last_event_mouse_move = 1;
733
734 /* Xdnd handling */
735 _ecore_x_dnd_drag(xevent->xmotion.root,
736 xevent->xmotion.x_root,
737 xevent->xmotion.y_root);
738} /* _ecore_x_event_handle_motion_notify */
739
740void
741_ecore_x_event_handle_enter_notify(XEvent *xevent)
742{
743 _ecore_x_last_event_mouse_move = 0;
744 {
745 _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
746 xevent->xcrossing.x, xevent->xcrossing.y,
747 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
748 xevent->xcrossing.window,
749 (xevent->xcrossing.subwindow ? xevent->xcrossing.
750 subwindow : xevent->xcrossing.window),
751 xevent->xcrossing.root,
752 xevent->xcrossing.same_screen,
753 0, 1, 1,
754 1.0, // pressure
755 0.0, // angle
756 xevent->xcrossing.x, xevent->xcrossing.y,
757 xevent->xcrossing.x_root, xevent->xcrossing.y_root);
758 }
759 {
760 Ecore_X_Event_Mouse_In *e;
761
762 e = calloc(1, sizeof(Ecore_X_Event_Mouse_In));
763 if (!e)
764 return;
765
766 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
767 e->x = xevent->xcrossing.x;
768 e->y = xevent->xcrossing.y;
769 e->root.x = xevent->xcrossing.x_root;
770 e->root.y = xevent->xcrossing.y_root;
771 if (xevent->xcrossing.subwindow)
772 e->win = xevent->xcrossing.subwindow;
773 else
774 e->win = xevent->xcrossing.window;
775
776 e->same_screen = xevent->xcrossing.same_screen;
777 e->root_win = xevent->xcrossing.root;
778 e->event_win = xevent->xcrossing.window;
779
780 if (xevent->xcrossing.mode == NotifyNormal)
781 e->mode = ECORE_X_EVENT_MODE_NORMAL;
782 else if (xevent->xcrossing.mode == NotifyGrab)
783 e->mode = ECORE_X_EVENT_MODE_GRAB;
784 else if (xevent->xcrossing.mode == NotifyUngrab)
785 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
786
787 if (xevent->xcrossing.detail == NotifyAncestor)
788 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
789 else if (xevent->xcrossing.detail == NotifyVirtual)
790 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
791 else if (xevent->xcrossing.detail == NotifyInferior)
792 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
793 else if (xevent->xcrossing.detail == NotifyNonlinear)
794 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
795 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
796 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
797
798 e->time = xevent->xcrossing.time;
799 _ecore_x_event_last_time = e->time;
800 ecore_event_add(ECORE_X_EVENT_MOUSE_IN, e, NULL, NULL);
801 }
802} /* _ecore_x_event_handle_enter_notify */
803
804void
805_ecore_x_event_handle_leave_notify(XEvent *xevent)
806{
807 _ecore_x_last_event_mouse_move = 0;
808 {
809 _ecore_mouse_move(xevent->xcrossing.time, xevent->xcrossing.state,
810 xevent->xcrossing.x, xevent->xcrossing.y,
811 xevent->xcrossing.x_root, xevent->xcrossing.y_root,
812 xevent->xcrossing.window,
813 (xevent->xcrossing.subwindow ? xevent->xcrossing.
814 subwindow : xevent->xcrossing.window),
815 xevent->xcrossing.root,
816 xevent->xcrossing.same_screen,
817 0, 1, 1,
818 1.0, // pressure
819 0.0, // angle
820 xevent->xcrossing.x, xevent->xcrossing.y,
821 xevent->xcrossing.x_root, xevent->xcrossing.y_root);
822 }
823 {
824 Ecore_X_Event_Mouse_Out *e;
825
826 e = calloc(1, sizeof(Ecore_X_Event_Mouse_Out));
827 if (!e)
828 return;
829
830 e->modifiers = _ecore_x_event_modifiers(xevent->xcrossing.state);
831 e->x = xevent->xcrossing.x;
832 e->y = xevent->xcrossing.y;
833 e->root.x = xevent->xcrossing.x_root;
834 e->root.y = xevent->xcrossing.y_root;
835 if (xevent->xcrossing.subwindow)
836 e->win = xevent->xcrossing.subwindow;
837 else
838 e->win = xevent->xcrossing.window;
839
840 e->same_screen = xevent->xcrossing.same_screen;
841 e->root_win = xevent->xcrossing.root;
842 e->event_win = xevent->xcrossing.window;
843
844 if (xevent->xcrossing.mode == NotifyNormal)
845 e->mode = ECORE_X_EVENT_MODE_NORMAL;
846 else if (xevent->xcrossing.mode == NotifyGrab)
847 e->mode = ECORE_X_EVENT_MODE_GRAB;
848 else if (xevent->xcrossing.mode == NotifyUngrab)
849 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
850
851 if (xevent->xcrossing.detail == NotifyAncestor)
852 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
853 else if (xevent->xcrossing.detail == NotifyVirtual)
854 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
855 else if (xevent->xcrossing.detail == NotifyInferior)
856 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
857 else if (xevent->xcrossing.detail == NotifyNonlinear)
858 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
859 else if (xevent->xcrossing.detail == NotifyNonlinearVirtual)
860 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
861
862 e->time = xevent->xcrossing.time;
863 _ecore_x_event_last_time = e->time;
864 _ecore_x_event_last_win = e->win;
865 _ecore_x_event_last_root_x = e->root.x;
866 _ecore_x_event_last_root_y = e->root.y;
867 ecore_event_add(ECORE_X_EVENT_MOUSE_OUT, e, NULL, NULL);
868 }
869} /* _ecore_x_event_handle_leave_notify */
870
871void
872_ecore_x_event_handle_focus_in(XEvent *xevent)
873{
874 Ecore_X_Event_Window_Focus_In *e;
875
876 _ecore_x_last_event_mouse_move = 0;
877
878 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_In));
879 if (!e)
880 return;
881
882 e->win = xevent->xfocus.window;
883
884 if (xevent->xfocus.mode == NotifyNormal)
885 e->mode = ECORE_X_EVENT_MODE_NORMAL;
886 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
887 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
888 else if (xevent->xfocus.mode == NotifyGrab)
889 e->mode = ECORE_X_EVENT_MODE_GRAB;
890 else if (xevent->xfocus.mode == NotifyUngrab)
891 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
892
893 if (xevent->xfocus.detail == NotifyAncestor)
894 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
895 else if (xevent->xfocus.detail == NotifyVirtual)
896 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
897 else if (xevent->xfocus.detail == NotifyInferior)
898 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
899 else if (xevent->xfocus.detail == NotifyNonlinear)
900 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
901 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
902 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
903 else if (xevent->xfocus.detail == NotifyPointer)
904 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
905 else if (xevent->xfocus.detail == NotifyPointerRoot)
906 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
907 else if (xevent->xfocus.detail == NotifyDetailNone)
908 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
909
910 e->time = _ecore_x_event_last_time;
911 _ecore_x_event_last_time = e->time;
912 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, e, NULL, NULL);
913} /* _ecore_x_event_handle_focus_in */
914
915void
916_ecore_x_event_handle_focus_out(XEvent *xevent)
917{
918 Ecore_X_Event_Window_Focus_Out *e;
919
920 _ecore_x_last_event_mouse_move = 0;
921
922 e = calloc(1, sizeof(Ecore_X_Event_Window_Focus_Out));
923 if (!e)
924 return;
925
926 e->win = xevent->xfocus.window;
927
928 if (xevent->xfocus.mode == NotifyNormal)
929 e->mode = ECORE_X_EVENT_MODE_NORMAL;
930 else if (xevent->xfocus.mode == NotifyWhileGrabbed)
931 e->mode = ECORE_X_EVENT_MODE_WHILE_GRABBED;
932 else if (xevent->xfocus.mode == NotifyGrab)
933 e->mode = ECORE_X_EVENT_MODE_GRAB;
934 else if (xevent->xfocus.mode == NotifyUngrab)
935 e->mode = ECORE_X_EVENT_MODE_UNGRAB;
936
937 if (xevent->xfocus.detail == NotifyAncestor)
938 e->detail = ECORE_X_EVENT_DETAIL_ANCESTOR;
939 else if (xevent->xfocus.detail == NotifyVirtual)
940 e->detail = ECORE_X_EVENT_DETAIL_VIRTUAL;
941 else if (xevent->xfocus.detail == NotifyInferior)
942 e->detail = ECORE_X_EVENT_DETAIL_INFERIOR;
943 else if (xevent->xfocus.detail == NotifyNonlinear)
944 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR;
945 else if (xevent->xfocus.detail == NotifyNonlinearVirtual)
946 e->detail = ECORE_X_EVENT_DETAIL_NON_LINEAR_VIRTUAL;
947 else if (xevent->xfocus.detail == NotifyPointer)
948 e->detail = ECORE_X_EVENT_DETAIL_POINTER;
949 else if (xevent->xfocus.detail == NotifyPointerRoot)
950 e->detail = ECORE_X_EVENT_DETAIL_POINTER_ROOT;
951 else if (xevent->xfocus.detail == NotifyDetailNone)
952 e->detail = ECORE_X_EVENT_DETAIL_DETAIL_NONE;
953
954 e->time = _ecore_x_event_last_time;
955 _ecore_x_event_last_time = e->time;
956 ecore_event_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, e, NULL, NULL);
957} /* _ecore_x_event_handle_focus_out */
958
959void
960_ecore_x_event_handle_keymap_notify(XEvent *xevent __UNUSED__)
961{
962 _ecore_x_last_event_mouse_move = 0;
963 /* FIXME: handle this event type */
964} /* _ecore_x_event_handle_keymap_notify */
965
966void
967_ecore_x_event_handle_expose(XEvent *xevent)
968{
969 Ecore_X_Event_Window_Damage *e;
970
971 _ecore_x_last_event_mouse_move = 0;
972 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
973 if (!e)
974 return;
975
976 e->win = xevent->xexpose.window;
977 e->time = _ecore_x_event_last_time;
978 e->x = xevent->xexpose.x;
979 e->y = xevent->xexpose.y;
980 e->w = xevent->xexpose.width;
981 e->h = xevent->xexpose.height;
982 e->count = xevent->xexpose.count;
983 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
984} /* _ecore_x_event_handle_expose */
985
986void
987_ecore_x_event_handle_graphics_expose(XEvent *xevent)
988{
989 Ecore_X_Event_Window_Damage *e;
990
991 _ecore_x_last_event_mouse_move = 0;
992 e = calloc(1, sizeof(Ecore_X_Event_Window_Damage));
993 if (!e)
994 return;
995
996 e->win = xevent->xgraphicsexpose.drawable;
997 e->time = _ecore_x_event_last_time;
998 e->x = xevent->xgraphicsexpose.x;
999 e->y = xevent->xgraphicsexpose.y;
1000 e->w = xevent->xgraphicsexpose.width;
1001 e->h = xevent->xgraphicsexpose.height;
1002 e->count = xevent->xgraphicsexpose.count;
1003 ecore_event_add(ECORE_X_EVENT_WINDOW_DAMAGE, e, NULL, NULL);
1004} /* _ecore_x_event_handle_graphics_expose */
1005
1006void
1007_ecore_x_event_handle_visibility_notify(XEvent *xevent)
1008{
1009 _ecore_x_last_event_mouse_move = 0;
1010// if (xevent->xvisibility.state != VisibilityPartiallyObscured)
1011 {
1012 Ecore_X_Event_Window_Visibility_Change *e;
1013
1014 e = calloc(1, sizeof(Ecore_X_Event_Window_Visibility_Change));
1015 if (!e)
1016 return;
1017
1018 e->win = xevent->xvisibility.window;
1019 e->time = _ecore_x_event_last_time;
1020 if (xevent->xvisibility.state == VisibilityFullyObscured)
1021 e->fully_obscured = 1;
1022 else
1023 e->fully_obscured = 0;
1024
1025 ecore_event_add(ECORE_X_EVENT_WINDOW_VISIBILITY_CHANGE, e, NULL, NULL);
1026 }
1027} /* _ecore_x_event_handle_visibility_notify */
1028
1029void
1030_ecore_x_event_handle_create_notify(XEvent *xevent)
1031{
1032 Ecore_X_Event_Window_Create *e;
1033
1034 _ecore_x_last_event_mouse_move = 0;
1035 e = calloc(1, sizeof(Ecore_X_Event_Window_Create));
1036 if (!e)
1037 return;
1038
1039 e->win = xevent->xcreatewindow.window;
1040 e->parent = xevent->xcreatewindow.parent;
1041 if (xevent->xcreatewindow.override_redirect)
1042 e->override = 1;
1043 else
1044 e->override = 0;
1045
1046 e->x = xevent->xcreatewindow.x;
1047 e->y = xevent->xcreatewindow.y;
1048 e->w = xevent->xcreatewindow.width;
1049 e->h = xevent->xcreatewindow.height;
1050 e->border = xevent->xcreatewindow.border_width;
1051 e->time = _ecore_x_event_last_time;
1052 ecore_event_add(ECORE_X_EVENT_WINDOW_CREATE, e, NULL, NULL);
1053} /* _ecore_x_event_handle_create_notify */
1054
1055void
1056_ecore_x_event_handle_destroy_notify(XEvent *xevent)
1057{
1058 Ecore_X_Event_Window_Destroy *e;
1059
1060 _ecore_x_last_event_mouse_move = 0;
1061 e = calloc(1, sizeof(Ecore_X_Event_Window_Destroy));
1062 if (!e)
1063 return;
1064
1065 e->win = xevent->xdestroywindow.window;
1066 e->event_win = xevent->xdestroywindow.event;
1067 e->time = _ecore_x_event_last_time;
1068 if (e->win == _ecore_x_event_last_win)
1069 _ecore_x_event_last_win = 0;
1070
1071 ecore_event_add(ECORE_X_EVENT_WINDOW_DESTROY, e, NULL, NULL);
1072} /* _ecore_x_event_handle_destroy_notify */
1073
1074void
1075_ecore_x_event_handle_unmap_notify(XEvent *xevent)
1076{
1077 Ecore_X_Event_Window_Hide *e;
1078
1079 _ecore_x_last_event_mouse_move = 0;
1080 e = calloc(1, sizeof(Ecore_X_Event_Window_Hide));
1081 if (!e)
1082 return;
1083
1084 e->win = xevent->xunmap.window;
1085 e->event_win = xevent->xunmap.event;
1086 e->time = _ecore_x_event_last_time;
1087 ecore_event_add(ECORE_X_EVENT_WINDOW_HIDE, e, NULL, NULL);
1088} /* _ecore_x_event_handle_unmap_notify */
1089
1090void
1091_ecore_x_event_handle_map_notify(XEvent *xevent)
1092{
1093 Ecore_X_Event_Window_Show *e;
1094
1095 _ecore_x_last_event_mouse_move = 0;
1096 e = calloc(1, sizeof(Ecore_X_Event_Window_Show));
1097 if (!e)
1098 return;
1099
1100 e->win = xevent->xmap.window;
1101 e->event_win = xevent->xmap.event;
1102 e->time = _ecore_x_event_last_time;
1103 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW, e, NULL, NULL);
1104} /* _ecore_x_event_handle_map_notify */
1105
1106void
1107_ecore_x_event_handle_map_request(XEvent *xevent)
1108{
1109 Ecore_X_Event_Window_Show_Request *e;
1110
1111 _ecore_x_last_event_mouse_move = 0;
1112 e = calloc(1, sizeof(Ecore_X_Event_Window_Show_Request));
1113 if (!e)
1114 return;
1115
1116 e->win = xevent->xmaprequest.window;
1117 e->time = _ecore_x_event_last_time;
1118 e->parent = xevent->xmaprequest.parent;
1119 ecore_event_add(ECORE_X_EVENT_WINDOW_SHOW_REQUEST, e, NULL, NULL);
1120} /* _ecore_x_event_handle_map_request */
1121
1122void
1123_ecore_x_event_handle_reparent_notify(XEvent *xevent)
1124{
1125 Ecore_X_Event_Window_Reparent *e;
1126
1127 _ecore_x_last_event_mouse_move = 0;
1128 e = calloc(1, sizeof(Ecore_X_Event_Window_Reparent));
1129 if (!e)
1130 return;
1131
1132 e->win = xevent->xreparent.window;
1133 e->event_win = xevent->xreparent.event;
1134 e->parent = xevent->xreparent.parent;
1135 e->time = _ecore_x_event_last_time;
1136 ecore_event_add(ECORE_X_EVENT_WINDOW_REPARENT, e, NULL, NULL);
1137} /* _ecore_x_event_handle_reparent_notify */
1138
1139void
1140_ecore_x_event_handle_configure_notify(XEvent *xevent)
1141{
1142 Ecore_X_Event_Window_Configure *e;
1143
1144 _ecore_x_last_event_mouse_move = 0;
1145 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure));
1146 if (!e)
1147 return;
1148
1149 e->win = xevent->xconfigure.window;
1150 e->event_win = xevent->xconfigure.event;
1151 e->abovewin = xevent->xconfigure.above;
1152 e->x = xevent->xconfigure.x;
1153 e->y = xevent->xconfigure.y;
1154 e->w = xevent->xconfigure.width;
1155 e->h = xevent->xconfigure.height;
1156 e->border = xevent->xconfigure.border_width;
1157 e->override = xevent->xconfigure.override_redirect;
1158 e->from_wm = xevent->xconfigure.send_event;
1159 e->time = _ecore_x_event_last_time;
1160 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE, e, NULL, NULL);
1161} /* _ecore_x_event_handle_configure_notify */
1162
1163void
1164_ecore_x_event_handle_configure_request(XEvent *xevent)
1165{
1166 Ecore_X_Event_Window_Configure_Request *e;
1167
1168 _ecore_x_last_event_mouse_move = 0;
1169 e = calloc(1, sizeof(Ecore_X_Event_Window_Configure_Request));
1170 if (!e)
1171 return;
1172
1173 e->win = xevent->xconfigurerequest.window;
1174 e->parent_win = xevent->xconfigurerequest.parent;
1175 e->abovewin = xevent->xconfigurerequest.above;
1176 e->x = xevent->xconfigurerequest.x;
1177 e->y = xevent->xconfigurerequest.y;
1178 e->w = xevent->xconfigurerequest.width;
1179 e->h = xevent->xconfigurerequest.height;
1180 e->border = xevent->xconfigurerequest.border_width;
1181 e->value_mask = xevent->xconfigurerequest.value_mask;
1182 e->time = _ecore_x_event_last_time;
1183
1184 if (xevent->xconfigurerequest.detail == Above)
1185 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1186 else if (xevent->xconfigurerequest.detail == Below)
1187 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1188 else if (xevent->xconfigurerequest.detail == TopIf)
1189 e->detail = ECORE_X_WINDOW_STACK_TOP_IF;
1190 else if (xevent->xconfigurerequest.detail == BottomIf)
1191 e->detail = ECORE_X_WINDOW_STACK_BOTTOM_IF;
1192 else if (xevent->xconfigurerequest.detail == Opposite)
1193 e->detail = ECORE_X_WINDOW_STACK_OPPOSITE;
1194
1195 ecore_event_add(ECORE_X_EVENT_WINDOW_CONFIGURE_REQUEST, e, NULL, NULL);
1196} /* _ecore_x_event_handle_configure_request */
1197
1198void
1199_ecore_x_event_handle_gravity_notify(XEvent *xevent __UNUSED__)
1200{
1201 _ecore_x_last_event_mouse_move = 0;
1202 /* FIXME: handle this event type */
1203} /* _ecore_x_event_handle_gravity_notify */
1204
1205void
1206_ecore_x_event_handle_resize_request(XEvent *xevent)
1207{
1208 Ecore_X_Event_Window_Resize_Request *e;
1209
1210 _ecore_x_last_event_mouse_move = 0;
1211 e = calloc(1, sizeof(Ecore_X_Event_Window_Resize_Request));
1212 if (!e)
1213 return;
1214
1215 e->win = xevent->xresizerequest.window;
1216 e->w = xevent->xresizerequest.width;
1217 e->h = xevent->xresizerequest.height;
1218 e->time = _ecore_x_event_last_time;
1219 ecore_event_add(ECORE_X_EVENT_WINDOW_RESIZE_REQUEST, e, NULL, NULL);
1220} /* _ecore_x_event_handle_resize_request */
1221
1222void
1223_ecore_x_event_handle_circulate_notify(XEvent *xevent)
1224{
1225 Ecore_X_Event_Window_Stack *e;
1226
1227 _ecore_x_last_event_mouse_move = 0;
1228 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack));
1229 if (!e)
1230 return;
1231
1232 e->win = xevent->xcirculate.window;
1233 e->event_win = xevent->xcirculate.event;
1234 if (xevent->xcirculate.place == PlaceOnTop)
1235 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1236 else
1237 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1238
1239 e->time = _ecore_x_event_last_time;
1240 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK, e, NULL, NULL);
1241} /* _ecore_x_event_handle_circulate_notify */
1242
1243void
1244_ecore_x_event_handle_circulate_request(XEvent *xevent)
1245{
1246 Ecore_X_Event_Window_Stack_Request *e;
1247
1248 _ecore_x_last_event_mouse_move = 0;
1249 e = calloc(1, sizeof(Ecore_X_Event_Window_Stack_Request));
1250 if (!e)
1251 return;
1252
1253 e->win = xevent->xcirculaterequest.window;
1254 e->parent = xevent->xcirculaterequest.parent;
1255 if (xevent->xcirculaterequest.place == PlaceOnTop)
1256 e->detail = ECORE_X_WINDOW_STACK_ABOVE;
1257 else
1258 e->detail = ECORE_X_WINDOW_STACK_BELOW;
1259
1260 e->time = _ecore_x_event_last_time;
1261 ecore_event_add(ECORE_X_EVENT_WINDOW_STACK_REQUEST, e, NULL, NULL);
1262} /* _ecore_x_event_handle_circulate_request */
1263
1264void
1265_ecore_x_event_handle_property_notify(XEvent *xevent)
1266{
1267 _ecore_x_last_event_mouse_move = 0;
1268 {
1269 Ecore_X_Event_Window_Property *e;
1270
1271 e = calloc(1, sizeof(Ecore_X_Event_Window_Property));
1272 if (!e)
1273 return;
1274
1275 e->win = xevent->xproperty.window;
1276 e->atom = xevent->xproperty.atom;
1277 e->time = xevent->xproperty.time;
1278 _ecore_x_event_last_time = e->time;
1279 ecore_event_add(ECORE_X_EVENT_WINDOW_PROPERTY, e, NULL, NULL);
1280 }
1281} /* _ecore_x_event_handle_property_notify */
1282
1283void
1284_ecore_x_event_handle_selection_clear(XEvent *xevent)
1285{
1286// Ecore_X_Selection_Intern *d;
1287 Ecore_X_Event_Selection_Clear *e;
1288 Ecore_X_Atom sel;
1289
1290 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1291 _ecore_x_last_event_mouse_move = 0;
1292/* errr..... why? paranoia.
1293 d = _ecore_x_selection_get(xevent->xselectionclear.selection);
1294 if (d && (xevent->xselectionclear.time > d->time))
1295 {
1296 _ecore_x_selection_set(None, NULL, 0,
1297 xevent->xselectionclear.selection);
1298 }
1299 */
1300/* Generate event for app cleanup */
1301 e = malloc(sizeof(Ecore_X_Event_Selection_Clear));
1302 e->win = xevent->xselectionclear.window;
1303 e->time = xevent->xselectionclear.time;
1304 e->atom = sel = xevent->xselectionclear.selection;
1305 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
1306 e->selection = ECORE_X_SELECTION_PRIMARY;
1307 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
1308 e->selection = ECORE_X_SELECTION_SECONDARY;
1309 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1310 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1311 else
1312 e->selection = ECORE_X_SELECTION_OTHER;
1313
1314 ecore_event_add(ECORE_X_EVENT_SELECTION_CLEAR, e, NULL, NULL);
1315} /* _ecore_x_event_handle_selection_clear */
1316
1317void
1318_ecore_x_event_handle_selection_request(XEvent *xevent)
1319{
1320 Ecore_X_Event_Selection_Request *e;
1321 Ecore_X_Selection_Intern *sd;
1322 void *data = NULL;
1323 int len;
1324 int typesize;
1325
1326 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1327 _ecore_x_last_event_mouse_move = 0;
1328 /*
1329 * Generate a selection request event.
1330 */
1331 e = malloc(sizeof(Ecore_X_Event_Selection_Request));
1332 e->owner = xevent->xselectionrequest.owner;
1333 e->requestor = xevent->xselectionrequest.requestor;
1334 e->time = xevent->xselectionrequest.time;
1335 e->selection = xevent->xselectionrequest.selection;
1336 e->target = xevent->xselectionrequest.target;
1337 e->property = xevent->xselectionrequest.property;
1338 ecore_event_add(ECORE_X_EVENT_SELECTION_REQUEST, e, NULL, NULL);
1339
1340 if ((sd = _ecore_x_selection_get(xevent->xselectionrequest.selection)) &&
1341 (sd->win == xevent->xselectionrequest.owner))
1342 {
1343 Ecore_X_Selection_Intern *si;
1344
1345 si = _ecore_x_selection_get(xevent->xselectionrequest.selection);
1346 if (si->data)
1347 {
1348 Ecore_X_Atom property = None;
1349 Ecore_X_Atom type;
1350
1351 /* Set up defaults for strings first */
1352 type = xevent->xselectionrequest.target;
1353 typesize = 8;
1354 len = sd->length;
1355
1356 if (!ecore_x_selection_convert(xevent->xselectionrequest.selection,
1357 xevent->xselectionrequest.target,
1358 &data, &len, &type, &typesize))
1359 /* Refuse selection, conversion to requested target failed */
1360 property = None;
1361 else if (data)
1362 {
1363 /* FIXME: This does not properly handle large data transfers */
1364 ecore_x_window_prop_property_set(
1365 xevent->xselectionrequest.requestor,
1366 xevent->xselectionrequest.
1367 property,
1368 type,
1369 typesize,
1370 data,
1371 len);
1372 property = xevent->xselectionrequest.property;
1373 free(data);
1374 }
1375
1376 ecore_x_selection_notify_send(xevent->xselectionrequest.requestor,
1377 xevent->xselectionrequest.selection,
1378 xevent->xselectionrequest.target,
1379 property,
1380 xevent->xselectionrequest.time);
1381 }
1382 }
1383} /* _ecore_x_event_handle_selection_request */
1384
1385void
1386_ecore_x_event_handle_selection_notify(XEvent *xevent)
1387{
1388 Ecore_X_Event_Selection_Notify *e;
1389 unsigned char *data = NULL;
1390 Ecore_X_Atom selection;
1391 int num_ret, format;
1392
1393 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1394 _ecore_x_last_event_mouse_move = 0;
1395 selection = xevent->xselection.selection;
1396
1397 if (xevent->xselection.target == ECORE_X_ATOM_SELECTION_TARGETS)
1398 {
1399 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1400 xevent->xselection.property,
1401 XA_ATOM, 32, &data, &num_ret);
1402 if (!format)
1403 return;
1404 }
1405 else
1406 {
1407 format = ecore_x_window_prop_property_get(xevent->xselection.requestor,
1408 xevent->xselection.property,
1409 AnyPropertyType, 8, &data,
1410 &num_ret);
1411 if (!format)
1412 return;
1413 }
1414
1415 e = calloc(1, sizeof(Ecore_X_Event_Selection_Notify));
1416 if (!e)
1417 return;
1418
1419 e->win = xevent->xselection.requestor;
1420 e->time = xevent->xselection.time;
1421 e->atom = selection;
1422 e->target = _ecore_x_selection_target_get(xevent->xselection.target);
1423
1424 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
1425 e->selection = ECORE_X_SELECTION_PRIMARY;
1426 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
1427 e->selection = ECORE_X_SELECTION_SECONDARY;
1428 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
1429 e->selection = ECORE_X_SELECTION_XDND;
1430 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
1431 e->selection = ECORE_X_SELECTION_CLIPBOARD;
1432 else
1433 e->selection = ECORE_X_SELECTION_OTHER;
1434
1435 e->data = _ecore_x_selection_parse(e->target, data, num_ret, format);
1436
1437 ecore_event_add(ECORE_X_EVENT_SELECTION_NOTIFY, e,
1438 _ecore_x_event_free_selection_notify, NULL);
1439} /* _ecore_x_event_handle_selection_notify */
1440
1441void
1442_ecore_x_event_handle_colormap_notify(XEvent *xevent)
1443{
1444 Ecore_X_Event_Window_Colormap *e;
1445
1446 _ecore_x_last_event_mouse_move = 0;
1447 e = calloc(1, sizeof(Ecore_X_Event_Window_Colormap));
1448 if (!e)
1449 return;
1450
1451 e->win = xevent->xcolormap.window;
1452 e->cmap = xevent->xcolormap.colormap;
1453 e->time = _ecore_x_event_last_time;
1454 if (xevent->xcolormap.state == ColormapInstalled)
1455 e->installed = EINA_TRUE;
1456 else
1457 e->installed = EINA_FALSE;
1458
1459 ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL);
1460} /* _ecore_x_event_handle_colormap_notify */
1461
1462void
1463_ecore_x_event_handle_client_message(XEvent *xevent)
1464{
1465 _ecore_x_last_event_mouse_move = 0;
1466 /* Special client message event handling here. need to put LOTS of if */
1467 /* checks here and generate synthetic events per special message known */
1468 /* otherwise generate generic client message event. this would handle*/
1469 /* netwm, ICCCM, gnomewm, old kde and mwm hint client message protocols */
1470 if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS) &&
1471 (xevent->xclient.format == 32) &&
1472 (xevent->xclient.data.l[0] == (long)ECORE_X_ATOM_WM_DELETE_WINDOW))
1473 {
1474 Ecore_X_Event_Window_Delete_Request *e;
1475
1476 e = calloc(1, sizeof(Ecore_X_Event_Window_Delete_Request));
1477 if (!e)
1478 return;
1479
1480 e->win = xevent->xclient.window;
1481 e->time = _ecore_x_event_last_time;
1482 ecore_event_add(ECORE_X_EVENT_WINDOW_DELETE_REQUEST, e, NULL, NULL);
1483 }
1484 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_MOVERESIZE) &&
1485 (xevent->xclient.format == 32) &&
1486/* Ignore move and resize with keyboard */
1487 (xevent->xclient.data.l[2] < 9))
1488 {
1489 Ecore_X_Event_Window_Move_Resize_Request *e;
1490
1491 e = calloc(1, sizeof(Ecore_X_Event_Window_Move_Resize_Request));
1492 if (!e)
1493 return;
1494
1495 e->win = xevent->xclient.window;
1496 e->x = xevent->xclient.data.l[0];
1497 e->y = xevent->xclient.data.l[1];
1498 e->direction = xevent->xclient.data.l[2];
1499 e->button = xevent->xclient.data.l[3];
1500 e->source = xevent->xclient.data.l[4];
1501 ecore_event_add(ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST, e, NULL, NULL);
1502 }
1503 /* Xdnd Client Message Handling Begin */
1504 /* Message Type: XdndEnter target */
1505 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_ENTER)
1506 {
1507 Ecore_X_Event_Xdnd_Enter *e;
1508 Ecore_X_DND_Target *target;
1509
1510 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Enter));
1511 if (!e) return;
1512
1513 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1514
1515 target = _ecore_x_dnd_target_get();
1516 target->state = ECORE_X_DND_TARGET_ENTERED;
1517 target->source = xevent->xclient.data.l[0];
1518 target->win = xevent->xclient.window;
1519 target->version = (int)(xevent->xclient.data.l[1] >> 24);
1520 if (target->version > ECORE_X_DND_VERSION)
1521 {
1522 WRN("DND: Requested version %d, we only support up to %d",
1523 target->version, ECORE_X_DND_VERSION);
1524 free(e);
1525 return;
1526 }
1527
1528 if (xevent->xclient.data.l[1] & 0x1UL)
1529 {
1530 /* source supports more than 3 types, fetch property */
1531 unsigned char *data;
1532 Ecore_X_Atom *types;
1533 int i, num_ret;
1534
1535 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1536 if (!(ecore_x_window_prop_property_get(target->source,
1537 ECORE_X_ATOM_XDND_TYPE_LIST,
1538 XA_ATOM,
1539 32, &data, &num_ret)))
1540 {
1541 WRN(
1542 "DND: Could not fetch data type list from source window, aborting.");
1543 free(e);
1544 return;
1545 }
1546
1547 types = (Ecore_X_Atom *)data;
1548 e->types = calloc(num_ret, sizeof(char *));
1549 if (e->types)
1550 {
1551 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1552 for (i = 0; i < num_ret; i++)
1553 e->types[i] = XGetAtomName(_ecore_x_disp, types[i]);
1554 }
1555
1556 e->num_types = num_ret;
1557 }
1558 else
1559 {
1560 int i = 0;
1561
1562 e->types = calloc(3, sizeof(char *));
1563 if (e->types)
1564 {
1565 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1566 while ((i < 3) && (xevent->xclient.data.l[i + 2]))
1567 {
1568 e->types[i] = XGetAtomName(_ecore_x_disp,
1569 xevent->xclient.data.l[i + 2]);
1570 i++;
1571 }
1572 }
1573
1574 e->num_types = i;
1575 }
1576
1577 e->win = target->win;
1578 e->source = target->source;
1579 ecore_event_add(ECORE_X_EVENT_XDND_ENTER, e,
1580 _ecore_x_event_free_xdnd_enter, NULL);
1581 }
1582 /* Message Type: XdndPosition target */
1583 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_POSITION)
1584 {
1585 Ecore_X_Event_Xdnd_Position *e;
1586 Ecore_X_DND_Target *target;
1587
1588 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1589
1590 target = _ecore_x_dnd_target_get();
1591 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1592 (target->win != xevent->xclient.window))
1593 return;
1594
1595 target->pos.x = xevent->xclient.data.l[2] >> 16;
1596 target->pos.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1597 target->action = xevent->xclient.data.l[4]; /* Version 2 */
1598
1599 target->time = (target->version >= 1) ?
1600 (Time)xevent->xclient.data.l[3] : CurrentTime;
1601
1602 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Position));
1603 if (!e) return;
1604
1605 e->win = target->win;
1606 e->source = target->source;
1607 e->position.x = target->pos.x;
1608 e->position.y = target->pos.y;
1609 e->action = target->action;
1610 ecore_event_add(ECORE_X_EVENT_XDND_POSITION, e, NULL, NULL);
1611 }
1612 /* Message Type: XdndStatus source */
1613 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_STATUS)
1614 {
1615 Ecore_X_Event_Xdnd_Status *e;
1616 Ecore_X_DND_Source *source;
1617
1618 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1619
1620 source = _ecore_x_dnd_source_get();
1621 /* Make sure source/target match */
1622 if ((source->win != xevent->xclient.window) ||
1623 (source->dest != (Window)xevent->xclient.data.l[0]))
1624 return;
1625
1626 source->await_status = 0;
1627
1628 source->will_accept = xevent->xclient.data.l[1] & 0x1UL;
1629 source->suppress = (xevent->xclient.data.l[1] & 0x2UL) ? 0 : 1;
1630
1631 source->rectangle.x = xevent->xclient.data.l[2] >> 16;
1632 source->rectangle.y = xevent->xclient.data.l[2] & 0xFFFFUL;
1633 source->rectangle.width = xevent->xclient.data.l[3] >> 16;
1634 source->rectangle.height = xevent->xclient.data.l[3] & 0xFFFFUL;
1635
1636 source->accepted_action = xevent->xclient.data.l[4];
1637
1638 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Status));
1639 if (!e) return;
1640
1641 e->win = source->win;
1642 e->target = source->dest;
1643 e->will_accept = source->will_accept;
1644 e->rectangle.x = source->rectangle.x;
1645 e->rectangle.y = source->rectangle.y;
1646 e->rectangle.width = source->rectangle.width;
1647 e->rectangle.height = source->rectangle.height;
1648 e->action = source->accepted_action;
1649
1650 ecore_event_add(ECORE_X_EVENT_XDND_STATUS, e, NULL, NULL);
1651 }
1652 /* Message Type: XdndLeave target */
1653 /* Pretend the whole thing never happened, sort of */
1654 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_LEAVE)
1655 {
1656 Ecore_X_Event_Xdnd_Leave *e;
1657 Ecore_X_DND_Target *target;
1658
1659 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1660
1661 target = _ecore_x_dnd_target_get();
1662 if ((target->source != (Ecore_X_Window)xevent->xclient.data.l[0]) ||
1663 (target->win != xevent->xclient.window))
1664 return;
1665
1666 target->state = ECORE_X_DND_TARGET_IDLE;
1667
1668 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Leave));
1669 if (!e) return;
1670
1671 e->win = xevent->xclient.window;
1672 e->source = (Window)xevent->xclient.data.l[0];
1673 ecore_event_add(ECORE_X_EVENT_XDND_LEAVE, e, NULL, NULL);
1674 }
1675 /* Message Type: XdndDrop target */
1676 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_DROP)
1677 {
1678 Ecore_X_Event_Xdnd_Drop *e;
1679 Ecore_X_DND_Target *target;
1680
1681 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1682
1683 target = _ecore_x_dnd_target_get();
1684 /* Match source/target */
1685 if ((target->source != (Window)xevent->xclient.data.l[0]) ||
1686 (target->win != xevent->xclient.window))
1687 return;
1688
1689 target->time = (target->version >= 1) ?
1690 (Time)xevent->xclient.data.l[2] : _ecore_x_event_last_time;
1691
1692 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Drop));
1693 if (!e) return;
1694
1695 e->win = target->win;
1696 e->source = target->source;
1697 e->action = target->action;
1698 e->position.x = target->pos.x;
1699 e->position.y = target->pos.y;
1700 ecore_event_add(ECORE_X_EVENT_XDND_DROP, e, NULL, NULL);
1701 }
1702 /* Message Type: XdndFinished source */
1703 else if (xevent->xclient.message_type == ECORE_X_ATOM_XDND_FINISHED)
1704 {
1705 Ecore_X_Event_Xdnd_Finished *e;
1706 Ecore_X_DND_Source *source;
1707 Eina_Bool completed = EINA_TRUE;
1708
1709 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1710
1711 source = _ecore_x_dnd_source_get();
1712 /* Match source/target */
1713 if ((source->win != xevent->xclient.window) ||
1714 (source->dest != (Window)xevent->xclient.data.l[0]))
1715 return;
1716
1717 if ((source->version < 5) || (xevent->xclient.data.l[1] & 0x1UL))
1718 {
1719 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1720 /* Target successfully performed drop action */
1721 ecore_x_selection_xdnd_clear();
1722 source->state = ECORE_X_DND_SOURCE_IDLE;
1723 }
1724 else if (source->version >= 5)
1725 {
1726 completed = EINA_FALSE;
1727 source->state = ECORE_X_DND_SOURCE_CONVERTING;
1728
1729 /* FIXME: Probably need to add a timer to switch back to idle
1730 * and discard the selection data */
1731 }
1732
1733 e = calloc(1, sizeof(Ecore_X_Event_Xdnd_Finished));
1734 if (!e) return;
1735
1736 e->win = source->win;
1737 e->target = source->dest;
1738 e->completed = completed;
1739 if (source->version >= 5)
1740 {
1741 source->accepted_action = xevent->xclient.data.l[2];
1742 e->action = source->accepted_action;
1743 }
1744 else
1745 {
1746 source->accepted_action = 0;
1747 e->action = source->action;
1748 }
1749
1750 ecore_event_add(ECORE_X_EVENT_XDND_FINISHED, e, NULL, NULL);
1751 }
1752 else if (xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_STATE)
1753 {
1754 Ecore_X_Event_Window_State_Request *e;
1755
1756 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1757 if (!e) return;
1758
1759 e->win = xevent->xclient.window;
1760 if (xevent->xclient.data.l[0] == 0)
1761 e->action = ECORE_X_WINDOW_STATE_ACTION_REMOVE;
1762 else if (xevent->xclient.data.l[0] == 1)
1763 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1764 else if (xevent->xclient.data.l[0] == 2)
1765 e->action = ECORE_X_WINDOW_STATE_ACTION_TOGGLE;
1766 else
1767 {
1768 free(e);
1769 return;
1770 }
1771
1772 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1773 e->state[0] = _ecore_x_netwm_state_get(xevent->xclient.data.l[1]);
1774 if (e->state[0] == ECORE_X_WINDOW_STATE_UNKNOWN)
1775 {
1776// char *name;
1777 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1778
1779// name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[1]);
1780// if (name) ERR("Unknown state: %s", name);
1781// XFree(name);
1782 }
1783 e->state[1] = _ecore_x_netwm_state_get(xevent->xclient.data.l[2]);
1784 if (e->state[1] == ECORE_X_WINDOW_STATE_UNKNOWN)
1785 {
1786// char *name;
1787 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1788
1789// name = XGetAtomName(_ecore_x_disp, xevent->xclient.data.l[2]);
1790// if (name) ERR("Unknown state: %s", name);
1791// XFree(name);
1792 }
1793
1794 e->source = xevent->xclient.data.l[3];
1795
1796 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1797 }
1798 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_CHANGE_STATE)
1799 && (xevent->xclient.format == 32)
1800 && (xevent->xclient.data.l[0] == IconicState))
1801 {
1802 Ecore_X_Event_Window_State_Request *e;
1803
1804 e = calloc(1, sizeof(Ecore_X_Event_Window_State_Request));
1805 if (!e)
1806 return;
1807
1808 e->win = xevent->xclient.window;
1809 e->action = ECORE_X_WINDOW_STATE_ACTION_ADD;
1810 e->state[0] = ECORE_X_WINDOW_STATE_ICONIFIED;
1811
1812 ecore_event_add(ECORE_X_EVENT_WINDOW_STATE_REQUEST, e, NULL, NULL);
1813 }
1814 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_WM_DESKTOP)
1815 && (xevent->xclient.format == 32))
1816 {
1817 Ecore_X_Event_Desktop_Change *e;
1818
1819 e = calloc(1, sizeof(Ecore_X_Event_Desktop_Change));
1820 if (!e)
1821 return;
1822
1823 e->win = xevent->xclient.window;
1824 e->desk = xevent->xclient.data.l[0];
1825 e->source = xevent->xclient.data.l[1];
1826
1827 ecore_event_add(ECORE_X_EVENT_DESKTOP_CHANGE, e, NULL, NULL);
1828 }
1829 else if ((xevent->xclient.message_type ==
1830 ECORE_X_ATOM_NET_REQUEST_FRAME_EXTENTS))
1831 {
1832 Ecore_X_Event_Frame_Extents_Request *e;
1833
1834 e = calloc(1, sizeof(Ecore_X_Event_Frame_Extents_Request));
1835 if (!e)
1836 return;
1837
1838 e->win = xevent->xclient.window;
1839
1840 ecore_event_add(ECORE_X_EVENT_FRAME_EXTENTS_REQUEST, e, NULL, NULL);
1841 }
1842 else if ((xevent->xclient.message_type == ECORE_X_ATOM_WM_PROTOCOLS)
1843 && ((Ecore_X_Atom)xevent->xclient.data.l[0] ==
1844 ECORE_X_ATOM_NET_WM_PING)
1845 && (xevent->xclient.format == 32))
1846 {
1847 Ecore_X_Event_Ping *e;
1848 Ecore_X_Window root = 0;
1849
1850 e = calloc(1, sizeof(Ecore_X_Event_Ping));
1851 if (!e)
1852 return;
1853
1854 e->win = xevent->xclient.window;
1855 e->time = xevent->xclient.data.l[1];
1856 e->event_win = xevent->xclient.data.l[2];
1857
1858 /* send a reply anyway - we are alive... eventloop at least */
1859 ecore_event_add(ECORE_X_EVENT_PING, e, NULL, NULL);
1860 if (ScreenCount(_ecore_x_disp) > 1)
1861 {
1862 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1863 root = ecore_x_window_root_get(e->win);
1864 }
1865 else
1866 root = DefaultRootWindow(_ecore_x_disp);
1867
1868 if (xevent->xclient.window != root)
1869 {
1870 xevent->xclient.window = root;
1871 XSendEvent(_ecore_x_disp, root, False,
1872 SubstructureRedirectMask | SubstructureNotifyMask,
1873 xevent);
1874 }
1875 }
1876 else if ((xevent->xclient.message_type ==
1877 ECORE_X_ATOM_NET_STARTUP_INFO_BEGIN) &&
1878 (xevent->xclient.format == 8))
1879 _ecore_x_netwm_startup_info_begin(xevent->xclient.window,
1880 xevent->xclient.data.b);
1881 else if ((xevent->xclient.message_type == ECORE_X_ATOM_NET_STARTUP_INFO) &&
1882 (xevent->xclient.format == 8))
1883 _ecore_x_netwm_startup_info(xevent->xclient.window,
1884 xevent->xclient.data.b);
1885 else if ((xevent->xclient.message_type == 27777)
1886 && (xevent->xclient.data.l[0] == 0x7162534)
1887 && (xevent->xclient.format == 32)
1888 && (xevent->xclient.window == _ecore_x_private_win))
1889 {
1890 /* a grab sync marker */
1891 if (xevent->xclient.data.l[1] == 0x10000001)
1892 _ecore_x_window_grab_remove(xevent->xclient.data.l[2]);
1893 else if (xevent->xclient.data.l[1] == 0x10000002)
1894 _ecore_x_key_grab_remove(xevent->xclient.data.l[2]);
1895 }
1896 else
1897 {
1898 Ecore_X_Event_Client_Message *e;
1899 int i;
1900
1901 e = calloc(1, sizeof(Ecore_X_Event_Client_Message));
1902 if (!e)
1903 return;
1904
1905 e->win = xevent->xclient.window;
1906 e->message_type = xevent->xclient.message_type;
1907 e->format = xevent->xclient.format;
1908 for (i = 0; i < 5; i++)
1909 e->data.l[i] = xevent->xclient.data.l[i];
1910
1911 ecore_event_add(ECORE_X_EVENT_CLIENT_MESSAGE, e, NULL, NULL);
1912 }
1913} /* _ecore_x_event_handle_client_message */
1914
1915void
1916_ecore_x_event_handle_mapping_notify(XEvent *xevent)
1917{
1918 Ecore_X_Event_Mapping_Change *e;
1919
1920 _ecore_x_last_event_mouse_move = 0;
1921 XRefreshKeyboardMapping((XMappingEvent *)xevent);
1922 _ecore_x_modifiers_get();
1923 e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change));
1924 if (!e) return;
1925 switch (xevent->xmapping.request)
1926 {
1927 case MappingModifier:
1928 e->type = ECORE_X_MAPPING_MODIFIER;
1929 break;
1930
1931 case MappingKeyboard:
1932 e->type = ECORE_X_MAPPING_KEYBOARD;
1933 break;
1934
1935 case MappingPointer:
1936 default:
1937 e->type = ECORE_X_MAPPING_MOUSE;
1938 break;
1939 }
1940 e->keycode = xevent->xmapping.first_keycode;
1941 e->num = xevent->xmapping.count;
1942 ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL);
1943} /* _ecore_x_event_handle_mapping_notify */
1944
1945void
1946_ecore_x_event_handle_shape_change(XEvent *xevent)
1947{
1948 XShapeEvent *shape_event;
1949 Ecore_X_Event_Window_Shape *e;
1950
1951 _ecore_x_last_event_mouse_move = 0;
1952 shape_event = (XShapeEvent *)xevent;
1953 e = calloc(1, sizeof(Ecore_X_Event_Window_Shape));
1954 if (!e)
1955 return;
1956
1957 e->win = shape_event->window;
1958 e->time = shape_event->time;
1959 switch (shape_event->kind)
1960 {
1961 case ShapeBounding:
1962 e->type = ECORE_X_SHAPE_BOUNDING;
1963 break;
1964
1965 case ShapeClip:
1966 e->type = ECORE_X_SHAPE_CLIP;
1967 break;
1968
1969 case ShapeInput:
1970 e->type = ECORE_X_SHAPE_INPUT;
1971 break;
1972
1973 default:
1974 break;
1975 }
1976 e->x = shape_event->x;
1977 e->y = shape_event->y;
1978 e->w = shape_event->width;
1979 e->h = shape_event->height;
1980 e->shaped = shape_event->shaped;
1981 ecore_event_add(ECORE_X_EVENT_WINDOW_SHAPE, e, NULL, NULL);
1982} /* _ecore_x_event_handle_shape_change */
1983
1984void
1985_ecore_x_event_handle_screensaver_notify(XEvent *xevent)
1986{
1987#ifdef ECORE_XSS
1988 XScreenSaverNotifyEvent *screensaver_event;
1989 Ecore_X_Event_Screensaver_Notify *e;
1990
1991 _ecore_x_last_event_mouse_move = 0;
1992 screensaver_event = (XScreenSaverNotifyEvent *)xevent;
1993 e = calloc(1, sizeof(Ecore_X_Event_Screensaver_Notify));
1994 if (!e)
1995 return;
1996
1997 e->win = screensaver_event->window;
1998 if (screensaver_event->state == ScreenSaverOn)
1999 e->on = EINA_TRUE;
2000 else
2001 e->on = EINA_FALSE;
2002
2003 e->time = screensaver_event->time;
2004 ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL);
2005#else /* ifdef ECORE_XSS */
2006 xevent = NULL;
2007#endif /* ifdef ECORE_XSS */
2008} /* _ecore_x_event_handle_screensaver_notify */
2009
2010void
2011_ecore_x_event_handle_sync_counter(XEvent *xevent)
2012{
2013 XSyncCounterNotifyEvent *sync_counter_event;
2014 Ecore_X_Event_Sync_Counter *e;
2015
2016 _ecore_x_last_event_mouse_move = 0;
2017 sync_counter_event = (XSyncCounterNotifyEvent *)xevent;
2018 e = calloc(1, sizeof(Ecore_X_Event_Sync_Counter));
2019 if (!e)
2020 return;
2021
2022 e->time = sync_counter_event->time;
2023 ecore_event_add(ECORE_X_EVENT_SYNC_COUNTER, e, NULL, NULL);
2024} /* _ecore_x_event_handle_sync_counter */
2025
2026void
2027_ecore_x_event_handle_sync_alarm(XEvent *xevent)
2028{
2029 XSyncAlarmNotifyEvent *sync_alarm_event;
2030 Ecore_X_Event_Sync_Alarm *e;
2031
2032 _ecore_x_last_event_mouse_move = 0;
2033 sync_alarm_event = (XSyncAlarmNotifyEvent *)xevent;
2034
2035 e = calloc(1, sizeof(Ecore_X_Event_Sync_Alarm));
2036 if (!e)
2037 return;
2038
2039 e->time = sync_alarm_event->time;
2040 e->alarm = sync_alarm_event->alarm;
2041 ecore_event_add(ECORE_X_EVENT_SYNC_ALARM, e, NULL, NULL);
2042} /* _ecore_x_event_handle_sync_alarm */
2043
2044#ifdef ECORE_XRANDR
2045void
2046_ecore_x_event_handle_randr_change(XEvent *xevent)
2047{
2048 XRRScreenChangeNotifyEvent *randr_event;
2049 Ecore_X_Event_Screen_Change *e;
2050
2051 _ecore_x_last_event_mouse_move = 0;
2052 randr_event = (XRRScreenChangeNotifyEvent *)xevent;
2053 if (!XRRUpdateConfiguration(xevent))
2054 ERR("Can't update RR config!");
2055
2056 e = calloc(1, sizeof(Ecore_X_Event_Screen_Change));
2057 if (!e)
2058 return;
2059
2060 e->win = randr_event->window;
2061 e->root = randr_event->root;
2062 e->size.width = randr_event->width;
2063 e->size.height = randr_event->height;
2064 e->time = randr_event->timestamp;
2065 e->config_time = randr_event->config_timestamp;
2066 e->size.width_mm = randr_event->mwidth;
2067 e->size.height_mm = randr_event->mheight;
2068 e->orientation = randr_event->rotation;
2069 e->subpixel_order = randr_event->subpixel_order;
2070 ecore_event_add(ECORE_X_EVENT_SCREEN_CHANGE, e, NULL, NULL);
2071} /* _ecore_x_event_handle_randr_change */
2072
2073static void
2074_ecore_x_event_handle_randr_notify_crtc_change(const XRRNotifyEvent *xevent)
2075{
2076 const XRRCrtcChangeNotifyEvent *randr_event;
2077 Ecore_X_Event_Randr_Crtc_Change *e;
2078
2079 randr_event = (const XRRCrtcChangeNotifyEvent *)xevent;
2080
2081 e = calloc(1, sizeof(Ecore_X_Event_Randr_Crtc_Change));
2082 if (!e)
2083 return;
2084
2085 e->win = randr_event->window;
2086 e->crtc = randr_event->crtc;
2087 e->mode = randr_event->mode;
2088 e->orientation = randr_event->rotation;
2089 e->geo.x = randr_event->x;
2090 e->geo.y = randr_event->y;
2091 e->geo.w = randr_event->width;
2092 e->geo.h = randr_event->height;
2093 ecore_event_add(ECORE_X_EVENT_RANDR_CRTC_CHANGE, e, NULL, NULL);
2094} /* _ecore_x_event_handle_randr_notify_crtc_change */
2095
2096static void
2097_ecore_x_event_handle_randr_notify_output_change(const XRRNotifyEvent *xevent)
2098{
2099 const XRROutputChangeNotifyEvent *randr_event;
2100 Ecore_X_Event_Randr_Output_Change *e;
2101
2102 randr_event = (const XRROutputChangeNotifyEvent *)xevent;
2103
2104 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Change));
2105 if (!e)
2106 return;
2107
2108 e->win = randr_event->window;
2109 e->output = randr_event->output;
2110 e->crtc = randr_event->crtc;
2111 e->mode = randr_event->mode;
2112 e->orientation = randr_event->rotation;
2113 e->connection = randr_event->connection;
2114 e->subpixel_order = randr_event->subpixel_order;
2115 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_CHANGE, e, NULL, NULL);
2116} /* _ecore_x_event_handle_randr_notify_output_change */
2117
2118static void
2119_ecore_x_event_handle_randr_notify_output_property(const XRRNotifyEvent *xevent)
2120{
2121 const XRROutputPropertyNotifyEvent *randr_event;
2122 Ecore_X_Event_Randr_Output_Property_Notify *e;
2123
2124 randr_event = (const XRROutputPropertyNotifyEvent *)xevent;
2125
2126 e = calloc(1, sizeof(Ecore_X_Event_Randr_Output_Property_Notify));
2127 if (!e)
2128 return;
2129
2130 e->win = randr_event->window;
2131 e->output = randr_event->output;
2132 e->property = randr_event->property;
2133 e->time = randr_event->timestamp;
2134 if (randr_event->state == PropertyNewValue)
2135 e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD;
2136 else
2137 e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL;
2138 ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL);
2139} /* _ecore_x_event_handle_randr_notify_output_property */
2140
2141void
2142_ecore_x_event_handle_randr_notify(XEvent *xevent)
2143{
2144 const XRRNotifyEvent *randr_event;
2145
2146 _ecore_x_last_event_mouse_move = 0;
2147 randr_event = (const XRRNotifyEvent *)xevent;
2148 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2149 switch (randr_event->subtype)
2150 {
2151 case RRNotify_CrtcChange:
2152 _ecore_x_event_handle_randr_notify_crtc_change(randr_event);
2153 break;
2154
2155 case RRNotify_OutputChange:
2156 _ecore_x_event_handle_randr_notify_output_change(randr_event);
2157 break;
2158
2159 case RRNotify_OutputProperty:
2160 _ecore_x_event_handle_randr_notify_output_property(randr_event);
2161 break;
2162
2163 default:
2164 ERR("Unknown XRandR RRNotify subtype: %d.",
2165 randr_event->subtype);
2166 break;
2167 } /* switch */
2168} /* _ecore_x_event_handle_randr_notify */
2169
2170#endif /* ifdef ECORE_XRANDR */
2171
2172#ifdef ECORE_XFIXES
2173void
2174_ecore_x_event_handle_fixes_selection_notify(XEvent *event)
2175{
2176 XFixesSelectionNotifyEvent *notify_event =
2177 (XFixesSelectionNotifyEvent *)event;
2178 Ecore_X_Event_Fixes_Selection_Notify *e;
2179 Ecore_X_Atom sel;
2180
2181 _ecore_x_last_event_mouse_move = 0;
2182 /* Nothing here yet */
2183
2184 e = calloc(1, sizeof(*e));
2185 if (!e)
2186 return;
2187
2188 e->win = notify_event->window;
2189 e->owner = notify_event->owner;
2190 e->time = notify_event->timestamp;
2191 e->selection_time = notify_event->selection_timestamp;
2192 e->atom = sel = notify_event->selection;
2193 if (sel == ECORE_X_ATOM_SELECTION_PRIMARY)
2194 e->selection = ECORE_X_SELECTION_PRIMARY;
2195 else if (sel == ECORE_X_ATOM_SELECTION_SECONDARY)
2196 e->selection = ECORE_X_SELECTION_SECONDARY;
2197 else if (sel == ECORE_X_ATOM_SELECTION_CLIPBOARD)
2198 e->selection = ECORE_X_SELECTION_CLIPBOARD;
2199 else
2200 e->selection = ECORE_X_SELECTION_OTHER;
2201 e->reason = notify_event->subtype;
2202
2203 ecore_event_add(ECORE_X_EVENT_FIXES_SELECTION_NOTIFY, e, NULL, NULL);
2204} /* _ecore_x_event_handle_fixes_selection_notify */
2205
2206#endif /* ifdef ECORE_XFIXES */
2207
2208#ifdef ECORE_XDAMAGE
2209void
2210_ecore_x_event_handle_damage_notify(XEvent *event)
2211{
2212 XDamageNotifyEvent *damage_event;
2213 Ecore_X_Event_Damage *e;
2214
2215 _ecore_x_last_event_mouse_move = 0;
2216 damage_event = (XDamageNotifyEvent *)event;
2217
2218 e = calloc(1, sizeof(Ecore_X_Event_Damage));
2219 if (!e)
2220 return;
2221
2222 e->level = damage_event->level;
2223 e->drawable = damage_event->drawable;
2224 e->damage = damage_event->damage;
2225 e->more = damage_event->more;
2226 e->time = damage_event->timestamp;
2227 e->area.x = damage_event->area.x;
2228 e->area.y = damage_event->area.y;
2229 e->area.width = damage_event->area.width;
2230 e->area.height = damage_event->area.height;
2231 e->geometry.x = damage_event->geometry.x;
2232 e->geometry.y = damage_event->geometry.y;
2233 e->geometry.width = damage_event->geometry.width;
2234 e->geometry.height = damage_event->geometry.height;
2235
2236 ecore_event_add(ECORE_X_EVENT_DAMAGE_NOTIFY, e, NULL, NULL);
2237} /* _ecore_x_event_handle_damage_notify */
2238
2239#endif /* ifdef ECORE_XDAMAGE */
2240
2241static void
2242_ecore_x_event_free_generic_event(void *data,
2243 void *ev)
2244{
2245#ifdef ECORE_XI2
2246 Ecore_X_Event_Generic *e = (Ecore_X_Event_Generic *)ev;
2247
2248 if (data)
2249 {
2250 if (e->data)
2251 XFreeEventData(_ecore_x_disp, (XGenericEventCookie *)data);
2252 free(data);
2253 }
2254 free(e);
2255#else
2256 return;
2257 data = NULL; ev = NULL;
2258#endif /* ifdef ECORE_XI2 */
2259} /* _ecore_x_event_free_generic_event */
2260
2261void
2262_ecore_x_event_handle_generic_event(XEvent *event)
2263{
2264#ifdef ECORE_XI2
2265 XGenericEvent *generic_event;
2266 Ecore_X_Event_Generic *e;
2267 XGenericEventCookie *data;
2268
2269 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2270 generic_event = (XGenericEvent *)event;
2271
2272 e = calloc(1, sizeof(Ecore_X_Event_Generic));
2273 if (!e)
2274 return;
2275
2276 if (XGetEventData(_ecore_x_disp, &(event->xcookie)))
2277 {
2278 e->cookie = event->xcookie.cookie;
2279 e->data = event->xcookie.data;
2280 }
2281 else
2282 {
2283 e->cookie = 0;
2284 e->data = NULL;
2285 }
2286
2287 e->extension = generic_event->extension;
2288 e->evtype = generic_event->evtype;
2289
2290 if (e->extension == _ecore_x_xi2_opcode)
2291 _ecore_x_input_handler(event);
2292
2293 data = malloc(sizeof(XGenericEventCookie));
2294 if (data) memcpy(data, &(event->xcookie), sizeof(XGenericEventCookie));
2295 ecore_event_add(ECORE_X_EVENT_GENERIC,
2296 e,
2297 _ecore_x_event_free_generic_event,
2298 data);
2299#else
2300 return;
2301 event = NULL;
2302#endif /* ifdef ECORE_XI2 */
2303} /* _ecore_x_event_handle_generic_event */
2304
2305#ifdef ECORE_XGESTURE
2306void
2307_ecore_x_event_handle_gesture_notify_flick(XEvent *xevent)
2308{
2309 XGestureNotifyFlickEvent *xfe;
2310 Ecore_X_Event_Gesture_Notify_Flick *e;
2311
2312 _ecore_x_last_event_mouse_move = 0;
2313 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2314
2315 xfe = (XGestureNotifyFlickEvent *)xevent;
2316 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Flick));
2317 if (!e)
2318 return;
2319
2320 e->win = xfe->window;
2321 e->time = xfe->time;
2322 e->subtype = xfe->kind;
2323 e->num_fingers = xfe->num_finger;
2324 e->distance = xfe->distance;
2325 e->duration = xfe->duration;
2326 e->direction = xfe->direction;
2327 e->angle = XFixedToDouble(xfe->angle);
2328
2329 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_FLICK, e, NULL, NULL);
2330}
2331
2332void
2333_ecore_x_event_handle_gesture_notify_pan(XEvent *xevent)
2334{
2335 XGestureNotifyPanEvent *xpe;
2336 Ecore_X_Event_Gesture_Notify_Pan *e;
2337
2338 _ecore_x_last_event_mouse_move = 0;
2339 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2340
2341 xpe = (XGestureNotifyPanEvent *)xevent;
2342 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Pan));
2343 if (!e)
2344 return;
2345
2346 e->win = xpe->window;
2347 e->time = xpe->time;
2348 e->subtype = xpe->kind;
2349 e->num_fingers = xpe->num_finger;
2350 e->dx = xpe->dx;
2351 e->dy = xpe->dy;
2352 e->distance = xpe->distance;
2353 e->duration = xpe->duration;
2354 e->direction = xpe->direction;
2355
2356 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PAN, e, NULL, NULL);
2357}
2358
2359void
2360_ecore_x_event_handle_gesture_notify_pinchrotation(XEvent *xevent)
2361{
2362 XGestureNotifyPinchRotationEvent *xpre;
2363 Ecore_X_Event_Gesture_Notify_PinchRotation *e;
2364
2365 _ecore_x_last_event_mouse_move = 0;
2366 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2367
2368 xpre = (XGestureNotifyPinchRotationEvent *)xevent;
2369 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_PinchRotation));
2370 if (!e)
2371 return;
2372
2373 e->win = xpre->window;
2374 e->time = xpre->time;
2375 e->subtype = xpre->kind;
2376 e->num_fingers = xpre->num_finger;
2377 e->distance = xpre->distance;
2378 e->cx = xpre->cx;
2379 e->cy = xpre->cy;
2380 e->zoom = XFixedToDouble(xpre->zoom);
2381 e->angle = XFixedToDouble(xpre->angle);
2382
2383 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_PINCHROTATION, e, NULL, NULL);
2384}
2385
2386void
2387_ecore_x_event_handle_gesture_notify_tap(XEvent *xevent)
2388{
2389 XGestureNotifyTapEvent *xte;
2390 Ecore_X_Event_Gesture_Notify_Tap *e;
2391
2392 _ecore_x_last_event_mouse_move = 0;
2393 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2394
2395 xte = (XGestureNotifyTapEvent *)xevent;
2396 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Tap));
2397 if (!e)
2398 return;
2399
2400 e->win = xte->window;
2401 e->time = xte->time;
2402 e->subtype = xte->kind;
2403 e->num_fingers = xte->num_finger;
2404 e->cx = xte->cx;
2405 e->cy = xte->cy;
2406 e->tap_repeat = xte->tap_repeat;
2407 e->interval = xte->interval;
2408
2409 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAP, e, NULL, NULL);
2410}
2411
2412void
2413_ecore_x_event_handle_gesture_notify_tapnhold(XEvent *xevent)
2414{
2415 XGestureNotifyTapNHoldEvent *xthe;
2416 Ecore_X_Event_Gesture_Notify_TapNHold *e;
2417
2418 _ecore_x_last_event_mouse_move = 0;
2419 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2420
2421 xthe = (XGestureNotifyTapNHoldEvent *)xevent;
2422 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_TapNHold));
2423 if (!e)
2424 return;
2425
2426 e->win = xthe->window;
2427 e->time = xthe->time;
2428 e->subtype = xthe->kind;
2429 e->num_fingers = xthe->num_finger;
2430 e->cx = xthe->cx;
2431 e->cy = xthe->cy;
2432 e->interval = xthe->interval;
2433 e->hold_time = xthe->holdtime;
2434
2435 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_TAPNHOLD, e, NULL, NULL);
2436}
2437
2438void
2439 _ecore_x_event_handle_gesture_notify_hold(XEvent *xevent)
2440{
2441 XGestureNotifyHoldEvent *xhe;
2442 Ecore_X_Event_Gesture_Notify_Hold *e;
2443
2444 _ecore_x_last_event_mouse_move = 0;
2445 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2446
2447 xhe = (XGestureNotifyHoldEvent *)xevent;
2448 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Hold));
2449 if (!e)
2450 return;
2451
2452 e->win = xhe->window;
2453 e->time = xhe->time;
2454 e->subtype = xhe->kind;
2455 e->num_fingers = xhe->num_finger;
2456 e->cx = xhe->cx;
2457 e->cy = xhe->cy;
2458 e->hold_time = xhe->holdtime;
2459
2460 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_HOLD, e, NULL, NULL);
2461}
2462
2463void
2464 _ecore_x_event_handle_gesture_notify_group(XEvent *xevent)
2465{
2466 XGestureNotifyGroupEvent *xge;
2467 Ecore_X_Event_Gesture_Notify_Group *e;
2468
2469 _ecore_x_last_event_mouse_move = 0;
2470 LOGFN(__FILE__, __LINE__, __FUNCTION__);
2471
2472 xge = (XGestureNotifyGroupEvent *)xevent;
2473 e = calloc(1, sizeof(Ecore_X_Event_Gesture_Notify_Group));
2474 if (!e)
2475 return;
2476
2477 e->win = xge->window;
2478 e->time = xge->time;
2479 e->subtype = xge->kind;
2480 e->num_groups = xge->num_group;
2481 e->group_id = xge->groupid;
2482
2483 ecore_event_add(ECORE_X_EVENT_GESTURE_NOTIFY_GROUP, e, NULL, NULL);
2484}
2485#endif /* ifdef ECORE_XGESTURE */
2486
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_fixes.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_fixes.c
new file mode 100644
index 0000000..e81af13
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_fixes.c
@@ -0,0 +1,364 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6
7#include "ecore_x_private.h"
8#include "Ecore_X.h"
9
10static int _fixes_available;
11#ifdef ECORE_XFIXES
12static int _fixes_major, _fixes_minor;
13#endif /* ifdef ECORE_XFIXES */
14
15void
16_ecore_x_fixes_init(void)
17{
18#ifdef ECORE_XFIXES
19 _fixes_major = 3;
20 _fixes_minor = 0;
21
22 LOGFN(__FILE__, __LINE__, __FUNCTION__);
23 if (XFixesQueryVersion(_ecore_x_disp, &_fixes_major, &_fixes_minor))
24 {
25 _fixes_available = 1;
26
27 ECORE_X_EVENT_FIXES_SELECTION_NOTIFY = ecore_event_type_new();
28 }
29 else
30 _fixes_available = 0;
31
32#else /* ifdef ECORE_XFIXES */
33 _fixes_available = 0;
34#endif /* ifdef ECORE_XFIXES */
35} /* _ecore_x_fixes_init */
36
37#ifdef ECORE_XFIXES
38/* I don't know what to call this function. */
39static XRectangle *
40_ecore_x_rectangle_ecore_to_x(Ecore_X_Rectangle *rects,
41 int num)
42{
43 XRectangle *xrect;
44 int i;
45
46 if (num == 0)
47 return NULL;
48
49 xrect = malloc(sizeof(XRectangle) * num);
50 if (!xrect)
51 return NULL;
52
53 for (i = 0; i < num; i++)
54 {
55 xrect[i].x = rects[i].x;
56 xrect[i].y = rects[i].y;
57 xrect[i].width = rects[i].width;
58 xrect[i].height = rects[i].height;
59 }
60 return xrect;
61} /* _ecore_x_rectangle_ecore_to_x */
62
63static Ecore_X_Rectangle *
64_ecore_x_rectangle_x_to_ecore(XRectangle *xrect,
65 int num)
66{
67 Ecore_X_Rectangle *rects;
68 int i;
69
70 if (num == 0)
71 return NULL;
72
73 rects = malloc(sizeof(Ecore_X_Rectangle) * num);
74 if (!rects)
75 return NULL;
76
77 for (i = 0; i < num; i++)
78 {
79 rects[i].x = xrect[i].x;
80 rects[i].y = xrect[i].y;
81 rects[i].width = xrect[i].width;
82 rects[i].height = xrect[i].height;
83 }
84 return rects;
85} /* _ecore_x_rectangle_x_to_ecore */
86
87#endif /* ifdef ECORE_XFIXES */
88
89EAPI Eina_Bool
90ecore_x_fixes_selection_notification_request(Ecore_X_Atom selection)
91{
92#ifdef ECORE_XFIXES
93 if (_fixes_available)
94 {
95 XFixesSelectSelectionInput (_ecore_x_disp,
96 DefaultRootWindow(_ecore_x_disp),
97 selection,
98 XFixesSetSelectionOwnerNotifyMask |
99 XFixesSelectionWindowDestroyNotifyMask |
100 XFixesSelectionClientCloseNotifyMask);
101 return EINA_TRUE;
102 }
103#endif
104 return EINA_FALSE;
105}
106
107EAPI Ecore_X_Region
108ecore_x_region_new(Ecore_X_Rectangle *rects,
109 int num)
110{
111#ifdef ECORE_XFIXES
112 Ecore_X_Region region;
113 XRectangle *xrect;
114
115 LOGFN(__FILE__, __LINE__, __FUNCTION__);
116 xrect = _ecore_x_rectangle_ecore_to_x(rects, num);
117 region = XFixesCreateRegion(_ecore_x_disp, xrect, num);
118 free(xrect);
119 return region;
120#else /* ifdef ECORE_XFIXES */
121 return 0;
122#endif /* ifdef ECORE_XFIXES */
123} /* ecore_x_region_new */
124
125EAPI Ecore_X_Region
126ecore_x_region_new_from_bitmap(Ecore_X_Pixmap bitmap)
127{
128#ifdef ECORE_XFIXES
129 Ecore_X_Region region;
130
131 LOGFN(__FILE__, __LINE__, __FUNCTION__);
132 region = XFixesCreateRegionFromBitmap(_ecore_x_disp, bitmap);
133 return region;
134#else /* ifdef ECORE_XFIXES */
135 return 0;
136#endif /* ifdef ECORE_XFIXES */
137} /* ecore_x_region_new_from_bitmap */
138
139EAPI Ecore_X_Region
140ecore_x_region_new_from_window(Ecore_X_Window win,
141 Ecore_X_Region_Type type)
142{
143#ifdef ECORE_XFIXES
144 Ecore_X_Region region;
145
146 LOGFN(__FILE__, __LINE__, __FUNCTION__);
147 region = XFixesCreateRegionFromWindow(_ecore_x_disp, win, type);
148 return region;
149#else /* ifdef ECORE_XFIXES */
150 return 0;
151#endif /* ifdef ECORE_XFIXES */
152} /* ecore_x_region_new_from_window */
153
154EAPI Ecore_X_Region
155ecore_x_region_new_from_gc(Ecore_X_GC gc)
156{
157#ifdef ECORE_XFIXES
158 Ecore_X_Region region;
159
160 LOGFN(__FILE__, __LINE__, __FUNCTION__);
161 region = XFixesCreateRegionFromGC(_ecore_x_disp, gc);
162 return region;
163#else /* ifdef ECORE_XFIXES */
164 return 0;
165#endif /* ifdef ECORE_XFIXES */
166} /* ecore_x_region_new_from_gc */
167
168EAPI Ecore_X_Region
169ecore_x_region_new_from_picture(Ecore_X_Picture picture)
170{
171#ifdef ECORE_XFIXES
172 Ecore_X_Region region;
173
174 LOGFN(__FILE__, __LINE__, __FUNCTION__);
175 region = XFixesCreateRegionFromPicture(_ecore_x_disp, picture);
176 return region;
177#else /* ifdef ECORE_XFIXES */
178 return 0;
179#endif /* ifdef ECORE_XFIXES */
180} /* ecore_x_region_new_from_picture */
181
182EAPI void
183ecore_x_region_free(Ecore_X_Region region)
184{
185#ifdef ECORE_XFIXES
186 LOGFN(__FILE__, __LINE__, __FUNCTION__);
187 XFixesDestroyRegion(_ecore_x_disp, region);
188#endif /* ifdef ECORE_XFIXES */
189} /* ecore_x_region_free */
190
191EAPI void
192ecore_x_region_set(Ecore_X_Region region,
193 Ecore_X_Rectangle *rects,
194 int num)
195{
196#ifdef ECORE_XFIXES
197 XRectangle *xrect = _ecore_x_rectangle_ecore_to_x(rects, num);
198 LOGFN(__FILE__, __LINE__, __FUNCTION__);
199 XFixesSetRegion(_ecore_x_disp, region, xrect, num);
200#endif /* ifdef ECORE_XFIXES */
201} /* ecore_x_region_set */
202
203EAPI void
204ecore_x_region_copy(Ecore_X_Region dest,
205 Ecore_X_Region source)
206{
207#ifdef ECORE_XFIXES
208 LOGFN(__FILE__, __LINE__, __FUNCTION__);
209 XFixesCopyRegion(_ecore_x_disp, dest, source);
210#endif /* ifdef ECORE_XFIXES */
211} /* ecore_x_region_copy */
212
213EAPI void
214ecore_x_region_combine(Ecore_X_Region dest,
215 Ecore_X_Region source1,
216 Ecore_X_Region source2)
217{
218#ifdef ECORE_XFIXES
219 LOGFN(__FILE__, __LINE__, __FUNCTION__);
220 XFixesUnionRegion(_ecore_x_disp, dest, source1, source2);
221#endif /* ifdef ECORE_XFIXES */
222} /* ecore_x_region_combine */
223
224EAPI void
225ecore_x_region_intersect(Ecore_X_Region dest,
226 Ecore_X_Region source1,
227 Ecore_X_Region source2)
228{
229#ifdef ECORE_XFIXES
230 LOGFN(__FILE__, __LINE__, __FUNCTION__);
231 XFixesIntersectRegion(_ecore_x_disp, dest, source1, source2);
232#endif /* ifdef ECORE_XFIXES */
233} /* ecore_x_region_intersect */
234
235EAPI void
236ecore_x_region_subtract(Ecore_X_Region dest,
237 Ecore_X_Region source1,
238 Ecore_X_Region source2)
239{
240#ifdef ECORE_XFIXES
241 LOGFN(__FILE__, __LINE__, __FUNCTION__);
242 XFixesSubtractRegion(_ecore_x_disp, dest, source1, source2);
243#endif /* ifdef ECORE_XFIXES */
244} /* ecore_x_region_subtract */
245
246EAPI void
247ecore_x_region_invert(Ecore_X_Region dest,
248 Ecore_X_Rectangle *bounds,
249 Ecore_X_Region source)
250{
251#ifdef ECORE_XFIXES
252 XRectangle *xbound;
253 int num = 0;
254
255 LOGFN(__FILE__, __LINE__, __FUNCTION__);
256 while (bounds + num) num++;
257 xbound = _ecore_x_rectangle_ecore_to_x(bounds, num);
258
259 XFixesInvertRegion(_ecore_x_disp, dest, xbound, source);
260#endif /* ifdef ECORE_XFIXES */
261} /* ecore_x_region_invert */
262
263EAPI void
264ecore_x_region_translate(Ecore_X_Region region,
265 int dx,
266 int dy)
267{
268#ifdef ECORE_XFIXES
269 LOGFN(__FILE__, __LINE__, __FUNCTION__);
270 XFixesTranslateRegion(_ecore_x_disp, region, dx, dy);
271#endif /* ifdef ECORE_XFIXES */
272} /* ecore_x_region_translate */
273
274EAPI void
275ecore_x_region_extents(Ecore_X_Region dest,
276 Ecore_X_Region source)
277{
278#ifdef ECORE_XFIXES
279 LOGFN(__FILE__, __LINE__, __FUNCTION__);
280 XFixesRegionExtents(_ecore_x_disp, dest, source);
281#endif /* ifdef ECORE_XFIXES */
282} /* ecore_x_region_extents */
283
284EAPI Ecore_X_Rectangle *
285ecore_x_region_fetch(Ecore_X_Region region,
286 int *num,
287 Ecore_X_Rectangle *bounds){
288#ifdef ECORE_XFIXES
289 Ecore_X_Rectangle *rects;
290 XRectangle *xrect, xbound;
291
292 LOGFN(__FILE__, __LINE__, __FUNCTION__);
293 xrect = XFixesFetchRegionAndBounds(_ecore_x_disp, region, num, &xbound);
294 rects = _ecore_x_rectangle_x_to_ecore(xrect, *num);
295 (*bounds).x = xbound.x;
296 (*bounds).y = xbound.y;
297 (*bounds).width = xbound.width;
298 (*bounds).height = xbound.height;
299 return rects;
300#else /* ifdef ECORE_XFIXES */
301 return NULL;
302#endif /* ifdef ECORE_XFIXES */
303} /* ecore_x_region_fetch */
304
305EAPI void
306ecore_x_region_expand(Ecore_X_Region dest,
307 Ecore_X_Region source,
308 unsigned int left,
309 unsigned int right,
310 unsigned int top,
311 unsigned int bottom)
312{
313#ifdef ECORE_XFIXES
314 LOGFN(__FILE__, __LINE__, __FUNCTION__);
315 XFixesExpandRegion(_ecore_x_disp, dest, source, left, right, top, bottom);
316#endif /* ifdef ECORE_XFIXES */
317} /* ecore_x_region_expand */
318
319EAPI void
320ecore_x_region_gc_clip_set(Ecore_X_Region region,
321 Ecore_X_GC gc,
322 int x_origin,
323 int y_origin)
324{
325#ifdef ECORE_XFIXES
326 LOGFN(__FILE__, __LINE__, __FUNCTION__);
327 XFixesSetGCClipRegion(_ecore_x_disp, gc, x_origin, y_origin, region);
328#endif /* ifdef ECORE_XFIXES */
329} /* ecore_x_region_gc_clip_set */
330
331EAPI void
332ecore_x_region_window_shape_set(Ecore_X_Region region,
333 Ecore_X_Window win,
334 Ecore_X_Shape_Type type,
335 int x_offset,
336 int y_offset)
337{
338#ifdef ECORE_XFIXES
339 LOGFN(__FILE__, __LINE__, __FUNCTION__);
340 XFixesSetWindowShapeRegion(_ecore_x_disp,
341 win,
342 type,
343 x_offset,
344 y_offset,
345 region);
346#endif /* ifdef ECORE_XFIXES */
347} /* ecore_x_region_window_shape_set */
348
349EAPI void
350ecore_x_region_picture_clip_set(Ecore_X_Region region,
351 Ecore_X_Picture picture,
352 int x_origin,
353 int y_origin)
354{
355#ifdef ECORE_XFIXES
356 LOGFN(__FILE__, __LINE__, __FUNCTION__);
357 XFixesSetPictureClipRegion(_ecore_x_disp,
358 picture,
359 x_origin,
360 y_origin,
361 region);
362#endif /* ifdef ECORE_XFIXES */
363} /* ecore_x_region_picture_clip_set */
364
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c
new file mode 100644
index 0000000..10b807b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gc.c
@@ -0,0 +1,171 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <string.h>
6
7#include "Ecore.h"
8#include "ecore_x_private.h"
9#include "Ecore_X.h"
10
11/**
12 * Creates a new default graphics context associated with the given
13 * drawable.
14 * @param draw Drawable to create graphics context with. If @c 0 is
15 * given instead, the default root window is used.
16 * @param value_mask Bitmask values.
17 * @param value_list List of values. The order of values must be the
18 * same than the corresponding bitmaks.
19 * @return The new default graphics context.
20 */
21EAPI Ecore_X_GC
22ecore_x_gc_new(Ecore_X_Drawable draw,
23 Ecore_X_GC_Value_Mask value_mask,
24 const unsigned int *value_list)
25{
26 XGCValues gcv;
27 int mask;
28 int idx;
29 int i;
30
31 LOGFN(__FILE__, __LINE__, __FUNCTION__);
32 if (!draw)
33 draw = DefaultRootWindow(_ecore_x_disp);
34
35 memset(&gcv, 0, sizeof (gcv));
36
37 for (i = 0, idx = 0, mask = 1; i <= 22; i++, mask <<= 1)
38 {
39 switch (mask & value_mask)
40 {
41 case ECORE_X_GC_VALUE_MASK_FUNCTION:
42 gcv.function = value_list[idx];
43 idx++;
44 break;
45
46 case ECORE_X_GC_VALUE_MASK_PLANE_MASK:
47 gcv.plane_mask = value_list[idx];
48 idx++;
49 break;
50
51 case ECORE_X_GC_VALUE_MASK_FOREGROUND:
52 gcv.foreground = value_list[idx];
53 idx++;
54 break;
55
56 case ECORE_X_GC_VALUE_MASK_BACKGROUND:
57 gcv.background = value_list[idx];
58 idx++;
59 break;
60
61 case ECORE_X_GC_VALUE_MASK_LINE_WIDTH:
62 gcv.line_width = value_list[idx];
63 idx++;
64 break;
65
66 case ECORE_X_GC_VALUE_MASK_LINE_STYLE:
67 gcv.line_style = value_list[idx];
68 idx++;
69 break;
70
71 case ECORE_X_GC_VALUE_MASK_CAP_STYLE:
72 gcv.cap_style = value_list[idx];
73 idx++;
74 break;
75
76 case ECORE_X_GC_VALUE_MASK_JOIN_STYLE:
77 gcv.join_style = value_list[idx];
78 idx++;
79 break;
80
81 case ECORE_X_GC_VALUE_MASK_FILL_STYLE:
82 gcv.fill_style = value_list[idx];
83 idx++;
84 break;
85
86 case ECORE_X_GC_VALUE_MASK_FILL_RULE:
87 gcv.fill_rule = value_list[idx];
88 idx++;
89 break;
90
91 case ECORE_X_GC_VALUE_MASK_TILE:
92 gcv.tile = value_list[idx];
93 idx++;
94 break;
95
96 case ECORE_X_GC_VALUE_MASK_STIPPLE:
97 gcv.stipple = value_list[idx];
98 idx++;
99 break;
100
101 case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_X:
102 gcv.ts_x_origin = value_list[idx];
103 idx++;
104 break;
105
106 case ECORE_X_GC_VALUE_MASK_TILE_STIPPLE_ORIGIN_Y:
107 gcv.ts_y_origin = value_list[idx];
108 idx++;
109 break;
110
111 case ECORE_X_GC_VALUE_MASK_FONT:
112 gcv.font = value_list[idx];
113 idx++;
114 break;
115
116 case ECORE_X_GC_VALUE_MASK_SUBWINDOW_MODE:
117 gcv.subwindow_mode = value_list[idx];
118 idx++;
119 break;
120
121 case ECORE_X_GC_VALUE_MASK_GRAPHICS_EXPOSURES:
122 gcv.graphics_exposures = value_list[idx];
123 idx++;
124 break;
125
126 case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_X:
127 gcv.clip_x_origin = value_list[idx];
128 idx++;
129 break;
130
131 case ECORE_X_GC_VALUE_MASK_CLIP_ORIGIN_Y:
132 gcv.clip_y_origin = value_list[idx];
133 idx++;
134 break;
135
136 case ECORE_X_GC_VALUE_MASK_CLIP_MASK:
137 gcv.clip_mask = value_list[idx];
138 idx++;
139 break;
140
141 case ECORE_X_GC_VALUE_MASK_DASH_OFFSET:
142 gcv.dash_offset = value_list[idx];
143 idx++;
144 break;
145
146 case ECORE_X_GC_VALUE_MASK_DASH_LIST:
147 gcv.dashes = value_list[idx];
148 idx++;
149 break;
150
151 case ECORE_X_GC_VALUE_MASK_ARC_MODE:
152 gcv.arc_mode = value_list[idx];
153 idx++;
154 break;
155 } /* switch */
156 }
157
158 return XCreateGC(_ecore_x_disp, draw, value_mask, &gcv);
159} /* ecore_x_gc_new */
160
161/**
162 * Deletes and frees the given graphics context.
163 * @param gc The given graphics context.
164 */
165EAPI void
166ecore_x_gc_free(Ecore_X_GC gc)
167{
168 LOGFN(__FILE__, __LINE__, __FUNCTION__);
169 XFreeGC(_ecore_x_disp, gc);
170} /* ecore_x_gc_free */
171
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gesture.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gesture.c
new file mode 100644
index 0000000..e1dc75c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_gesture.c
@@ -0,0 +1,136 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6
7static Eina_Bool _gesture_available = EINA_FALSE;
8
9#ifdef ECORE_XGESTURE
10static int _gesture_major, _gesture_minor, _gesture_patch;
11int _gesture_version;
12#endif /* ifdef ECORE_XGESTURE */
13
14void
15_ecore_x_gesture_init(void)
16{
17#ifdef ECORE_XGESTURE
18 _gesture_major = 0;
19 _gesture_minor = 0;
20 _gesture_patch = 0;
21 _gesture_version = 0;
22
23 if (XGestureQueryVersion(_ecore_x_disp, &_gesture_major, &_gesture_minor, &_gesture_patch))
24 {
25 _gesture_version = (_gesture_major << 16) | _gesture_minor;
26 _gesture_available = EINA_TRUE;
27 }
28 else
29 _gesture_available = EINA_FALSE;
30#else /* ifdef ECORE_XGESTURE */
31 _gesture_available = EINA_FALSE;
32#endif /* ifdef ECORE_XGESTURE */
33}
34
35/*
36 * @brief query whether gesture is available or not
37 * @return EINA_TRUE, if extension is available, else EINA_FALSE
38 */
39EAPI Eina_Bool
40ecore_x_gesture_supported(void)
41{
42 return _gesture_available;
43}
44
45EAPI Eina_Bool
46ecore_x_gesture_events_select(Ecore_X_Window win,
47 Ecore_X_Gesture_Event_Mask mask)
48{
49#ifdef ECORE_XGESTURE
50 if (!_gesture_available)
51 return EINA_FALSE;
52
53 LOGFN(__FILE__, __LINE__, __FUNCTION__);
54 XGestureSelectEvents(_ecore_x_disp, win, mask);
55
56 return EINA_TRUE;
57#else /* ifdef ECORE_XGESTURE */
58 return EINA_FALSE;
59 win = 0;
60 mask = 0;
61#endif /* ifdef ECORE_XGESTURE */
62}
63
64EAPI Ecore_X_Gesture_Event_Mask
65ecore_x_gesture_events_selected_get(Ecore_X_Window win)
66{
67#ifdef ECORE_XGESTURE
68 Ecore_X_Gesture_Event_Mask mask;
69
70 if (!_gesture_available)
71 return ECORE_X_GESTURE_EVENT_MASK_NONE;
72
73 LOGFN(__FILE__, __LINE__, __FUNCTION__);
74 if (GestureSuccess != XGestureGetSelectedEvents(_ecore_x_disp, win, &mask))
75 {
76 mask = ECORE_X_GESTURE_EVENT_MASK_NONE;
77 return mask;
78 }
79
80 return mask;
81#else /* ifdef ECORE_XGESTURE */
82 return ECORE_X_GESTURE_EVENT_MASK_NONE;
83 win = 0;
84#endif /* ifdef ECORE_XGESTURE */
85}
86
87EAPI Eina_Bool
88ecore_x_gesture_event_grab(Ecore_X_Window win,
89 Ecore_X_Gesture_Event_Type type,
90 int num_fingers)
91{
92#ifdef ECORE_XGESTURE
93 if (!_gesture_available)
94 return EINA_FALSE;
95
96 LOGFN(__FILE__, __LINE__, __FUNCTION__);
97 if (GestureGrabSuccess != XGestureGrabEvent(_ecore_x_disp, win, type, num_fingers, CurrentTime))
98 {
99 return EINA_FALSE;
100 }
101
102 return EINA_TRUE;
103#else /* ifdef ECORE_XGESTURE */
104 return EINA_FALSE;
105 win = 0;
106 type = 0;
107 num_fingers = 0;
108#endif /* ifdef ECORE_XGESTURE */
109}
110
111EAPI Eina_Bool
112ecore_x_gesture_event_ungrab(Ecore_X_Window win,
113 Ecore_X_Gesture_Event_Type type,
114 int num_fingers)
115{
116#ifdef ECORE_XGESTURE
117 Ecore_X_Gesture_Event_Mask mask;
118
119 if (!_gesture_available)
120 return EINA_FALSE;
121
122 LOGFN(__FILE__, __LINE__, __FUNCTION__);
123 if (GestureUngrabSuccess != XGestureUngrabEvent(_ecore_x_disp, win, type, num_fingers, CurrentTime))
124 {
125 return EINA_FALSE;
126 }
127
128 return EINA_TRUE;
129#else /* ifdef ECORE_XGESTURE */
130 return EINA_FALSE;
131 win = 0;
132 type = 0;
133 num_fingers = 0;
134#endif /* ifdef ECORE_XGESTURE */
135}
136
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_icccm.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_icccm.c
new file mode 100644
index 0000000..3899651
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_icccm.c
@@ -0,0 +1,1214 @@
1/*
2 * Various ICCCM related functions.
3 *
4 * This is ALL the code involving anything ICCCM related. for both WM and
5 * client.
6 */
7
8#ifdef HAVE_CONFIG_H
9# include <config.h>
10#endif /* ifdef HAVE_CONFIG_H */
11
12#include <stdlib.h>
13#include <string.h>
14
15#include "Ecore.h"
16#include "ecore_x_private.h"
17#include "Ecore_X.h"
18#include "Ecore_X_Atoms.h"
19
20EAPI void
21ecore_x_icccm_init(void)
22{
23 LOGFN(__FILE__, __LINE__, __FUNCTION__);
24} /* ecore_x_icccm_init */
25
26EAPI void
27ecore_x_icccm_state_set(Ecore_X_Window win,
28 Ecore_X_Window_State_Hint state)
29{
30 unsigned long c[2];
31
32 LOGFN(__FILE__, __LINE__, __FUNCTION__);
33 if (state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
34 c[0] = WithdrawnState;
35 else if (state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
36 c[0] = NormalState;
37 else if (state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
38 c[0] = IconicState;
39
40 c[1] = None;
41 XChangeProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_STATE,
42 ECORE_X_ATOM_WM_STATE, 32, PropModeReplace,
43 (unsigned char *)c, 2);
44} /* ecore_x_icccm_state_set */
45
46EAPI Ecore_X_Window_State_Hint
47ecore_x_icccm_state_get(Ecore_X_Window win)
48{
49 unsigned char *prop_ret = NULL;
50 Atom type_ret;
51 unsigned long bytes_after, num_ret;
52 int format_ret;
53 Ecore_X_Window_State_Hint hint;
54
55 LOGFN(__FILE__, __LINE__, __FUNCTION__);
56 hint = ECORE_X_WINDOW_STATE_HINT_NONE;
57 XGetWindowProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_STATE,
58 0, 0x7fffffff, False, ECORE_X_ATOM_WM_STATE,
59 &type_ret, &format_ret, &num_ret, &bytes_after,
60 &prop_ret);
61 if ((prop_ret) && (num_ret == 2))
62 {
63 if (prop_ret[0] == WithdrawnState)
64 hint = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
65 else if (prop_ret[0] == NormalState)
66 hint = ECORE_X_WINDOW_STATE_HINT_NORMAL;
67 else if (prop_ret[0] == IconicState)
68 hint = ECORE_X_WINDOW_STATE_HINT_ICONIC;
69 }
70
71 if (prop_ret)
72 XFree(prop_ret);
73
74 return hint;
75} /* ecore_x_icccm_state_get */
76
77EAPI void
78ecore_x_icccm_delete_window_send(Ecore_X_Window win,
79 Ecore_X_Time t)
80{
81 LOGFN(__FILE__, __LINE__, __FUNCTION__);
82 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
83 ECORE_X_EVENT_MASK_NONE,
84 ECORE_X_ATOM_WM_DELETE_WINDOW,
85 t, 0, 0, 0);
86} /* ecore_x_icccm_delete_window_send */
87
88EAPI void
89ecore_x_icccm_take_focus_send(Ecore_X_Window win,
90 Ecore_X_Time t)
91{
92 LOGFN(__FILE__, __LINE__, __FUNCTION__);
93 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
94 ECORE_X_EVENT_MASK_NONE,
95 ECORE_X_ATOM_WM_TAKE_FOCUS,
96 t, 0, 0, 0);
97} /* ecore_x_icccm_take_focus_send */
98
99EAPI void
100ecore_x_icccm_save_yourself_send(Ecore_X_Window win,
101 Ecore_X_Time t)
102{
103 LOGFN(__FILE__, __LINE__, __FUNCTION__);
104 ecore_x_client_message32_send(win, ECORE_X_ATOM_WM_PROTOCOLS,
105 ECORE_X_EVENT_MASK_NONE,
106 ECORE_X_ATOM_WM_SAVE_YOURSELF,
107 t, 0, 0, 0);
108} /* ecore_x_icccm_save_yourself_send */
109
110EAPI void
111ecore_x_icccm_move_resize_send(Ecore_X_Window win,
112 int x,
113 int y,
114 int w,
115 int h)
116{
117 XEvent ev;
118
119 LOGFN(__FILE__, __LINE__, __FUNCTION__);
120 ev.type = ConfigureNotify;
121 ev.xconfigure.display = _ecore_x_disp;
122 ev.xconfigure.event = win;
123 ev.xconfigure.window = win;
124 ev.xconfigure.x = x;
125 ev.xconfigure.y = y;
126 ev.xconfigure.width = w;
127 ev.xconfigure.height = h;
128 ev.xconfigure.border_width = 0;
129 ev.xconfigure.above = None;
130 ev.xconfigure.override_redirect = False;
131 XSendEvent(_ecore_x_disp, win, False, StructureNotifyMask, &ev);
132} /* ecore_x_icccm_move_resize_send */
133
134EAPI void
135ecore_x_icccm_hints_set(Ecore_X_Window win,
136 Eina_Bool accepts_focus,
137 Ecore_X_Window_State_Hint initial_state,
138 Ecore_X_Pixmap icon_pixmap,
139 Ecore_X_Pixmap icon_mask,
140 Ecore_X_Window icon_window,
141 Ecore_X_Window window_group,
142 Eina_Bool is_urgent)
143{
144 XWMHints *hints;
145
146 hints = XAllocWMHints();
147 if (!hints)
148 return;
149
150 LOGFN(__FILE__, __LINE__, __FUNCTION__);
151 hints->flags = InputHint | StateHint;
152 hints->input = accepts_focus;
153 if (initial_state == ECORE_X_WINDOW_STATE_HINT_WITHDRAWN)
154 hints->initial_state = WithdrawnState;
155 else if (initial_state == ECORE_X_WINDOW_STATE_HINT_NORMAL)
156 hints->initial_state = NormalState;
157 else if (initial_state == ECORE_X_WINDOW_STATE_HINT_ICONIC)
158 hints->initial_state = IconicState;
159
160 if (icon_pixmap != 0)
161 {
162 hints->icon_pixmap = icon_pixmap;
163 hints->flags |= IconPixmapHint;
164 }
165
166 if (icon_mask != 0)
167 {
168 hints->icon_mask = icon_mask;
169 hints->flags |= IconMaskHint;
170 }
171
172 if (icon_window != 0)
173 {
174 hints->icon_window = icon_window;
175 hints->flags |= IconWindowHint;
176 }
177
178 if (window_group != 0)
179 {
180 hints->window_group = window_group;
181 hints->flags |= WindowGroupHint;
182 }
183
184 if (is_urgent)
185 hints->flags |= XUrgencyHint;
186
187 XSetWMHints(_ecore_x_disp, win, hints);
188 XFree(hints);
189} /* ecore_x_icccm_hints_set */
190
191EAPI Eina_Bool
192ecore_x_icccm_hints_get(Ecore_X_Window win,
193 Eina_Bool *accepts_focus,
194 Ecore_X_Window_State_Hint *initial_state,
195 Ecore_X_Pixmap *icon_pixmap,
196 Ecore_X_Pixmap *icon_mask,
197 Ecore_X_Window *icon_window,
198 Ecore_X_Window *window_group,
199 Eina_Bool *is_urgent)
200{
201 XWMHints *hints;
202
203 LOGFN(__FILE__, __LINE__, __FUNCTION__);
204 if (accepts_focus)
205 *accepts_focus = EINA_TRUE;
206
207 if (initial_state)
208 *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
209
210 if (icon_pixmap)
211 *icon_pixmap = 0;
212
213 if (icon_mask)
214 *icon_mask = 0;
215
216 if (icon_window)
217 *icon_window = 0;
218
219 if (window_group)
220 *window_group = 0;
221
222 if (is_urgent)
223 *is_urgent = EINA_FALSE;
224
225 hints = XGetWMHints(_ecore_x_disp, win);
226 if (hints)
227 {
228 if ((hints->flags & InputHint) && (accepts_focus))
229 {
230 if (hints->input)
231 *accepts_focus = EINA_TRUE;
232 else
233 *accepts_focus = EINA_FALSE;
234 }
235
236 if ((hints->flags & StateHint) && (initial_state))
237 {
238 if (hints->initial_state == WithdrawnState)
239 *initial_state = ECORE_X_WINDOW_STATE_HINT_WITHDRAWN;
240 else if (hints->initial_state == NormalState)
241 *initial_state = ECORE_X_WINDOW_STATE_HINT_NORMAL;
242 else if (hints->initial_state == IconicState)
243 *initial_state = ECORE_X_WINDOW_STATE_HINT_ICONIC;
244 }
245
246 if ((hints->flags & IconPixmapHint) && (icon_pixmap))
247 *icon_pixmap = hints->icon_pixmap;
248
249 if ((hints->flags & IconMaskHint) && (icon_mask))
250 *icon_mask = hints->icon_mask;
251
252 if ((hints->flags & IconWindowHint) && (icon_window))
253 *icon_window = hints->icon_window;
254
255 if ((hints->flags & WindowGroupHint) && (window_group))
256 *window_group = hints->window_group;
257
258 if ((hints->flags & XUrgencyHint) && (is_urgent))
259 *is_urgent = EINA_TRUE;
260
261 XFree(hints);
262 return EINA_TRUE;
263 }
264
265 return EINA_FALSE;
266} /* ecore_x_icccm_hints_get */
267
268EAPI void
269ecore_x_icccm_size_pos_hints_set(Ecore_X_Window win,
270 Eina_Bool request_pos,
271 Ecore_X_Gravity gravity,
272 int min_w,
273 int min_h,
274 int max_w,
275 int max_h,
276 int base_w,
277 int base_h,
278 int step_x,
279 int step_y,
280 double min_aspect,
281 double max_aspect)
282{
283 XSizeHints hint;
284 long mask;
285
286 LOGFN(__FILE__, __LINE__, __FUNCTION__);
287 if (!XGetWMNormalHints(_ecore_x_disp, win, &hint, &mask))
288 memset(&hint, 0, sizeof(XSizeHints));
289
290 hint.flags = 0;
291 if (request_pos)
292 hint.flags |= USPosition;
293
294 if (gravity != ECORE_X_GRAVITY_NW)
295 {
296 hint.flags |= PWinGravity;
297 hint.win_gravity = gravity;
298 }
299
300 if ((min_w > 0) || (min_h > 0))
301 {
302 hint.flags |= PMinSize;
303 hint.min_width = min_w;
304 hint.min_height = min_h;
305 }
306
307 if ((max_w > 0) || (max_h > 0))
308 {
309 hint.flags |= PMaxSize;
310 hint.max_width = max_w;
311 hint.max_height = max_h;
312 }
313
314 if ((base_w > 0) || (base_h > 0))
315 {
316 hint.flags |= PBaseSize;
317 hint.base_width = base_w;
318 hint.base_height = base_h;
319 }
320
321 if ((step_x > 1) || (step_y > 1))
322 {
323 hint.flags |= PResizeInc;
324 hint.width_inc = step_x;
325 hint.height_inc = step_y;
326 }
327
328 if ((min_aspect > 0.0) || (max_aspect > 0.0))
329 {
330 hint.flags |= PAspect;
331 hint.min_aspect.x = min_aspect * 10000;
332 hint.min_aspect.y = 10000;
333 hint.max_aspect.x = max_aspect * 10000;
334 hint.max_aspect.y = 10000;
335 }
336
337 XSetWMNormalHints(_ecore_x_disp, win, &hint);
338} /* ecore_x_icccm_size_pos_hints_set */
339
340EAPI Eina_Bool
341ecore_x_icccm_size_pos_hints_get(Ecore_X_Window win,
342 Eina_Bool *request_pos,
343 Ecore_X_Gravity *gravity,
344 int *min_w,
345 int *min_h,
346 int *max_w,
347 int *max_h,
348 int *base_w,
349 int *base_h,
350 int *step_x,
351 int *step_y,
352 double *min_aspect,
353 double *max_aspect)
354{
355 XSizeHints hint;
356 long mask;
357
358 int minw = 0, minh = 0;
359 int maxw = 32767, maxh = 32767;
360 int basew = -1, baseh = -1;
361 int stepx = -1, stepy = -1;
362 double mina = 0.0, maxa = 0.0;
363
364 LOGFN(__FILE__, __LINE__, __FUNCTION__);
365 if (!XGetWMNormalHints(_ecore_x_disp, win, &hint, &mask))
366 return EINA_FALSE;
367
368 if ((hint.flags & USPosition) || ((hint.flags & PPosition)))
369 {
370 if (request_pos)
371 *request_pos = EINA_TRUE;
372 }
373 else if (request_pos)
374 *request_pos = EINA_FALSE;
375
376 if (hint.flags & PWinGravity)
377 {
378 if (gravity)
379 *gravity = hint.win_gravity;
380 }
381 else if (gravity)
382 *gravity = ECORE_X_GRAVITY_NW;
383
384 if (hint.flags & PMinSize)
385 {
386 minw = hint.min_width;
387 minh = hint.min_height;
388 }
389
390 if (hint.flags & PMaxSize)
391 {
392 maxw = hint.max_width;
393 maxh = hint.max_height;
394 if (maxw < minw)
395 maxw = minw;
396
397 if (maxh < minh)
398 maxh = minh;
399 }
400
401 if (hint.flags & PBaseSize)
402 {
403 basew = hint.base_width;
404 baseh = hint.base_height;
405 if (basew > minw)
406 minw = basew;
407
408 if (baseh > minh)
409 minh = baseh;
410 }
411
412 if (hint.flags & PResizeInc)
413 {
414 stepx = hint.width_inc;
415 stepy = hint.height_inc;
416 if (stepx < 1)
417 stepx = 1;
418
419 if (stepy < 1)
420 stepy = 1;
421 }
422
423 if (hint.flags & PAspect)
424 {
425 if (hint.min_aspect.y > 0)
426 mina = ((double)hint.min_aspect.x) / ((double)hint.min_aspect.y);
427
428 if (hint.max_aspect.y > 0)
429 maxa = ((double)hint.max_aspect.x) / ((double)hint.max_aspect.y);
430 }
431
432 if (min_w)
433 *min_w = minw;
434
435 if (min_h)
436 *min_h = minh;
437
438 if (max_w)
439 *max_w = maxw;
440
441 if (max_h)
442 *max_h = maxh;
443
444 if (base_w)
445 *base_w = basew;
446
447 if (base_h)
448 *base_h = baseh;
449
450 if (step_x)
451 *step_x = stepx;
452
453 if (step_y)
454 *step_y = stepy;
455
456 if (min_aspect)
457 *min_aspect = mina;
458
459 if (max_aspect)
460 *max_aspect = maxa;
461
462 return EINA_TRUE;
463} /* ecore_x_icccm_size_pos_hints_get */
464
465EAPI void
466ecore_x_icccm_title_set(Ecore_X_Window win,
467 const char *t)
468{
469 char *list[1];
470 XTextProperty xprop;
471 int ret;
472
473 if (!t)
474 return;
475
476 LOGFN(__FILE__, __LINE__, __FUNCTION__);
477 xprop.value = NULL;
478#ifdef X_HAVE_UTF8_STRING
479 list[0] = strdup(t);
480 ret =
481 Xutf8TextListToTextProperty(_ecore_x_disp, list, 1, XUTF8StringStyle,
482 &xprop);
483#else /* ifdef X_HAVE_UTF8_STRING */
484 list[0] = strdup(t);
485 ret =
486 XmbTextListToTextProperty(_ecore_x_disp, list, 1, XStdICCTextStyle,
487 &xprop);
488#endif /* ifdef X_HAVE_UTF8_STRING */
489 if (ret >= Success)
490 {
491 XSetWMName(_ecore_x_disp, win, &xprop);
492 if (xprop.value)
493 XFree(xprop.value);
494 }
495 else if (XStringListToTextProperty(list, 1, &xprop) >= Success)
496 {
497 XSetWMName(_ecore_x_disp, win, &xprop);
498 if (xprop.value)
499 XFree(xprop.value);
500 }
501
502 free(list[0]);
503} /* ecore_x_icccm_title_set */
504
505EAPI char *
506ecore_x_icccm_title_get(Ecore_X_Window win)
507{
508 XTextProperty xprop;
509
510 LOGFN(__FILE__, __LINE__, __FUNCTION__);
511 xprop.value = NULL;
512 if (XGetWMName(_ecore_x_disp, win, &xprop) >= Success)
513 {
514 if (xprop.value)
515 {
516 char **list = NULL;
517 char *t = NULL;
518 int num = 0;
519 int ret;
520
521 if (xprop.encoding == ECORE_X_ATOM_UTF8_STRING)
522 t = strdup((char *)xprop.value);
523 else
524 {
525 /* convert to utf8 */
526#ifdef X_HAVE_UTF8_STRING
527 ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop,
528 &list, &num);
529#else /* ifdef X_HAVE_UTF8_STRING */
530 ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop,
531 &list, &num);
532#endif /* ifdef X_HAVE_UTF8_STRING */
533
534 if ((ret == XLocaleNotSupported) ||
535 (ret == XNoMemory) || (ret == XConverterNotFound))
536 t = strdup((char *)xprop.value);
537 else if ((ret >= Success) && (num > 0))
538 t = strdup(list[0]);
539
540 if (list)
541 XFreeStringList(list);
542 }
543
544 if (xprop.value)
545 XFree(xprop.value);
546
547 return t;
548 }
549 }
550
551 return NULL;
552} /* ecore_x_icccm_title_get */
553
554/**
555 * Set protocol atoms explicitly
556 * @param win The Window
557 * @param protos An array of protocol atoms
558 * @param num the number of members of the array
559 */
560EAPI void
561ecore_x_icccm_protocol_atoms_set(Ecore_X_Window win,
562 Ecore_X_Atom *protos,
563 int num)
564{
565 LOGFN(__FILE__, __LINE__, __FUNCTION__);
566 if (num > 0)
567 XSetWMProtocols(_ecore_x_disp, win, (Atom *)(protos), num);
568 else
569 XDeleteProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_PROTOCOLS);
570} /* ecore_x_icccm_protocol_atoms_set */
571
572/**
573 * Set or unset a wm protocol property.
574 * @param win The Window
575 * @param protocol The protocol to enable/disable
576 * @param on On/Off
577 */
578EAPI void
579ecore_x_icccm_protocol_set(Ecore_X_Window win,
580 Ecore_X_WM_Protocol protocol,
581 Eina_Bool on)
582{
583 Atom *protos = NULL;
584 Atom proto;
585 int protos_count = 0;
586 int already_set = 0;
587 int i;
588
589 /* Check for invalid values */
590 if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
591 return;
592
593 LOGFN(__FILE__, __LINE__, __FUNCTION__);
594 proto = _ecore_x_atoms_wm_protocols[protocol];
595
596 if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
597 {
598 protos = NULL;
599 protos_count = 0;
600 }
601
602 for (i = 0; i < protos_count; i++)
603 {
604 if (protos[i] == proto)
605 {
606 already_set = 1;
607 break;
608 }
609 }
610
611 if (on)
612 {
613 Atom *new_protos = NULL;
614
615 if (already_set)
616 goto leave;
617
618 new_protos = malloc((protos_count + 1) * sizeof(Atom));
619 if (!new_protos)
620 goto leave;
621
622 for (i = 0; i < protos_count; i++)
623 new_protos[i] = protos[i];
624 new_protos[protos_count] = proto;
625 XSetWMProtocols(_ecore_x_disp, win, new_protos, protos_count + 1);
626 free(new_protos);
627 }
628 else
629 {
630 if (!already_set)
631 goto leave;
632
633 for (i = 0; i < protos_count; i++)
634 {
635 if (protos[i] == proto)
636 {
637 int j;
638
639 for (j = i + 1; j < protos_count; j++)
640 protos[j - 1] = protos[j];
641 if (protos_count > 1)
642 XSetWMProtocols(_ecore_x_disp, win, protos,
643 protos_count - 1);
644 else
645 XDeleteProperty(_ecore_x_disp, win,
646 ECORE_X_ATOM_WM_PROTOCOLS);
647
648 goto leave;
649 }
650 }
651 }
652
653leave:
654 if (protos)
655 XFree(protos);
656} /* ecore_x_icccm_protocol_set */
657
658/**
659 * Determines whether a protocol is set for a window.
660 * @param win The Window
661 * @param protocol The protocol to query
662 * @return 1 if the protocol is set, else 0.
663 */
664EAPI Eina_Bool
665ecore_x_icccm_protocol_isset(Ecore_X_Window win,
666 Ecore_X_WM_Protocol protocol)
667{
668 Atom proto, *protos = NULL;
669 int i, protos_count = 0;
670 Eina_Bool ret = EINA_FALSE;
671
672 /* check for invalid values */
673 if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
674 return EINA_FALSE;
675
676 LOGFN(__FILE__, __LINE__, __FUNCTION__);
677 proto = _ecore_x_atoms_wm_protocols[protocol];
678
679 if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
680 return EINA_FALSE;
681
682 for (i = 0; i < protos_count; i++)
683 if (protos[i] == proto)
684 {
685 ret = EINA_TRUE;
686 break;
687 }
688
689 if (protos)
690 XFree(protos);
691
692 return ret;
693} /* ecore_x_icccm_protocol_isset */
694
695/**
696 * Set a window name & class.
697 * @param win The window
698 * @param n The name string
699 * @param c The class string
700 *
701 * Set a window name * class
702 */
703EAPI void
704ecore_x_icccm_name_class_set(Ecore_X_Window win,
705 const char *n,
706 const char *c)
707{
708 XClassHint *xch;
709
710 xch = XAllocClassHint();
711 if (!xch)
712 return;
713
714 LOGFN(__FILE__, __LINE__, __FUNCTION__);
715 xch->res_name = (char *)n;
716 xch->res_class = (char *)c;
717 XSetClassHint(_ecore_x_disp, win, xch);
718 XFree(xch);
719} /* ecore_x_icccm_name_class_set */
720
721/**
722 * Get a window name & class.
723 * @param win The window
724 * @param n The name string
725 * @param c The class string
726 *
727 * Get a window name * class
728 */
729EAPI void
730ecore_x_icccm_name_class_get(Ecore_X_Window win,
731 char **n,
732 char **c)
733{
734 XClassHint xch;
735
736 LOGFN(__FILE__, __LINE__, __FUNCTION__);
737 if (n)
738 *n = NULL;
739
740 if (c)
741 *c = NULL;
742
743 xch.res_name = NULL;
744 xch.res_class = NULL;
745 if (XGetClassHint(_ecore_x_disp, win, &xch))
746 {
747 if (n)
748 if (xch.res_name)
749 *n = strdup(xch.res_name);
750
751 if (c)
752 if (xch.res_class)
753 *c = strdup(xch.res_class);
754
755 XFree(xch.res_name);
756 XFree(xch.res_class);
757 }
758} /* ecore_x_icccm_name_class_get */
759
760/**
761 * Get a window client machine string.
762 * @param win The window
763 * @return The windows client machine string
764 *
765 * Return the client machine of a window. String must be free'd when done with.
766 */
767EAPI char *
768ecore_x_icccm_client_machine_get(Ecore_X_Window win)
769{
770 char *name;
771
772 LOGFN(__FILE__, __LINE__, __FUNCTION__);
773 name = ecore_x_window_prop_string_get(win, ECORE_X_ATOM_WM_CLIENT_MACHINE);
774 return name;
775} /* ecore_x_icccm_client_machine_get */
776
777/**
778 * Sets the WM_COMMAND property for @a win.
779 *
780 * @param win The window.
781 * @param argc Number of arguments.
782 * @param argv Arguments.
783 */
784EAPI void
785ecore_x_icccm_command_set(Ecore_X_Window win,
786 int argc,
787 char **argv)
788{
789 LOGFN(__FILE__, __LINE__, __FUNCTION__);
790 XSetCommand(_ecore_x_disp, win, argv, argc);
791} /* ecore_x_icccm_command_set */
792
793/**
794 * Get the WM_COMMAND property for @a win.
795 *
796 * Return the command of a window. String must be free'd when done with.
797 *
798 * @param win The window.
799 * @param argc Number of arguments.
800 * @param argv Arguments.
801 */
802EAPI void
803ecore_x_icccm_command_get(Ecore_X_Window win,
804 int *argc,
805 char ***argv)
806{
807 int i, c;
808 char **v;
809
810 if (argc)
811 *argc = 0;
812
813 if (argv)
814 *argv = NULL;
815
816 LOGFN(__FILE__, __LINE__, __FUNCTION__);
817 if (!XGetCommand(_ecore_x_disp, win, &v, &c))
818 return;
819
820 if (c < 1)
821 {
822 if (v)
823 XFreeStringList(v);
824
825 return;
826 }
827
828 if (argc)
829 *argc = c;
830
831 if (argv)
832 {
833 (*argv) = malloc(c * sizeof(char *));
834 if (!*argv)
835 {
836 XFreeStringList(v);
837 if (argc)
838 *argc = 0;
839
840 return;
841 }
842
843 for (i = 0; i < c; i++)
844 {
845 if (v[i])
846 (*argv)[i] = strdup(v[i]);
847 else
848 (*argv)[i] = strdup("");
849 }
850 }
851
852 XFreeStringList(v);
853} /* ecore_x_icccm_command_get */
854
855/**
856 * Set a window icon name.
857 * @param win The window
858 * @param t The icon name string
859 *
860 * Set a window icon name
861 */
862EAPI void
863ecore_x_icccm_icon_name_set(Ecore_X_Window win,
864 const char *t)
865{
866 char *list[1];
867 XTextProperty xprop;
868 int ret;
869
870 LOGFN(__FILE__, __LINE__, __FUNCTION__);
871 xprop.value = NULL;
872#ifdef X_HAVE_UTF8_STRING
873 list[0] = strdup(t);
874 ret = Xutf8TextListToTextProperty(_ecore_x_disp, list, 1,
875 XUTF8StringStyle, &xprop);
876#else /* ifdef X_HAVE_UTF8_STRING */
877 list[0] = strdup(t);
878 ret = XmbTextListToTextProperty(_ecore_x_disp, list, 1,
879 XStdICCTextStyle, &xprop);
880#endif /* ifdef X_HAVE_UTF8_STRING */
881 if (ret >= Success)
882 {
883 XSetWMIconName(_ecore_x_disp, win, &xprop);
884 if (xprop.value)
885 XFree(xprop.value);
886 }
887 else if (XStringListToTextProperty(list, 1, &xprop) >= Success)
888 {
889 XSetWMIconName(_ecore_x_disp, win, &xprop);
890 if (xprop.value)
891 XFree(xprop.value);
892 }
893
894 free(list[0]);
895} /* ecore_x_icccm_icon_name_set */
896
897/**
898 * Get a window icon name.
899 * @param win The window
900 * @return The windows icon name string
901 *
902 * Return the icon name of a window. String must be free'd when done with.
903 */
904EAPI char *
905ecore_x_icccm_icon_name_get(Ecore_X_Window win)
906{
907 XTextProperty xprop;
908
909 LOGFN(__FILE__, __LINE__, __FUNCTION__);
910 xprop.value = NULL;
911 if (XGetWMIconName(_ecore_x_disp, win, &xprop) >= Success)
912 {
913 if (xprop.value)
914 {
915 char **list = NULL;
916 char *t = NULL;
917 int num = 0;
918 int ret;
919
920 if (xprop.encoding == ECORE_X_ATOM_UTF8_STRING)
921 t = strdup((char *)xprop.value);
922 else
923 {
924 /* convert to utf8 */
925#ifdef X_HAVE_UTF8_STRING
926 ret = Xutf8TextPropertyToTextList(_ecore_x_disp, &xprop,
927 &list, &num);
928#else /* ifdef X_HAVE_UTF8_STRING */
929 ret = XmbTextPropertyToTextList(_ecore_x_disp, &xprop,
930 &list, &num);
931#endif /* ifdef X_HAVE_UTF8_STRING */
932
933 if ((ret == XLocaleNotSupported) ||
934 (ret == XNoMemory) || (ret == XConverterNotFound))
935 t = strdup((char *)xprop.value);
936 else if (ret >= Success)
937 {
938 if ((num >= 1) && (list))
939 t = strdup(list[0]);
940
941 if (list)
942 XFreeStringList(list);
943 }
944 }
945
946 if (xprop.value)
947 XFree(xprop.value);
948
949 return t;
950 }
951 }
952
953 return NULL;
954} /* ecore_x_icccm_icon_name_get */
955
956/**
957 * Add a subwindow to the list of windows that need a different colormap installed.
958 * @param win The toplevel window
959 * @param subwin The subwindow to be added to the colormap windows list
960 */
961EAPI void
962ecore_x_icccm_colormap_window_set(Ecore_X_Window win,
963 Ecore_X_Window subwin)
964{
965 int num = 0, i;
966 unsigned char *old_data = NULL;
967 unsigned char *data = NULL;
968 Window *oldset = NULL;
969 Window *newset = NULL;
970
971 LOGFN(__FILE__, __LINE__, __FUNCTION__);
972 if (!ecore_x_window_prop_property_get(win,
973 ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
974 XA_WINDOW, 32, &old_data, &num))
975 {
976 newset = calloc(1, sizeof(Window));
977 if (!newset)
978 return;
979
980 newset[0] = subwin;
981 num = 1;
982 data = (unsigned char *)newset;
983 }
984 else
985 {
986 newset = calloc(num + 1, sizeof(Window));
987 oldset = (Window *)old_data;
988 if (!newset)
989 return;
990
991 for (i = 0; i < num; ++i)
992 {
993 if (oldset[i] == subwin)
994 {
995 if (old_data)
996 XFree(old_data);
997
998 old_data = NULL;
999 free(newset);
1000 return;
1001 }
1002
1003 newset[i] = oldset[i];
1004 }
1005
1006 newset[num++] = subwin;
1007 if (old_data)
1008 XFree(old_data);
1009
1010 data = (unsigned char *)newset;
1011 }
1012
1013 ecore_x_window_prop_property_set(win,
1014 ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1015 XA_WINDOW, 32, data, num);
1016 free(newset);
1017} /* ecore_x_icccm_colormap_window_set */
1018
1019/**
1020 * Remove a window from the list of colormap windows.
1021 * @param win The toplevel window
1022 * @param subwin The window to be removed from the colormap window list.
1023 */
1024EAPI void
1025ecore_x_icccm_colormap_window_unset(Ecore_X_Window win,
1026 Ecore_X_Window subwin)
1027{
1028 int num = 0, i, j, k = 0;
1029 unsigned char *old_data = NULL;
1030 unsigned char *data = NULL;
1031 Window *oldset = NULL;
1032 Window *newset = NULL;
1033
1034 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1035 if (!ecore_x_window_prop_property_get(win,
1036 ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1037 XA_WINDOW, 32, &old_data, &num))
1038 return;
1039
1040 oldset = (Window *)old_data;
1041 for (i = 0; i < num; i++)
1042 {
1043 if (oldset[i] == subwin)
1044 {
1045 if (num == 1)
1046 {
1047 XDeleteProperty(_ecore_x_disp,
1048 win, ECORE_X_ATOM_WM_COLORMAP_WINDOWS);
1049 if (old_data)
1050 XFree(old_data);
1051
1052 old_data = NULL;
1053 return;
1054 }
1055 else
1056 {
1057 newset = calloc(num - 1, sizeof(Window));
1058 data = (unsigned char *)newset;
1059 for (j = 0; j < num; ++j)
1060 if (oldset[j] != subwin)
1061 newset[k++] = oldset[j];
1062
1063 ecore_x_window_prop_property_set(
1064 win,
1065 ECORE_X_ATOM_WM_COLORMAP_WINDOWS,
1066 XA_WINDOW,
1067 32,
1068 data,
1069 k);
1070 if (old_data)
1071 XFree(old_data);
1072
1073 old_data = NULL;
1074 free(newset);
1075 return;
1076 }
1077 }
1078 }
1079
1080 if (old_data)
1081 XFree(old_data);
1082} /* ecore_x_icccm_colormap_window_unset */
1083
1084/**
1085 * Specify that a window is transient for another top-level window and should be handled accordingly.
1086 * @param win the transient window
1087 * @param forwin the toplevel window
1088 */
1089EAPI void
1090ecore_x_icccm_transient_for_set(Ecore_X_Window win,
1091 Ecore_X_Window forwin)
1092{
1093 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1094 XSetTransientForHint(_ecore_x_disp, win, forwin);
1095} /* ecore_x_icccm_transient_for_set */
1096
1097/**
1098 * Remove the transient_for setting from a window.
1099 * @param The window
1100 */
1101EAPI void
1102ecore_x_icccm_transient_for_unset(Ecore_X_Window win)
1103{
1104 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1105 XDeleteProperty(_ecore_x_disp, win, ECORE_X_ATOM_WM_TRANSIENT_FOR);
1106} /* ecore_x_icccm_transient_for_unset */
1107
1108/**
1109 * Get the window this window is transient for, if any.
1110 * @param win The window to check
1111 * @return The window ID of the top-level window, or 0 if the property does not exist.
1112 */
1113EAPI Ecore_X_Window
1114ecore_x_icccm_transient_for_get(Ecore_X_Window win)
1115{
1116 Window forwin;
1117
1118 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1119 if (XGetTransientForHint(_ecore_x_disp, win, &forwin))
1120 return (Ecore_X_Window)forwin;
1121 else
1122 return 0;
1123} /* ecore_x_icccm_transient_for_get */
1124
1125/**
1126 * Set the window role hint.
1127 * @param win The window
1128 * @param role The role string
1129 */
1130EAPI void
1131ecore_x_icccm_window_role_set(Ecore_X_Window win,
1132 const char *role)
1133{
1134 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1135 ecore_x_window_prop_string_set(win, ECORE_X_ATOM_WM_WINDOW_ROLE,
1136 (char *)role);
1137} /* ecore_x_icccm_window_role_set */
1138
1139/**
1140 * Get the window role.
1141 * @param win The window
1142 * @return The window's role string.
1143 */
1144EAPI char *
1145ecore_x_icccm_window_role_get(Ecore_X_Window win)
1146{
1147 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1148 return ecore_x_window_prop_string_get(win, ECORE_X_ATOM_WM_WINDOW_ROLE);
1149} /* ecore_x_icccm_window_role_get */
1150
1151/**
1152 * Set the window's client leader.
1153 * @param win The window
1154 * @param l The client leader window
1155 *
1156 * All non-transient top-level windows created by an app other than
1157 * the main window must have this property set to the app's main window.
1158 */
1159EAPI void
1160ecore_x_icccm_client_leader_set(Ecore_X_Window win,
1161 Ecore_X_Window l)
1162{
1163 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1164 ecore_x_window_prop_window_set(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
1165 &l, 1);
1166} /* ecore_x_icccm_client_leader_set */
1167
1168/**
1169 * Get the window's client leader.
1170 * @param win The window
1171 * @return The window's client leader window, or 0 if unset */
1172EAPI Ecore_X_Window
1173ecore_x_icccm_client_leader_get(Ecore_X_Window win)
1174{
1175 Ecore_X_Window l;
1176
1177 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1178 if (ecore_x_window_prop_window_get(win, ECORE_X_ATOM_WM_CLIENT_LEADER,
1179 &l, 1) > 0)
1180 return l;
1181
1182 return 0;
1183} /* ecore_x_icccm_client_leader_get */
1184
1185EAPI void
1186ecore_x_icccm_iconic_request_send(Ecore_X_Window win,
1187 Ecore_X_Window root)
1188{
1189 XEvent xev;
1190
1191 if (!win)
1192 return;
1193
1194 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1195 if (!root)
1196 root = DefaultRootWindow(_ecore_x_disp);
1197
1198 xev.xclient.type = ClientMessage;
1199 xev.xclient.serial = 0;
1200 xev.xclient.send_event = True;
1201 xev.xclient.display = _ecore_x_disp;
1202 xev.xclient.window = win;
1203 xev.xclient.format = 32;
1204 xev.xclient.message_type = ECORE_X_ATOM_WM_CHANGE_STATE;
1205 xev.xclient.data.l[0] = IconicState;
1206
1207 XSendEvent(_ecore_x_disp, root, False,
1208 SubstructureNotifyMask | SubstructureRedirectMask, &xev);
1209} /* ecore_x_icccm_iconic_request_send */
1210
1211/* FIXME: there are older E hints, gnome hints and mwm hints and new netwm */
1212/* hints. each should go in their own file/section so we know which */
1213/* is which. also older kde hints too. we should try support as much */
1214/* as makese sense to support */
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_image.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_image.c
new file mode 100644
index 0000000..2de5319
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_image.c
@@ -0,0 +1,598 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6#include "Ecore_X.h"
7
8#include <X11/extensions/XShm.h>
9#include <X11/Xutil.h>
10#include <sys/ipc.h>
11#include <sys/shm.h>
12#include <string.h>
13
14static int _ecore_x_image_shm_can = -1;
15static int _ecore_x_image_err = 0;
16
17static int
18_ecore_x_image_error_handler(Display *d __UNUSED__,
19 XErrorEvent *ev __UNUSED__)
20{
21 _ecore_x_image_err = 1;
22 return 0;
23} /* _ecore_x_image_error_handler */
24
25static void
26_ecore_x_image_shm_check(void)
27{
28 XErrorHandler ph;
29 XShmSegmentInfo shminfo;
30 XImage *xim;
31
32 if (_ecore_x_image_shm_can != -1)
33 return;
34
35 XSync(_ecore_x_disp, False);
36 _ecore_x_image_err = 0;
37
38 xim = XShmCreateImage(_ecore_x_disp,
39 DefaultVisual(_ecore_x_disp,
40 DefaultScreen(_ecore_x_disp)),
41 DefaultDepth(_ecore_x_disp,
42 DefaultScreen(_ecore_x_disp)),
43 ZPixmap, NULL,
44 &shminfo, 1, 1);
45 if (!xim)
46 {
47 _ecore_x_image_shm_can = 0;
48 return;
49 }
50
51 shminfo.shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height,
52 IPC_CREAT | 0666);
53 if (shminfo.shmid == -1)
54 {
55 XDestroyImage(xim);
56 _ecore_x_image_shm_can = 0;
57 return;
58 }
59
60 shminfo.readOnly = False;
61 shminfo.shmaddr = shmat(shminfo.shmid, 0, 0);
62 xim->data = shminfo.shmaddr;
63
64 if (xim->data == (char *)-1)
65 {
66 XDestroyImage(xim);
67 _ecore_x_image_shm_can = 0;
68 return;
69 }
70
71 ph = XSetErrorHandler((XErrorHandler)_ecore_x_image_error_handler);
72 XShmAttach(_ecore_x_disp, &shminfo);
73 XShmGetImage(_ecore_x_disp, DefaultRootWindow(_ecore_x_disp),
74 xim, 0, 0, 0xffffffff);
75 XSync(_ecore_x_disp, False);
76 XSetErrorHandler((XErrorHandler)ph);
77 if (_ecore_x_image_err)
78 {
79 XShmDetach(_ecore_x_disp, &shminfo);
80 XDestroyImage(xim);
81 shmdt(shminfo.shmaddr);
82 shmctl(shminfo.shmid, IPC_RMID, 0);
83 _ecore_x_image_shm_can = 0;
84 return;
85 }
86
87 XShmDetach(_ecore_x_disp, &shminfo);
88 XDestroyImage(xim);
89 shmdt(shminfo.shmaddr);
90 shmctl(shminfo.shmid, IPC_RMID, 0);
91
92 _ecore_x_image_shm_can = 1;
93} /* _ecore_x_image_shm_check */
94
95struct _Ecore_X_Image
96{
97 XShmSegmentInfo shminfo;
98 Ecore_X_Visual vis;
99 XImage *xim;
100 int depth;
101 int w, h;
102 int bpl, bpp, rows;
103 unsigned char *data;
104 Eina_Bool shm : 1;
105};
106
107EAPI Ecore_X_Image *
108ecore_x_image_new(int w,
109 int h,
110 Ecore_X_Visual vis,
111 int depth)
112{
113 Ecore_X_Image *im;
114
115 im = calloc(1, sizeof(Ecore_X_Image));
116 if (!im)
117 return NULL;
118
119 LOGFN(__FILE__, __LINE__, __FUNCTION__);
120 im->w = w;
121 im->h = h;
122 im->vis = vis;
123 im->depth = depth;
124 _ecore_x_image_shm_check();
125 im->shm = _ecore_x_image_shm_can;
126 return im;
127} /* ecore_x_image_new */
128
129EAPI void
130ecore_x_image_free(Ecore_X_Image *im)
131{
132 LOGFN(__FILE__, __LINE__, __FUNCTION__);
133 if (im->shm)
134 {
135 if (im->xim)
136 {
137 XShmDetach(_ecore_x_disp, &(im->shminfo));
138 XDestroyImage(im->xim);
139 shmdt(im->shminfo.shmaddr);
140 shmctl(im->shminfo.shmid, IPC_RMID, 0);
141 }
142 }
143 else if (im->xim)
144 {
145 free(im->xim->data);
146 im->xim->data = NULL;
147 XDestroyImage(im->xim);
148 }
149
150 free(im);
151} /* ecore_x_image_free */
152
153static void
154_ecore_x_image_shm_create(Ecore_X_Image *im)
155{
156 im->xim = XShmCreateImage(_ecore_x_disp, im->vis, im->depth,
157 ZPixmap, NULL, &(im->shminfo),
158 im->w, im->h);
159 if (!im->xim)
160 return;
161
162 im->shminfo.shmid = shmget(IPC_PRIVATE,
163 im->xim->bytes_per_line * im->xim->height,
164 IPC_CREAT | 0666);
165 if (im->shminfo.shmid == -1)
166 {
167 XDestroyImage(im->xim);
168 return;
169 }
170
171 im->shminfo.readOnly = False;
172 im->shminfo.shmaddr = shmat(im->shminfo.shmid, 0, 0);
173 im->xim->data = im->shminfo.shmaddr;
174 if ((im->xim->data == (char *)-1) ||
175 (!im->xim->data))
176 {
177 shmdt(im->shminfo.shmaddr);
178 shmctl(im->shminfo.shmid, IPC_RMID, 0);
179 XDestroyImage(im->xim);
180 return;
181 }
182
183 XShmAttach(_ecore_x_disp, &im->shminfo);
184
185 im->data = (unsigned char *)im->xim->data;
186
187 im->bpl = im->xim->bytes_per_line;
188 im->rows = im->xim->height;
189 if (im->xim->bits_per_pixel <= 8)
190 im->bpp = 1;
191 else if (im->xim->bits_per_pixel <= 16)
192 im->bpp = 2;
193 else
194 im->bpp = 4;
195} /* _ecore_x_image_shm_create */
196
197EAPI Eina_Bool
198ecore_x_image_get(Ecore_X_Image *im,
199 Ecore_X_Drawable draw,
200 int x,
201 int y,
202 int sx,
203 int sy,
204 int w,
205 int h)
206{
207 Eina_Bool ret = EINA_TRUE;
208 XErrorHandler ph;
209
210 LOGFN(__FILE__, __LINE__, __FUNCTION__);
211 if (im->shm)
212 {
213 if (!im->xim)
214 _ecore_x_image_shm_create(im);
215
216 if (!im->xim)
217 return 0;
218
219 _ecore_x_image_err = 0;
220 // optimised path
221 ph = XSetErrorHandler((XErrorHandler)_ecore_x_image_error_handler);
222 if ((sx == 0) && (w == im->w))
223 {
224 im->xim->data = (char *)
225 im->data + (im->xim->bytes_per_line * sy) + (sx * im->bpp);
226 im->xim->width = w;
227 im->xim->height = h;
228 XGrabServer(_ecore_x_disp);
229 if (!XShmGetImage(_ecore_x_disp, draw, im->xim, x, y, 0xffffffff))
230 ret = EINA_FALSE;
231 XUngrabServer(_ecore_x_disp);
232 ecore_x_sync();
233 }
234 // unavoidable thanks to mit-shm get api - tmp shm buf + copy into it
235 else
236 {
237 Ecore_X_Image *tim;
238 unsigned char *spixels, *sp, *pixels, *p;
239 int bpp, bpl, rows, sbpp, sbpl, srows;
240 int r;
241
242 tim = ecore_x_image_new(w, h, im->vis, im->depth);
243 if (tim)
244 {
245 ret = ecore_x_image_get(tim, draw, x, y, 0, 0, w, h);
246 if (ret)
247 {
248 spixels = ecore_x_image_data_get(tim,
249 &sbpl,
250 &srows,
251 &sbpp);
252 pixels = ecore_x_image_data_get(im, &bpl, &rows, &bpp);
253 if ((pixels) && (spixels))
254 {
255 p = pixels + (sy * bpl) + (sx * bpp);
256 sp = spixels;
257 for (r = srows; r > 0; r--)
258 {
259 memcpy(p, sp, sbpl);
260 p += bpl;
261 sp += sbpl;
262 }
263 }
264 }
265
266 ecore_x_image_free(tim);
267 }
268 }
269
270 XSetErrorHandler((XErrorHandler)ph);
271 if (_ecore_x_image_err)
272 ret = EINA_FALSE;
273 }
274 else
275 {
276 printf("currently unimplemented ecore_x_image_get without shm\n");
277 ret = EINA_FALSE;
278 }
279
280 return ret;
281} /* ecore_x_image_get */
282
283EAPI void
284ecore_x_image_put(Ecore_X_Image *im,
285 Ecore_X_Drawable draw,
286 Ecore_X_GC gc,
287 int x,
288 int y,
289 int sx,
290 int sy,
291 int w,
292 int h)
293{
294 Ecore_X_GC tgc = 0;
295
296 LOGFN(__FILE__, __LINE__, __FUNCTION__);
297 if (!gc)
298 {
299 XGCValues gcv;
300 memset(&gcv, 0, sizeof(gcv));
301 gcv.subwindow_mode = IncludeInferiors;
302 tgc = XCreateGC(_ecore_x_disp, draw, GCSubwindowMode, &gcv);
303 gc = tgc;
304 }
305 if (!im->xim) _ecore_x_image_shm_create(im);
306 if (im->xim)
307 XShmPutImage(_ecore_x_disp, draw, gc, im->xim, sx, sy, x, y, w, h, False);
308 if (tgc) ecore_x_gc_free(tgc);
309} /* ecore_x_image_put */
310
311EAPI void *
312ecore_x_image_data_get(Ecore_X_Image *im,
313 int *bpl,
314 int *rows,
315 int *bpp)
316{
317 LOGFN(__FILE__, __LINE__, __FUNCTION__);
318 if (!im->xim) _ecore_x_image_shm_create(im);
319 if (!im->xim) return NULL;
320 if (bpl) *bpl = im->bpl;
321 if (rows) *rows = im->rows;
322 if (bpp) *bpp = im->bpp;
323 return im->data;
324} /* ecore_x_image_data_get */
325
326EAPI Eina_Bool
327ecore_x_image_is_argb32_get(Ecore_X_Image *im)
328{
329 Visual *vis = im->vis;
330 if (!im->xim) _ecore_x_image_shm_create(im);
331 if (((vis->class == TrueColor) ||
332 (vis->class == DirectColor)) &&
333 (im->depth >= 24) &&
334 (vis->red_mask == 0xff0000) &&
335 (vis->green_mask == 0x00ff00) &&
336 (vis->blue_mask == 0x0000ff))
337 {
338#ifdef WORDS_BIGENDIAN
339 if (im->xim->bitmap_bit_order == LSBFirst) return EINA_TRUE;
340#else
341 if (im->xim->bitmap_bit_order == MSBFirst) return EINA_TRUE;
342#endif
343 }
344 return EINA_FALSE;
345}
346
347EAPI Eina_Bool
348ecore_x_image_to_argb_convert(void *src,
349 int sbpp,
350 int sbpl,
351 Ecore_X_Colormap c,
352 Ecore_X_Visual v,
353 int x,
354 int y,
355 int w,
356 int h,
357 unsigned int *dst,
358 int dbpl,
359 int dx,
360 int dy)
361{
362 Visual *vis = v;
363 XColor *cols = NULL;
364 int n = 0, nret = 0, i, row;
365 unsigned int pal[256], r, g, b;
366 enum
367 {
368 rgbnone = 0,
369 rgb565,
370 bgr565,
371 rgbx555,
372 argbx888,
373 abgrx888,
374 rgba888x,
375 bgra888x,
376 argbx666
377 };
378 int mode = 0;
379
380 sbpp *= 8;
381
382 n = vis->map_entries;
383 if ((n <= 256) &&
384 ((vis->class == PseudoColor) ||
385 (vis->class == StaticColor) ||
386 (vis->class == GrayScale) ||
387 (vis->class == StaticGray)))
388 {
389 if (!c)
390 c = DefaultColormap(_ecore_x_disp,
391 DefaultScreen(_ecore_x_disp));
392 cols = alloca(n * sizeof(XColor));
393 for (i = 0; i < n; i++)
394 {
395 cols[i].pixel = i;
396 cols[i].flags = DoRed | DoGreen | DoBlue;
397 cols[i].red = 0;
398 cols[i].green = 0;
399 cols[i].blue = 0;
400 }
401 XQueryColors(_ecore_x_disp, c, cols, n);
402 for (i = 0; i < n; i++)
403 {
404 pal[i] = 0xff000000 |
405 ((cols[i].red >> 8) << 16) |
406 ((cols[i].green >> 8) << 8) |
407 ((cols[i].blue >> 8));
408 }
409 nret = n;
410 }
411 else if ((vis->class == TrueColor) ||
412 (vis->class == DirectColor))
413 {
414 if ((vis->red_mask == 0x00ff0000) &&
415 (vis->green_mask == 0x0000ff00) &&
416 (vis->blue_mask == 0x000000ff))
417 mode = argbx888;
418 else if ((vis->red_mask == 0x000000ff) &&
419 (vis->green_mask == 0x0000ff00) &&
420 (vis->blue_mask == 0x00ff0000))
421 mode = abgrx888;
422 else if ((vis->red_mask == 0xff000000) &&
423 (vis->green_mask == 0x00ff0000) &&
424 (vis->blue_mask == 0x0000ff00))
425 mode = rgba888x;
426 else if ((vis->red_mask == 0x0000ff00) &&
427 (vis->green_mask == 0x00ff0000) &&
428 (vis->blue_mask == 0xff000000))
429 mode = bgra888x;
430 else if ((vis->red_mask == 0x0003f000) &&
431 (vis->green_mask == 0x00000fc0) &&
432 (vis->blue_mask == 0x0000003f))
433 mode = argbx666;
434 else if ((vis->red_mask == 0x0000f800) &&
435 (vis->green_mask == 0x000007e0) &&
436 (vis->blue_mask == 0x0000001f))
437 mode = rgb565;
438 else if ((vis->red_mask == 0x0000001f) &&
439 (vis->green_mask == 0x000007e0) &&
440 (vis->blue_mask == 0x0000f800))
441 mode = bgr565;
442 else if ((vis->red_mask == 0x00007c00) &&
443 (vis->green_mask == 0x000003e0) &&
444 (vis->blue_mask == 0x0000001f))
445 mode = rgbx555;
446 else
447 return EINA_FALSE;
448 }
449 for (row = 0; row < h; row++)
450 {
451 unsigned char *s8;
452 unsigned short *s16;
453 unsigned int *s32;
454 unsigned int *dp, *de;
455
456 dp = ((unsigned int *)(((unsigned char *)dst) +
457 ((dy + row) * dbpl))) + dx;
458 de = dp + w;
459 switch (sbpp)
460 {
461 case 8:
462 s8 = ((unsigned char *)(((unsigned char *)src) + ((y + row) * sbpl))) + x;
463 if (nret > 0)
464 {
465 while (dp < de)
466 {
467 *dp = pal[*s8];
468 s8++; dp++;
469 }
470 }
471 else
472 return EINA_FALSE;
473 break;
474
475 case 16:
476 s16 = ((unsigned short *)(((unsigned char *)src) + ((y + row) * sbpl))) + x;
477 switch (mode)
478 {
479 case rgb565:
480 while (dp < de)
481 {
482 r = (*s16 & 0xf800) << 8;
483 g = (*s16 & 0x07e0) << 5;
484 b = (*s16 & 0x001f) << 3;
485 r |= (r >> 5) & 0xff0000;
486 g |= (g >> 6) & 0x00ff00;
487 b |= (b >> 5);
488 *dp = 0xff000000 | r | g | b;
489 s16++; dp++;
490 }
491 break;
492
493 case bgr565:
494 while (dp < de)
495 {
496 r = (*s16 & 0x001f) << 19;
497 g = (*s16 & 0x07e0) << 5;
498 b = (*s16 & 0xf800) >> 8;
499 r |= (r >> 5) & 0xff0000;
500 g |= (g >> 6) & 0x00ff00;
501 b |= (b >> 5);
502 *dp = 0xff000000 | r | g | b;
503 s16++; dp++;
504 }
505 break;
506
507 case rgbx555:
508 while (dp < de)
509 {
510 r = (*s16 & 0x7c00) << 9;
511 g = (*s16 & 0x03e0) << 6;
512 b = (*s16 & 0x001f) << 3;
513 r |= (r >> 5) & 0xff0000;
514 g |= (g >> 5) & 0x00ff00;
515 b |= (b >> 5);
516 *dp = 0xff000000 | r | g | b;
517 s16++; dp++;
518 }
519 break;
520
521 default:
522 return EINA_FALSE;
523 break;
524 }
525 break;
526
527 case 24:
528 case 32:
529 s32 = ((unsigned int *)(((unsigned char *)src) + ((y + row) * sbpl))) + x;
530 switch (mode)
531 {
532 case argbx888:
533 while (dp < de)
534 {
535 *dp = 0xff000000 | *s32;
536 s32++; dp++;
537 }
538 break;
539
540 case abgrx888:
541 while (dp < de)
542 {
543 r = *s32 & 0x000000ff;
544 g = *s32 & 0x0000ff00;
545 b = *s32 & 0x00ff0000;
546 *dp = 0xff000000 | (r << 16) | (g) | (b >> 16);
547 s32++; dp++;
548 }
549 break;
550
551 case rgba888x:
552 while (dp < de)
553 {
554 *dp = 0xff000000 | (*s32 >> 8);
555 s32++; dp++;
556 }
557 break;
558
559 case bgra888x:
560 while (dp < de)
561 {
562 r = *s32 & 0x0000ff00;
563 g = *s32 & 0x00ff0000;
564 b = *s32 & 0xff000000;
565 *dp = 0xff000000 | (r << 8) | (g >> 8) | (b >> 24);
566 s32++; dp++;
567 }
568 break;
569
570 case argbx666:
571 while (dp < de)
572 {
573 r = (*s32 & 0x3f000) << 6;
574 g = (*s32 & 0x00fc0) << 4;
575 b = (*s32 & 0x0003f) << 2;
576 r |= (r >> 6) & 0xff0000;
577 g |= (g >> 6) & 0x00ff00;
578 b |= (b >> 6);
579 *dp = 0xff000000 | r | g | b;
580 s32++; dp++;
581 }
582 break;
583
584 default:
585 return EINA_FALSE;
586 break;
587 }
588 break;
589 break;
590
591 default:
592 return EINA_FALSE;
593 break;
594 }
595 }
596 return EINA_TRUE;
597}
598
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_mwm.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_mwm.c
new file mode 100644
index 0000000..7459a8b
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_mwm.c
@@ -0,0 +1,106 @@
1/*
2 * Various MWM related functions.
3 *
4 * This is ALL the code involving anything MWM related. for both WM and
5 * client.
6 */
7
8#ifdef HAVE_CONFIG_H
9# include <config.h>
10#endif /* ifdef HAVE_CONFIG_H */
11
12#include <stdlib.h>
13
14#include "Ecore.h"
15#include "ecore_x_private.h"
16#include "Ecore_X.h"
17#include "Ecore_X_Atoms.h"
18
19#define ECORE_X_MWM_HINTS_FUNCTIONS (1 << 0)
20#define ECORE_X_MWM_HINTS_DECORATIONS (1 << 1)
21#define ECORE_X_MWM_HINTS_INPUT_MODE (1 << 2)
22#define ECORE_X_MWM_HINTS_STATUS (1 << 3)
23
24typedef struct _mwmhints
25{
26 CARD32 flags;
27 CARD32 functions;
28 CARD32 decorations;
29 INT32 inputmode;
30 CARD32 status;
31}
32MWMHints;
33
34EAPI Eina_Bool
35ecore_x_mwm_hints_get(Ecore_X_Window win,
36 Ecore_X_MWM_Hint_Func *fhint,
37 Ecore_X_MWM_Hint_Decor *dhint,
38 Ecore_X_MWM_Hint_Input *ihint)
39{
40 unsigned char *p = NULL;
41 MWMHints *mwmhints = NULL;
42 int num;
43 Eina_Bool ret;
44
45 LOGFN(__FILE__, __LINE__, __FUNCTION__);
46 ret = EINA_FALSE;
47 if (!ecore_x_window_prop_property_get(win,
48 ECORE_X_ATOM_MOTIF_WM_HINTS,
49 ECORE_X_ATOM_MOTIF_WM_HINTS,
50 32, &p, &num))
51 return EINA_FALSE;
52
53 mwmhints = (MWMHints *)p;
54 if (mwmhints)
55 {
56 if (num >= 4)
57 {
58 if (dhint)
59 {
60 if (mwmhints->flags & ECORE_X_MWM_HINTS_DECORATIONS)
61 *dhint = mwmhints->decorations;
62 else
63 *dhint = ECORE_X_MWM_HINT_DECOR_ALL;
64 }
65
66 if (fhint)
67 {
68 if (mwmhints->flags & ECORE_X_MWM_HINTS_FUNCTIONS)
69 *fhint = mwmhints->functions;
70 else
71 *fhint = ECORE_X_MWM_HINT_FUNC_ALL;
72 }
73
74 if (ihint)
75 {
76 if (mwmhints->flags & ECORE_X_MWM_HINTS_INPUT_MODE)
77 *ihint = mwmhints->inputmode;
78 else
79 *ihint = ECORE_X_MWM_HINT_INPUT_MODELESS;
80 }
81
82 ret = EINA_TRUE;
83 }
84
85 free(mwmhints);
86 }
87
88 return ret;
89} /* ecore_x_mwm_hints_get */
90
91EAPI void
92ecore_x_mwm_borderless_set(Ecore_X_Window win,
93 Eina_Bool borderless)
94{
95 unsigned int data[5] = {0, 0, 0, 0, 0};
96
97 data[0] = 2; /* just set the decorations hint! */
98 data[2] = !borderless;
99
100 LOGFN(__FILE__, __LINE__, __FUNCTION__);
101 ecore_x_window_prop_property_set(win,
102 ECORE_X_ATOM_MOTIF_WM_HINTS,
103 ECORE_X_ATOM_MOTIF_WM_HINTS,
104 32, (void *)data, 5);
105} /* ecore_x_mwm_borderless_set */
106
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_netwm.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_netwm.c
new file mode 100644
index 0000000..1a6fc9a
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_netwm.c
@@ -0,0 +1,2003 @@
1/*
2 * _NET_WM... aka Extended Window Manager Hint (EWMH) functions.
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif /* ifdef HAVE_CONFIG_H */
8
9#include <stdio.h>
10#include <string.h>
11
12#include "Ecore.h"
13#include "ecore_x_private.h"
14#include "Ecore_X.h"
15
16typedef struct _Ecore_X_Startup_Info Ecore_X_Startup_Info;
17
18struct _Ecore_X_Startup_Info
19{
20 Ecore_X_Window win;
21
22 int init;
23
24 int buffer_size;
25 char *buffer;
26
27 int length;
28
29 /* These are the sequence info fields */
30 char *id;
31 char *name;
32 int screen;
33 char *bin;
34 char *icon;
35 int desktop;
36 int timestamp;
37 char *description;
38 char *wmclass;
39 int silent;
40};
41
42static void _ecore_x_window_prop_string_utf8_set(Ecore_X_Window win,
43 Ecore_X_Atom atom,
44 const char *str);
45static char *_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win,
46 Ecore_X_Atom atom);
47#if 0 /* Unused */
48static int _ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info);
49static int _ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
50 char *data);
51#endif /* if 0 */
52static void _ecore_x_netwm_startup_info_free(void *data);
53
54/*
55 * Convenience macros
56 */
57#define _ATOM_SET_UTF8_STRING_LIST(win, atom, string, cnt) \
58 XChangeProperty(_ecore_x_disp, \
59 win, \
60 atom, \
61 ECORE_X_ATOM_UTF8_STRING, \
62 8, \
63 PropModeReplace, \
64 (unsigned char *)string, \
65 cnt)
66
67/*
68 * Local variables
69 */
70
71static Eina_Hash *startup_info = NULL;
72
73EAPI void
74ecore_x_netwm_init(void)
75{
76 LOGFN(__FILE__, __LINE__, __FUNCTION__);
77 startup_info = eina_hash_string_superfast_new(
78 _ecore_x_netwm_startup_info_free);
79} /* ecore_x_netwm_init */
80
81EAPI void
82ecore_x_netwm_shutdown(void)
83{
84 LOGFN(__FILE__, __LINE__, __FUNCTION__);
85 if (startup_info)
86 eina_hash_free(startup_info);
87
88 startup_info = NULL;
89} /* ecore_x_netwm_shutdown */
90
91/*
92 * WM identification
93 */
94EAPI void
95ecore_x_netwm_wm_identify(Ecore_X_Window root,
96 Ecore_X_Window check,
97 const char *wm_name)
98{
99 LOGFN(__FILE__, __LINE__, __FUNCTION__);
100 ecore_x_window_prop_window_set(root,
101 ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
102 &check,
103 1);
104 ecore_x_window_prop_window_set(check,
105 ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK,
106 &check,
107 1);
108 _ecore_x_window_prop_string_utf8_set(check,
109 ECORE_X_ATOM_NET_WM_NAME,
110 wm_name);
111 /* This one isn't mandatory */
112 _ecore_x_window_prop_string_utf8_set(root,
113 ECORE_X_ATOM_NET_WM_NAME,
114 wm_name);
115} /* ecore_x_netwm_wm_identify */
116
117/*
118 * Set supported atoms
119 */
120EAPI void
121ecore_x_netwm_supported_set(Ecore_X_Window root,
122 Ecore_X_Atom *supported,
123 int num)
124{
125 LOGFN(__FILE__, __LINE__, __FUNCTION__);
126 ecore_x_window_prop_atom_set(root,
127 ECORE_X_ATOM_NET_SUPPORTED,
128 supported,
129 num);
130} /* ecore_x_netwm_supported_set */
131
132EAPI Eina_Bool
133ecore_x_netwm_supported_get(Ecore_X_Window root,
134 Ecore_X_Atom **supported,
135 int *num)
136{
137 int num_ret;
138
139 if (num)
140 *num = 0;
141
142 if (supported)
143 *supported = NULL;
144
145 LOGFN(__FILE__, __LINE__, __FUNCTION__);
146 num_ret = ecore_x_window_prop_atom_list_get(root, ECORE_X_ATOM_NET_SUPPORTED,
147 supported);
148 if (num_ret <= 0)
149 return EINA_FALSE;
150
151 if (num)
152 *num = num_ret;
153
154 return EINA_TRUE;
155} /* ecore_x_netwm_supported_get */
156
157/*
158 * Desktop configuration and status
159 */
160EAPI void
161ecore_x_netwm_desk_count_set(Ecore_X_Window root,
162 unsigned int n_desks)
163{
164 LOGFN(__FILE__, __LINE__, __FUNCTION__);
165 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_NUMBER_OF_DESKTOPS,
166 &n_desks, 1);
167} /* ecore_x_netwm_desk_count_set */
168
169EAPI void
170ecore_x_netwm_desk_roots_set(Ecore_X_Window root,
171 Ecore_X_Window *vroots,
172 unsigned int n_desks)
173{
174 LOGFN(__FILE__, __LINE__, __FUNCTION__);
175 ecore_x_window_prop_window_set(root,
176 ECORE_X_ATOM_NET_VIRTUAL_ROOTS,
177 vroots,
178 n_desks);
179} /* ecore_x_netwm_desk_roots_set */
180
181EAPI void
182ecore_x_netwm_desk_names_set(Ecore_X_Window root,
183 const char **names,
184 unsigned int n_desks)
185{
186 char ss[32], *buf, *t;
187 const char *s;
188 unsigned int i;
189 int l, len;
190
191 LOGFN(__FILE__, __LINE__, __FUNCTION__);
192 buf = NULL;
193 len = 0;
194
195 for (i = 0; i < n_desks; i++)
196 {
197 s = (names) ? names[i] : NULL;
198 if (!s)
199 {
200 /* Default to "Desk-<number>" */
201 sprintf(ss, "Desk-%d", i);
202 s = ss;
203 }
204
205 l = strlen(s) + 1;
206 t = realloc(buf, len + l);
207 if (t)
208 {
209 buf = t;
210 memcpy(buf + len, s, l);
211 }
212 len += l;
213 }
214
215 _ATOM_SET_UTF8_STRING_LIST(root, ECORE_X_ATOM_NET_DESKTOP_NAMES, buf, len);
216
217 free(buf);
218} /* ecore_x_netwm_desk_names_set */
219
220EAPI void
221ecore_x_netwm_desk_size_set(Ecore_X_Window root,
222 unsigned int width,
223 unsigned int height)
224{
225 unsigned int size[2];
226
227 LOGFN(__FILE__, __LINE__, __FUNCTION__);
228 size[0] = width;
229 size[1] = height;
230 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_GEOMETRY, size,
231 2);
232} /* ecore_x_netwm_desk_size_set */
233
234EAPI void
235ecore_x_netwm_desk_viewports_set(Ecore_X_Window root,
236 unsigned int *origins,
237 unsigned int n_desks)
238{
239 LOGFN(__FILE__, __LINE__, __FUNCTION__);
240 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_VIEWPORT,
241 origins, 2 * n_desks);
242} /* ecore_x_netwm_desk_viewports_set */
243
244EAPI void
245ecore_x_netwm_desk_layout_set(Ecore_X_Window root,
246 int orientation,
247 int columns,
248 int rows,
249 int starting_corner)
250{
251 unsigned int layout[4];
252
253 LOGFN(__FILE__, __LINE__, __FUNCTION__);
254 layout[0] = orientation;
255 layout[1] = columns;
256 layout[2] = rows;
257 layout[3] = starting_corner;
258 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_DESKTOP_LAYOUT,
259 layout, 4);
260} /* ecore_x_netwm_desk_layout_set */
261
262EAPI void
263ecore_x_netwm_desk_workareas_set(Ecore_X_Window root,
264 unsigned int *areas,
265 unsigned int n_desks)
266{
267 LOGFN(__FILE__, __LINE__, __FUNCTION__);
268 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_WORKAREA, areas,
269 4 * n_desks);
270} /* ecore_x_netwm_desk_workareas_set */
271
272EAPI unsigned int *
273ecore_x_netwm_desk_workareas_get(Ecore_X_Window root, unsigned int *n_desks)
274{
275 int ret;
276 unsigned int *areas = NULL;
277
278 if (!root) root = DefaultRootWindow(_ecore_x_disp);
279
280 ret = ecore_x_window_prop_card32_list_get(root, ECORE_X_ATOM_NET_WORKAREA,
281 &areas);
282 if (!areas)
283 {
284 if (n_desks) *n_desks = 0;
285 return 0;
286 }
287 if (n_desks) *n_desks = ret / 4;
288 return areas;
289}
290
291EAPI void
292ecore_x_netwm_desk_current_set(Ecore_X_Window root,
293 unsigned int desk)
294{
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
296 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_CURRENT_DESKTOP, &desk,
297 1);
298} /* ecore_x_netwm_desk_current_set */
299
300EAPI void
301ecore_x_netwm_showing_desktop_set(Ecore_X_Window root,
302 Eina_Bool on)
303{
304 unsigned int val;
305
306 LOGFN(__FILE__, __LINE__, __FUNCTION__);
307 val = (on) ? 1 : 0;
308 ecore_x_window_prop_card32_set(root, ECORE_X_ATOM_NET_SHOWING_DESKTOP, &val,
309 1);
310} /* ecore_x_netwm_showing_desktop_set */
311
312/*
313 * Client status
314 */
315
316/* Mapping order */
317EAPI void
318ecore_x_netwm_client_list_set(Ecore_X_Window root,
319 Ecore_X_Window *p_clients,
320 unsigned int n_clients)
321{
322 LOGFN(__FILE__, __LINE__, __FUNCTION__);
323 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST,
324 p_clients, n_clients);
325} /* ecore_x_netwm_client_list_set */
326
327/* Stacking order */
328EAPI void
329ecore_x_netwm_client_list_stacking_set(Ecore_X_Window root,
330 Ecore_X_Window *p_clients,
331 unsigned int n_clients)
332{
333 LOGFN(__FILE__, __LINE__, __FUNCTION__);
334 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_CLIENT_LIST_STACKING,
335 p_clients, n_clients);
336} /* ecore_x_netwm_client_list_stacking_set */
337
338EAPI void
339ecore_x_netwm_client_active_set(Ecore_X_Window root,
340 Ecore_X_Window win)
341{
342 LOGFN(__FILE__, __LINE__, __FUNCTION__);
343 ecore_x_window_prop_window_set(root, ECORE_X_ATOM_NET_ACTIVE_WINDOW,
344 &win, 1);
345} /* ecore_x_netwm_client_active_set */
346
347EAPI void
348ecore_x_netwm_client_active_request(Ecore_X_Window root,
349 Ecore_X_Window win,
350 int type,
351 Ecore_X_Window current_win)
352{
353 XEvent xev;
354
355 LOGFN(__FILE__, __LINE__, __FUNCTION__);
356 if (!root)
357 root = DefaultRootWindow(_ecore_x_disp);
358
359 xev.xclient.type = ClientMessage;
360 xev.xclient.display = _ecore_x_disp;
361 xev.xclient.window = win;
362 xev.xclient.message_type = ECORE_X_ATOM_NET_ACTIVE_WINDOW;
363 xev.xclient.format = 32;
364 xev.xclient.data.l[0] = type;
365 xev.xclient.data.l[1] = CurrentTime;
366 xev.xclient.data.l[2] = current_win;
367 xev.xclient.data.l[3] = 0;
368 xev.xclient.data.l[4] = 0;
369
370 XSendEvent(_ecore_x_disp, root, False,
371 SubstructureRedirectMask | SubstructureNotifyMask, &xev);
372} /* ecore_x_netwm_client_active_request */
373
374EAPI void
375ecore_x_netwm_name_set(Ecore_X_Window win,
376 const char *name)
377{
378 LOGFN(__FILE__, __LINE__, __FUNCTION__);
379 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_NAME, name);
380} /* ecore_x_netwm_name_set */
381
382EAPI int
383ecore_x_netwm_name_get(Ecore_X_Window win,
384 char **name)
385{
386 LOGFN(__FILE__, __LINE__, __FUNCTION__);
387 if (name)
388 *name = _ecore_x_window_prop_string_utf8_get(win,
389 ECORE_X_ATOM_NET_WM_NAME);
390
391 return 1;
392} /* ecore_x_netwm_name_get */
393
394EAPI void
395ecore_x_netwm_startup_id_set(Ecore_X_Window win,
396 const char *id)
397{
398 LOGFN(__FILE__, __LINE__, __FUNCTION__);
399 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_STARTUP_ID, id);
400} /* ecore_x_netwm_startup_id_set */
401
402EAPI int
403ecore_x_netwm_startup_id_get(Ecore_X_Window win,
404 char **id)
405{
406 LOGFN(__FILE__, __LINE__, __FUNCTION__);
407 if (id)
408 *id = _ecore_x_window_prop_string_utf8_get(win,
409 ECORE_X_ATOM_NET_STARTUP_ID);
410
411 return 1;
412} /* ecore_x_netwm_startup_id_get */
413
414EAPI void
415ecore_x_netwm_visible_name_set(Ecore_X_Window win,
416 const char *name)
417{
418 LOGFN(__FILE__, __LINE__, __FUNCTION__);
419 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_VISIBLE_NAME,
420 name);
421} /* ecore_x_netwm_visible_name_set */
422
423EAPI int
424ecore_x_netwm_visible_name_get(Ecore_X_Window win,
425 char **name)
426{
427 LOGFN(__FILE__, __LINE__, __FUNCTION__);
428 if (name)
429 *name = _ecore_x_window_prop_string_utf8_get(
430 win,
431 ECORE_X_ATOM_NET_WM_VISIBLE_NAME);
432
433 return 1;
434} /* ecore_x_netwm_visible_name_get */
435
436EAPI void
437ecore_x_netwm_icon_name_set(Ecore_X_Window win,
438 const char *name)
439{
440 LOGFN(__FILE__, __LINE__, __FUNCTION__);
441 _ecore_x_window_prop_string_utf8_set(win, ECORE_X_ATOM_NET_WM_ICON_NAME,
442 name);
443} /* ecore_x_netwm_icon_name_set */
444
445EAPI int
446ecore_x_netwm_icon_name_get(Ecore_X_Window win,
447 char **name)
448{
449 LOGFN(__FILE__, __LINE__, __FUNCTION__);
450 if (name)
451 *name = _ecore_x_window_prop_string_utf8_get(
452 win,
453 ECORE_X_ATOM_NET_WM_ICON_NAME);
454
455 return 1;
456} /* ecore_x_netwm_icon_name_get */
457
458EAPI void
459ecore_x_netwm_visible_icon_name_set(Ecore_X_Window win,
460 const char *name)
461{
462 LOGFN(__FILE__, __LINE__, __FUNCTION__);
463 _ecore_x_window_prop_string_utf8_set(win,
464 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME,
465 name);
466} /* ecore_x_netwm_visible_icon_name_set */
467
468EAPI int
469ecore_x_netwm_visible_icon_name_get(Ecore_X_Window win,
470 char **name)
471{
472 LOGFN(__FILE__, __LINE__, __FUNCTION__);
473 if (name)
474 *name = _ecore_x_window_prop_string_utf8_get(
475 win,
476 ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME);
477
478 return 1;
479} /* ecore_x_netwm_visible_icon_name_get */
480
481EAPI void
482ecore_x_netwm_desktop_set(Ecore_X_Window win,
483 unsigned int desk)
484{
485 LOGFN(__FILE__, __LINE__, __FUNCTION__);
486 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_DESKTOP, &desk, 1);
487} /* ecore_x_netwm_desktop_set */
488
489EAPI Eina_Bool
490ecore_x_netwm_desktop_get(Ecore_X_Window win,
491 unsigned int *desk)
492{
493 int ret;
494 unsigned int tmp;
495
496 LOGFN(__FILE__, __LINE__, __FUNCTION__);
497 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_DESKTOP,
498 &tmp, 1);
499
500 if (desk)
501 *desk = tmp;
502
503 return ret == 1 ? EINA_TRUE : EINA_FALSE;
504} /* ecore_x_netwm_desktop_get */
505
506/*
507 * _NET_WM_STRUT is deprecated
508 */
509EAPI void
510ecore_x_netwm_strut_set(Ecore_X_Window win,
511 int left,
512 int right,
513 int top,
514 int bottom)
515{
516 unsigned int strut[4];
517
518 LOGFN(__FILE__, __LINE__, __FUNCTION__);
519 strut[0] = left;
520 strut[1] = right;
521 strut[2] = top;
522 strut[3] = bottom;
523 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_STRUT, strut, 4);
524} /* ecore_x_netwm_strut_set */
525
526/*
527 * _NET_WM_STRUT is deprecated
528 */
529EAPI Eina_Bool
530ecore_x_netwm_strut_get(Ecore_X_Window win,
531 int *left,
532 int *right,
533 int *top,
534 int *bottom)
535{
536 int ret = 0;
537 unsigned int strut[4];
538
539 LOGFN(__FILE__, __LINE__, __FUNCTION__);
540 ret = ecore_x_window_prop_card32_get(win,
541 ECORE_X_ATOM_NET_WM_STRUT,
542 strut,
543 4);
544 if (ret != 4)
545 return EINA_FALSE;
546
547 if (left)
548 *left = strut[0];
549
550 if (right)
551 *right = strut[1];
552
553 if (top)
554 *top = strut[2];
555
556 if (bottom)
557 *bottom = strut[3];
558
559 return EINA_TRUE;
560} /* ecore_x_netwm_strut_get */
561
562EAPI void
563ecore_x_netwm_strut_partial_set(Ecore_X_Window win,
564 int left,
565 int right,
566 int top,
567 int bottom,
568 int left_start_y,
569 int left_end_y,
570 int right_start_y,
571 int right_end_y,
572 int top_start_x,
573 int top_end_x,
574 int bottom_start_x,
575 int bottom_end_x)
576{
577 unsigned int strut[12];
578
579 LOGFN(__FILE__, __LINE__, __FUNCTION__);
580 strut[0] = left;
581 strut[1] = right;
582 strut[2] = top;
583 strut[3] = bottom;
584 strut[4] = left_start_y;
585 strut[5] = left_end_y;
586 strut[6] = right_start_y;
587 strut[7] = right_end_y;
588 strut[8] = top_start_x;
589 strut[9] = top_end_x;
590 strut[10] = bottom_start_x;
591 strut[11] = bottom_end_x;
592 ecore_x_window_prop_card32_set(win,
593 ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
594 strut,
595 12);
596} /* ecore_x_netwm_strut_partial_set */
597
598EAPI Eina_Bool
599ecore_x_netwm_strut_partial_get(Ecore_X_Window win,
600 int *left,
601 int *right,
602 int *top,
603 int *bottom,
604 int *left_start_y,
605 int *left_end_y,
606 int *right_start_y,
607 int *right_end_y,
608 int *top_start_x,
609 int *top_end_x,
610 int *bottom_start_x,
611 int *bottom_end_x)
612{
613 int ret = 0;
614 unsigned int strut[12];
615
616 LOGFN(__FILE__, __LINE__, __FUNCTION__);
617 ret = ecore_x_window_prop_card32_get(win,
618 ECORE_X_ATOM_NET_WM_STRUT_PARTIAL,
619 strut,
620 12);
621 if (ret != 12)
622 return EINA_FALSE;
623
624 if (left)
625 *left = strut[0];
626
627 if (right)
628 *right = strut[1];
629
630 if (top)
631 *top = strut[2];
632
633 if (bottom)
634 *bottom = strut[3];
635
636 if (left_start_y)
637 *left_start_y = strut[4];
638
639 if (left_end_y)
640 *left_end_y = strut[5];
641
642 if (right_start_y)
643 *right_start_y = strut[6];
644
645 if (right_end_y)
646 *right_end_y = strut[7];
647
648 if (top_start_x)
649 *top_start_x = strut[8];
650
651 if (top_end_x)
652 *top_end_x = strut[9];
653
654 if (bottom_start_x)
655 *bottom_start_x = strut[10];
656
657 if (bottom_end_x)
658 *bottom_end_x = strut[11];
659
660 return EINA_TRUE;
661} /* ecore_x_netwm_strut_partial_get */
662
663EAPI Eina_Bool
664ecore_x_netwm_icons_get(Ecore_X_Window win,
665 Ecore_X_Icon **icon,
666 int *num)
667{
668 unsigned int *data, *p;
669 unsigned int *src;
670 unsigned int len, icons, i;
671 int num_ret;
672
673 LOGFN(__FILE__, __LINE__, __FUNCTION__);
674 if (num)
675 *num = 0;
676
677 if (icon)
678 *icon = NULL;
679
680 num_ret = ecore_x_window_prop_card32_list_get(win, ECORE_X_ATOM_NET_WM_ICON,
681 &data);
682 if (num_ret <= 0)
683 return EINA_FALSE;
684
685 if (!data)
686 return EINA_FALSE;
687
688 if (num_ret < 2)
689 {
690 free(data);
691 return EINA_FALSE;
692 }
693
694 /* Check how many icons there are */
695 icons = 0;
696 p = data;
697 while (p)
698 {
699 len = p[0] * p[1];
700 p += (len + 2);
701 if ((p - data) > num_ret)
702 {
703 free(data);
704 return EINA_FALSE;
705 }
706
707 icons++;
708
709 if ((p - data) == num_ret)
710 p = NULL;
711 }
712 if (num)
713 *num = icons;
714
715 /* If the user doesn't want the icons, return */
716 if (!icon)
717 {
718 free(data);
719 return EINA_TRUE;
720 }
721
722 /* Allocate memory */
723 *icon = malloc(icons * sizeof(Ecore_X_Icon));
724 if (!(*icon))
725 {
726 free(data);
727 return EINA_FALSE;
728 }
729
730 /* Fetch the icons */
731 p = data;
732 for (i = 0; i < icons; i++)
733 {
734 unsigned int *ps, *pd, *pe;
735
736 len = p[0] * p[1];
737 ((*icon)[i]).width = p[0];
738 ((*icon)[i]).height = p[1];
739 src = &(p[2]);
740 ((*icon)[i]).data = malloc(len * sizeof(unsigned int));
741 if (!((*icon)[i]).data)
742 {
743 while (i)
744 free(((*icon)[--i]).data);
745 free(*icon);
746 free(data);
747 return EINA_FALSE;
748 }
749
750 pd = ((*icon)[i]).data;
751 ps = src;
752 pe = ps + len;
753 for (; ps < pe; ps++)
754 {
755 unsigned int r, g, b, a;
756
757 a = (*ps >> 24) & 0xff;
758 r = (((*ps >> 16) & 0xff) * a) / 255;
759 g = (((*ps >> 8) & 0xff) * a) / 255;
760 b = (((*ps) & 0xff) * a) / 255;
761 *pd = (a << 24) | (r << 16) | (g << 8) | (b);
762 pd++;
763 }
764 p += (len + 2);
765 }
766
767 free(data);
768
769 return EINA_TRUE;
770} /* ecore_x_netwm_icons_get */
771
772EAPI void
773ecore_x_netwm_icon_geometry_set(Ecore_X_Window win,
774 int x,
775 int y,
776 int width,
777 int height)
778{
779 unsigned int geometry[4];
780
781 LOGFN(__FILE__, __LINE__, __FUNCTION__);
782 geometry[0] = x;
783 geometry[1] = y;
784 geometry[2] = width;
785 geometry[3] = height;
786 ecore_x_window_prop_card32_set(win,
787 ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
788 geometry,
789 4);
790} /* ecore_x_netwm_icon_geometry_set */
791
792EAPI Eina_Bool
793ecore_x_netwm_icon_geometry_get(Ecore_X_Window win,
794 int *x,
795 int *y,
796 int *width,
797 int *height)
798{
799 int ret;
800 unsigned int geometry[4];
801
802 LOGFN(__FILE__, __LINE__, __FUNCTION__);
803 ret = ecore_x_window_prop_card32_get(win,
804 ECORE_X_ATOM_NET_WM_ICON_GEOMETRY,
805 geometry,
806 4);
807 if (ret != 4)
808 return EINA_FALSE;
809
810 if (x)
811 *x = geometry[0];
812
813 if (y)
814 *y = geometry[1];
815
816 if (width)
817 *width = geometry[2];
818
819 if (height)
820 *height = geometry[3];
821
822 return EINA_TRUE;
823} /* ecore_x_netwm_icon_geometry_get */
824
825EAPI void
826ecore_x_netwm_pid_set(Ecore_X_Window win,
827 int pid)
828{
829 unsigned int tmp;
830
831 LOGFN(__FILE__, __LINE__, __FUNCTION__);
832 tmp = pid;
833 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_PID,
834 &tmp, 1);
835} /* ecore_x_netwm_pid_set */
836
837EAPI Eina_Bool
838ecore_x_netwm_pid_get(Ecore_X_Window win,
839 int *pid)
840{
841 int ret;
842 unsigned int tmp;
843
844 LOGFN(__FILE__, __LINE__, __FUNCTION__);
845 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_PID,
846 &tmp, 1);
847 if (pid)
848 *pid = tmp;
849
850 return ret == 1 ? EINA_TRUE : EINA_FALSE;
851} /* ecore_x_netwm_pid_get */
852
853EAPI void
854ecore_x_netwm_handled_icons_set(Ecore_X_Window win)
855{
856 LOGFN(__FILE__, __LINE__, __FUNCTION__);
857 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
858 NULL, 0);
859} /* ecore_x_netwm_handled_icons_set */
860
861EAPI Eina_Bool
862ecore_x_netwm_handled_icons_get(Ecore_X_Window win)
863{
864 int ret = 0;
865 LOGFN(__FILE__, __LINE__, __FUNCTION__);
866 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_HANDLED_ICONS,
867 NULL, 0);
868 return ret == 0 ? EINA_TRUE : EINA_FALSE;
869} /* ecore_x_netwm_handled_icons_get */
870
871EAPI void
872ecore_x_netwm_user_time_set(Ecore_X_Window win,
873 unsigned int tim)
874{
875 LOGFN(__FILE__, __LINE__, __FUNCTION__);
876 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_USER_TIME,
877 &tim, 1);
878} /* ecore_x_netwm_user_time_set */
879
880EAPI Eina_Bool
881ecore_x_netwm_user_time_get(Ecore_X_Window win,
882 unsigned int *tim)
883{
884 int ret;
885 unsigned int tmp;
886
887 LOGFN(__FILE__, __LINE__, __FUNCTION__);
888 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_USER_TIME,
889 &tmp, 1);
890 if (tim)
891 *tim = tmp;
892
893 return ret == 1 ? EINA_TRUE : EINA_FALSE;
894} /* ecore_x_netwm_user_time_get */
895
896Ecore_X_Window_State
897_ecore_x_netwm_state_get(Ecore_X_Atom a)
898{
899 if (a == ECORE_X_ATOM_NET_WM_STATE_MODAL)
900 return ECORE_X_WINDOW_STATE_MODAL;
901 else if (a == ECORE_X_ATOM_NET_WM_STATE_STICKY)
902 return ECORE_X_WINDOW_STATE_STICKY;
903 else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT)
904 return ECORE_X_WINDOW_STATE_MAXIMIZED_VERT;
905 else if (a == ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ)
906 return ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ;
907 else if (a == ECORE_X_ATOM_NET_WM_STATE_SHADED)
908 return ECORE_X_WINDOW_STATE_SHADED;
909 else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR)
910 return ECORE_X_WINDOW_STATE_SKIP_TASKBAR;
911 else if (a == ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER)
912 return ECORE_X_WINDOW_STATE_SKIP_PAGER;
913 else if (a == ECORE_X_ATOM_NET_WM_STATE_HIDDEN)
914 return ECORE_X_WINDOW_STATE_HIDDEN;
915 else if (a == ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN)
916 return ECORE_X_WINDOW_STATE_FULLSCREEN;
917 else if (a == ECORE_X_ATOM_NET_WM_STATE_ABOVE)
918 return ECORE_X_WINDOW_STATE_ABOVE;
919 else if (a == ECORE_X_ATOM_NET_WM_STATE_BELOW)
920 return ECORE_X_WINDOW_STATE_BELOW;
921 else if (a == ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION)
922 return ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION;
923 else
924 return ECORE_X_WINDOW_STATE_UNKNOWN;
925} /* _ecore_x_netwm_state_get */
926
927static Ecore_X_Atom
928_ecore_x_netwm_state_atom_get(Ecore_X_Window_State s)
929{
930 switch(s)
931 {
932 case ECORE_X_WINDOW_STATE_MODAL:
933 return ECORE_X_ATOM_NET_WM_STATE_MODAL;
934
935 case ECORE_X_WINDOW_STATE_STICKY:
936 return ECORE_X_ATOM_NET_WM_STATE_STICKY;
937
938 case ECORE_X_WINDOW_STATE_MAXIMIZED_VERT:
939 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_VERT;
940
941 case ECORE_X_WINDOW_STATE_MAXIMIZED_HORZ:
942 return ECORE_X_ATOM_NET_WM_STATE_MAXIMIZED_HORZ;
943
944 case ECORE_X_WINDOW_STATE_SHADED:
945 return ECORE_X_ATOM_NET_WM_STATE_SHADED;
946
947 case ECORE_X_WINDOW_STATE_SKIP_TASKBAR:
948 return ECORE_X_ATOM_NET_WM_STATE_SKIP_TASKBAR;
949
950 case ECORE_X_WINDOW_STATE_SKIP_PAGER:
951 return ECORE_X_ATOM_NET_WM_STATE_SKIP_PAGER;
952
953 case ECORE_X_WINDOW_STATE_HIDDEN:
954 return ECORE_X_ATOM_NET_WM_STATE_HIDDEN;
955
956 case ECORE_X_WINDOW_STATE_FULLSCREEN:
957 return ECORE_X_ATOM_NET_WM_STATE_FULLSCREEN;
958
959 case ECORE_X_WINDOW_STATE_ABOVE:
960 return ECORE_X_ATOM_NET_WM_STATE_ABOVE;
961
962 case ECORE_X_WINDOW_STATE_BELOW:
963 return ECORE_X_ATOM_NET_WM_STATE_BELOW;
964
965 case ECORE_X_WINDOW_STATE_DEMANDS_ATTENTION:
966 return ECORE_X_ATOM_NET_WM_STATE_DEMANDS_ATTENTION;
967
968 default:
969 return 0;
970 } /* switch */
971} /* _ecore_x_netwm_state_atom_get */
972
973EAPI void
974ecore_x_netwm_window_state_set(Ecore_X_Window win,
975 Ecore_X_Window_State *state,
976 unsigned int num)
977{
978 Ecore_X_Atom *set;
979 unsigned int i;
980
981 LOGFN(__FILE__, __LINE__, __FUNCTION__);
982 if (!num)
983 {
984 ecore_x_window_prop_property_del(win, ECORE_X_ATOM_NET_WM_STATE);
985 return;
986 }
987
988 set = malloc(num * sizeof(Ecore_X_Atom));
989 if (!set)
990 return;
991
992 for (i = 0; i < num; i++)
993 set[i] = _ecore_x_netwm_state_atom_get(state[i]);
994
995 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_STATE, set, num);
996
997 free(set);
998} /* ecore_x_netwm_window_state_set */
999
1000EAPI Eina_Bool
1001ecore_x_netwm_window_state_get(Ecore_X_Window win,
1002 Ecore_X_Window_State **state,
1003 unsigned int *num)
1004{
1005 int num_ret, i;
1006 Ecore_X_Atom *atoms;
1007
1008 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1009 if (num)
1010 *num = 0;
1011
1012 if (state)
1013 *state = NULL;
1014
1015 num_ret = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_STATE,
1016 &atoms);
1017 if (num_ret <= 0)
1018 return EINA_FALSE;
1019
1020 if (state)
1021 {
1022 *state = malloc(num_ret * sizeof(Ecore_X_Window_State));
1023 if (*state)
1024 for (i = 0; i < num_ret; ++i)
1025 (*state)[i] = _ecore_x_netwm_state_get(atoms[i]);
1026
1027 if (num)
1028 *num = num_ret;
1029 }
1030
1031 free(atoms);
1032 return EINA_TRUE;
1033} /* ecore_x_netwm_window_state_get */
1034
1035static Ecore_X_Window_Type
1036_ecore_x_netwm_window_type_type_get(Ecore_X_Atom atom)
1037{
1038 if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP)
1039 return ECORE_X_WINDOW_TYPE_DESKTOP;
1040 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK)
1041 return ECORE_X_WINDOW_TYPE_DOCK;
1042 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR)
1043 return ECORE_X_WINDOW_TYPE_TOOLBAR;
1044 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU)
1045 return ECORE_X_WINDOW_TYPE_MENU;
1046 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY)
1047 return ECORE_X_WINDOW_TYPE_UTILITY;
1048 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH)
1049 return ECORE_X_WINDOW_TYPE_SPLASH;
1050 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG)
1051 return ECORE_X_WINDOW_TYPE_DIALOG;
1052 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL)
1053 return ECORE_X_WINDOW_TYPE_NORMAL;
1054 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
1055 return ECORE_X_WINDOW_TYPE_DROPDOWN_MENU;
1056 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU)
1057 return ECORE_X_WINDOW_TYPE_POPUP_MENU;
1058 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP)
1059 return ECORE_X_WINDOW_TYPE_TOOLTIP;
1060 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION)
1061 return ECORE_X_WINDOW_TYPE_NOTIFICATION;
1062 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO)
1063 return ECORE_X_WINDOW_TYPE_COMBO;
1064 else if (atom == ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND)
1065 return ECORE_X_WINDOW_TYPE_DND;
1066 else
1067 return ECORE_X_WINDOW_TYPE_UNKNOWN;
1068} /* _ecore_x_netwm_window_type_type_get */
1069
1070static Ecore_X_Atom
1071_ecore_x_netwm_window_type_atom_get(Ecore_X_Window_Type type)
1072{
1073 switch (type)
1074 {
1075 case ECORE_X_WINDOW_TYPE_DESKTOP:
1076 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DESKTOP;
1077
1078 case ECORE_X_WINDOW_TYPE_DOCK:
1079 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DOCK;
1080
1081 case ECORE_X_WINDOW_TYPE_TOOLBAR:
1082 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLBAR;
1083
1084 case ECORE_X_WINDOW_TYPE_MENU:
1085 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_MENU;
1086
1087 case ECORE_X_WINDOW_TYPE_UTILITY:
1088 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_UTILITY;
1089
1090 case ECORE_X_WINDOW_TYPE_SPLASH:
1091 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_SPLASH;
1092
1093 case ECORE_X_WINDOW_TYPE_DIALOG:
1094 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DIALOG;
1095
1096 case ECORE_X_WINDOW_TYPE_NORMAL:
1097 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NORMAL;
1098
1099 case ECORE_X_WINDOW_TYPE_DROPDOWN_MENU:
1100 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DROPDOWN_MENU;
1101
1102 case ECORE_X_WINDOW_TYPE_POPUP_MENU:
1103 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_POPUP_MENU;
1104
1105 case ECORE_X_WINDOW_TYPE_TOOLTIP:
1106 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_TOOLTIP;
1107
1108 case ECORE_X_WINDOW_TYPE_NOTIFICATION:
1109 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_NOTIFICATION;
1110
1111 case ECORE_X_WINDOW_TYPE_COMBO:
1112 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_COMBO;
1113
1114 case ECORE_X_WINDOW_TYPE_DND:
1115 return ECORE_X_ATOM_NET_WM_WINDOW_TYPE_DND;
1116
1117 default:
1118 return 0;
1119 } /* switch */
1120} /* _ecore_x_netwm_window_type_atom_get */
1121
1122/*
1123 * FIXME: We should set WM_TRANSIENT_FOR if type is ECORE_X_WINDOW_TYPE_TOOLBAR
1124 * , ECORE_X_WINDOW_TYPE_MENU or ECORE_X_WINDOW_TYPE_DIALOG
1125 */
1126EAPI void
1127ecore_x_netwm_window_type_set(Ecore_X_Window win,
1128 Ecore_X_Window_Type type)
1129{
1130 Ecore_X_Atom atom;
1131
1132 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1133 atom = _ecore_x_netwm_window_type_atom_get(type);
1134 ecore_x_window_prop_atom_set(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1135 &atom, 1);
1136} /* ecore_x_netwm_window_type_set */
1137
1138/* FIXME: Maybe return 0 on some conditions? */
1139EAPI Eina_Bool
1140ecore_x_netwm_window_type_get(Ecore_X_Window win,
1141 Ecore_X_Window_Type *type)
1142{
1143 int num;
1144 Ecore_X_Atom *atoms = NULL;
1145
1146 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1147 if (type)
1148 *type = ECORE_X_WINDOW_TYPE_NORMAL;
1149
1150 num = ecore_x_window_prop_atom_list_get(win,
1151 ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1152 &atoms);
1153 if ((type) && (num >= 1) && (atoms))
1154 *type = _ecore_x_netwm_window_type_type_get(atoms[0]);
1155
1156 free(atoms);
1157 if (num >= 1)
1158 return EINA_TRUE;
1159
1160 return EINA_FALSE;
1161} /* ecore_x_netwm_window_type_get */
1162
1163EAPI int
1164ecore_x_netwm_window_types_get(Ecore_X_Window win,
1165 Ecore_X_Window_Type **types)
1166{
1167 int num, i;
1168 Ecore_X_Atom *atoms = NULL;
1169 Ecore_X_Window_Type *atoms2 = NULL;
1170
1171 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1172 if (types)
1173 *types = NULL;
1174
1175 num = ecore_x_window_prop_atom_list_get(win,
1176 ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1177 &atoms);
1178 if ((num <= 0) || (!atoms))
1179 {
1180 if (atoms)
1181 free(atoms);
1182
1183 return 0;
1184 }
1185
1186 atoms2 = malloc(num * sizeof(Ecore_X_Window_Type));
1187 if (!atoms2)
1188 return 0;
1189
1190 for (i = 0; i < num; i++)
1191 atoms2[i] = _ecore_x_netwm_window_type_type_get(atoms[i]);
1192 free(atoms);
1193 if (types)
1194 *types = atoms2;
1195 else
1196 free(atoms2);
1197
1198 return num;
1199} /* ecore_x_netwm_window_types_get */
1200
1201static Ecore_X_Atom
1202_ecore_x_netwm_action_atom_get(Ecore_X_Action action)
1203{
1204 switch (action)
1205 {
1206 case ECORE_X_ACTION_MOVE:
1207 return ECORE_X_ATOM_NET_WM_ACTION_MOVE;
1208
1209 case ECORE_X_ACTION_RESIZE:
1210 return ECORE_X_ATOM_NET_WM_ACTION_RESIZE;
1211
1212 case ECORE_X_ACTION_MINIMIZE:
1213 return ECORE_X_ATOM_NET_WM_ACTION_MINIMIZE;
1214
1215 case ECORE_X_ACTION_SHADE:
1216 return ECORE_X_ATOM_NET_WM_ACTION_SHADE;
1217
1218 case ECORE_X_ACTION_STICK:
1219 return ECORE_X_ATOM_NET_WM_ACTION_STICK;
1220
1221 case ECORE_X_ACTION_MAXIMIZE_HORZ:
1222 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_HORZ;
1223
1224 case ECORE_X_ACTION_MAXIMIZE_VERT:
1225 return ECORE_X_ATOM_NET_WM_ACTION_MAXIMIZE_VERT;
1226
1227 case ECORE_X_ACTION_FULLSCREEN:
1228 return ECORE_X_ATOM_NET_WM_ACTION_FULLSCREEN;
1229
1230 case ECORE_X_ACTION_CHANGE_DESKTOP:
1231 return ECORE_X_ATOM_NET_WM_ACTION_CHANGE_DESKTOP;
1232
1233 case ECORE_X_ACTION_CLOSE:
1234 return ECORE_X_ATOM_NET_WM_ACTION_CLOSE;
1235
1236 case ECORE_X_ACTION_ABOVE:
1237 return ECORE_X_ATOM_NET_WM_ACTION_ABOVE;
1238
1239 case ECORE_X_ACTION_BELOW:
1240 return ECORE_X_ATOM_NET_WM_ACTION_BELOW;
1241
1242 default:
1243 return 0;
1244 } /* switch */
1245} /* _ecore_x_netwm_action_atom_get */
1246
1247/* FIXME: Get complete list */
1248EAPI Eina_Bool
1249ecore_x_netwm_allowed_action_isset(Ecore_X_Window win,
1250 Ecore_X_Action action)
1251{
1252 int num, i;
1253 Ecore_X_Atom *atoms, atom;
1254 Eina_Bool ret = EINA_FALSE;
1255
1256 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1257 num = ecore_x_window_prop_atom_list_get(win, ECORE_X_ATOM_NET_WM_WINDOW_TYPE,
1258 &atoms);
1259 if (num <= 0)
1260 return ret;
1261
1262 atom = _ecore_x_netwm_action_atom_get(action);
1263
1264 for (i = 0; i < num; ++i)
1265 {
1266 if (atom == atoms[i])
1267 {
1268 ret = 1;
1269 break;
1270 }
1271 }
1272
1273 free(atoms);
1274 return ret;
1275} /* ecore_x_netwm_allowed_action_isset */
1276
1277/* FIXME: Set complete list */
1278EAPI void
1279ecore_x_netwm_allowed_action_set(Ecore_X_Window win,
1280 Ecore_X_Action *action,
1281 unsigned int num)
1282{
1283 Ecore_X_Atom *set;
1284 unsigned int i;
1285
1286 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1287 if (!num)
1288 {
1289 ecore_x_window_prop_property_del(win,
1290 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS);
1291 return;
1292 }
1293
1294 set = malloc(num * sizeof(Ecore_X_Atom));
1295 if (!set)
1296 return;
1297
1298 for (i = 0; i < num; i++)
1299 set[i] = _ecore_x_netwm_action_atom_get(action[i]);
1300
1301 ecore_x_window_prop_atom_set(win,
1302 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1303 set,
1304 num);
1305
1306 free(set);
1307} /* ecore_x_netwm_allowed_action_set */
1308
1309EAPI Eina_Bool
1310ecore_x_netwm_allowed_action_get(Ecore_X_Window win,
1311 Ecore_X_Action **action,
1312 unsigned int *num)
1313{
1314 int num_ret, i;
1315 Ecore_X_Atom *atoms;
1316
1317 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1318 if (num)
1319 *num = 0;
1320
1321 if (action)
1322 *action = NULL;
1323
1324 num_ret = ecore_x_window_prop_atom_list_get(
1325 win,
1326 ECORE_X_ATOM_NET_WM_ALLOWED_ACTIONS,
1327 &atoms);
1328 if (num_ret <= 0)
1329 return EINA_FALSE;
1330
1331 if (action)
1332 {
1333 *action = malloc(num_ret * sizeof(Ecore_X_Action));
1334 if (*action)
1335 for (i = 0; i < num_ret; ++i)
1336 (*action)[i] = _ecore_x_netwm_action_atom_get(atoms[i]);
1337
1338 if (num)
1339 *num = num_ret;
1340 }
1341
1342 free(atoms);
1343 return EINA_TRUE;
1344} /* ecore_x_netwm_allowed_action_get */
1345
1346EAPI void
1347ecore_x_netwm_opacity_set(Ecore_X_Window win,
1348 unsigned int opacity)
1349{
1350 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1351 ecore_x_window_prop_card32_set(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
1352 &opacity, 1);
1353} /* ecore_x_netwm_opacity_set */
1354
1355EAPI Eina_Bool
1356ecore_x_netwm_opacity_get(Ecore_X_Window win,
1357 unsigned int *opacity)
1358{
1359 int ret;
1360 unsigned int tmp;
1361
1362 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1363 ret = ecore_x_window_prop_card32_get(win, ECORE_X_ATOM_NET_WM_WINDOW_OPACITY,
1364 &tmp, 1);
1365 if (opacity)
1366 *opacity = tmp;
1367
1368 return ret == 1 ? EINA_TRUE : EINA_FALSE;
1369} /* ecore_x_netwm_opacity_get */
1370
1371EAPI void
1372ecore_x_netwm_frame_size_set(Ecore_X_Window win,
1373 int fl,
1374 int fr,
1375 int ft,
1376 int fb)
1377{
1378 unsigned int frames[4];
1379
1380 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1381 frames[0] = fl;
1382 frames[1] = fr;
1383 frames[2] = ft;
1384 frames[3] = fb;
1385 ecore_x_window_prop_card32_set(win,
1386 ECORE_X_ATOM_NET_FRAME_EXTENTS,
1387 frames,
1388 4);
1389} /* ecore_x_netwm_frame_size_set */
1390
1391EAPI Eina_Bool
1392ecore_x_netwm_frame_size_get(Ecore_X_Window win,
1393 int *fl,
1394 int *fr,
1395 int *ft,
1396 int *fb)
1397{
1398 int ret = 0;
1399 unsigned int frames[4];
1400
1401 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1402 ret = ecore_x_window_prop_card32_get(win,
1403 ECORE_X_ATOM_NET_FRAME_EXTENTS,
1404 frames,
1405 4);
1406 if (ret != 4)
1407 return EINA_FALSE;
1408
1409 if (fl)
1410 *fl = frames[0];
1411
1412 if (fr)
1413 *fr = frames[1];
1414
1415 if (ft)
1416 *ft = frames[2];
1417
1418 if (fb)
1419 *fb = frames[3];
1420
1421 return EINA_TRUE;
1422} /* ecore_x_netwm_frame_size_get */
1423
1424EAPI Eina_Bool
1425ecore_x_netwm_sync_counter_get(Ecore_X_Window win,
1426 Ecore_X_Sync_Counter *counter)
1427{
1428 int ret;
1429 unsigned int tmp;
1430
1431 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1432 ret = ecore_x_window_prop_card32_get(
1433 win,
1434 ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER,
1435 &tmp,
1436 1);
1437
1438 if (counter)
1439 *counter = tmp;
1440
1441 return ret == 1 ? EINA_TRUE : EINA_FALSE;
1442} /* ecore_x_netwm_sync_counter_get */
1443
1444EAPI void
1445ecore_x_netwm_ping_send(Ecore_X_Window win)
1446{
1447 XEvent xev;
1448
1449 if (!win)
1450 return;
1451
1452 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1453 xev.xclient.type = ClientMessage;
1454 xev.xclient.display = _ecore_x_disp;
1455 xev.xclient.window = win;
1456 xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
1457 xev.xclient.format = 32;
1458 xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_PING;
1459 xev.xclient.data.l[1] = _ecore_x_event_last_time;
1460 xev.xclient.data.l[2] = win;
1461 xev.xclient.data.l[3] = 0;
1462 xev.xclient.data.l[4] = 0;
1463
1464 XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
1465} /* ecore_x_netwm_ping_send */
1466
1467EAPI void
1468ecore_x_netwm_sync_request_send(Ecore_X_Window win,
1469 unsigned int serial)
1470{
1471 XSyncValue value;
1472 XEvent xev;
1473
1474 if (!win)
1475 return;
1476
1477 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1478 XSyncIntToValue(&value, (int)serial);
1479
1480 xev.xclient.type = ClientMessage;
1481 xev.xclient.display = _ecore_x_disp;
1482 xev.xclient.window = win;
1483 xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
1484 xev.xclient.format = 32;
1485 xev.xclient.data.l[0] = ECORE_X_ATOM_NET_WM_SYNC_REQUEST;
1486 xev.xclient.data.l[1] = _ecore_x_event_last_time;
1487 xev.xclient.data.l[2] = XSyncValueLow32(value);
1488 xev.xclient.data.l[3] = XSyncValueHigh32(value);
1489 xev.xclient.data.l[4] = 0;
1490
1491 XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
1492} /* ecore_x_netwm_sync_request_send */
1493
1494EAPI void
1495ecore_x_netwm_state_request_send(Ecore_X_Window win,
1496 Ecore_X_Window root,
1497 Ecore_X_Window_State s1,
1498 Ecore_X_Window_State s2,
1499 Eina_Bool set)
1500{
1501 XEvent xev;
1502
1503 if (!win)
1504 return;
1505
1506 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1507 if (!root)
1508 root = DefaultRootWindow(_ecore_x_disp);
1509
1510 xev.xclient.type = ClientMessage;
1511 xev.xclient.serial = 0;
1512 xev.xclient.send_event = True;
1513 xev.xclient.display = _ecore_x_disp;
1514 xev.xclient.window = win;
1515 xev.xclient.format = 32;
1516 xev.xclient.message_type = ECORE_X_ATOM_NET_WM_STATE;
1517 xev.xclient.data.l[0] = !!set;
1518 xev.xclient.data.l[1] = _ecore_x_netwm_state_atom_get(s1);
1519 xev.xclient.data.l[2] = _ecore_x_netwm_state_atom_get(s2);
1520 /* 1 == normal client, if someone wants to use this
1521 * function in a pager, this should be 2 */
1522 xev.xclient.data.l[3] = 1;
1523 xev.xclient.data.l[4] = 0;
1524
1525 XSendEvent(_ecore_x_disp, root, False,
1526 SubstructureNotifyMask | SubstructureRedirectMask, &xev);
1527} /* ecore_x_netwm_state_request_send */
1528
1529EAPI void
1530ecore_x_netwm_desktop_request_send(Ecore_X_Window win,
1531 Ecore_X_Window root,
1532 unsigned int desktop)
1533{
1534 XEvent xev;
1535
1536 if (!win)
1537 return;
1538
1539 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1540 if (!root)
1541 root = DefaultRootWindow(_ecore_x_disp);
1542
1543 xev.xclient.type = ClientMessage;
1544 xev.xclient.serial = 0;
1545 xev.xclient.send_event = True;
1546 xev.xclient.display = _ecore_x_disp;
1547 xev.xclient.window = win;
1548 xev.xclient.format = 32;
1549 xev.xclient.message_type = ECORE_X_ATOM_NET_WM_DESKTOP;
1550 xev.xclient.data.l[0] = desktop;
1551
1552 XSendEvent(_ecore_x_disp, root, False,
1553 SubstructureNotifyMask | SubstructureRedirectMask, &xev);
1554} /* ecore_x_netwm_desktop_request_send */
1555
1556int
1557_ecore_x_netwm_startup_info_begin(Ecore_X_Window win __UNUSED__,
1558 char *data __UNUSED__)
1559{
1560#if 0
1561 Ecore_X_Startup_Info *info;
1562 unsigned char *exists = 0;
1563
1564 if (!startup_info)
1565 return 0;
1566
1567 info = eina_hash_find(startup_info, (void *)win);
1568 if (info)
1569 {
1570 exists = 1;
1571 WRN("Already got info for win: 0x%x", win);
1572 _ecore_x_netwm_startup_info_free(info);
1573 }
1574
1575 info = calloc(1, sizeof(Ecore_X_Startup_Info));
1576 if (!info)
1577 return 0;
1578
1579 info->win = win;
1580 info->length = 0;
1581 info->buffer_size = 161;
1582 info->buffer = calloc(info->buffer_size, sizeof(char));
1583 if (!info->buffer)
1584 {
1585 _ecore_x_netwm_startup_info_free(info);
1586 return 0;
1587 }
1588
1589 memcpy(info->buffer, data, 20);
1590 info->length += 20;
1591 info->buffer[info->length] = 0;
1592 if (exists)
1593 eina_hash_modify(startup_info, (void *)info->win, info);
1594 else
1595 eina_hash_add(startup_info, (void *)info->win, info);
1596
1597 if (strlen(info->buffer) != 20)
1598 /* We have a '\0' in there, the message is done */
1599 _ecore_x_netwm_startup_info_process(info);
1600
1601#endif /* if 0 */
1602 return 1;
1603} /* _ecore_x_netwm_startup_info_begin */
1604
1605int
1606_ecore_x_netwm_startup_info(Ecore_X_Window win __UNUSED__,
1607 char *data __UNUSED__)
1608{
1609#if 0
1610 Ecore_X_Startup_Info *info;
1611 char *p;
1612
1613 if (!startup_info)
1614 return 0;
1615
1616 info = eina_hash_find(startup_info, (void *)win);
1617 if (!info)
1618 return 0;
1619
1620 if ((info->length + 20) > info->buffer_size)
1621 {
1622 info->buffer_size += 160;
1623 info->buffer = realloc(info->buffer, info->buffer_size * sizeof(char));
1624 if (!info->buffer)
1625 {
1626 eina_hash_del(startup_info, (void *)info->win);
1627 _ecore_x_netwm_startup_info_free(info);
1628 return 0;
1629 }
1630 }
1631
1632 memcpy(info->buffer + info->length, data, 20);
1633 p = info->buffer + info->length;
1634 info->length += 20;
1635 info->buffer[info->length] = 0;
1636 if (strlen(p) != 20)
1637 /* We have a '\0' in there, the message is done */
1638 _ecore_x_netwm_startup_info_process(info);
1639
1640#endif /* if 0 */
1641 return 1;
1642} /* _ecore_x_netwm_startup_info */
1643
1644/*
1645 * Set UTF-8 string property
1646 */
1647static void
1648_ecore_x_window_prop_string_utf8_set(Ecore_X_Window win,
1649 Ecore_X_Atom atom,
1650 const char *str)
1651{
1652 XChangeProperty(_ecore_x_disp, win, atom, ECORE_X_ATOM_UTF8_STRING, 8,
1653 PropModeReplace, (unsigned char *)str, strlen(str));
1654} /* _ecore_x_window_prop_string_utf8_set */
1655
1656/*
1657 * Get UTF-8 string property
1658 */
1659static char *
1660_ecore_x_window_prop_string_utf8_get(Ecore_X_Window win,
1661 Ecore_X_Atom atom)
1662{
1663 char *str;
1664 unsigned char *prop_ret;
1665 Atom type_ret;
1666 unsigned long bytes_after, num_ret;
1667 int format_ret;
1668
1669 str = NULL;
1670 prop_ret = NULL;
1671 XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
1672 ECORE_X_ATOM_UTF8_STRING, &type_ret,
1673 &format_ret, &num_ret, &bytes_after, &prop_ret);
1674 if (prop_ret && num_ret > 0 && format_ret == 8)
1675 {
1676 str = malloc(num_ret + 1);
1677 if (str)
1678 {
1679 memcpy(str, prop_ret, num_ret);
1680 str[num_ret] = '\0';
1681 }
1682 }
1683
1684 if (prop_ret)
1685 XFree(prop_ret);
1686
1687 return str;
1688} /* _ecore_x_window_prop_string_utf8_get */
1689
1690#if 0 /* Unused */
1691/*
1692 * Process startup info
1693 */
1694static int
1695_ecore_x_netwm_startup_info_process(Ecore_X_Startup_Info *info)
1696{
1697 Ecore_X_Event_Startup_Sequence *e;
1698 int event;
1699 char *p;
1700
1701 p = strchr(info->buffer, ':');
1702 if (!p)
1703 {
1704 eina_hash_del(startup_info, (void *)info->win);
1705 _ecore_x_netwm_startup_info_free(info);
1706 return 0;
1707 }
1708
1709 *p = 0;
1710 if (!strcmp(info->buffer, "new"))
1711 {
1712 if (info->init)
1713 event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
1714 else
1715 event = ECORE_X_EVENT_STARTUP_SEQUENCE_NEW;
1716
1717 info->init = 1;
1718 }
1719 else if (!strcmp(info->buffer, "change"))
1720 event = ECORE_X_EVENT_STARTUP_SEQUENCE_CHANGE;
1721 else if (!strcmp(info->buffer, "remove"))
1722 event = ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE;
1723 else
1724 {
1725 eina_hash_del(startup_info, (void *)info->win);
1726 _ecore_x_netwm_startup_info_free(info);
1727 return 0;
1728 }
1729
1730 p++;
1731
1732 if (!_ecore_x_netwm_startup_info_parse(info, p))
1733 {
1734 eina_hash_del(startup_info, (void *)info->win);
1735 _ecore_x_netwm_startup_info_free(info);
1736 return 0;
1737 }
1738
1739 if (info->init)
1740 {
1741 e = calloc(1, sizeof(Ecore_X_Event_Startup_Sequence));
1742 if (!e)
1743 {
1744 eina_hash_del(startup_info, (void *)info->win);
1745 _ecore_x_netwm_startup_info_free(info);
1746 return 0;
1747 }
1748
1749 e->win = info->win;
1750 ecore_event_add(event, e, NULL, NULL);
1751 }
1752
1753 if (event == ECORE_X_EVENT_STARTUP_SEQUENCE_REMOVE)
1754 {
1755 eina_hash_del(startup_info, (void *)info->win);
1756 _ecore_x_netwm_startup_info_free(info);
1757 }
1758 else
1759 {
1760 /* Discard buffer */
1761 info->length = 0;
1762 info->buffer[0] = 0;
1763 }
1764
1765 return 1;
1766} /* _ecore_x_netwm_startup_info_process */
1767
1768/*
1769 * Parse startup info
1770 */
1771static int
1772_ecore_x_netwm_startup_info_parse(Ecore_X_Startup_Info *info,
1773 char *data)
1774{
1775 while (*data)
1776 {
1777 int in_quot_sing, in_quot_dbl, escaped;
1778 char *p, *pp;
1779 char *key;
1780 char value[1024];
1781
1782 /* Skip space */
1783 while (*data == ' ') data++;
1784 /* Get key */
1785 key = data;
1786 data = strchr(key, '=');
1787 if (!data)
1788 return 0;
1789
1790 *data = 0;
1791 data++;
1792
1793 /* Get value */
1794 p = data;
1795 pp = value;
1796 in_quot_dbl = 0;
1797 in_quot_sing = 0;
1798 escaped = 0;
1799 while (*p)
1800 {
1801 if ((pp - value) >= 1024)
1802 return 0;
1803
1804 if (escaped)
1805 {
1806 *pp = *p;
1807 pp++;
1808 escaped = 0;
1809 }
1810 else if (in_quot_sing)
1811 {
1812 if (*p == '\\')
1813 escaped = 1;
1814 else if (*p == '\'')
1815 in_quot_sing = 0;
1816 else
1817 {
1818 *pp = *p;
1819 pp++;
1820 }
1821 }
1822 else if (in_quot_dbl)
1823 {
1824 if (*p == '\\')
1825 escaped = 1;
1826 else if (*p == '\"')
1827 in_quot_dbl = 0;
1828 else
1829 {
1830 *pp = *p;
1831 pp++;
1832 }
1833 }
1834 else
1835 {
1836 if (*p == '\\')
1837 escaped = 1;
1838 else if (*p == '\'')
1839 in_quot_sing = 1;
1840 else if (*p == '\"')
1841 in_quot_dbl = 1;
1842 else if (*p == ' ')
1843 break;
1844 else
1845 {
1846 *pp = *p;
1847 pp++;
1848 }
1849 }
1850
1851 p++;
1852 }
1853 if ((in_quot_dbl) || (in_quot_sing))
1854 return 0;
1855
1856 data = p;
1857 *pp = 0;
1858
1859 /* Parse info */
1860 if (!strcmp(key, "ID"))
1861 {
1862 if ((info->id) && (strcmp(info->id, value)))
1863 return 0;
1864
1865 info->id = strdup(value);
1866 p = strstr(value, "_TIME");
1867 if (p)
1868 info->timestamp = atoi(p + 5);
1869 }
1870 else if (!strcmp(key, "NAME"))
1871 {
1872 if (info->name)
1873 free(info->name);
1874
1875 info->name = strdup(value);
1876 }
1877 else if (!strcmp(key, "SCREEN"))
1878 info->screen = atoi(value);
1879 else if (!strcmp(key, "BIN"))
1880 {
1881 if (info->bin)
1882 free(info->bin);
1883
1884 info->bin = strdup(value);
1885 }
1886 else if (!strcmp(key, "ICON"))
1887 {
1888 if (info->icon)
1889 free(info->icon);
1890
1891 info->icon = strdup(value);
1892 }
1893 else if (!strcmp(key, "DESKTOP"))
1894 info->desktop = atoi(value);
1895 else if (!strcmp(key, "TIMESTAMP"))
1896 {
1897 if (!info->timestamp)
1898 info->timestamp = atoi(value);
1899 }
1900 else if (!strcmp(key, "DESCRIPTION"))
1901 {
1902 if (info->description)
1903 free(info->description);
1904
1905 info->description = strdup(value);
1906 }
1907 else if (!strcmp(key, "WMCLASS"))
1908 {
1909 if (info->wmclass)
1910 free(info->wmclass);
1911
1912 info->wmclass = strdup(value);
1913 }
1914 else if (!strcmp(key, "SILENT"))
1915 info->silent = atoi(value);
1916 else
1917 ERR("Ecore X Sequence, Unknown: %s=%s", key, value);
1918 }
1919 if (!info->id)
1920 return 0;
1921
1922 return 1;
1923} /* _ecore_x_netwm_startup_info_parse */
1924
1925#endif /* if 0 */
1926
1927/*
1928 * Free startup info struct
1929 */
1930static void
1931_ecore_x_netwm_startup_info_free(void *data)
1932{
1933 Ecore_X_Startup_Info *info;
1934
1935 info = data;
1936 if (!info)
1937 return;
1938
1939 if (info->buffer)
1940 free(info->buffer);
1941
1942 if (info->id)
1943 free(info->id);
1944
1945 if (info->name)
1946 free(info->name);
1947
1948 if (info->bin)
1949 free(info->bin);
1950
1951 if (info->icon)
1952 free(info->icon);
1953
1954 if (info->description)
1955 free(info->description);
1956
1957 if (info->wmclass)
1958 free(info->wmclass);
1959
1960 free(info);
1961} /* _ecore_x_netwm_startup_info_free */
1962
1963/*
1964 * Is screen composited?
1965 */
1966EAPI Eina_Bool
1967ecore_x_screen_is_composited(int screen)
1968{
1969 Ecore_X_Window win;
1970 static Ecore_X_Atom atom = None;
1971 char buf[32];
1972
1973 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1974 snprintf(buf, sizeof(buf), "_NET_WM_CM_S%i", screen);
1975 if (atom == None)
1976 atom = XInternAtom(_ecore_x_disp, buf, False);
1977
1978 if (atom == None)
1979 return EINA_FALSE;
1980
1981 win = XGetSelectionOwner(_ecore_x_disp, atom);
1982
1983 return (win != None) ? EINA_TRUE : EINA_FALSE;
1984} /* ecore_x_screen_is_composited */
1985
1986EAPI void
1987ecore_x_screen_is_composited_set(int screen,
1988 Ecore_X_Window win)
1989{
1990 static Ecore_X_Atom atom = None;
1991 char buf[32];
1992
1993 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1994 snprintf(buf, sizeof(buf), "_NET_WM_CM_S%i", screen);
1995 if (atom == None)
1996 atom = XInternAtom(_ecore_x_disp, buf, False);
1997
1998 if (atom == None)
1999 return;
2000
2001 XSetSelectionOwner(_ecore_x_disp, atom, win, _ecore_x_event_last_time);
2002} /* ecore_x_screen_is_composited_set */
2003
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_pixmap.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_pixmap.c
new file mode 100644
index 0000000..b81d06c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_pixmap.c
@@ -0,0 +1,121 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "Ecore.h"
6#include "ecore_x_private.h"
7#include "Ecore_X.h"
8
9/**
10 * @defgroup Ecore_X_Pixmap_Group X Pixmap Functions
11 *
12 * Functions that operate on pixmaps.
13 */
14
15/**
16 * Creates a new pixmap.
17 * @param win Window used to determine which screen of the display the
18 * pixmap should be created on. If 0, the default root window
19 * is used.
20 * @param w Width of the new pixmap.
21 * @param h Height of the new pixmap.
22 * @param dep Depth of the pixmap. If 0, the default depth of the default
23 * screen is used.
24 * @return New pixmap.
25 * @ingroup Ecore_X_Pixmap_Group
26 */
27EAPI Ecore_X_Pixmap
28ecore_x_pixmap_new(Ecore_X_Window win,
29 int w,
30 int h,
31 int dep)
32{
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
34 if (win == 0)
35 win = DefaultRootWindow(_ecore_x_disp);
36
37 if (dep == 0)
38 dep = DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp));
39
40 return XCreatePixmap(_ecore_x_disp, win, w, h, dep);
41} /* ecore_x_pixmap_new */
42
43/**
44 * Deletes the reference to the given pixmap.
45 *
46 * If no other clients have a reference to the given pixmap, the server
47 * will destroy it.
48 *
49 * @param pmap The given pixmap.
50 * @ingroup Ecore_X_Pixmap_Group
51 */
52EAPI void
53ecore_x_pixmap_free(Ecore_X_Pixmap pmap)
54{
55 LOGFN(__FILE__, __LINE__, __FUNCTION__);
56 XFreePixmap(_ecore_x_disp, pmap);
57} /* ecore_x_pixmap_free */
58
59/**
60 * Pastes a rectangular area of the given pixmap onto the given drawable.
61 * @param pmap The given pixmap.
62 * @param dest The given drawable.
63 * @param gc The graphics context which governs which operation will
64 * be used to paste the area onto the drawable.
65 * @param sx The X position of the area on the pixmap.
66 * @param sy The Y position of the area on the pixmap.
67 * @param w The width of the area.
68 * @param h The height of the area.
69 * @param dx The X position at which to paste the area on @p dest.
70 * @param dy The Y position at which to paste the area on @p dest.
71 * @ingroup Ecore_X_Pixmap_Group
72 */
73EAPI void
74ecore_x_pixmap_paste(Ecore_X_Pixmap pmap,
75 Ecore_X_Drawable dest,
76 Ecore_X_GC gc,
77 int sx,
78 int sy,
79 int w,
80 int h,
81 int dx,
82 int dy)
83{
84 LOGFN(__FILE__, __LINE__, __FUNCTION__);
85 XCopyArea(_ecore_x_disp, pmap, dest, gc, sx, sy, w, h, dx, dy);
86} /* ecore_x_pixmap_paste */
87
88/**
89 * Retrieves the size of the given pixmap.
90 * @param pmap The given pixmap.
91 * @param x Pointer to an integer in which to store the X position.
92 * @param y Pointer to an integer in which to store the Y position.
93 * @param w Pointer to an integer in which to store the width.
94 * @param h Pointer to an integer in which to store the height.
95 * @ingroup Ecore_X_Pixmap_Group
96 */
97EAPI void
98ecore_x_pixmap_geometry_get(Ecore_X_Pixmap pmap,
99 int *x,
100 int *y,
101 int *w,
102 int *h)
103{
104 LOGFN(__FILE__, __LINE__, __FUNCTION__);
105 if (pmap)
106 ecore_x_drawable_geometry_get(pmap, x, y, w, h);
107} /* ecore_x_pixmap_geometry_get */
108
109/**
110 * Retrieves the depth of the given pixmap.
111 * @param pmap The given pixmap.
112 * @return The depth of the pixmap.
113 * @ingroup Ecore_X_Pixmap_Group
114 */
115EAPI int
116ecore_x_pixmap_depth_get(Ecore_X_Pixmap pmap)
117{
118 LOGFN(__FILE__, __LINE__, __FUNCTION__);
119 return ecore_x_drawable_depth_get(pmap);
120} /* ecore_x_pixmap_depth_get */
121
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_private.h b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_private.h
new file mode 100644
index 0000000..02a01f7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_private.h
@@ -0,0 +1,385 @@
1#ifndef _ECORE_X_PRIVATE_H
2#define _ECORE_X_PRIVATE_H
3
4#include <sys/param.h>
5#ifndef MAXHOSTNAMELEN
6#define MAXHOSTNAMELEN 256
7#endif /* ifndef MAXHOSTNAMELEN */
8
9#include <X11/Xlib.h>
10#include <X11/Xproto.h>
11#include <X11/Xutil.h>
12#include <X11/Xatom.h>
13#include <X11/Xresource.h>
14#include <X11/keysymdef.h>
15#include <X11/extensions/XShm.h>
16#include <X11/extensions/shape.h>
17#include <X11/extensions/sync.h>
18#include <X11/extensions/dpms.h>
19#ifdef ECORE_XCURSOR
20#include <X11/Xcursor/Xcursor.h>
21#endif /* ifdef ECORE_XCURSOR */
22#ifdef ECORE_XPRINT
23#include <X11/extensions/Print.h>
24#endif /* ifdef ECORE_XPRINT */
25#ifdef ECORE_XINERAMA
26#include <X11/extensions/Xinerama.h>
27#endif /* ifdef ECORE_XINERAMA */
28#ifdef ECORE_XRANDR
29#include <X11/extensions/Xrandr.h>
30#endif /* ifdef ECORE_XRANDR */
31#ifdef ECORE_XSS
32#include <X11/extensions/scrnsaver.h>
33#endif /* ifdef ECORE_XSS */
34#ifdef ECORE_XRENDER
35#include <X11/extensions/Xrender.h>
36#endif /* ifdef ECORE_XRENDER */
37#ifdef ECORE_XFIXES
38#include <X11/extensions/Xfixes.h>
39#endif /* ifdef ECORE_XFIXES */
40#ifdef ECORE_XCOMPOSITE
41#include <X11/extensions/Xcomposite.h>
42#endif /* ifdef ECORE_XCOMPOSITE */
43#ifdef ECORE_XDAMAGE
44#include <X11/extensions/Xdamage.h>
45#endif /* ifdef ECORE_XDAMAGE */
46#ifdef ECORE_XGESTURE
47#include <X11/extensions/gesture.h>
48#include <X11/extensions/gestureproto.h>
49#endif /* ifdef ECORE_XGESTURE */
50#ifdef ECORE_XDPMS
51#include <X11/extensions/dpms.h>
52#endif /* ifdef ECORE_XDPMS */
53#ifdef ECORE_XKB
54#include <X11/XKBlib.h>
55#endif /* ifdef ECORE_XKB */
56#ifdef ECORE_XI2
57#include <X11/extensions/XInput2.h>
58#endif /* ifdef ECORE_XI2 */
59
60#ifndef XK_MISCELLANY
61# define XK_MISCELLANY 1
62#endif
63
64#include "Ecore.h"
65#include "ecore_private.h"
66#include "Ecore_X.h"
67#include "Ecore_Input.h"
68
69extern int _ecore_xlib_log_dom;
70#ifdef ECORE_XLIB_DEFAULT_LOG_COLOR
71# undef ECORE_XLIB_DEFAULT_LOG_COLOR
72#endif /* ifdef ECORE_XLIB_DEFAULT_LOG_COLOR */
73#define ECORE_XLIB_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
74
75#ifdef ERR
76# undef ERR
77#endif /* ifdef ERR */
78#define ERR(...) EINA_LOG_DOM_ERR(_ecore_xlib_log_dom, __VA_ARGS__)
79
80#ifdef DBG
81# undef DBG
82#endif /* ifdef DBG */
83#define DBG(...) EINA_LOG_DOM_DBG(_ecore_xlib_log_dom, __VA_ARGS__)
84
85#ifdef INF
86# undef INF
87#endif /* ifdef INF */
88#define INF(...) EINA_LOG_DOM_INFO(_ecore_xlib_log_dom, __VA_ARGS__)
89
90#ifdef WRN
91# undef WRN
92#endif /* ifdef WRN */
93#define WRN(...) EINA_LOG_DOM_WARN(_ecore_xlib_log_dom, __VA_ARGS__)
94
95#ifdef CRIT
96# undef CRIT
97#endif /* ifdef CRIT */
98#define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_xlib_log_dom, __VA_ARGS__)
99
100typedef struct _Ecore_X_Selection_Intern Ecore_X_Selection_Intern;
101
102struct _Ecore_X_Selection_Intern
103{
104 Ecore_X_Window win;
105 Ecore_X_Atom selection;
106 unsigned char *data;
107 int length;
108 Time time;
109};
110
111typedef struct _Ecore_X_Selection_Converter Ecore_X_Selection_Converter;
112
113struct _Ecore_X_Selection_Converter
114{
115 Ecore_X_Atom target;
116 Eina_Bool (*convert)(char *target, void *data, int size, void **data_ret, int *size_ret, Ecore_X_Atom *type, int *typeseize);
117 Ecore_X_Selection_Converter *next;
118};
119
120typedef struct _Ecore_X_Selection_Parser Ecore_X_Selection_Parser;
121
122struct _Ecore_X_Selection_Parser
123{
124 char *target;
125 void *(*parse)(const char *target, void *data, int size, int format);
126 Ecore_X_Selection_Parser *next;
127};
128
129typedef struct _Ecore_X_DND_Source
130{
131 int version;
132 Ecore_X_Window win, dest;
133
134 enum {
135 ECORE_X_DND_SOURCE_IDLE,
136 ECORE_X_DND_SOURCE_DRAGGING,
137 ECORE_X_DND_SOURCE_DROPPED,
138 ECORE_X_DND_SOURCE_CONVERTING
139 } state;
140
141 struct
142 {
143 short x, y;
144 unsigned short width, height;
145 } rectangle;
146
147 struct
148 {
149 Ecore_X_Window window;
150 int x, y;
151 } prev;
152
153 Time time;
154
155 Ecore_X_Atom action, accepted_action;
156
157 int will_accept;
158 int suppress;
159
160 int await_status;
161} Ecore_X_DND_Source;
162
163typedef struct _Ecore_X_DND_Target
164{
165 int version;
166 Ecore_X_Window win, source;
167
168 enum {
169 ECORE_X_DND_TARGET_IDLE,
170 ECORE_X_DND_TARGET_ENTERED
171 } state;
172
173 struct
174 {
175 int x, y;
176 } pos;
177
178 Time time;
179
180 Ecore_X_Atom action, accepted_action;
181
182 int will_accept;
183} Ecore_X_DND_Target;
184
185extern int ECORE_X_MODIFIER_SHIFT;
186extern int ECORE_X_MODIFIER_CTRL;
187extern int ECORE_X_MODIFIER_ALT;
188extern int ECORE_X_MODIFIER_WIN;
189
190extern int ECORE_X_LOCK_SCROLL;
191extern int ECORE_X_LOCK_NUM;
192extern int ECORE_X_LOCK_CAPS;
193extern int ECORE_X_LOCK_SHIFT;
194
195extern Display *_ecore_x_disp;
196extern double _ecore_x_double_click_time;
197extern Time _ecore_x_event_last_time;
198extern Window _ecore_x_event_last_win;
199extern int _ecore_x_event_last_root_x;
200extern int _ecore_x_event_last_root_y;
201extern Eina_Bool _ecore_x_xcursor;
202
203extern Ecore_X_Atom _ecore_x_atoms_wm_protocols[ECORE_X_WM_PROTOCOL_NUM];
204
205extern int _ecore_window_grabs_num;
206extern Window *_ecore_window_grabs;
207extern Eina_Bool (*_ecore_window_grab_replay_func)(void *data,
208 int event_type,
209 void *event);
210extern void *_ecore_window_grab_replay_data;
211
212extern Ecore_X_Window _ecore_x_private_win;
213
214void _ecore_x_error_handler_init(void);
215void _ecore_x_event_handle_any_event(XEvent *xevent);
216void _ecore_x_event_handle_key_press(XEvent *xevent);
217void _ecore_x_event_handle_key_release(XEvent *xevent);
218void _ecore_x_event_handle_button_press(XEvent *xevent);
219void _ecore_x_event_handle_button_release(XEvent *xevent);
220void _ecore_x_event_handle_motion_notify(XEvent *xevent);
221void _ecore_x_event_handle_enter_notify(XEvent *xevent);
222void _ecore_x_event_handle_leave_notify(XEvent *xevent);
223void _ecore_x_event_handle_focus_in(XEvent *xevent);
224void _ecore_x_event_handle_focus_out(XEvent *xevent);
225void _ecore_x_event_handle_keymap_notify(XEvent *xevent);
226void _ecore_x_event_handle_expose(XEvent *xevent);
227void _ecore_x_event_handle_graphics_expose(XEvent *xevent);
228void _ecore_x_event_handle_visibility_notify(XEvent *xevent);
229void _ecore_x_event_handle_create_notify(XEvent *xevent);
230void _ecore_x_event_handle_destroy_notify(XEvent *xevent);
231void _ecore_x_event_handle_unmap_notify(XEvent *xevent);
232void _ecore_x_event_handle_map_notify(XEvent *xevent);
233void _ecore_x_event_handle_map_request(XEvent *xevent);
234void _ecore_x_event_handle_reparent_notify(XEvent *xevent);
235void _ecore_x_event_handle_configure_notify(XEvent *xevent);
236void _ecore_x_event_handle_configure_request(XEvent *xevent);
237void _ecore_x_event_handle_gravity_notify(XEvent *xevent);
238void _ecore_x_event_handle_resize_request(XEvent *xevent);
239void _ecore_x_event_handle_circulate_notify(XEvent *xevent);
240void _ecore_x_event_handle_circulate_request(XEvent *xevent);
241void _ecore_x_event_handle_property_notify(XEvent *xevent);
242void _ecore_x_event_handle_selection_clear(XEvent *xevent);
243void _ecore_x_event_handle_selection_request(XEvent *xevent);
244void _ecore_x_event_handle_selection_notify(XEvent *xevent);
245void _ecore_x_event_handle_colormap_notify(XEvent *xevent);
246void _ecore_x_event_handle_client_message(XEvent *xevent);
247void _ecore_x_event_handle_mapping_notify(XEvent *xevent);
248void _ecore_x_event_handle_shape_change(XEvent *xevent);
249void _ecore_x_event_handle_screensaver_notify(XEvent *xevent);
250#ifdef ECORE_XGESTURE
251void _ecore_x_event_handle_gesture_notify_flick(XEvent *xevent);
252void _ecore_x_event_handle_gesture_notify_pan(XEvent *xevent);
253void _ecore_x_event_handle_gesture_notify_pinchrotation(XEvent *xevent);
254void _ecore_x_event_handle_gesture_notify_tap(XEvent *xevent);
255void _ecore_x_event_handle_gesture_notify_tapnhold(XEvent *xevent);
256void _ecore_x_event_handle_gesture_notify_hold(XEvent *xevent);
257void _ecore_x_event_handle_gesture_notify_group(XEvent *xevent);
258#endif /* ifdef ECORE_XGESTURE */
259void _ecore_x_event_handle_sync_counter(XEvent *xevent);
260void _ecore_x_event_handle_sync_alarm(XEvent *xevent);
261#ifdef ECORE_XRANDR
262void _ecore_x_event_handle_randr_change(XEvent *xevent);
263void _ecore_x_event_handle_randr_notify(XEvent *xevent);
264#endif /* ifdef ECORE_XRANDR */
265#ifdef ECORE_XFIXES
266void _ecore_x_event_handle_fixes_selection_notify(XEvent *xevent);
267#endif /* ifdef ECORE_XFIXES */
268#ifdef ECORE_XDAMAGE
269void _ecore_x_event_handle_damage_notify(XEvent *xevent);
270#endif /* ifdef ECORE_XDAMAGE */
271void _ecore_x_event_handle_generic_event(XEvent *xevent);
272
273void _ecore_x_selection_data_init(void);
274void _ecore_x_selection_shutdown(void);
275Ecore_X_Atom _ecore_x_selection_target_atom_get(const char *target);
276char *_ecore_x_selection_target_get(Ecore_X_Atom target);
277Ecore_X_Selection_Intern *_ecore_x_selection_get(Ecore_X_Atom selection);
278Eina_Bool _ecore_x_selection_set(Window w,
279 const void *data,
280 int len,
281 Ecore_X_Atom selection);
282int _ecore_x_selection_convert(Ecore_X_Atom selection,
283 Ecore_X_Atom target,
284 void **data_ret,
285 Ecore_X_Atom *targettype,
286 int *targetsize);
287void *_ecore_x_selection_parse(const char *target,
288 void *data,
289 int size,
290 int format);
291
292void _ecore_x_sync_magic_send(int val,
293 Ecore_X_Window swin);
294void _ecore_x_window_grab_remove(Ecore_X_Window win);
295void _ecore_x_key_grab_remove(Ecore_X_Window win);
296
297/* from dnd */
298void _ecore_x_dnd_init(void);
299Ecore_X_DND_Source *_ecore_x_dnd_source_get(void);
300Ecore_X_DND_Target *_ecore_x_dnd_target_get(void);
301void _ecore_x_dnd_drag(Ecore_X_Window root,
302 int x,
303 int y);
304void _ecore_x_dnd_shutdown(void);
305
306/* from netwm */
307Ecore_X_Window_State _ecore_x_netwm_state_get(Ecore_X_Atom a);
308int _ecore_x_netwm_startup_info_begin(Ecore_X_Window win,
309 char *data);
310int _ecore_x_netwm_startup_info(Ecore_X_Window win,
311 char *data);
312
313/* Fixes * Damage * Composite * DPMS */
314void _ecore_x_fixes_init(void);
315void _ecore_x_damage_init(void);
316void _ecore_x_composite_init(void);
317void _ecore_x_dpms_init(void);
318void _ecore_x_randr_init(void);
319void _ecore_x_gesture_init(void);
320
321void _ecore_x_atoms_init(void);
322
323extern int _ecore_x_xi2_opcode;
324
325void _ecore_x_events_init(void);
326void _ecore_x_events_shutdown(void);
327
328void _ecore_x_input_init(void);
329void _ecore_x_input_shutdown(void);
330void _ecore_x_input_handler(XEvent *xevent);
331/* from sync */
332
333void _ecore_mouse_move(unsigned int timestamp,
334 unsigned int xmodifiers,
335 int x,
336 int y,
337 int x_root,
338 int y_root,
339 unsigned int event_window,
340 unsigned int window,
341 unsigned int root_win,
342 int same_screen,
343 int dev,
344 double radx,
345 double rady,
346 double pressure,
347 double angle,
348 double mx,
349 double my,
350 double mrx,
351 double mry);
352Ecore_Event_Mouse_Button *_ecore_mouse_button(int event,
353 unsigned int timestamp,
354 unsigned int xmodifiers,
355 unsigned int buttons,
356 int x,
357 int y,
358 int x_root,
359 int y_root,
360 unsigned int event_window,
361 unsigned int window,
362 unsigned int root_win,
363 int same_screen,
364 int dev,
365 double radx,
366 double rady,
367 double pressure,
368 double angle,
369 double mx,
370 double my,
371 double mrx,
372 double mry);
373
374void _ecore_x_modifiers_get(void);
375
376//#define LOGFNS 1
377
378#ifdef LOGFNS
379#include <stdio.h>
380#define LOGFN(fl, ln, fn) printf("-ECORE-X: %25s: %5i - %s\n", fl, ln, fn);
381#else /* ifdef LOGFNS */
382#define LOGFN(fl, ln, fn)
383#endif /* ifdef LOGFNS */
384
385#endif /* ifndef _ECORE_X_PRIVATE_H */
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.c
new file mode 100644
index 0000000..d4d834f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.c
@@ -0,0 +1,102 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6#include "ecore_x_randr.h"
7
8static Eina_Bool _randr_available = EINA_FALSE;
9#ifdef ECORE_XRANDR
10static int _randr_major, _randr_minor;
11int _randr_version;
12#define RANDR_1_1 ((1 << 16) | 1)
13#define RANDR_1_2 ((1 << 16) | 2)
14#define RANDR_1_3 ((1 << 16) | 3)
15
16#define RANDR_VALIDATE_ROOT(screen, \
17 root) ((screen = \
18 XRRRootToScreen(_ecore_x_disp, \
19 root)) != -1)
20
21#define Ecore_X_Randr_Unset -1
22
23XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display * dpy,
24 Window window);
25
26#endif /* ifdef ECORE_XRANDR */
27
28void
29_ecore_x_randr_init(void)
30{
31#ifdef ECORE_XRANDR
32 _randr_major = 1;
33 _randr_minor = 3;
34 _randr_version = 0;
35
36 _ecore_x_randr_get_screen_resources = NULL;
37 if (XRRQueryVersion(_ecore_x_disp, &_randr_major, &_randr_minor))
38 {
39 _randr_version = (_randr_major << 16) | _randr_minor;
40 if (_randr_version >= RANDR_1_3)
41 _ecore_x_randr_get_screen_resources = XRRGetScreenResourcesCurrent;
42 else if (_randr_version == RANDR_1_2)
43 _ecore_x_randr_get_screen_resources = XRRGetScreenResources;
44
45 _randr_available = EINA_TRUE;
46 }
47 else
48 _randr_available = EINA_FALSE;
49
50#else
51 _randr_available = EINA_FALSE;
52#endif
53}
54
55/*
56 * @brief query whether randr is available or not
57 * @return EINA_TRUE, if extension is available, else EINA_FALSE
58 */
59EAPI Eina_Bool
60ecore_x_randr_query(void)
61{
62 return _randr_available;
63}
64
65/*
66 * @return version of the RandRR extension supported by the server or,
67 * in case RandRR extension is not available, Ecore_X_Randr_Unset (=-1).
68 * bit version information: 31 MAJOR 16 | 15 MINOR 0
69 */
70EAPI int
71ecore_x_randr_version_get(void)
72{
73#ifdef ECORE_XRANDR
74 LOGFN(__FILE__, __LINE__, __FUNCTION__);
75 if (_randr_available)
76 {
77 return _randr_version;
78 }
79 else
80 {
81 return Ecore_X_Randr_Unset;
82 }
83#else
84 return -1;
85#endif
86}
87
88Eina_Bool
89_ecore_x_randr_root_validate(Ecore_X_Window root)
90{
91#ifdef ECORE_XRANDR
92 Ecore_X_Randr_Screen scr = -1;
93 if (root && RANDR_VALIDATE_ROOT(scr, root))
94 return EINA_TRUE;
95 else
96 return EINA_FALSE;
97
98#else
99 return EINA_FALSE;
100#endif
101}
102
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.h b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.h
new file mode 100644
index 0000000..eca3c0c
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr.h
@@ -0,0 +1,7 @@
1#ifndef ECORE_X_INLINE_X
2#define ECORE_X_INLINE_X
3Eina_Bool _ecore_x_randr_root_validate(Ecore_X_Window root);
4Eina_Bool _ecore_x_randr_output_validate(Ecore_X_Window root,
5 Ecore_X_Randr_Output
6 output);
7#endif
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_11.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_11.c
new file mode 100644
index 0000000..a6bafb6
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_11.c
@@ -0,0 +1,332 @@
1/*
2 * vim:ts=8:sw=3:sts=8:expandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif /* ifdef HAVE_CONFIG_H */
8
9#include "ecore_x_private.h"
10#include "ecore_x_randr.h"
11
12#define Ecore_X_Randr_None 0
13#ifdef ECORE_XRANDR
14
15#define RANDR_1_1 ((1 << 16) | 1)
16
17#define RANDR_VALIDATE_ROOT(screen, \
18 root) ((screen = \
19 XRRRootToScreen(_ecore_x_disp, \
20 root)) != -1)
21#define RANDR_CHECK_1_1_RET(ret) if(_randr_version < RANDR_1_1) return ret
22
23extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
24 dpy,
25 Window
26 window);
27extern int _randr_version;
28#endif /* ifdef ECORE_XRANDR */
29
30/*
31 * @param root window which's primary output will be queried
32 */
33EAPI Ecore_X_Randr_Orientation
34ecore_x_randr_screen_primary_output_orientations_get(Ecore_X_Window root)
35{
36#ifdef ECORE_XRANDR
37 Rotation rot = Ecore_X_Randr_None, crot;
38
39 LOGFN(__FILE__, __LINE__, __FUNCTION__);
40 rot =
41 XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
42 root), &crot);
43 return rot;
44#else /* ifdef ECORE_XRANDR */
45 return Ecore_X_Randr_None;
46#endif /* ifdef ECORE_XRANDR */
47} /* ecore_x_randr_screen_primary_output_orientations_get */
48
49/*
50 * @param root window which's primary output will be queried
51 * @return the current orientation of the root window's screen primary output
52 */
53EAPI Ecore_X_Randr_Orientation
54ecore_x_randr_screen_primary_output_orientation_get(Ecore_X_Window root)
55{
56#ifdef ECORE_XRANDR
57 Rotation crot = Ecore_X_Randr_None;
58 XRRRotations(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
59 root), &crot);
60 return crot;
61#else /* ifdef ECORE_XRANDR */
62 return Ecore_X_Randr_None;
63#endif /* ifdef ECORE_XRANDR */
64} /* ecore_x_randr_screen_primary_output_orientation_get */
65
66/*
67 * @brief sets a given screen's primary output's orientation
68 * @param root window which's screen's primary output will be queried
69 * @param orientation orientation which should be set for the root window's screen primary output
70 * @return EINA_TRUE if the primary output's orientation could be successfully altered
71 */
72EAPI Eina_Bool
73ecore_x_randr_screen_primary_output_orientation_set(
74 Ecore_X_Window root,
75 Ecore_X_Randr_Orientation
76 orientation)
77{
78#ifdef ECORE_XRANDR
79 XRRScreenConfiguration *xrr_screen_cfg = NULL;
80 int sizeid;
81 Rotation crot;
82 Eina_Bool ret = EINA_FALSE;
83 if (!(xrr_screen_cfg = XRRGetScreenInfo(_ecore_x_disp, root)))
84 return EINA_FALSE;
85
86 sizeid = XRRConfigCurrentConfiguration(xrr_screen_cfg, &crot);
87 if (!XRRSetScreenConfig(_ecore_x_disp, xrr_screen_cfg, root, sizeid,
88 orientation, CurrentTime))
89 ret = EINA_TRUE;
90
91 if (xrr_screen_cfg)
92 XRRFreeScreenConfigInfo(xrr_screen_cfg);
93
94 return ret;
95#else /* ifdef ECORE_XRANDR */
96 return EINA_FALSE;
97#endif /* ifdef ECORE_XRANDR */
98} /* ecore_x_randr_screen_primary_output_orientation_set */
99
100/*
101 * @brief gets a screen's primary output's possible sizes
102 * @param root window which's primary output will be queried
103 * @param num number of sizes reported as supported by the screen's primary output
104 * @return an array of sizes reported as supported by the screen's primary output or - if query failed - NULL
105 */
106EAPI Ecore_X_Randr_Screen_Size_MM *
107ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root,
108 int *num)
109{
110#ifdef ECORE_XRANDR
111 Ecore_X_Randr_Screen_Size_MM *ret = NULL;
112 XRRScreenSize *sizes;
113 int i, n;
114
115 /* we don't have to free sizes, because they're hold in a cache inside X*/
116 sizes =
117 XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
118 root), &n);
119 if ((!sizes) || (n <= 0)) return NULL;
120 ret = calloc(n, sizeof(Ecore_X_Randr_Screen_Size_MM));
121 if (!ret)
122 return NULL;
123
124 if (num)
125 *num = n;
126
127 for (i = 0; i < n; i++)
128 {
129 ret[i].width = sizes[i].width;
130 ret[i].height = sizes[i].height;
131 ret[i].width_mm = sizes[i].mwidth;
132 ret[i].height_mm = sizes[i].mheight;
133 }
134 return ret;
135#else /* ifdef ECORE_XRANDR */
136 return NULL;
137#endif /* ifdef ECORE_XRANDR */
138} /* ecore_x_randr_screen_primary_output_sizes_get */
139
140/*
141 * @brief get the current set size of a given screen's primary output
142 * @param root window which's primary output will be queried
143 * @param w the current size's width
144 * @param h the current size's height
145 * @param w_mm the current size's width in mm
146 * @param h_mm the current size's height in mm
147 * @param size_index of current set size to be used with ecore_x_randr_primary_output_size_set()
148 */
149EAPI void
150ecore_x_randr_screen_primary_output_current_size_get(Ecore_X_Window root,
151 int *w,
152 int *h,
153 int *w_mm,
154 int *h_mm,
155 int *size_index)
156{
157#ifdef ECORE_XRANDR
158 XRRScreenSize *sizes;
159 XRRScreenConfiguration *sc = NULL;
160 int idx;
161 Rotation orientation;
162 int n;
163
164 if (!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
165 {
166 ERR("Couldn't get screen information for %d", root);
167 return;
168 }
169
170 idx = XRRConfigCurrentConfiguration(sc, &orientation);
171
172 sizes =
173 XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
174 root), &n);
175 if ((idx < n) && (idx >= 0))
176 {
177 if (w)
178 *w = sizes[idx].width;
179
180 if (h)
181 *h = sizes[idx].height;
182
183 if (w_mm)
184 *w_mm = sizes[idx].mwidth;
185
186 if (h_mm)
187 *h_mm = sizes[idx].mheight;
188
189 if (size_index)
190 *size_index = idx;
191 }
192
193 XRRFreeScreenConfigInfo(sc);
194#endif /* ifdef ECORE_XRANDR */
195} /* ecore_x_randr_screen_primary_output_current_size_get */
196
197/*
198 * @brief sets a given screen's primary output size, but disables all other outputs at the same time
199 * @param root window which's primary output will be queried
200 * @param size_index within the list of sizes reported as supported by the root window's screen primary output
201 * @return EINA_TRUE on success, EINA_FALSE on failure due to e.g. invalid times
202 */
203EAPI Eina_Bool
204ecore_x_randr_screen_primary_output_size_set(Ecore_X_Window root,
205 int size_index)
206{
207#ifdef ECORE_XRANDR
208 XRRScreenConfiguration *sc = NULL;
209 XRRScreenSize *sizes;
210 Eina_Bool ret = EINA_FALSE;
211 int nsizes = 0;
212
213 if (size_index >= 0 && _ecore_x_randr_root_validate(root))
214 {
215 sizes =
216 XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
217 root), &nsizes);
218
219 if (size_index < nsizes)
220 {
221 sc = XRRGetScreenInfo(_ecore_x_disp, root);
222 if (!XRRSetScreenConfig(_ecore_x_disp, sc,
223 root, size_index,
224 ECORE_X_RANDR_ORIENTATION_ROT_0, CurrentTime))
225 {
226 ret = EINA_TRUE;
227 }
228
229 if (sc)
230 XRRFreeScreenConfigInfo(sc);
231 }
232 }
233
234 return ret;
235#else /* ifdef ECORE_XRANDR */
236 return EINA_FALSE;
237#endif /* ifdef ECORE_XRANDR */
238} /* ecore_x_randr_screen_primary_output_size_set */
239
240/*
241 * @param root window which's primary output will be queried
242 * @return currently used refresh rate or - if request failed or RandRR is not available - 0.0
243 */
244EAPI Ecore_X_Randr_Refresh_Rate
245ecore_x_randr_screen_primary_output_current_refresh_rate_get(
246 Ecore_X_Window root)
247{
248#ifdef ECORE_XRANDR
249 Ecore_X_Randr_Refresh_Rate ret = 0.0;
250 XRRScreenConfiguration *sc = NULL;
251
252 if (!_ecore_x_randr_root_validate(root) ||
253 !(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
254 return ret;
255
256 ret = XRRConfigCurrentRate(sc);
257 if (sc)
258 XRRFreeScreenConfigInfo(sc);
259
260 return ret;
261#else /* ifdef ECORE_XRANDR */
262 return 0.0;
263#endif /* ifdef ECORE_XRANDR */
264} /* ecore_x_randr_screen_primary_output_current_refresh_rate_get */
265
266/*
267 * @param root window which's primary output will be queried
268 * @param size_index referencing the size to query valid refresh rates for
269 * @return currently used refresh rate or - if request failed or RandRR is not available - NULL
270 */
271EAPI Ecore_X_Randr_Refresh_Rate *
272ecore_x_randr_screen_primary_output_refresh_rates_get(Ecore_X_Window root,
273 int size_index,
274 int *num)
275{
276#ifdef ECORE_XRANDR
277 Ecore_X_Randr_Refresh_Rate *ret = NULL, *rates = NULL;
278 Ecore_X_Randr_Screen scr;
279 int n;
280
281 if (num
282 && RANDR_VALIDATE_ROOT(scr, root)
283 && (rates = XRRRates(_ecore_x_disp, scr, size_index, &n)))
284 {
285 if (rates && (ret = malloc(sizeof(Ecore_X_Randr_Refresh_Rate) * n)))
286 {
287 memcpy(ret, rates, (sizeof(Ecore_X_Randr_Refresh_Rate) * n));
288 *num = n;
289 }
290 }
291
292 return ret;
293#else /* ifdef ECORE_XRANDR */
294 return NULL;
295#endif /* ifdef ECORE_XRANDR */
296} /* ecore_x_randr_screen_primary_output_refresh_rates_get */
297
298//>= 1.1
299/*
300 * @brief sets the current primary output's refresh rate
301 * @param root window which's primary output will be queried
302 * @param size_index referencing the size to be set
303 * @param rate the refresh rate to be set
304 * @return EINA_TRUE on success else EINA_FALSE
305 */
306EAPI Eina_Bool
307ecore_x_randr_screen_primary_output_refresh_rate_set(
308 Ecore_X_Window root,
309 int size_index,
310 Ecore_X_Randr_Refresh_Rate
311 rate)
312{
313#ifdef ECORE_XRANDR
314 RANDR_CHECK_1_1_RET(EINA_FALSE);
315 Eina_Bool ret = EINA_FALSE;
316 XRRScreenConfiguration *sc = NULL;
317
318 if (!(sc = XRRGetScreenInfo(_ecore_x_disp, root)))
319 return ret;
320
321 if (!XRRSetScreenConfigAndRate(_ecore_x_disp, sc,
322 root, size_index,
323 RR_Rotate_0, rate, CurrentTime))
324 ret = EINA_TRUE;
325
326 XRRFreeScreenConfigInfo(sc);
327 return ret;
328#else /* ifdef ECORE_XRANDR */
329 return EINA_FALSE;
330#endif /* ifdef ECORE_XRANDR */
331} /* ecore_x_randr_screen_primary_output_refresh_rate_set */
332
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c
new file mode 100644
index 0000000..fb607d1
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12.c
@@ -0,0 +1,2199 @@
1/*
2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8
9#include "ecore_x_private.h"
10#include "ecore_x_randr.h"
11
12#define Ecore_X_Randr_None (Ecore_X_Randr_Crtc)0
13#define Ecore_X_Randr_Unset (Ecore_X_Randr_Crtc) - 1
14
15#ifdef ECORE_XRANDR
16
17#define RANDR_1_2 ((1 << 16) | 2)
18
19#define RANDR_VALIDATE_ROOT(screen, root) \
20 ((screen = XRRRootToScreen(_ecore_x_disp, root)) != -1)
21
22#define RANDR_CHECK_1_2_RET(ret) if(_randr_version < RANDR_1_2) return ret
23
24#define RANDR_PROPERTY_EDID "EDID"
25#define RANDR_PROPERTY_BACKLIGHT "Backlight"
26#define RANDR_PROPERTY_SIGNAL_FORMAT "SignalFormat"
27#define RANDR_PROPERTY_SIGNAL_PROPERTIES "SignalProperties"
28#define RANDR_PROPERTY_CONNECTOR_TYPE "ConnectorType"
29#define RANDR_PROPERTY_CONNECTOR_NUMBER "ConnectorNumber"
30#define RANDR_PROPERTY_COMPATIBILITY_LIST "CompatibilityList"
31#define RANDR_PROPERTY_CLONE_LIST "CloneList"
32
33extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
34 dpy,
35 Window
36 window);
37extern int _randr_version;
38#endif
39
40/**
41 * @brief enable event selection. This enables basic interaction with
42 * output/crtc events and requires RRandR >= 1.2.
43 * @param win select this window's properties for RandRR events
44 * @param on enable/disable selecting
45 */
46EAPI void
47ecore_x_randr_events_select(Ecore_X_Window win,
48 Eina_Bool on)
49{
50#ifdef ECORE_XRANDR
51 int mask;
52
53 LOGFN(__FILE__, __LINE__, __FUNCTION__);
54 if (!on)
55 mask = 0;
56 else
57 {
58 mask = RRScreenChangeNotifyMask;
59 if (_randr_version >= RANDR_1_2)
60 mask |= (RRCrtcChangeNotifyMask |
61 RROutputChangeNotifyMask |
62 RROutputPropertyNotifyMask);
63 }
64
65 XRRSelectInput(_ecore_x_disp, win, mask);
66#endif
67}
68
69/**
70 * @brief validates a CRTC for a given root window's screen.
71 * @param root the window which's default display will be queried
72 * @param crtc the CRTC to be validated.
73 * @return in case it is found EINA_TRUE will be returned. Else EINA_FALSE is returned.
74 */
75static inline Eina_Bool
76_ecore_x_randr_crtc_validate(Ecore_X_Window root,
77 Ecore_X_Randr_Crtc crtc)
78{
79#ifdef ECORE_XRANDR
80 RANDR_CHECK_1_2_RET(EINA_FALSE);
81
82 XRRScreenResources *res = NULL;
83 int i;
84 Eina_Bool ret = EINA_FALSE;
85
86 if ((crtc == Ecore_X_Randr_None) ||
87 (crtc == Ecore_X_Randr_Unset))
88 return ret;
89
90 if (_ecore_x_randr_root_validate(root) && crtc &&
91 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
92 {
93 for (i = 0; i < res->ncrtc; i++)
94 {
95 if (res->crtcs[i] == crtc)
96 {
97 ret = EINA_TRUE;
98 break;
99 }
100 }
101 XRRFreeScreenResources(res);
102 }
103
104 return ret;
105#else
106 return EINA_FALSE;
107#endif
108}
109
110Eina_Bool
111_ecore_x_randr_output_validate(Ecore_X_Window root,
112 Ecore_X_Randr_Output output)
113{
114#ifdef ECORE_XRANDR
115 RANDR_CHECK_1_2_RET(EINA_FALSE);
116
117 Eina_Bool ret = EINA_FALSE;
118 XRRScreenResources *res = NULL;
119 int i;
120
121 if (_ecore_x_randr_root_validate(root) && output &&
122 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
123 {
124 for (i = 0; i < res->noutput; i++)
125 {
126 if (res->outputs[i] == output)
127 {
128 ret = EINA_TRUE;
129 break;
130 }
131 }
132 XRRFreeScreenResources(res);
133 }
134
135 return ret;
136#else
137 return EINA_FALSE;
138#endif
139}
140
141static inline Eina_Bool
142_ecore_x_randr_mode_validate(Ecore_X_Window root,
143 Ecore_X_Randr_Mode mode)
144{
145#ifdef ECORE_XRANDR
146 RANDR_CHECK_1_2_RET(EINA_FALSE);
147
148 Eina_Bool ret = EINA_FALSE;
149 XRRScreenResources *res = NULL;
150 int i;
151
152 if (_ecore_x_randr_root_validate(root) && mode &&
153 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
154 {
155 for (i = 0; i < res->nmode; i++)
156 {
157 if (res->modes[i].id == mode)
158 {
159 ret = EINA_TRUE;
160 break;
161 }
162 }
163 XRRFreeScreenResources(res);
164 }
165
166 return ret;
167#else
168 return EINA_FALSE;
169#endif
170}
171
172/*
173 * @param w width of screen in px
174 * @param h height of screen in px
175 */
176EAPI void
177ecore_x_randr_screen_current_size_get(Ecore_X_Window root,
178 int *w,
179 int *h,
180 int *w_mm,
181 int *h_mm)
182{
183#ifdef ECORE_XRANDR
184 RANDR_CHECK_1_2_RET();
185 Ecore_X_Randr_Screen scr;
186
187 if (!RANDR_VALIDATE_ROOT(scr, root))
188 return;
189
190 if (w)
191 *w = DisplayWidth(_ecore_x_disp, scr);
192
193 if (h)
194 *h = DisplayHeight(_ecore_x_disp, scr);
195
196 if (w_mm)
197 *w_mm = DisplayWidthMM(_ecore_x_disp, scr);
198
199 if (h_mm)
200 *h_mm = DisplayHeightMM(_ecore_x_disp, scr);
201
202#endif
203}
204
205/*
206 * @param root window which's screen will be queried
207 * @param wmin minimum width the screen can be set to
208 * @param hmin minimum height the screen can be set to
209 * @param wmax maximum width the screen can be set to
210 * @param hmax maximum height the screen can be set to
211 */
212EAPI void
213ecore_x_randr_screen_size_range_get(Ecore_X_Window root,
214 int *wmin,
215 int *hmin,
216 int *wmax,
217 int *hmax)
218{
219#ifdef ECORE_XRANDR
220 RANDR_CHECK_1_2_RET();
221 int twmin, thmin, twmax, thmax;
222 if (XRRGetScreenSizeRange (_ecore_x_disp, root, &twmin, &thmin, &twmax,
223 &thmax))
224 {
225 if (wmin)
226 *wmin = twmin;
227
228 if (hmin)
229 *hmin = thmin;
230
231 if (wmax)
232 *wmax = twmax;
233
234 if (hmax)
235 *hmax = thmax;
236 }
237
238#endif
239}
240
241/*
242 * @param root window which's screen's size should be set. If invalid (e.g. NULL) no action is taken.
243 * @param w width in px the screen should be set to. If out of valid boundaries, current value is assumed.
244 * @param h height in px the screen should be set to. If out of valid boundaries, current value is assumed.
245 * @param w_mm width in mm the screen should be set to. If 0, current aspect is assumed.
246 * @param h_mm height in mm the screen should be set to. If 0, current aspect is assumed.
247 * @return EINA_TRUE if request was successfully sent or screen is already in
248 * requested size, EINA_FALSE if parameters are invalid
249 */
250EAPI Eina_Bool
251ecore_x_randr_screen_current_size_set(Ecore_X_Window root,
252 int w,
253 int h,
254 int w_mm,
255 int h_mm)
256{
257#ifdef ECORE_XRANDR
258 RANDR_CHECK_1_2_RET(EINA_FALSE);
259
260 Ecore_X_Randr_Screen scr;
261 int w_c, h_c, w_mm_c, h_mm_c, twmin, thmin, twmax, thmax;
262
263 if (!RANDR_VALIDATE_ROOT(scr, root))
264 return EINA_FALSE;
265
266 ecore_x_randr_screen_current_size_get(root, &w_c, &h_c, &w_mm_c, &h_mm_c);
267 if ((w == w_c) && (h == h_c) && (w_mm_c == w_mm) && (h_mm_c == h_mm))
268 return EINA_TRUE;
269
270 ecore_x_randr_screen_size_range_get(root, &twmin, &thmin, &twmax, &thmax);
271
272 if (((w != Ecore_X_Randr_None) &&
273 ((w < twmin) ||
274 (w > twmax))) ||
275 ((h != Ecore_X_Randr_None) && ((h < thmin) || (h > thmax))))
276 return EINA_FALSE;
277
278 if (w <= 0)
279 w = DisplayWidth(_ecore_x_disp, scr);
280
281 if (h <= 0)
282 h = DisplayHeight(_ecore_x_disp, scr);
283
284 if(w_mm <= 0)
285 w_mm =
286 (int)(((double)(DisplayWidthMM(_ecore_x_disp,
287 scr) /
288 (double)DisplayWidth(_ecore_x_disp,
289 scr))) * (double)w);
290
291 if(h_mm <= 0)
292 h_mm =
293 (int)(((double)(DisplayHeightMM(_ecore_x_disp,
294 scr) /
295 (double)DisplayHeight(_ecore_x_disp,
296 scr))) * (double)h);
297
298 XRRSetScreenSize (_ecore_x_disp, root, w, h, w_mm, h_mm);
299 return EINA_TRUE;
300#else
301 return EINA_FALSE;
302#endif
303}
304
305/*
306 * @brief get detailed information for all modes related to a root window's screen
307 * @param root window which's screen's ressources are queried
308 * @param num number of modes returned
309 * @return modes' information
310 */
311EAPI Ecore_X_Randr_Mode_Info **
312ecore_x_randr_modes_info_get(Ecore_X_Window root,
313 int *num)
314{
315#ifdef ECORE_XRANDR
316 RANDR_CHECK_1_2_RET(NULL);
317 XRRScreenResources *res = NULL;
318 Ecore_X_Randr_Mode_Info **ret = NULL;
319 int i;
320
321 if (_ecore_x_randr_root_validate(root) &&
322 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
323 {
324 if ((ret =
325 (Ecore_X_Randr_Mode_Info **)malloc(sizeof(
326 Ecore_X_Randr_Mode_Info *)
327 *
328 res->nmode)))
329 {
330 for (i = 0; i < res->nmode; i++)
331 {
332 if ((ret[i] = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
333 {
334 ret[i]->xid = res->modes[i].id;
335 ret[i]->width = res->modes[i].width;
336 ret[i]->height = res->modes[i].height;
337 ret[i]->dotClock = res->modes[i].dotClock;
338 ret[i]->hSyncStart = res->modes[i].hSyncStart;
339 ret[i]->hSyncEnd = res->modes[i].hSyncEnd;
340 ret[i]->hTotal = res->modes[i].hTotal;
341 ret[i]->hSkew = res->modes[i].hSkew;
342 ret[i]->vSyncStart = res->modes[i].vSyncStart;
343 ret[i]->vSyncEnd = res->modes[i].vSyncEnd;
344 ret[i]->vTotal = res->modes[i].vTotal;
345 if ((ret[i]->name = (malloc(res->modes[i].nameLength))))
346 strncpy(ret[i]->name, res->modes[i].name,
347 res->modes[i].nameLength);
348 else
349 ret[i]->name = NULL;
350
351 ret[i]->nameLength = res->modes[i].nameLength;
352 ret[i]->modeFlags = res->modes[i].modeFlags;
353 }
354 else
355 {
356 while(i > 0)
357 free(ret[--i]);
358 free(ret);
359 ret = NULL;
360 break;
361 }
362 }
363 }
364
365 if (ret && num)
366 *num = res->nmode;
367
368 XRRFreeScreenResources(res);
369 }
370
371 return ret;
372#else
373 return NULL;
374#endif
375}
376
377/*
378 * @brief get detailed information for a given mode id
379 * @param root window which's screen's ressources are queried
380 * @param mode the XID which identifies the mode of interest
381 * @return mode's detailed information
382 */
383EAPI Ecore_X_Randr_Mode_Info *
384ecore_x_randr_mode_info_get(Ecore_X_Window root,
385 Ecore_X_Randr_Mode mode)
386{
387#ifdef ECORE_XRANDR
388 RANDR_CHECK_1_2_RET(NULL);
389 XRRScreenResources *res = NULL;
390 Ecore_X_Randr_Mode_Info *ret = NULL;
391 int i;
392
393 if (_ecore_x_randr_root_validate(root) &&
394 (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
395 {
396 for (i = 0; i < res->nmode; i++)
397 {
398 if ((res->modes[i].id == mode) &&
399 (ret = malloc(sizeof(Ecore_X_Randr_Mode_Info))))
400 {
401 ret->xid = res->modes[i].id;
402 ret->width = res->modes[i].width;
403 ret->height = res->modes[i].height;
404 ret->dotClock = res->modes[i].dotClock;
405 ret->hSyncStart = res->modes[i].hSyncStart;
406 ret->hSyncEnd = res->modes[i].hSyncEnd;
407 ret->hTotal = res->modes[i].hTotal;
408 ret->hSkew = res->modes[i].hSkew;
409 ret->vSyncStart = res->modes[i].vSyncStart;
410 ret->vSyncEnd = res->modes[i].vSyncEnd;
411 ret->vTotal = res->modes[i].vTotal;
412 ret->name = NULL;
413 ret->nameLength = 0;
414 if (res->modes[i].nameLength > 0)
415 {
416 ret->nameLength = res->modes[i].nameLength;
417 ret->name = malloc(res->modes[i].nameLength + 1);
418 if (ret->name)
419 memcpy(ret->name, res->modes[i].name,
420 res->modes[i].nameLength + 1);
421 }
422 ret->modeFlags = res->modes[i].modeFlags;
423 break;
424 }
425 }
426 XRRFreeScreenResources(res);
427 }
428
429 return ret;
430#else
431 return NULL;
432#endif
433}
434
435/*
436 * @brief free detailed mode information. The pointer handed in will be set to
437 * NULL after freeing the memory.
438 * @param mode_info the mode information that should be freed
439 */
440EAPI void
441ecore_x_randr_mode_info_free(Ecore_X_Randr_Mode_Info *mode_info)
442{
443#ifdef ECORE_XRANDR
444 RANDR_CHECK_1_2_RET();
445 if (!mode_info)
446 return;
447
448 if (mode_info->name)
449 free(mode_info->name);
450
451 free(mode_info);
452 mode_info = NULL;
453#endif
454}
455
456/*
457 * @brief get all known CRTCs related to a root window's screen
458 * @param root window which's screen's ressources are queried
459 * @param num number of CRTCs returned
460 * @return CRTC IDs
461 */
462EAPI Ecore_X_Randr_Crtc *
463ecore_x_randr_crtcs_get(Ecore_X_Window root,
464 int *num)
465{
466#ifdef ECORE_XRANDR
467 RANDR_CHECK_1_2_RET(NULL);
468 XRRScreenResources *res = NULL;
469 Ecore_X_Randr_Crtc *ret = NULL;
470
471 if (num && root &&
472 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
473 {
474 if ((ret = malloc(sizeof(Ecore_X_Randr_Crtc) * res->ncrtc)))
475 {
476 memcpy(ret, res->crtcs, (sizeof(Ecore_X_Randr_Crtc) * res->ncrtc));
477 *num = res->ncrtc;
478 }
479
480 XRRFreeScreenResources(res);
481 }
482
483 return ret;
484#else
485 return NULL;
486#endif
487}
488
489EAPI Ecore_X_Randr_Output *
490ecore_x_randr_outputs_get(Ecore_X_Window root,
491 int *num)
492{
493#ifdef ECORE_XRANDR
494 RANDR_CHECK_1_2_RET(NULL);
495 XRRScreenResources *res = NULL;
496 Ecore_X_Randr_Output *ret = NULL;
497
498 if (num && root &&
499 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
500 {
501 if ((ret = malloc(sizeof(Ecore_X_Randr_Output) * res->noutput)))
502 {
503 memcpy(ret, res->outputs,
504 (sizeof(Ecore_X_Randr_Output) * res->noutput));
505 if (num)
506 *num = res->noutput;
507 }
508
509 if (res)
510 XRRFreeScreenResources(res);
511 }
512
513 return ret;
514#else
515 return NULL;
516#endif
517}
518
519//Per Crtc
520/*
521 * @brief get a CRTC's outputs.
522 * @param root the root window which's screen will be queried
523 * @param num number of outputs referenced by given CRTC
524 */
525EAPI Ecore_X_Randr_Output *
526ecore_x_randr_crtc_outputs_get(Ecore_X_Window root,
527 Ecore_X_Randr_Crtc crtc,
528 int *num)
529{
530#ifdef ECORE_XRANDR
531 RANDR_CHECK_1_2_RET(NULL);
532 XRRScreenResources *res = NULL;
533 Ecore_X_Randr_Output *ret = NULL;
534 XRRCrtcInfo *crtc_info = NULL;
535
536 if (_ecore_x_randr_crtc_validate(root,
537 crtc) &&
538 (res =
539 _ecore_x_randr_get_screen_resources (_ecore_x_disp,
540 root)) &&
541 (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
542 {
543 if ((ret = malloc(sizeof(Ecore_X_Randr_Output) * crtc_info->noutput)))
544 {
545 memcpy(ret, crtc_info->outputs,
546 (sizeof(Ecore_X_Randr_Output) * crtc_info->noutput));
547 if (num)
548 *num = crtc_info->noutput;
549 }
550
551 if (crtc_info)
552 XRRFreeCrtcInfo(crtc_info);
553
554 if (res)
555 XRRFreeScreenResources(res);
556 }
557
558 return ret;
559#else
560 return NULL;
561#endif
562}
563
564/*
565 * @brief get a CRTC's possible outputs.
566 * @param root the root window which's screen will be queried
567 * @param num number of possible outputs referenced by given CRTC
568 */
569EAPI Ecore_X_Randr_Output *
570ecore_x_randr_crtc_possible_outputs_get(Ecore_X_Window root,
571 Ecore_X_Randr_Crtc crtc,
572 int *num)
573{
574#ifdef ECORE_XRANDR
575 RANDR_CHECK_1_2_RET(NULL);
576 XRRScreenResources *res = NULL;
577 Ecore_X_Randr_Output *ret = NULL;
578 XRRCrtcInfo *crtc_info = NULL;
579
580 if (_ecore_x_randr_crtc_validate(root,
581 crtc) &&
582 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
583 {
584 if((crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
585 {
586 if ((ret =
587 malloc(sizeof(Ecore_X_Randr_Output) * crtc_info->npossible)))
588 {
589 memcpy(ret, crtc_info->possible,
590 (sizeof(Ecore_X_Randr_Output) * crtc_info->npossible));
591 if (num)
592 *num = res->ncrtc;
593 }
594
595 XRRFreeCrtcInfo(crtc_info);
596 }
597
598 XRRFreeScreenResources(res);
599 }
600
601 return ret;
602#else
603 return NULL;
604#endif
605}
606
607EAPI void
608ecore_x_randr_crtc_geometry_get(Ecore_X_Window root,
609 Ecore_X_Randr_Crtc crtc,
610 int *x,
611 int *y,
612 int *w,
613 int *h)
614{
615#ifdef ECORE_XRANDR
616 RANDR_CHECK_1_2_RET();
617 XRRScreenResources *res = NULL;
618 XRRCrtcInfo *crtc_info = NULL;
619
620 if (_ecore_x_randr_crtc_validate(root,
621 crtc) &&
622 (res =
623 _ecore_x_randr_get_screen_resources (_ecore_x_disp,
624 root)) &&
625 (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
626 {
627 if (x)
628 *x = crtc_info->x;
629
630 if (y)
631 *y = crtc_info->y;
632
633 if (w)
634 *w = crtc_info->width;
635
636 if (h)
637 *h = crtc_info->height;
638
639 XRRFreeCrtcInfo(crtc_info);
640 XRRFreeScreenResources(res);
641 }
642
643#endif
644}
645
646/*
647 * @brief sets the position of given CRTC within root window's screen
648 * @param root the window's screen to be queried
649 * @param crtc the CRTC which's position within the mentioned screen is to be altered
650 * @param x position on the x-axis (0 == left) of the screen. if x < 0 current value will be kept.
651 * @param y position on the y-ayis (0 == top) of the screen. if y < 0, current value will be kept.
652 * @return EINA_TRUE if position could be successfully be altered.
653 */
654EAPI Eina_Bool
655ecore_x_randr_crtc_pos_set(Ecore_X_Window root,
656 Ecore_X_Randr_Crtc crtc,
657 int x,
658 int y)
659{
660#ifdef ECORE_XRANDR
661 RANDR_CHECK_1_2_RET(EINA_FALSE);
662 int w_c, h_c, w_new = 0, h_new = 0;
663 Eina_Rectangle crtc_geo;
664
665 ecore_x_randr_crtc_geometry_get(root,
666 crtc,
667 &crtc_geo.x,
668 &crtc_geo.y,
669 &crtc_geo.w,
670 &crtc_geo.h);
671 ecore_x_randr_screen_current_size_get(root, &w_c, &h_c, NULL, NULL);
672 if (x < 0)
673 x = crtc_geo.x;
674
675 if (y < 0)
676 y = crtc_geo.y;
677
678 if ((x + crtc_geo.w) > w_c)
679 w_new = x + crtc_geo.w;
680
681 if ((y + crtc_geo.h) > h_c)
682 h_new = y + crtc_geo.h;
683
684 if ((w_new != 0) || (h_new != 0))
685 if (!ecore_x_randr_screen_current_size_set(root, w_new, h_new, 0, 0))
686 return EINA_FALSE;
687
688 return ecore_x_randr_crtc_settings_set(root,
689 crtc,
690 NULL,
691 Ecore_X_Randr_Unset,
692 x,
693 y,
694 Ecore_X_Randr_Unset,
695 Ecore_X_Randr_Unset);
696#else
697 return EINA_FALSE;
698#endif
699}
700
701/**
702 * @brief Get the current set mode of a given CRTC
703 * @param root the window's screen to be queried
704 * @param crtc the CRTC which's should be queried
705 * @return currently set mode or - in case parameters are invalid -
706 * Ecore_X_Randr_Unset
707 */
708EAPI Ecore_X_Randr_Mode
709ecore_x_randr_crtc_mode_get(Ecore_X_Window root,
710 Ecore_X_Randr_Crtc crtc)
711{
712#ifdef ECORE_XRANDR
713 RANDR_CHECK_1_2_RET(Ecore_X_Randr_Unset);
714 XRRScreenResources *res = NULL;
715 XRRCrtcInfo *crtc_info = NULL;
716 Ecore_X_Randr_Mode ret = Ecore_X_Randr_Unset;
717 if (_ecore_x_randr_root_validate(root) &&
718 _ecore_x_randr_crtc_validate(root,
719 crtc) &&
720 (res =
721 _ecore_x_randr_get_screen_resources(_ecore_x_disp,
722 root)) &&
723 (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
724 {
725 ret = crtc_info->mode;
726 XRRFreeCrtcInfo(crtc_info);
727 XRRFreeScreenResources(res);
728 }
729
730 return ret;
731#else
732 return Ecore_X_Randr_Unset;
733#endif
734}
735
736/**
737 * @brief sets a mode for a CRTC and the outputs attached to it
738 * @param root the window's screen to be queried
739 * @param crtc the CRTC which shall be set
740 * @param outputs array of outputs which have to be compatible with the mode. If
741 * NULL CRTC will be disabled.
742 * @param noutputs number of outputs in array to be used. Use
743 * Ecore_X_Randr_Unset (or -1) to use currently used outputs.
744 * @param mode XID of the mode to be set. If set to 0 the CRTC will be disabled.
745 * If set to -1 the call will fail.
746 * @return EINA_TRUE if mode setting was successful. Else EINA_FALSE
747 */
748EAPI Eina_Bool
749ecore_x_randr_crtc_mode_set(Ecore_X_Window root,
750 Ecore_X_Randr_Crtc crtc,
751 Ecore_X_Randr_Output *outputs,
752 int noutputs,
753 Ecore_X_Randr_Mode mode)
754{
755#ifdef ECORE_XRANDR
756 RANDR_CHECK_1_2_RET(EINA_FALSE);
757
758 if (mode == Ecore_X_Randr_Unset)
759 return EINA_FALSE;
760
761 return ecore_x_randr_crtc_settings_set(root,
762 crtc,
763 outputs,
764 noutputs,
765 Ecore_X_Randr_Unset,
766 Ecore_X_Randr_Unset,
767 mode,
768 Ecore_X_Randr_Unset);
769#else
770 return EINA_FALSE;
771#endif
772}
773
774EAPI void
775ecore_x_randr_crtc_size_get(Ecore_X_Window root,
776 Ecore_X_Randr_Crtc crtc,
777 int *w,
778 int *h)
779{
780#ifdef ECORE_XRANDR
781 RANDR_CHECK_1_2_RET();
782 ecore_x_randr_crtc_geometry_get(root, crtc, NULL, NULL, w, h);
783#endif
784}
785
786EAPI Ecore_X_Randr_Refresh_Rate
787ecore_x_randr_crtc_refresh_rate_get(Ecore_X_Window root,
788 Ecore_X_Randr_Crtc crtc,
789 Ecore_X_Randr_Mode mode)
790{
791#ifdef ECORE_XRANDR
792 RANDR_CHECK_1_2_RET(0.0);
793 XRRScreenResources *res = NULL;
794 XRRCrtcInfo *crtc_info = NULL;
795 Ecore_X_Randr_Refresh_Rate ret = 0.0;
796 int i;
797
798 if (_ecore_x_randr_crtc_validate(root,
799 crtc) &&
800 (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
801 {
802 for (i = 0; i < res->nmode; i++)
803 if (res->modes[i].id == mode)
804 {
805 if (res->modes[i].hTotal && res->modes[i].vTotal)
806 ret = ((double)res->modes[i].dotClock /
807 ((double)res->modes[i].hTotal *
808 (double)res->modes[i].vTotal));
809
810 break;
811 }
812 }
813
814 if (crtc_info)
815 XRRFreeCrtcInfo(crtc_info);
816
817 if (res)
818 XRRFreeScreenResources(res);
819
820 return ret;
821#else
822 return 0.0;
823#endif
824}
825
826EAPI Ecore_X_Randr_Orientation
827ecore_x_randr_crtc_orientations_get(Ecore_X_Window root,
828 Ecore_X_Randr_Crtc crtc)
829{
830#ifdef ECORE_XRANDR
831 RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
832 XRRCrtcInfo *crtc_info = NULL;
833 XRRScreenResources *res = NULL;
834 Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
835
836 if (_ecore_x_randr_crtc_validate(root,
837 crtc) &&
838 (res =
839 _ecore_x_randr_get_screen_resources (_ecore_x_disp,
840 root)) &&
841 (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
842 {
843 ret = crtc_info->rotations;
844 }
845 if (crtc_info)
846 XRRFreeCrtcInfo(crtc_info);
847
848 if (res)
849 XRRFreeScreenResources(res);
850
851 return ret;
852#else
853 return Ecore_X_Randr_None;
854#endif
855}
856
857EAPI Ecore_X_Randr_Orientation
858ecore_x_randr_crtc_orientation_get(Ecore_X_Window root,
859 Ecore_X_Randr_Crtc crtc)
860{
861#ifdef ECORE_XRANDR
862 RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
863 XRRCrtcInfo *crtc_info = NULL;
864 XRRScreenResources *res = NULL;
865 Ecore_X_Randr_Orientation ret = Ecore_X_Randr_None;
866
867 if (_ecore_x_randr_crtc_validate(root,
868 crtc) &&
869 (res =
870 _ecore_x_randr_get_screen_resources (_ecore_x_disp,
871 root)) &&
872 (crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
873 {
874 ret = crtc_info->rotation;
875 }
876 if (crtc_info)
877 XRRFreeCrtcInfo(crtc_info);
878
879 if (res)
880 XRRFreeScreenResources(res);
881
882 return ret;
883#else
884 return Ecore_X_Randr_None;
885#endif
886}
887
888EAPI Eina_Bool
889ecore_x_randr_crtc_orientation_set(Ecore_X_Window root,
890 Ecore_X_Randr_Crtc crtc,
891 Ecore_X_Randr_Orientation orientation)
892{
893#ifdef ECORE_XRANDR
894 RANDR_CHECK_1_2_RET(EINA_FALSE);
895 Eina_Bool ret = EINA_FALSE;
896
897 if (orientation != Ecore_X_Randr_None)
898 {
899 ret = ecore_x_randr_crtc_settings_set(root,
900 crtc,
901 NULL,
902 Ecore_X_Randr_Unset,
903 Ecore_X_Randr_Unset,
904 Ecore_X_Randr_Unset,
905 Ecore_X_Randr_Unset,
906 orientation);
907 }
908
909 return ret;
910#else
911 return EINA_FALSE;
912#endif
913}
914
915EAPI void
916ecore_x_randr_crtc_pos_get(Ecore_X_Window root,
917 Ecore_X_Randr_Crtc crtc,
918 int *x,
919 int *y)
920{
921#ifdef ECORE_XRANDR
922 RANDR_CHECK_1_2_RET();
923
924 ecore_x_randr_crtc_geometry_get(root, crtc, x, y, NULL, NULL);
925#endif
926}
927
928EAPI Eina_Bool
929ecore_x_randr_crtc_clone_set(Ecore_X_Window root,
930 Ecore_X_Randr_Crtc original,
931 Ecore_X_Randr_Crtc clon)
932{
933#ifdef ECORE_XRANDR
934 RANDR_CHECK_1_2_RET(EINA_FALSE);
935
936 XRRScreenResources *res = NULL;
937 XRRCrtcInfo *clone_crtc_info = NULL;
938 Ecore_X_Randr_Mode original_mode = Ecore_X_Randr_None;
939 Ecore_X_Randr_Orientation original_orientation = Ecore_X_Randr_None;
940 Eina_Bool ret = EINA_FALSE;
941 int x, y;
942
943 if (_ecore_x_randr_root_validate(root) &&
944 _ecore_x_randr_crtc_validate(root,
945 original) &&
946 _ecore_x_randr_crtc_validate(root,
947 clon) &&
948 (res =
949 _ecore_x_randr_get_screen_resources (_ecore_x_disp,
950 root)) &&
951 (clone_crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, clon)))
952 {
953 ecore_x_randr_crtc_geometry_get(root, original, &x, &y, NULL, NULL);
954 original_mode = ecore_x_randr_crtc_mode_get(root, original);
955 original_orientation = ecore_x_randr_crtc_orientation_get(root,
956 original);
957 ret = ecore_x_randr_crtc_settings_set(root,
958 clon,
959 NULL,
960 Ecore_X_Randr_Unset,
961 x,
962 y,
963 original_mode,
964 original_orientation);
965 XRRFreeCrtcInfo(clone_crtc_info);
966 XRRFreeScreenResources(res);
967 }
968
969 return ret;
970#else
971 return EINA_FALSE;
972#endif
973}
974
975/**
976 * @brief sets the demanded parameters for a given CRTC. Note that the CRTC is
977 * auto enabled in it's preferred mode, when it was disabled before.
978 * @param root the root window which's default display will be queried
979 * @param crtc the CRTC which's configuration should be altered
980 * @param outputs an array of outputs, that should display this CRTC's content.
981 * @param noutputs number of outputs in the array of outputs.
982 * If set to Ecore_X_Randr_Unset, current outputs and number of outputs will be used.
983 * If set to Ecore_X_Randr_None, CRTC will be disabled
984 * @param x new x coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current x
985 * corrdinate will be assumed.
986 * @param y new y coordinate. If <0 (e.g. Ecore_X_Randr_Unset) the current y
987 * corrdinate will be assumed.
988 * @param mode the new mode to be set. If Ecore_X_Randr_None is passed, the
989 * CRTC will be disabled. If Ecore_X_Randr_Unset is passed, the current mode is assumed.
990 * @param orientation the new orientation to be set. If Ecore_X_Randr_Unset is used,
991 * the current mode is assumed.
992 * @return EINA_TRUE if the configuration alteration was successful, else
993 * EINA_FALSE
994 */
995EAPI Eina_Bool
996ecore_x_randr_crtc_settings_set(Ecore_X_Window root,
997 Ecore_X_Randr_Crtc crtc,
998 Ecore_X_Randr_Output *outputs,
999 int noutputs,
1000 int x,
1001 int y,
1002 Ecore_X_Randr_Mode mode,
1003 Ecore_X_Randr_Orientation orientation)
1004{
1005#ifdef ECORE_XRANDR
1006 RANDR_CHECK_1_2_RET(EINA_FALSE);
1007 XRRScreenResources *res = NULL;
1008 XRRCrtcInfo *crtc_info = NULL;
1009 Eina_Bool ret = EINA_FALSE;
1010
1011 if (_ecore_x_randr_crtc_validate(root,
1012 crtc) &&
1013 (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1014 {
1015 if ((crtc_info = XRRGetCrtcInfo(_ecore_x_disp, res, crtc)))
1016 {
1017 if ((mode == Ecore_X_Randr_None) ||
1018 (noutputs == Ecore_X_Randr_None))
1019 {
1020 outputs = NULL;
1021 noutputs = 0;
1022 }
1023 else if (noutputs == (int)Ecore_X_Randr_Unset)
1024 {
1025 outputs = (Ecore_X_Randr_Output *)crtc_info->outputs;
1026 noutputs = crtc_info->noutput;
1027 }
1028
1029 if (mode == Ecore_X_Randr_Unset)
1030 mode = crtc_info->mode;
1031
1032 if (x < 0)
1033 x = crtc_info->x;
1034
1035 if (y < 0)
1036 y = crtc_info->y;
1037
1038 if (orientation == Ecore_X_Randr_Unset)
1039 orientation = crtc_info->rotation;
1040
1041 if (!XRRSetCrtcConfig(_ecore_x_disp, res, crtc, CurrentTime,
1042 x, y, mode, orientation, (RROutput *)outputs,
1043 noutputs))
1044 ret = EINA_TRUE;
1045
1046 XRRFreeCrtcInfo(crtc_info);
1047 }
1048
1049 XRRFreeScreenResources(res);
1050 }
1051
1052 return ret;
1053#else
1054 return EINA_FALSE;
1055#endif
1056}
1057
1058/**
1059 * @brief sets a CRTC relative to another one.
1060 * @param crtc_r1 the CRTC to be positioned.
1061 * @param crtc_r2 the CRTC the position should be relative to
1062 * @param position the relation between the crtcs
1063 * @param alignment in case CRTCs size differ, aligns CRTC1 accordingly at CRTC2's
1064 * borders
1065 * @return EINA_TRUE if crtc could be successfully positioned. EINA_FALSE if
1066 * repositioning failed or if position of new crtc would be out of given screen's min/max bounds.
1067 */
1068EAPI Eina_Bool
1069ecore_x_randr_crtc_pos_relative_set(Ecore_X_Window root,
1070 Ecore_X_Randr_Crtc crtc_r1,
1071 Ecore_X_Randr_Crtc crtc_r2,
1072 Ecore_X_Randr_Output_Policy policy,
1073 Ecore_X_Randr_Relative_Alignment alignment)
1074{
1075#ifdef ECORE_XRANDR
1076 RANDR_CHECK_1_2_RET(EINA_FALSE);
1077
1078 Eina_Rectangle r1_geo, r2_geo;
1079 int w_max, h_max, cw, ch, x_n = Ecore_X_Randr_Unset, y_n =
1080 Ecore_X_Randr_Unset;
1081 /*
1082 int r1_noutputs, r2_noutputs, r1_nmodes, i, j, outputs_mode_found, mode_w, mode_h;
1083 Ecore_X_Randr_Output *r1_outputs, *r2_outputs, *r2_r1_outputs;
1084 Ecore_X_Randr_Mode *r1_modes, r2_mode, r1_mode;
1085 Eina_Bool ret;
1086 */
1087
1088 if ((ecore_x_randr_crtc_mode_get(root, crtc_r1) == Ecore_X_Randr_None)
1089 || (ecore_x_randr_crtc_mode_get(root, crtc_r2) == Ecore_X_Randr_None))
1090 return EINA_FALSE;
1091
1092 if (!_ecore_x_randr_crtc_validate(root, crtc_r1) ||
1093 (!(crtc_r1 != crtc_r2) &&
1094 !_ecore_x_randr_crtc_validate(root, crtc_r2)))
1095 return EINA_FALSE;
1096
1097 ecore_x_randr_crtc_geometry_get(root,
1098 crtc_r1,
1099 &r1_geo.x,
1100 &r1_geo.y,
1101 &r1_geo.w,
1102 &r1_geo.h);
1103 ecore_x_randr_crtc_geometry_get(root,
1104 crtc_r2,
1105 &r2_geo.x,
1106 &r2_geo.y,
1107 &r2_geo.w,
1108 &r2_geo.h);
1109 ecore_x_randr_screen_size_range_get(root, NULL, NULL, &w_max, &h_max);
1110 ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
1111
1112 switch (policy)
1113 {
1114 case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT:
1115 //set r1 right of r2
1116 x_n = r2_geo.x + r2_geo.w;
1117
1118 switch (alignment)
1119 {
1120 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
1121 y_n = Ecore_X_Randr_Unset;
1122 break;
1123
1124 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
1125 y_n =
1126 ((int)(((double)r2_geo.h /
1127 2.0) + (double)r2_geo.y - ((double)r1_geo.h / 2.0)));
1128 break;
1129
1130 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
1131 y_n = ((int)((double)ch / 2.0) - ((double)r1_geo.h / 2.0));
1132 break;
1133 }
1134 break;
1135
1136 case ECORE_X_RANDR_OUTPUT_POLICY_LEFT:
1137 //set r1 left of r2
1138 x_n = r2_geo.x - r1_geo.w;
1139
1140 switch (alignment)
1141 {
1142 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
1143 y_n = Ecore_X_Randr_Unset;
1144 break;
1145
1146 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
1147 y_n =
1148 ((int)(((double)r2_geo.h /
1149 2.0) + r2_geo.y - ((double)r1_geo.h / 2.0)));
1150 break;
1151
1152 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
1153 y_n = ((int)(((double)ch / 2.0) - ((double)r1_geo.h / 2.0)));
1154 break;
1155 }
1156 break;
1157
1158 case ECORE_X_RANDR_OUTPUT_POLICY_BELOW:
1159 //set r1 below r2
1160 y_n = r2_geo.y + r2_geo.h;
1161
1162 switch (alignment)
1163 {
1164 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
1165 x_n = Ecore_X_Randr_Unset;
1166 break;
1167
1168 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
1169 x_n =
1170 ((int)((((double)r2_geo.x +
1171 (double)r2_geo.w) / 2.0) - ((double)r1_geo.w / 2.0)));
1172 break;
1173
1174 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
1175 x_n = ((int)((double)cw / 2.0));
1176 break;
1177 }
1178 break;
1179
1180 case ECORE_X_RANDR_OUTPUT_POLICY_ABOVE:
1181 y_n = r2_geo.y - r1_geo.h;
1182
1183 //set r1 above r2
1184 switch (alignment)
1185 {
1186 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_NONE:
1187 x_n = Ecore_X_Randr_Unset;
1188 break;
1189
1190 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_REL:
1191 x_n =
1192 ((int)((((double)r2_geo.x +
1193 (double)r2_geo.w) / 2.0) - ((double)r1_geo.w / 2.0)));
1194 break;
1195
1196 case ECORE_X_RANDR_RELATIVE_ALIGNMENT_CENTER_SCR:
1197 x_n = ((int)((double)cw / 2.0));
1198 break;
1199 }
1200 break;
1201
1202 case ECORE_X_RANDR_OUTPUT_POLICY_CLONE:
1203 return ecore_x_randr_crtc_pos_set(root, crtc_r1, r2_geo.x, r2_geo.y);
1204
1205 /* entire cloning (including modesetting)
1206 //all outputs of crtc1 capable of crtc2's current mode?
1207 r2_mode = ecore_x_randr_crtc_mode_get(root, crtc_r2);
1208 if (!(r1_outputs =
1209 ecore_x_randr_crtc_outputs_get(root, crtc_r1,
1210 &r1_noutputs)) ||
1211 (r1_noutputs == 0))
1212 return EINA_FALSE;
1213
1214 for (i = 0, outputs_mode_found = 0; i < r1_noutputs; i++)
1215 {
1216 if (!(r1_modes =
1217 ecore_x_randr_output_modes_get(root, r1_outputs[i],
1218 &r1_nmodes, NULL)))
1219 {
1220 free(r1_outputs);
1221 return EINA_FALSE;
1222 }
1223
1224 for (j = 0; j < r1_nmodes; j++)
1225 {
1226 ecore_x_randr_mode_size_get(root,
1227 r1_modes[j],
1228 &mode_w,
1229 &mode_h);
1230 if ((mode_w == r2_geo.w) && (mode_h == r2_geo.h))
1231 {
1232 r1_mode = r1_modes[j];
1233 ++outputs_mode_found;
1234 free(r1_modes);
1235 r1_modes = NULL;
1236 break;
1237 }
1238 }
1239 if (r1_modes)
1240 free(r1_modes);
1241
1242 if (outputs_mode_found <= i)
1243 {
1244 //an output doesn't support the set mode, cancel!
1245 free(r1_outputs);
1246 return EINA_FALSE;
1247 }
1248 }
1249 free (r1_outputs);
1250 //CRTC 1's outputs support a mode of same geometry as CRTC 2.
1251 ret =
1252 (ecore_x_randr_crtc_mode_set(root, crtc_r1, Ecore_X_Randr_None,
1253 Ecore_X_Randr_None,
1254 r1_mode) &&
1255 ecore_x_randr_crtc_pos_set(root, crtc_r1, r2_geo.x, r2_geo.y));
1256 return ret;
1257 */
1258
1259 /* entire cloning on same CRTC
1260 //all outputs of crtc1 capable of crtc2's current mode?
1261 r2_mode = ecore_x_randr_crtc_mode_get(root, crtc_r2);
1262 if (!(r1_outputs =
1263 ecore_x_randr_crtc_outputs_get(root, crtc_r1,
1264 &r1_noutputs)) ||
1265 (r1_noutputs == 0))
1266 return EINA_FALSE;
1267
1268 for (i = 0, outputs_mode_found = 0; i < r1_noutputs; i++)
1269 {
1270 if (!(r1_modes =
1271 ecore_x_randr_output_modes_get(root, r1_outputs[i],
1272 &r1_nmodes, NULL)))
1273 {
1274 free(r1_outputs);
1275 return EINA_FALSE;
1276 }
1277
1278 for (j = 0; j < r1_nmodes; j++)
1279 {
1280 if (r1_modes[j] == r2_mode)
1281 {
1282 ++outputs_mode_found;
1283 free(r1_modes);
1284 r1_modes = NULL;
1285 break;
1286 }
1287 }
1288 if (r1_modes)
1289 free(r1_modes);
1290
1291 if (outputs_mode_found <= i)
1292 {
1293 //an output doesn't support the set mode, cancel!
1294 free(r1_outputs);
1295 return EINA_FALSE;
1296 }
1297 }
1298 //check whether crtc r2 can use all outputs of r1.
1299 if (!(r2_outputs =
1300 ecore_x_randr_crtc_possible_outputs_get(root, crtc_r2,
1301 &r2_noutputs)) ||
1302 (r2_noutputs == 0))
1303 {
1304 free(r1_outputs);
1305 return EINA_FALSE;
1306 }
1307
1308 for (i = 0; i < r1_noutputs; i++)
1309 {
1310 for (j = 0; j < r2_noutputs; )
1311 {
1312 if (r1_outputs[i] == r2_outputs[j])
1313 break;
1314
1315 j++;
1316 }
1317 if (j == r2_noutputs)
1318 {
1319 //didn't find the output!
1320 free (r1_outputs);
1321 free (r2_outputs);
1322 return EINA_FALSE;
1323 }
1324 }
1325
1326 //apparently crtc2 supports all outputs of r1
1327 //TODO: check with the compatible list of outputs (property in RR1.3)
1328 r2_r1_outputs =
1329 malloc(sizeof(Ecore_X_Randr_Output) * (r1_noutputs + r2_noutputs));
1330 for (i = 0; i < r1_noutputs; i++)
1331 {
1332 r2_r1_outputs[i] = r1_outputs[i];
1333 }
1334 free(r1_outputs);
1335 for (; i < r2_noutputs; i++)
1336 {
1337 r2_r1_outputs[i] = r2_outputs[i];
1338 }
1339 free(r2_outputs);
1340 ret =
1341 ecore_x_randr_crtc_mode_set(root, crtc_r2, r2_r1_outputs,
1342 (r1_noutputs + r1_noutputs), r2_mode);
1343 free (r2_r1_outputs);
1344 return ret;
1345 */
1346 case ECORE_X_RANDR_OUTPUT_POLICY_NONE:
1347 break;
1348 }
1349 if ((x_n == r1_geo.x) && (y_n == r1_geo.x))
1350 return EINA_TRUE;
1351
1352 //out of possible bounds?
1353 if (((y_n + r1_geo.h) > h_max) || ((x_n + r1_geo.w) > w_max))
1354 return EINA_FALSE;
1355
1356 return ecore_x_randr_crtc_pos_set(root, crtc_r1, x_n, y_n);
1357#else
1358 return EINA_FALSE;
1359#endif
1360}
1361
1362EAPI Ecore_X_Randr_Mode *
1363ecore_x_randr_output_modes_get(Ecore_X_Window root,
1364 Ecore_X_Randr_Output output,
1365 int *num,
1366 int *npreferred)
1367{
1368#ifdef ECORE_XRANDR
1369 RANDR_CHECK_1_2_RET(NULL);
1370 XRRScreenResources *res = NULL;
1371 XRROutputInfo *output_info = NULL;
1372 Ecore_X_Randr_Mode *modes = NULL;
1373
1374 if ((output != Ecore_X_Randr_None)
1375 && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root))
1376 && (output_info =
1377 XRRGetOutputInfo(_ecore_x_disp, res, (RROutput)output)))
1378 {
1379 if ((modes = malloc(sizeof(Ecore_X_Randr_Mode) * output_info->nmode)))
1380 {
1381 memcpy(modes, output_info->modes,
1382 (sizeof(Ecore_X_Randr_Mode) * output_info->nmode));
1383 if (num)
1384 *num = output_info->nmode;
1385
1386 if (npreferred)
1387 *npreferred = output_info->npreferred;
1388 }
1389 }
1390
1391 if (output_info)
1392 XRRFreeOutputInfo(output_info);
1393
1394 if (res)
1395 XRRFreeScreenResources(res);
1396
1397 return modes;
1398#else
1399 return NULL;
1400#endif
1401}
1402
1403EAPI Ecore_X_Randr_Crtc *
1404ecore_x_randr_output_possible_crtcs_get(Ecore_X_Window root,
1405 Ecore_X_Randr_Output output,
1406 int *num)
1407{
1408#ifdef ECORE_XRANDR
1409 RANDR_CHECK_1_2_RET(NULL);
1410 XRRScreenResources *res = NULL;
1411 XRROutputInfo *output_info = NULL;
1412 Ecore_X_Randr_Crtc *crtcs = NULL;
1413
1414 if ((output != Ecore_X_Randr_None))
1415 {
1416 if ((res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1417 {
1418 if ((output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
1419 {
1420 if ((crtcs = malloc(sizeof(Ecore_X_Randr_Crtc) * output_info->ncrtc)))
1421 {
1422 memcpy(crtcs, output_info->crtcs, (sizeof(Ecore_X_Randr_Crtc) * output_info->ncrtc));
1423 if (num) *num = output_info->ncrtc;
1424 }
1425 XRRFreeOutputInfo(output_info);
1426 }
1427 XRRFreeScreenResources(res);
1428 }
1429 }
1430 return crtcs;
1431#else
1432 return Ecore_X_Randr_None;
1433#endif
1434}
1435
1436/**
1437 * @brief gets the the outputs which might be used simultenously on the same
1438 * CRTC.
1439 * @param root window that this information should be queried for.
1440 * @param output the output which's clones we concern
1441 * @param num number of possible clones
1442 */
1443EAPI Ecore_X_Randr_Output *
1444ecore_x_randr_output_clones_get(Ecore_X_Window root,
1445 Ecore_X_Randr_Output output,
1446 int *num)
1447{
1448#ifdef ECORE_XRANDR
1449 RANDR_CHECK_1_2_RET(NULL);
1450 XRRScreenResources *res = NULL;
1451 XRROutputInfo *output_info = NULL;
1452 Ecore_X_Randr_Output *outputs = NULL;
1453
1454 if ((output != Ecore_X_Randr_None))
1455 {
1456 if ((res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1457 {
1458 if ((output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
1459 {
1460 if ((outputs = malloc(sizeof(Ecore_X_Randr_Output) * output_info->nclone)))
1461 {
1462 memcpy(outputs, output_info->clones, (sizeof(Ecore_X_Randr_Output) * output_info->nclone));
1463 if (num) *num = output_info->nclone;
1464 }
1465 XRRFreeOutputInfo(output_info);
1466 }
1467 XRRFreeScreenResources(res);
1468 }
1469 }
1470 return outputs;
1471#else
1472 return Ecore_X_Randr_None;
1473#endif
1474}
1475
1476EAPI Ecore_X_Randr_Crtc
1477ecore_x_randr_output_crtc_get(Ecore_X_Window root,
1478 Ecore_X_Randr_Output output)
1479{
1480#ifdef ECORE_XRANDR
1481 RANDR_CHECK_1_2_RET(Ecore_X_Randr_None);
1482 XRRScreenResources *res = NULL;
1483 XRROutputInfo *output_info = NULL;
1484 Ecore_X_Randr_Crtc ret = Ecore_X_Randr_None;
1485
1486 if ((output != Ecore_X_Randr_None))
1487 {
1488 if ((res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1489 {
1490 if ((output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
1491 {
1492 ret = output_info->crtc;
1493 XRRFreeOutputInfo(output_info);
1494 }
1495 XRRFreeScreenResources(res);
1496 }
1497 }
1498
1499 return ret;
1500#else
1501 return Ecore_X_Randr_None;
1502#endif
1503}
1504
1505/**
1506 * @brief gets the given output's name as reported by X
1507 * @param root the window which's screen will be queried
1508 * @param len length of returned c-string.
1509 * @return name of the output as reported by X
1510 */
1511EAPI char *
1512ecore_x_randr_output_name_get(Ecore_X_Window root,
1513 Ecore_X_Randr_Output output,
1514 int *len)
1515{
1516#ifdef ECORE_XRANDR
1517 RANDR_CHECK_1_2_RET(NULL);
1518 XRRScreenResources *res = NULL;
1519 XRROutputInfo *output_info = NULL;
1520 char *ret = NULL;
1521
1522 if ((output != Ecore_X_Randr_None)
1523 && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root))
1524 && (output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
1525 {
1526 /*
1527 * Actually the below command is correct, but due to a bug in libXrandr
1528 * it doesn't work. Therefore we stick with strlen().
1529 * Replace the line below with the following once this bug is
1530 * fixed within libXrandr.
1531 *
1532 * *len = output_info->nameLen;
1533 *
1534 */
1535 if ((ret = strdup(output_info->name)) && len)
1536 *len = strlen(ret);
1537
1538 XRRFreeOutputInfo(output_info);
1539 }
1540
1541 if (res)
1542 XRRFreeScreenResources(res);
1543
1544 return ret;
1545#else
1546 return NULL;
1547#endif
1548}
1549
1550/**
1551 * @brief gets the width and hight of a given mode
1552 * @param mode the mode which's size is to be looked up
1553 * @param w width of given mode in px
1554 * @param h height of given mode in px
1555 */
1556EAPI void
1557ecore_x_randr_mode_size_get(Ecore_X_Window root,
1558 Ecore_X_Randr_Mode mode,
1559 int *w,
1560 int *h)
1561{
1562#ifdef ECORE_XRANDR
1563 RANDR_CHECK_1_2_RET();
1564 XRRScreenResources *res = NULL;
1565 int i;
1566
1567 if ((mode != Ecore_X_Randr_None)
1568 && (w || h)
1569 && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1570 {
1571 for (i = 0; i < res->nmode; i++)
1572 {
1573 if (res->modes[i].id == mode)
1574 {
1575 if (w)
1576 *w = res->modes[i].width;
1577
1578 if (h)
1579 *h = res->modes[i].height;
1580
1581 break;
1582 }
1583 }
1584 }
1585
1586 if (res)
1587 XRRFreeScreenResources(res);
1588
1589#endif
1590}
1591
1592/**
1593 * @brief gets the EDID information of an attached output if available.
1594 * Note that this information is not to be compared using ordinary string
1595 * comparison functions, since it includes 0-bytes.
1596 * @param root window this information should be queried from
1597 * @param output the XID of the output
1598 * @param length length of the byte-array. If NULL, request will fail.
1599 */
1600EAPI unsigned char *
1601ecore_x_randr_output_edid_get(Ecore_X_Window root,
1602 Ecore_X_Randr_Output output,
1603 unsigned long *length)
1604{
1605#ifdef ECORE_XRANDR
1606 RANDR_CHECK_1_2_RET(NULL);
1607 Atom name = XInternAtom (_ecore_x_disp, RANDR_PROPERTY_EDID, False);
1608 unsigned char *prop_data, *ret = NULL;
1609 int actual_format;
1610 unsigned long nitems, bytes_after;
1611 Atom actual_type;
1612
1613 if (!length || !_ecore_x_randr_output_validate(root, output))
1614 return NULL;
1615
1616 if(XRRGetOutputProperty (_ecore_x_disp, output, name,
1617 0, 100, False, False,
1618 AnyPropertyType,
1619 &actual_type, &actual_format,
1620 &nitems, &bytes_after, &prop_data) == Success)
1621 {
1622 if (actual_type == XA_INTEGER && actual_format == 8)
1623 {
1624 if ((ret = malloc(nitems * sizeof(unsigned char))))
1625 {
1626 if(length &&
1627 (memcpy(ret, prop_data, (nitems * sizeof(unsigned char)))))
1628 *length = nitems;
1629
1630 return ret;
1631 }
1632 }
1633 }
1634
1635 return NULL;
1636#else
1637 return NULL;
1638#endif
1639}
1640
1641EAPI Ecore_X_Randr_Connection_Status
1642ecore_x_randr_output_connection_status_get(Ecore_X_Window root,
1643 Ecore_X_Randr_Output output)
1644{
1645#ifdef ECORE_XRANDR
1646 RANDR_CHECK_1_2_RET(ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN);
1647 XRRScreenResources *res = NULL;
1648 XRROutputInfo *output_info = NULL;
1649 Ecore_X_Randr_Connection_Status ret =
1650 ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
1651
1652 if ((output != Ecore_X_Randr_None)
1653 && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root))
1654 && (output_info = XRRGetOutputInfo(_ecore_x_disp, res, output)))
1655 {
1656 ret = output_info->connection;
1657 }
1658
1659 if (output_info)
1660 XRRFreeOutputInfo(output_info);
1661
1662 if (res)
1663 XRRFreeScreenResources(res);
1664
1665 return ret;
1666#else
1667 return ECORE_X_RANDR_CONNECTION_STATUS_UNKNOWN;
1668#endif
1669}
1670
1671EAPI void
1672ecore_x_randr_output_size_mm_get(Ecore_X_Window root,
1673 Ecore_X_Randr_Output output,
1674 int *w_mm,
1675 int *h_mm)
1676{
1677#ifdef ECORE_XRANDR
1678 RANDR_CHECK_1_2_RET();
1679 XRRScreenResources *res = NULL;
1680 XRROutputInfo *output_info = NULL;
1681
1682 if ((output != Ecore_X_Randr_None)
1683 && (res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1684 {
1685 if ((output_info =
1686 XRRGetOutputInfo(_ecore_x_disp, res, (RROutput)output)))
1687 {
1688 if (w_mm)
1689 *w_mm = output_info->mm_width;
1690
1691 if (h_mm)
1692 *h_mm = output_info->mm_height;
1693
1694 XRRFreeOutputInfo(output_info);
1695 }
1696
1697 XRRFreeScreenResources(res);
1698 }
1699
1700#endif
1701}
1702
1703EAPI Eina_Bool
1704ecore_x_randr_move_all_crtcs_but(Ecore_X_Window root,
1705 const Ecore_X_Randr_Crtc *not_moved,
1706 int nnot_moved,
1707 int dx,
1708 int dy)
1709{
1710#ifdef ECORE_XRANDR
1711 Ecore_X_Randr_Crtc *crtcs_to_be_moved = NULL;
1712 XRRScreenResources *res = NULL;
1713 int i, j, k, n;
1714 Eina_Bool ret;
1715
1716 if ((nnot_moved <= 0) || (!not_moved)
1717 || !_ecore_x_randr_root_validate(root)
1718 || !(res =
1719 _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
1720 return EINA_FALSE;
1721
1722 n = (res->ncrtc - nnot_moved);
1723 if ((crtcs_to_be_moved = malloc(sizeof(Ecore_X_Randr_Crtc) * n)))
1724 {
1725 for (i = 0, k = 0; (i < res->ncrtc) && (k < n); i++)
1726 {
1727 for (j = 0; j < nnot_moved; j++)
1728 {
1729 if (res->crtcs[i] == not_moved[j])
1730 break;
1731 }
1732 if (j == nnot_moved)
1733 //crtcs[i] is not in the 'not to move'-list
1734 crtcs_to_be_moved[k++] = res->crtcs[i];
1735 }
1736 }
1737
1738 XRRFreeScreenResources(res);
1739 ret = ecore_x_randr_move_crtcs(root, crtcs_to_be_moved, n, dx, dy);
1740 free(crtcs_to_be_moved);
1741 return ret;
1742#else
1743 return EINA_FALSE;
1744#endif
1745}
1746
1747/*
1748 * @brief move given CRTCs belonging to the given root window's screen dx/dy pixels relative to their current position. The screen size will be automatically adjusted if necessary and possible.
1749 * @param root window which's screen's resources are used
1750 * @param crtcs list of CRTCs to be moved
1751 * @param ncrtc number of CRTCs in array
1752 * @param dx amount of pixels the CRTCs should be moved in x direction
1753 * @param dy amount of pixels the CRTCs should be moved in y direction
1754 * @return EINA_TRUE if all crtcs could be moved successfully.
1755 */
1756EAPI Eina_Bool
1757ecore_x_randr_move_crtcs(Ecore_X_Window root,
1758 const Ecore_X_Randr_Crtc *crtcs,
1759 int ncrtc,
1760 int dx,
1761 int dy)
1762{
1763#ifdef ECORE_XRANDR
1764 RANDR_CHECK_1_2_RET(EINA_FALSE);
1765 XRRScreenResources *res = NULL;
1766 XRRCrtcInfo **crtc_info = NULL;
1767 Eina_Bool ret = EINA_TRUE;
1768 int i, cw, ch, w_max, h_max, nw, nh;
1769
1770 crtc_info = alloca(sizeof(XRRCrtcInfo *) * ncrtc);
1771 memset(crtc_info, 0, sizeof(XRRCrtcInfo *) * ncrtc);
1772 if (_ecore_x_randr_root_validate(root)
1773 && (res = _ecore_x_randr_get_screen_resources (_ecore_x_disp, root)))
1774 {
1775 ecore_x_randr_screen_size_range_get(root, NULL, NULL, &w_max, &h_max);
1776 ecore_x_randr_screen_current_size_get(root, &cw, &ch, NULL, NULL);
1777 nw = cw;
1778 nh = ch;
1779
1780 for (i = 0;
1781 (i < ncrtc) &&
1782 (crtc_info[i] = XRRGetCrtcInfo(_ecore_x_disp, res, crtcs[i]));
1783 i++)
1784 {
1785 if (((crtc_info[i]->x + dx) < 0) ||
1786 ((int)(crtc_info[i]->x + crtc_info[i]->width + dx) > w_max)
1787 || ((crtc_info[i]->y + dy) < 0) ||
1788 ((int)(crtc_info[i]->y + crtc_info[i]->height + dy) > h_max)
1789 )
1790 goto _ecore_x_randr_move_crtcs_fail_free_crtc_info;
1791
1792 nw = MAX((int)(crtc_info[i]->x + crtc_info[i]->width + dx), nw);
1793 nh = MAX((int)(crtc_info[i]->y + crtc_info[i]->height + dy), nh);
1794 }
1795 //not out of bounds
1796
1797 //resize if necessary
1798 if (!(((nw > cw) ||
1799 (nh > ch)) ||
1800 ecore_x_randr_screen_current_size_set(root, nw, nh,
1801 Ecore_X_Randr_Unset,
1802 Ecore_X_Randr_Unset)))
1803 goto _ecore_x_randr_move_crtcs_fail_free_crtc_info;
1804
1805 //actually move all the crtcs, keep their rotation and mode.
1806 for (i = 0; (i < ncrtc) && crtc_info[i]; i++)
1807 {
1808 if ((crtc_info[i]) &&
1809 (!ecore_x_randr_crtc_settings_set(root, crtcs[i], NULL,
1810 Ecore_X_Randr_Unset,
1811 (crtc_info[i]->x + dx),
1812 (crtc_info[i]->y + dy),
1813 crtc_info[i]->mode,
1814 crtc_info[i]->rotation)))
1815 {
1816 ret = EINA_FALSE;
1817 break;
1818 }
1819 }
1820 if (i < ncrtc)
1821 {
1822 //something went wrong, let's try to move the already moved crtcs
1823 //back.
1824 while ((i--) >= 0)
1825 {
1826 if (crtc_info[i])
1827 ecore_x_randr_crtc_settings_set(root,
1828 crtcs[i],
1829 NULL,
1830 Ecore_X_Randr_Unset,
1831 (crtc_info[i]->x - dx),
1832 (crtc_info[i]->y - dy),
1833 crtc_info[i]->mode,
1834 crtc_info[i]->rotation);
1835 }
1836 }
1837
1838 for (i = 0; i < ncrtc; i++)
1839 {
1840 if (crtc_info[i]) XRRFreeCrtcInfo(crtc_info[i]);
1841 }
1842 }
1843
1844 XRRFreeScreenResources(res);
1845
1846 return ret;
1847_ecore_x_randr_move_crtcs_fail_free_crtc_info:
1848 while (i-- > 0)
1849 XRRFreeCrtcInfo(crtc_info[i]);
1850 XRRFreeScreenResources(res);
1851 return EINA_FALSE;
1852#else
1853 return EINA_FALSE;
1854#endif
1855}
1856
1857/**
1858 * @brief removes unused screen space. The most upper left CRTC is set to 0x0
1859 * and all other CRTCs dx,dy respectively.
1860 * @param root the window's screen which will be reset.
1861 */
1862EAPI void
1863ecore_x_randr_screen_reset(Ecore_X_Window root)
1864{
1865#ifdef ECORE_XRANDR
1866 XRRCrtcInfo *crtc_info = NULL;
1867 XRRScreenResources *res = NULL;
1868 //the 100000 are just a random huge number.
1869 int i, dx_min = 100000, dy_min = 100000, w_n = 0, h_n = 0, nenabled_crtcs = 0;
1870
1871 if (!_ecore_x_randr_root_validate(root) ||
1872 !(res = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root)))
1873 return;
1874
1875 Ecore_X_Randr_Crtc enabled_crtcs[res->ncrtc];
1876
1877 for (i = 0; i < res->ncrtc; i++)
1878 {
1879 if (!(crtc_info =
1880 XRRGetCrtcInfo(_ecore_x_disp, res,
1881 res->crtcs[i])) ||
1882 (crtc_info->mode == Ecore_X_Randr_None) ||
1883 (crtc_info->mode == Ecore_X_Randr_Unset)
1884 || ((crtc_info->noutput == 0)))
1885 continue;
1886
1887 enabled_crtcs[nenabled_crtcs++] = res->crtcs[i];
1888
1889 if ((int)(crtc_info->x + crtc_info->width) > w_n)
1890 w_n = (crtc_info->x + crtc_info->width);
1891
1892 if ((int)(crtc_info->y + crtc_info->height) > h_n)
1893 h_n = (crtc_info->y + crtc_info->height);
1894
1895 if (crtc_info->x < dx_min)
1896 dx_min = crtc_info->x;
1897 if (crtc_info->y < dy_min)
1898 dy_min = crtc_info->y;
1899
1900 XRRFreeCrtcInfo(crtc_info);
1901 }
1902 if ((dx_min > 0) || (dy_min > 0))
1903 {
1904 if (ecore_x_randr_move_crtcs(root, enabled_crtcs, nenabled_crtcs, -dx_min, -dy_min))
1905 {
1906 w_n -= dx_min;
1907 h_n -= dy_min;
1908 }
1909 }
1910 ecore_x_randr_screen_current_size_set(root,
1911 w_n,
1912 h_n,
1913 Ecore_X_Randr_Unset,
1914 Ecore_X_Randr_Unset);
1915#endif
1916}
1917
1918/**
1919 * @brief set up the backlight level to the given level.
1920 * @param root the window's screen which will be set.
1921 * @param level of the backlight between 0 and 1
1922 */
1923
1924EAPI void
1925ecore_x_randr_screen_backlight_level_set(Ecore_X_Window root,
1926 double level)
1927{
1928#ifdef ECORE_XRANDR
1929 RANDR_CHECK_1_2_RET();
1930 Atom _backlight;
1931 XRRScreenResources *resources = NULL;
1932 Ecore_X_Randr_Output output;
1933 int o;
1934
1935 if ((level < 0) || (level > 1))
1936 {
1937 ERR("Wrong value for the backlight level. It should be between 0 and 1.");
1938 return;
1939 }
1940
1941 /*
1942 * To make sure that the _backlight atomic property still exists.
1943 */
1944 _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
1945 if (_backlight == None)
1946 {
1947 WRN("Backlight setting is not supported on this server or driver");
1948 return;
1949 }
1950
1951 /* get the ressources */
1952 resources = _ecore_x_randr_get_screen_resources(_ecore_x_disp, root);
1953 if (!resources) return;
1954
1955 for (o = 0; o < resources->noutput; o++)
1956 {
1957 output = resources->outputs[o];
1958 if (ecore_x_randr_output_backlight_level_get(root, output) >= 0)
1959 {
1960 ecore_x_randr_output_backlight_level_set(root, output, level);
1961 }
1962 }
1963 XRRFreeScreenResources(resources);
1964#endif
1965}
1966
1967/*
1968 * @brief get the backlight level of the given output
1969 * @param root window which's screen should be queried
1970 * @param output from which the backlight level should be retrieved
1971 * @return the backlight level
1972 */
1973
1974EAPI double
1975ecore_x_randr_output_backlight_level_get(Ecore_X_Window root,
1976 Ecore_X_Randr_Output output)
1977{
1978#ifdef ECORE_XRANDR
1979 RANDR_CHECK_1_2_RET(-1);
1980 Atom actual_type;
1981 Atom _backlight;
1982 XRRPropertyInfo *info = NULL;
1983 double dvalue;
1984 int actual_format;
1985 long value, max, min;
1986 unsigned long nitems;
1987 unsigned long bytes_after;
1988 unsigned char *prop = NULL;
1989
1990 /* set backlight variable if not already done */
1991
1992 _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
1993 if (_backlight == None)
1994 {
1995 ERR("Backlight property is not suppported on this server or driver");
1996 return -1;
1997 }
1998
1999 if (!_ecore_x_randr_output_validate(root, output))
2000 {
2001 ERR("Invalid output");
2002 return -1;
2003 }
2004
2005 if (XRRGetOutputProperty(_ecore_x_disp, output, _backlight,
2006 0, 4, False, False, None,
2007 &actual_type, &actual_format,
2008 &nitems, &bytes_after, &prop) != Success)
2009 {
2010 WRN("Backlight not supported on this output");
2011 return -1;
2012 }
2013
2014 if ((actual_type != XA_INTEGER) || (nitems != 1) || (actual_format != 32)) return -1;
2015
2016 value = *((long *)prop);
2017 free (prop);
2018
2019 /* I have the current value of the backlight */
2020 /* Now retrieve the min and max intensities of the output */
2021 info = XRRQueryOutputProperty(_ecore_x_disp, output, _backlight);
2022 if (info)
2023 {
2024 dvalue = -1;
2025 if ((info->range) && (info->num_values == 2))
2026 {
2027 /* finally convert the current value in the interval [0..1] */
2028 min = info->values[0];
2029 max = info->values[1];
2030 dvalue = ((double)(value - min)) / ((double)(max - min));
2031 }
2032 free(info);
2033 return dvalue;
2034 }
2035#endif
2036 return -1;
2037}
2038
2039/*
2040 * @brief set the backlight level of a given output
2041 * @param root window which's screen should be queried
2042 * @param output that should be set
2043 * @param level for which the backlight should be set
2044 * @return EINA_TRUE in case of success
2045 */
2046
2047EAPI Eina_Bool
2048ecore_x_randr_output_backlight_level_set(Ecore_X_Window root,
2049 Ecore_X_Randr_Output output,
2050 double level)
2051{
2052#ifdef ECORE_XRANDR
2053 RANDR_CHECK_1_2_RET(EINA_FALSE);
2054 Atom _backlight;
2055 XRRPropertyInfo *info = NULL;
2056 double min, max, tmp;
2057 long new;
2058
2059 if ((level < 0) || (level > 1))
2060 {
2061 ERR("Backlight level should be between 0 and 1");
2062 return EINA_FALSE;
2063 }
2064
2065 if (!_ecore_x_randr_output_validate(root, output))
2066 {
2067 ERR("Wrong output value");
2068 return EINA_FALSE;
2069 }
2070
2071 _backlight = XInternAtom(_ecore_x_disp, RANDR_PROPERTY_BACKLIGHT, True);
2072 if (_backlight == None)
2073 {
2074 WRN("Backlight property is not suppported on this server or driver");
2075 return EINA_FALSE;
2076 }
2077
2078 info = XRRQueryOutputProperty(_ecore_x_disp, output, _backlight);
2079 if (info)
2080 {
2081 if ((info->range) && (info->num_values == 2))
2082 {
2083 min = info->values[0];
2084 max = info->values[1];
2085 tmp = (level * (max - min)) + min;
2086 new = tmp;
2087 if (new > max) new = max;
2088 if (new < min) new = min;
2089 XRRChangeOutputProperty(_ecore_x_disp, output, _backlight, XA_INTEGER, 32,
2090 PropModeReplace, (unsigned char *)&new, 1);
2091 XFlush(_ecore_x_disp);
2092 }
2093 free(info);
2094 return EINA_TRUE;
2095 }
2096#endif
2097 return EINA_FALSE;
2098}
2099
2100/*
2101 * @brief get the outputs, which display a certain window
2102 * @param window window the displaying outputs shall be found for
2103 * @param num the number of outputs displaying the window
2104 * @return array of outputs that display a certain window. NULL if no outputs
2105 * was found that displays the specified window.
2106 */
2107
2108EAPI Ecore_X_Randr_Output *
2109ecore_x_randr_window_outputs_get(Ecore_X_Window window,
2110 int *num)
2111{
2112#ifdef ECORE_XRANDR
2113 Ecore_X_Window root;
2114 Eina_Rectangle w_geo, c_geo;
2115 Ecore_X_Randr_Crtc *crtcs;
2116 Ecore_X_Randr_Mode mode;
2117 Ecore_X_Randr_Output *outputs, *ret = NULL, *tret;
2118 Window tw;
2119 int ncrtcs, noutputs, i, nret = 0, rx = 0, ry = 0;
2120
2121 if (_randr_version < RANDR_1_2) goto _ecore_x_randr_current_output_get_fail;
2122
2123 ecore_x_window_geometry_get(window,
2124 &w_geo.x, &w_geo.y,
2125 &w_geo.w, &w_geo.h);
2126
2127 root = ecore_x_window_root_get(window);
2128 crtcs = ecore_x_randr_crtcs_get(root, &ncrtcs);
2129 if (!crtcs) goto _ecore_x_randr_current_output_get_fail;
2130
2131 /* now get window RELATIVE to root window - thats what matters. */
2132 XTranslateCoordinates(_ecore_x_disp, window, root, 0, 0, &rx, &ry, &tw);
2133 w_geo.x = rx;
2134 w_geo.y = ry;
2135
2136 for (i = 0; i < ncrtcs; i++)
2137 {
2138 /* if crtc is not enabled, don't bother about it any further */
2139 mode = ecore_x_randr_crtc_mode_get(root, crtcs[i]);
2140 if (mode == Ecore_X_Randr_None) continue;
2141
2142 ecore_x_randr_crtc_geometry_get(root, crtcs[i],
2143 &c_geo.x, &c_geo.y,
2144 &c_geo.w, &c_geo.h);
2145 if (eina_rectangles_intersect(&w_geo, &c_geo))
2146 {
2147 outputs = ecore_x_randr_crtc_outputs_get(root, crtcs[i],
2148 &noutputs);
2149 /* The case below should be impossible, but for safety reasons
2150 * remains */
2151 if (!outputs)
2152 {
2153 if (num) *num = 0;
2154 free(ret);
2155 free(crtcs);
2156 return NULL;
2157 }
2158 tret = realloc(ret, ((nret + noutputs) * sizeof(Ecore_X_Randr_Output)));
2159 if (!tret)
2160 {
2161 if (num) *num = 0;
2162 free(outputs);
2163 free(ret);
2164 free(crtcs);
2165 return NULL;
2166 }
2167 ret = tret;
2168 memcpy(&ret[nret], outputs, (noutputs * sizeof(Ecore_X_Randr_Output)));
2169 nret += noutputs;
2170 free(outputs);
2171 }
2172 }
2173 free(crtcs);
2174
2175 if (num) *num = nret;
2176 return ret;
2177
2178_ecore_x_randr_current_output_get_fail:
2179#endif
2180 if (num) *num = 0;
2181 return NULL;
2182}
2183
2184/*
2185 * @depricated bad naming. Use ecore_x_randr_window_outputs_get instead.
2186 * @brief get the outputs, which display a certain window
2187 * @param window window the displaying outputs shall be found for
2188 * @param num the number of outputs displaying the window
2189 * @return array of outputs that display a certain window. NULL if no outputs
2190 * was found that displays the specified window.
2191 */
2192
2193EINA_DEPRECATED EAPI Ecore_X_Randr_Output *
2194ecore_x_randr_current_output_get(Ecore_X_Window window,
2195 int *num)
2196{
2197 return ecore_x_randr_window_outputs_get(window, num);
2198}
2199
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c
new file mode 100644
index 0000000..d434f2f
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_12_edid.c
@@ -0,0 +1,457 @@
1/*
2 * Copyright 2006-2009 Red Hat, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 */
22/* Original Author: Adam Jackson <ajax@nwnk.net> */
23/* Heavily modified by: Leif Middelschulte <leif.middelschulte@gmail.com> */
24
25#include "Ecore_X.h"
26
27/* TODO:
28 * - see other TODO's within this file.
29 */
30
31#define ECORE_X_RANDR_EDID_VERSION_10 ((1 << 8) | 0)
32#define ECORE_X_RANDR_EDID_VERSION_11 ((1 << 8) | 1)
33#define ECORE_X_RANDR_EDID_VERSION_12 ((1 << 8) | 2)
34#define ECORE_X_RANDR_EDID_VERSION_13 ((1 << 8) | 3)
35#define ECORE_X_RANDR_EDID_VERSION_14 ((1 << 8) | 4)
36
37#define _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER 0x08
38#define _ECORE_X_RANDR_EDID_OFFSET_TYPE 0x14
39#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR 0x12
40#define _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR 0x13
41#define _ECORE_X_RANDR_EDID_OFFSET_DPMS 0x18
42#define _ECORE_X_RANDR_EDID_OFFSET_COLORSPACE 0x18
43#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK 0x36
44#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE 3
45#define _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT 5
46#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED 15
47#define _ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO 14
48
49#define _ECORE_X_RANDR_EDID_MASK_DIGITAL 0x80
50#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_INTERFACE 0x0f
51#define _ECORE_X_RANDR_EDID_MASK_DIGITAL_TMDS_DFP_10 0x01
52#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS 0x18
53#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444 0x10
54#define _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422 0x08
55#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED 0xe0
56#define _ECORE_X_RANDR_EDID_MASK_DPMS 0xE0
57#define _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY 0x80
58#define _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND 0x40
59#define _ECORE_X_RANDR_EDID_MASK_DPMS_OFF 0x20
60#define _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE 0x0f
61#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3 0x80
62#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9 0x40
63#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10 0x20
64#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4 0x10
65#define _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9 0x08
66
67#define _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX 13
68
69typedef enum _Ecore_X_Randr_Edid_Aspect_Ratio_Preferred {
70 ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3 = 0x00,
71 ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9 = 0x01,
72 ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10 = 0x02,
73 ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4 = 0x03,
74 ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9 = 0x04
75} Ecore_X_Randr_Edid_Aspect_Ratio_Preferred;
76
77/* Some convenience loops */
78#define _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, extension_block_iter) \
79 for (extension_block_iter = edid; extension_block_iter < (edid + edid_length); extension_block_iter += 128)
80
81#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter) \
82 _ECORE_X_RANDR_EDID_FOR_EACH_EXTENSION_BLOCK(edid, edid_length, cea_block_iter) \
83 if (cea_block_iter[0] == 0x02)
84
85/* The following macro is to be used with caution as it inherits another loop.
86 * Therefore using a 'break;' statement will lead to continuation in the
87 * inherent 'Extension block'-loop.
88 */
89#define _ECORE_X_RANDR_EDID_FOR_EACH_CEA_DETAILED_BLOCK(edid, edid_length, cea_block_iter, detailed_block_iter) \
90 _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter) \
91 for (detailed_block_iter = cea_block_iter + cea_block_iter[2]; detailed_block_iter + 18 < cea_block_iter + 127; detailed_block_iter += 18) \
92 if (detailed_block_iter[0])
93
94#define _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
95 for (block = edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK; block <= (edid + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK + (3 * 18)); block += 18)
96
97#define _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block) \
98 _ECORE_X_RANDR_EDID_FOR_EACH_DESCRIPTOR_BLOCK(edid, block) \
99 if ((block[0] == 0) && (block[1] == 0))
100
101EAPI Eina_Bool
102ecore_x_randr_edid_has_valid_header(unsigned char *edid,
103 unsigned long edid_length)
104{
105 const unsigned char header[] =
106 { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 };
107 if (!edid) return EINA_FALSE;
108 if (edid_length < 8) return EINA_FALSE;
109 if (!memcmp(edid, header, 8)) return EINA_TRUE;
110 return EINA_FALSE;
111}
112
113EAPI int
114ecore_x_randr_edid_version_get(unsigned char *edid,
115 unsigned long edid_length)
116{
117 if ((edid_length > _ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR) &&
118 (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
119 return (edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MAJOR] << 8) |
120 edid[_ECORE_X_RANDR_EDID_OFFSET_VERSION_MINOR];
121 return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
122}
123
124EAPI int
125ecore_x_randr_edid_manufacturer_model_get(unsigned char *edid,
126 unsigned long edid_length)
127{
128 if ((edid_length > 0x0b) &&
129 (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
130 return (int)(edid[0x0a] + (edid[0x0b] << 8));
131 return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
132}
133
134EAPI int
135ecore_x_randr_edid_manufacturer_serial_number_get(unsigned char *edid,
136 unsigned long edid_length)
137{
138 if ((edid_length > 0x0f) &&
139 (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
140 return (int)(edid[0x0c] + (edid[0x0d] << 8) +
141 (edid[0x0e] << 16) + (edid[0x0f] << 24));
142 return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
143}
144
145EAPI char *
146ecore_x_randr_edid_manufacturer_name_get(unsigned char *edid,
147 unsigned long edid_length)
148{
149 if ((edid_length > (_ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER + 1)) &&
150 (ecore_x_randr_edid_has_valid_header(edid, edid_length)))
151 {
152 unsigned char *x;
153 char *name;
154
155 x = (edid + _ECORE_X_RANDR_EDID_OFFSET_MANUFACTURER);
156 name = malloc(sizeof(char) * 4);
157 if (!name) return NULL;
158 name[0] = ((x[0] & 0x7c) >> 2) + '@';
159 name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xe0) >> 5) + '@';
160 name[2] = (x[1] & 0x1f) + '@';
161 name[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] = 0;
162 return name;
163 }
164 return NULL;
165}
166
167EAPI char *
168ecore_x_randr_edid_display_name_get(unsigned char *edid,
169 unsigned long edid_length)
170{
171 unsigned char *block = NULL;
172 int version = ecore_x_randr_edid_version_get(edid, edid_length);
173
174 if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
175 _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
176 {
177 if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfc)
178 {
179 char *name, *p;
180 const char *edid_name;
181
182 edid_name = (const char *)block + _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
183 name = malloc(sizeof(char) * _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
184 if (!name) return NULL;
185 strncpy(name, edid_name, (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
186 name[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
187 for (p = name; *p; p++)
188 {
189 if ((*p < ' ') || (*p > '~')) *p = 0;
190 }
191 return name;
192 }
193 }
194 return NULL;
195}
196
197EAPI Ecore_X_Randr_Edid_Aspect_Ratio
198ecore_x_randr_edid_display_aspect_ratio_preferred_get(unsigned char *edid,
199 unsigned long edid_length)
200{
201 unsigned char *block = NULL;
202 int version = ecore_x_randr_edid_version_get(edid, edid_length);
203
204 if (version < ECORE_X_RANDR_EDID_VERSION_13) return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
205 _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
206 {
207 if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfd) &&
208 (block[10] == 0x04))
209 {
210 Ecore_X_Randr_Edid_Aspect_Ratio_Preferred preferred_ratio =
211 (Ecore_X_Randr_Edid_Aspect_Ratio_Preferred)
212 ((block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO_PREFERRED] &
213 _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_PREFERRED) >> 5);
214 switch (preferred_ratio)
215 {
216 case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_4_3:
217 return ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3;
218
219 case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_9:
220 return ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9;
221
222 case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_16_10:
223 return ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10;
224
225 case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_5_4:
226 return ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4;
227
228 case ECORE_X_RANDR_EDID_ASPECT_RATIO_PREFERRED_15_9:
229 return ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9;
230
231 default:
232 return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
233 }
234 }
235 }
236 return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
237}
238
239EAPI Ecore_X_Randr_Edid_Aspect_Ratio
240ecore_x_randr_edid_display_aspect_ratios_get(unsigned char *edid,
241 unsigned long edid_length)
242{
243 Ecore_X_Randr_Edid_Aspect_Ratio ret = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
244 unsigned char *block = NULL;
245 int version = ecore_x_randr_edid_version_get(edid, edid_length);
246
247 if (version < ECORE_X_RANDR_EDID_VERSION_13) return ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
248 _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
249 {
250 if ((block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfd) &&
251 (block[10] == 0x04))
252 {
253 if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_4_3)
254 ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3;
255 if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_9)
256 ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9;
257 if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_16_10)
258 ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10;
259 if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_5_4)
260 ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4;
261 if (block[_ECORE_X_RANDR_EDID_OFFSET_ASPECT_RATIO] & _ECORE_X_RANDR_EDID_MASK_ASPECT_RATIO_15_9)
262 ret |= ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9;
263 }
264 }
265 return ret;
266}
267
268EAPI char *
269ecore_x_randr_edid_display_ascii_get(unsigned char *edid,
270 unsigned long edid_length)
271{
272 unsigned char *block = NULL;
273 int version = ecore_x_randr_edid_version_get(edid, edid_length);
274
275 if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
276 _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
277 {
278 if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xfe)
279 {
280 char *ascii, *p;
281 const char *edid_ascii = (const char *)block +
282 _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
283 /*
284 * TODO: Two of these in a row, in the third and fourth slots,
285 * seems to be specified by SPWG: http://www.spwg.org/
286 */
287 ascii = malloc(sizeof(char) * _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
288 if (!ascii) return NULL;
289 strncpy(ascii, edid_ascii, (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
290 ascii[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
291 for (p = ascii; *p; p++)
292 {
293 if ((*p < ' ') || (*p > '~')) *p = 0;
294 }
295 return ascii;
296 }
297 }
298 return NULL;
299}
300
301EAPI char *
302ecore_x_randr_edid_display_serial_get(unsigned char *edid,
303 unsigned long edid_length)
304{
305 unsigned char *block = NULL;
306 int version = ecore_x_randr_edid_version_get(edid, edid_length);
307
308 if (version < ECORE_X_RANDR_EDID_VERSION_13) return NULL;
309 _ECORE_X_RANDR_EDID_FOR_EACH_NON_PIXEL_DESCRIPTOR_BLOCK(edid, block)
310 {
311 if (block[_ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_TYPE] == 0xff)
312 {
313 char *serial, *p;
314 const char *edid_serial = (const char *)block +
315 _ECORE_X_RANDR_EDID_OFFSET_DESCRIPTOR_BLOCK_CONTENT;
316 /*
317 * TODO: Two of these in a row, in the third and fourth slots,
318 * seems to be specified by SPWG: http://www.spwg.org/
319 */
320 serial = malloc(sizeof(char) * _ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX);
321 if (!serial) return NULL;
322 strncpy(serial, edid_serial, (_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX - 1));
323 serial[_ECORE_X_RANDR_EDID_DISPLAY_DESCRIPTOR_BLOCK_CONTENT_LENGTH_MAX] = 0;
324 for (p = serial; *p; p++)
325 {
326 if ((*p < ' ') || (*p > '~')) *p = 0;
327 }
328 return serial;
329 }
330 }
331 return NULL;
332}
333
334EAPI Eina_Bool
335ecore_x_randr_edid_info_has_valid_checksum(unsigned char *edid,
336 unsigned long edid_length)
337{
338 unsigned char *cea_block_iter = NULL;
339 char sum = 0;
340 int i;
341 int version = ecore_x_randr_edid_version_get(edid, edid_length);
342
343 if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
344 if (edid_length < 128) return EINA_FALSE;
345
346 /* Check the EDID block itself */
347 for (i = 0; i < 128; i++) sum += edid[i];
348 if (sum) return EINA_FALSE;
349
350 /* Check the cea extension blocks */
351 _ECORE_X_RANDR_EDID_FOR_EACH_CEA_BLOCK(edid, edid_length, cea_block_iter)
352 {
353 for (i = 0, sum = 0; i < 128; i++) sum += cea_block_iter[i];
354 }
355 if (sum) return EINA_FALSE;
356 return EINA_TRUE;
357}
358
359EAPI Eina_Bool
360ecore_x_randr_edid_dpms_available_get(unsigned char *edid,
361 unsigned long edid_length)
362{
363 int version = ecore_x_randr_edid_version_get(edid, edid_length);
364
365 if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
366 return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
367 _ECORE_X_RANDR_EDID_MASK_DPMS);
368}
369
370EAPI Eina_Bool
371ecore_x_randr_edid_dpms_standby_available_get(unsigned char *edid,
372 unsigned long edid_length)
373{
374 int version = ecore_x_randr_edid_version_get(edid, edid_length);
375
376 if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
377 if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
378 return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
379 _ECORE_X_RANDR_EDID_MASK_DPMS_STANDBY);
380 return EINA_FALSE;
381}
382
383EAPI Eina_Bool
384ecore_x_randr_edid_dpms_suspend_available_get(unsigned char *edid,
385 unsigned long edid_length)
386{
387 int version = ecore_x_randr_edid_version_get(edid, edid_length);
388
389 if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
390 if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
391 return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
392 _ECORE_X_RANDR_EDID_MASK_DPMS_SUSPEND);
393 return EINA_FALSE;
394}
395
396EAPI Eina_Bool
397ecore_x_randr_edid_dpms_off_available_get(unsigned char *edid,
398 unsigned long edid_length)
399{
400 int version = ecore_x_randr_edid_version_get(edid, edid_length);
401
402 if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
403 if (edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] & _ECORE_X_RANDR_EDID_MASK_DPMS)
404 return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_DPMS] &
405 _ECORE_X_RANDR_EDID_MASK_DPMS_OFF);
406 return EINA_FALSE;
407}
408
409EAPI Eina_Bool
410ecore_x_randr_edid_display_type_digital_get(unsigned char *edid,
411 unsigned long edid_length)
412{
413 int version = ecore_x_randr_edid_version_get(edid, edid_length);
414
415 if (version < ECORE_X_RANDR_EDID_VERSION_13) return EINA_FALSE;
416 return !!(edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE] &
417 _ECORE_X_RANDR_EDID_MASK_DIGITAL);
418}
419
420EAPI Ecore_X_Randr_Edid_Display_Colorscheme
421ecore_x_randr_edid_display_colorscheme_get(unsigned char *edid,
422 unsigned long edid_length)
423{
424 Ecore_X_Randr_Edid_Display_Colorscheme colorscheme = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
425 int version = ecore_x_randr_edid_version_get(edid, edid_length);
426
427 if (version < ECORE_X_RANDR_EDID_VERSION_13) return colorscheme;
428 if (ecore_x_randr_edid_display_type_digital_get(edid, edid_length))
429 {
430 colorscheme = ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_4_4_4;
431 if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] &
432 _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_444)
433 colorscheme |= ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_4_4;
434 if (edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] &
435 _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_DIGITAL_YCRCB_422)
436 colorscheme |= ECORE_X_RANDR_EDID_DISPLAY_COLORSCHEME_COLOR_RGB_YCRCB_4_2_2;
437 }
438 else
439 colorscheme = edid[_ECORE_X_RANDR_EDID_OFFSET_COLORSPACE] & _ECORE_X_RANDR_EDID_MASK_COLORSCHEME_ANALOGOUS;
440 return colorscheme;
441}
442
443EAPI Ecore_X_Randr_Edid_Display_Interface_Type
444ecore_x_randr_edid_display_interface_type_get(unsigned char *edid,
445 unsigned long edid_length)
446{
447 Ecore_X_Randr_Edid_Display_Interface_Type type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
448 int version = ecore_x_randr_edid_version_get(edid, edid_length);
449
450 if (version < ECORE_X_RANDR_EDID_VERSION_13) return type;
451 type = edid[_ECORE_X_RANDR_EDID_OFFSET_TYPE] &
452 _ECORE_X_RANDR_EDID_MASK_INTERFACE_TYPE;
453 if (type > ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT)
454 type = ECORE_X_RANDR_EDID_UNKNOWN_VALUE;
455 return type;
456}
457
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_13.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_13.c
new file mode 100644
index 0000000..ab242f7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_randr_13.c
@@ -0,0 +1,63 @@
1/*
2 * vim:ts=8:sw=3:sts=8:expandtab:cino=>5n-3f0^-2{2
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8
9#include "ecore_x_private.h"
10#include "ecore_x_randr.h"
11
12#define Ecore_X_Randr_None 0
13#define Ecore_X_Randr_Unset -1
14
15#ifdef ECORE_XRANDR
16
17#define RANDR_1_3 ((1 << 16) | 3)
18#define RANDR_CHECK_1_3_RET(ret) if(_randr_version < RANDR_1_3) return ret
19
20extern XRRScreenResources *(*_ecore_x_randr_get_screen_resources)(Display *
21 dpy,
22 Window
23 window);
24extern int _randr_version;
25#endif
26
27/*
28 * @param root window which's screen should be queried
29 * @return Ecore_X_Randr_Ouptut_Id or - if query failed or none is set - Ecore_X_Randr_None
30 */
31EAPI Ecore_X_Randr_Output
32ecore_x_randr_primary_output_get(Ecore_X_Window root)
33{
34#ifdef ECORE_XRANDR
35 RANDR_CHECK_1_3_RET(Ecore_X_Randr_None);
36 if (!_ecore_x_randr_root_validate(root))
37 return Ecore_X_Randr_None;
38
39 return XRRGetOutputPrimary(_ecore_x_disp, root);
40#else
41 return Ecore_X_Randr_None;
42#endif
43}
44
45/*
46 * @param root window which's screen should be queried
47 * @param output that should be set as given root window's screen primary output
48 */
49EAPI void
50ecore_x_randr_primary_output_set(Ecore_X_Window root,
51 Ecore_X_Randr_Output output)
52{
53#ifdef ECORE_XRANDR
54 RANDR_CHECK_1_3_RET();
55
56 if (_ecore_x_randr_output_validate(root, output))
57 {
58 XRRSetOutputPrimary(_ecore_x_disp, root, output);
59 }
60
61#endif
62}
63
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_region.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_region.c
new file mode 100644
index 0000000..7cc66e3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_region.c
@@ -0,0 +1,158 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "ecore_x_private.h"
6
7/*
8 * [x] XCreateRegion
9 * [ ] XPolygonRegion
10 * [x] XSetRegion
11 * [x] XDestroyRegion
12 *
13 * [x] XOffsetRegion
14 * [ ] XShrinkRegion
15 *
16 * [ ] XClipBox
17 * [x] XIntersectRegion
18 * [x] XUnionRegion
19 * [x] XUnionRectWithRegion
20 * [x] XSubtractRegion
21 * [ ] XXorRegion
22 *
23 * [x] XEmptyRegion
24 * [x] XEqualRegion
25 *
26 * [x] XPointInRegion
27 * [x] XRectInRegion
28 */
29
30EAPI Ecore_X_XRegion *
31ecore_x_xregion_new()
32{
33 LOGFN(__FILE__, __LINE__, __FUNCTION__);
34 return (Ecore_X_XRegion *)XCreateRegion();
35} /* ecore_x_xregion_new */
36
37EAPI void
38ecore_x_xregion_free(Ecore_X_XRegion *region)
39{
40 LOGFN(__FILE__, __LINE__, __FUNCTION__);
41 if (!region)
42 return;
43
44 XDestroyRegion((Region)region);
45} /* ecore_x_xregion_free */
46
47EAPI Eina_Bool
48ecore_x_xregion_set(Ecore_X_XRegion *region,
49 Ecore_X_GC gc)
50{
51 LOGFN(__FILE__, __LINE__, __FUNCTION__);
52 return XSetRegion(_ecore_x_disp, gc, (Region)region) ? EINA_TRUE : EINA_FALSE;
53} /* ecore_x_xregion_set */
54
55EAPI void
56ecore_x_xregion_translate(Ecore_X_XRegion *region,
57 int x,
58 int y)
59{
60 LOGFN(__FILE__, __LINE__, __FUNCTION__);
61 if (!region)
62 return;
63
64 /* return value not used */
65 XOffsetRegion((Region)region, x, y);
66} /* ecore_x_xregion_translate */
67
68EAPI Eina_Bool
69ecore_x_xregion_intersect(Ecore_X_XRegion *dst,
70 Ecore_X_XRegion *r1,
71 Ecore_X_XRegion *r2)
72{
73 LOGFN(__FILE__, __LINE__, __FUNCTION__);
74 return XIntersectRegion((Region)r1, (Region)r2, (Region)dst) ? EINA_TRUE : EINA_FALSE;
75} /* ecore_x_xregion_intersect */
76
77EAPI Eina_Bool
78ecore_x_xregion_union(Ecore_X_XRegion *dst,
79 Ecore_X_XRegion *r1,
80 Ecore_X_XRegion *r2)
81{
82 LOGFN(__FILE__, __LINE__, __FUNCTION__);
83 return XUnionRegion((Region)r1, (Region)r2, (Region)dst) ? EINA_TRUE : EINA_FALSE;
84} /* ecore_x_xregion_union */
85
86EAPI Eina_Bool
87ecore_x_xregion_union_rect(Ecore_X_XRegion *dst,
88 Ecore_X_XRegion *src,
89 Ecore_X_Rectangle *rect)
90{
91 XRectangle xr;
92
93 LOGFN(__FILE__, __LINE__, __FUNCTION__);
94 xr.x = rect->x;
95 xr.y = rect->y;
96 xr.width = rect->width;
97 xr.height = rect->height;
98
99 return XUnionRectWithRegion(&xr, (Region)src, (Region)dst) ? EINA_TRUE : EINA_FALSE;
100} /* ecore_x_xregion_union_rect */
101
102EAPI Eina_Bool
103ecore_x_xregion_subtract(Ecore_X_XRegion *dst,
104 Ecore_X_XRegion *rm,
105 Ecore_X_XRegion *rs)
106{
107 LOGFN(__FILE__, __LINE__, __FUNCTION__);
108 return XSubtractRegion((Region)rm, (Region)rs, (Region)dst) ? EINA_TRUE : EINA_FALSE;
109} /* ecore_x_xregion_subtract */
110
111EAPI Eina_Bool
112ecore_x_xregion_is_empty(Ecore_X_XRegion *region)
113{
114 if (!region)
115 return EINA_TRUE;
116
117 LOGFN(__FILE__, __LINE__, __FUNCTION__);
118 return XEmptyRegion((Region)region) ? EINA_TRUE : EINA_FALSE;
119} /* ecore_x_xregion_is_empty */
120
121EAPI Eina_Bool
122ecore_x_xregion_is_equal(Ecore_X_XRegion *r1,
123 Ecore_X_XRegion *r2)
124{
125 if (!r1 || !r2)
126 return EINA_FALSE;
127
128 LOGFN(__FILE__, __LINE__, __FUNCTION__);
129 return XEqualRegion((Region)r1, (Region)r1) ? EINA_TRUE : EINA_FALSE;
130} /* ecore_x_xregion_is_equal */
131
132EAPI Eina_Bool
133ecore_x_xregion_point_contain(Ecore_X_XRegion *region,
134 int x,
135 int y)
136{
137 if (!region)
138 return EINA_FALSE;
139
140 LOGFN(__FILE__, __LINE__, __FUNCTION__);
141 return XPointInRegion((Region)region, x, y) ? EINA_TRUE : EINA_FALSE;
142} /* ecore_x_xregion_point_contain */
143
144EAPI Eina_Bool
145ecore_x_xregion_rect_contain(Ecore_X_XRegion *region,
146 Ecore_X_Rectangle *rect)
147{
148 if (!region || !rect)
149 return EINA_FALSE;
150
151 LOGFN(__FILE__, __LINE__, __FUNCTION__);
152 return XRectInRegion((Region)region,
153 rect->x,
154 rect->y,
155 rect->width,
156 rect->height) ? EINA_TRUE : EINA_FALSE;
157} /* ecore_x_xregion_rect_contain */
158
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_screensaver.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_screensaver.c
new file mode 100644
index 0000000..a3bca67
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_screensaver.c
@@ -0,0 +1,173 @@
1/*
2 * Screensaver code
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif /* ifdef HAVE_CONFIG_H */
8
9#include "Ecore.h"
10#include "ecore_x_private.h"
11#include "Ecore_X.h"
12#include "Ecore_X_Atoms.h"
13
14static int _screensaver_available = -1;
15
16EAPI Eina_Bool
17ecore_x_screensaver_event_available_get(void)
18{
19 if (_screensaver_available >= 0)
20 return _screensaver_available;
21
22#ifdef ECORE_XSS
23 int _screensaver_major, _screensaver_minor;
24
25 LOGFN(__FILE__, __LINE__, __FUNCTION__);
26 _screensaver_major = 1;
27 _screensaver_minor = 0;
28
29 if (XScreenSaverQueryVersion(_ecore_x_disp, &_screensaver_major,
30 &_screensaver_minor))
31 _screensaver_available = 1;
32 else
33 _screensaver_available = 0;
34
35#else /* ifdef ECORE_XSS */
36 _screensaver_available = 0;
37#endif /* ifdef ECORE_XSS */
38 return _screensaver_available;
39} /* ecore_x_screensaver_event_available_get */
40
41EAPI int
42ecore_x_screensaver_idle_time_get(void)
43{
44#ifdef ECORE_XSS
45 XScreenSaverInfo *xss;
46 int idle;
47
48 LOGFN(__FILE__, __LINE__, __FUNCTION__);
49 xss = XScreenSaverAllocInfo();
50 XScreenSaverQueryInfo(_ecore_x_disp,
51 RootWindow(_ecore_x_disp, DefaultScreen(
52 _ecore_x_disp)), xss);
53 idle = xss->idle / 1000;
54 XFree(xss);
55
56 return idle;
57#else
58 return 0;
59#endif /* ifdef ECORE_XSS */
60} /* ecore_x_screensaver_idle_time_get */
61
62EAPI void
63ecore_x_screensaver_set(int timeout,
64 int interval,
65 int prefer_blanking,
66 int allow_exposures)
67{
68 LOGFN(__FILE__, __LINE__, __FUNCTION__);
69 XSetScreenSaver(_ecore_x_disp,
70 timeout,
71 interval,
72 prefer_blanking,
73 allow_exposures);
74} /* ecore_x_screensaver_set */
75
76EAPI void
77ecore_x_screensaver_timeout_set(int timeout)
78{
79 int pto, pint, pblank, pexpo;
80
81 LOGFN(__FILE__, __LINE__, __FUNCTION__);
82 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
83 XSetScreenSaver(_ecore_x_disp, timeout, pint, pblank, pexpo);
84} /* ecore_x_screensaver_timeout_set */
85
86EAPI int
87ecore_x_screensaver_timeout_get(void)
88{
89 int pto, pint, pblank, pexpo;
90
91 LOGFN(__FILE__, __LINE__, __FUNCTION__);
92 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
93 return pto;
94} /* ecore_x_screensaver_timeout_get */
95
96EAPI void
97ecore_x_screensaver_blank_set(int blank)
98{
99 int pto, pint, pblank, pexpo;
100
101 LOGFN(__FILE__, __LINE__, __FUNCTION__);
102 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
103 XSetScreenSaver(_ecore_x_disp, pto, pint, blank, pexpo);
104} /* ecore_x_screensaver_blank_set */
105
106EAPI int
107ecore_x_screensaver_blank_get(void)
108{
109 int pto, pint, pblank, pexpo;
110
111 LOGFN(__FILE__, __LINE__, __FUNCTION__);
112 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
113 return pblank;
114} /* ecore_x_screensaver_blank_get */
115
116EAPI void
117ecore_x_screensaver_expose_set(int expose)
118{
119 int pto, pint, pblank, pexpo;
120
121 LOGFN(__FILE__, __LINE__, __FUNCTION__);
122 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
123 XSetScreenSaver(_ecore_x_disp, pto, pint, pblank, expose);
124} /* ecore_x_screensaver_expose_set */
125
126EAPI int
127ecore_x_screensaver_expose_get(void)
128{
129 int pto, pint, pblank, pexpo;
130
131 LOGFN(__FILE__, __LINE__, __FUNCTION__);
132 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
133 return pexpo;
134} /* ecore_x_screensaver_expose_get */
135
136EAPI void
137ecore_x_screensaver_interval_set(int interval)
138{
139 int pto, pint, pblank, pexpo;
140
141 LOGFN(__FILE__, __LINE__, __FUNCTION__);
142 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
143 XSetScreenSaver(_ecore_x_disp, pto, interval, pblank, pexpo);
144} /* ecore_x_screensaver_interval_set */
145
146EAPI int
147ecore_x_screensaver_interval_get(void)
148{
149 int pto, pint, pblank, pexpo;
150
151 LOGFN(__FILE__, __LINE__, __FUNCTION__);
152 XGetScreenSaver(_ecore_x_disp, &pto, &pint, &pblank, &pexpo);
153 return pint;
154} /* ecore_x_screensaver_interval_get */
155
156EAPI void
157ecore_x_screensaver_event_listen_set(Eina_Bool on)
158{
159#ifdef ECORE_XSS
160 Ecore_X_Window root;
161
162 LOGFN(__FILE__, __LINE__, __FUNCTION__);
163 root = DefaultRootWindow(_ecore_x_disp);
164 if (on)
165 XScreenSaverSelectInput(_ecore_x_disp, root, ScreenSaverNotifyMask);
166 else
167 XScreenSaverSelectInput(_ecore_x_disp, root, 0);
168#else
169 return;
170 on = EINA_FALSE;
171#endif /* ifdef ECORE_XSS */
172} /* ecore_x_screensaver_event_listen_set */
173
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c
new file mode 100644
index 0000000..b1aa611
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_selection.c
@@ -0,0 +1,1001 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6#include <string.h>
7
8#include "Ecore.h"
9#include "ecore_private.h"
10#include "ecore_x_private.h"
11#include "Ecore_X.h"
12#include "Ecore_X_Atoms.h"
13
14static Ecore_X_Selection_Intern selections[4];
15static Ecore_X_Selection_Converter *converters = NULL;
16static Ecore_X_Selection_Parser *parsers = NULL;
17
18static Eina_Bool _ecore_x_selection_converter_text(char *target,
19 void *data,
20 int size,
21 void **data_ret,
22 int *size_ret,
23 Ecore_X_Atom *tprop,
24 int *);
25static int _ecore_x_selection_data_default_free(void *data);
26static void *_ecore_x_selection_parser_files(const char *target,
27 void *data,
28 int size,
29 int format);
30static int _ecore_x_selection_data_files_free(void *data);
31static void *_ecore_x_selection_parser_text(const char *target,
32 void *data,
33 int size,
34 int format);
35static int _ecore_x_selection_data_text_free(void *data);
36static void *_ecore_x_selection_parser_targets(const char *target,
37 void *data,
38 int size,
39 int format);
40static int _ecore_x_selection_data_targets_free(void *data);
41
42#define ECORE_X_SELECTION_DATA(x) ((Ecore_X_Selection_Data *)(x))
43
44void
45_ecore_x_selection_data_init(void)
46{
47 /* Initialize global data */
48 memset(selections, 0, sizeof(selections));
49
50 /* Initialize converters */
51 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_TEXT,
52 _ecore_x_selection_converter_text);
53#ifdef X_HAVE_UTF8_STRING
54 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_UTF8_STRING,
55 _ecore_x_selection_converter_text);
56#endif /* ifdef X_HAVE_UTF8_STRING */
57 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_COMPOUND_TEXT,
58 _ecore_x_selection_converter_text);
59 ecore_x_selection_converter_atom_add(ECORE_X_ATOM_STRING,
60 _ecore_x_selection_converter_text);
61
62 /* Initialize parsers */
63 ecore_x_selection_parser_add("text/plain",
64 _ecore_x_selection_parser_text);
65 ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_UTF8_STRING,
66 _ecore_x_selection_parser_text);
67 ecore_x_selection_parser_add("text/uri-list",
68 _ecore_x_selection_parser_files);
69 ecore_x_selection_parser_add("_NETSCAPE_URL",
70 _ecore_x_selection_parser_files);
71 ecore_x_selection_parser_add(ECORE_X_SELECTION_TARGET_TARGETS,
72 _ecore_x_selection_parser_targets);
73} /* _ecore_x_selection_data_init */
74
75void
76_ecore_x_selection_shutdown(void)
77{
78 Ecore_X_Selection_Converter *cnv;
79 Ecore_X_Selection_Parser *prs;
80
81 /* free the selection converters */
82 cnv = converters;
83 while (cnv)
84 {
85 Ecore_X_Selection_Converter *tmp;
86
87 tmp = cnv->next;
88 free(cnv);
89 cnv = tmp;
90 }
91 converters = NULL;
92
93 /* free the selection parsers */
94 prs = parsers;
95 while (prs)
96 {
97 Ecore_X_Selection_Parser *tmp;
98
99 tmp = prs;
100 prs = prs->next;
101 free(tmp->target);
102 free(tmp);
103 }
104 parsers = NULL;
105} /* _ecore_x_selection_shutdown */
106
107Ecore_X_Selection_Intern *
108_ecore_x_selection_get(Ecore_X_Atom selection)
109{
110 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
111 return &selections[0];
112 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
113 return &selections[1];
114 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
115 return &selections[2];
116 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
117 return &selections[3];
118 else
119 return NULL;
120} /* _ecore_x_selection_get */
121
122Eina_Bool
123_ecore_x_selection_set(Window w,
124 const void *data,
125 int size,
126 Ecore_X_Atom selection)
127{
128 int in;
129 unsigned char *buf = NULL;
130
131 XSetSelectionOwner(_ecore_x_disp, selection, w, _ecore_x_event_last_time);
132 if (XGetSelectionOwner(_ecore_x_disp, selection) != w)
133 return EINA_FALSE;
134
135 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
136 in = 0;
137 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
138 in = 1;
139 else if (selection == ECORE_X_ATOM_SELECTION_XDND)
140 in = 2;
141 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
142 in = 3;
143 else
144 return EINA_FALSE;
145
146 if (data)
147 {
148 selections[in].win = w;
149 selections[in].selection = selection;
150 selections[in].length = size;
151 selections[in].time = _ecore_x_event_last_time;
152
153 buf = malloc(size);
154 if (!buf) return EINA_FALSE;
155 memcpy(buf, data, size);
156 selections[in].data = buf;
157 }
158 else if (selections[in].data)
159 {
160 free(selections[in].data);
161 memset(&selections[in], 0, sizeof(Ecore_X_Selection_Data));
162 }
163
164 return EINA_TRUE;
165} /* _ecore_x_selection_set */
166
167/**
168 * Claim ownership of the PRIMARY selection and set its data.
169 * @param w The window to which this selection belongs
170 * @param data The data associated with the selection
171 * @param size The size of the data buffer in bytes
172 * @return Returns 1 if the ownership of the selection was successfully
173 * claimed, or 0 if unsuccessful.
174 */
175EAPI Eina_Bool
176ecore_x_selection_primary_set(Ecore_X_Window w,
177 const void *data,
178 int size)
179{
180 LOGFN(__FILE__, __LINE__, __FUNCTION__);
181 return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_PRIMARY);
182} /* ecore_x_selection_primary_set */
183
184/**
185 * Release ownership of the primary selection
186 * @return Returns 1 if the selection was successfully cleared,
187 * or 0 if unsuccessful.
188 *
189 */
190EAPI Eina_Bool
191ecore_x_selection_primary_clear(void)
192{
193 LOGFN(__FILE__, __LINE__, __FUNCTION__);
194 return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_PRIMARY);
195} /* ecore_x_selection_primary_clear */
196
197/**
198 * Claim ownership of the SECONDARY selection and set its data.
199 * @param w The window to which this selection belongs
200 * @param data The data associated with the selection
201 * @param size The size of the data buffer in bytes
202 * @return Returns 1 if the ownership of the selection was successfully
203 * claimed, or 0 if unsuccessful.
204 */
205EAPI Eina_Bool
206ecore_x_selection_secondary_set(Ecore_X_Window w,
207 const void *data,
208 int size)
209{
210 LOGFN(__FILE__, __LINE__, __FUNCTION__);
211 return _ecore_x_selection_set(w,
212 data,
213 size,
214 ECORE_X_ATOM_SELECTION_SECONDARY);
215} /* ecore_x_selection_secondary_set */
216
217/**
218 * Release ownership of the secondary selection
219 * @return Returns 1 if the selection was successfully cleared,
220 * or 0 if unsuccessful.
221 *
222 */
223EAPI Eina_Bool
224ecore_x_selection_secondary_clear(void)
225{
226 LOGFN(__FILE__, __LINE__, __FUNCTION__);
227 return _ecore_x_selection_set(None,
228 NULL,
229 0,
230 ECORE_X_ATOM_SELECTION_SECONDARY);
231} /* ecore_x_selection_secondary_clear */
232
233/**
234 * Claim ownership of the XDND selection and set its data.
235 * @param w The window to which this selection belongs
236 * @param data The data associated with the selection
237 * @param size The size of the data buffer in bytes
238 * @return Returns 1 if the ownership of the selection was successfully
239 * claimed, or 0 if unsuccessful.
240 */
241EAPI Eina_Bool
242ecore_x_selection_xdnd_set(Ecore_X_Window w,
243 const void *data,
244 int size)
245{
246 LOGFN(__FILE__, __LINE__, __FUNCTION__);
247 return _ecore_x_selection_set(w, data, size, ECORE_X_ATOM_SELECTION_XDND);
248} /* ecore_x_selection_xdnd_set */
249
250/**
251 * Release ownership of the XDND selection
252 * @return Returns 1 if the selection was successfully cleared,
253 * or 0 if unsuccessful.
254 *
255 */
256EAPI Eina_Bool
257ecore_x_selection_xdnd_clear(void)
258{
259 LOGFN(__FILE__, __LINE__, __FUNCTION__);
260 return _ecore_x_selection_set(None, NULL, 0, ECORE_X_ATOM_SELECTION_XDND);
261} /* ecore_x_selection_xdnd_clear */
262
263/**
264 * Claim ownership of the CLIPBOARD selection and set its data.
265 * @param w The window to which this selection belongs
266 * @param data The data associated with the selection
267 * @param size The size of the data buffer in bytes
268 * @return Returns 1 if the ownership of the selection was successfully
269 * claimed, or 0 if unsuccessful.
270 *
271 * Get the converted data from a previous CLIPBOARD selection
272 * request. The buffer must be freed when done with.
273 */
274EAPI Eina_Bool
275ecore_x_selection_clipboard_set(Ecore_X_Window w,
276 const void *data,
277 int size)
278{
279 LOGFN(__FILE__, __LINE__, __FUNCTION__);
280 return _ecore_x_selection_set(w,
281 data,
282 size,
283 ECORE_X_ATOM_SELECTION_CLIPBOARD);
284} /* ecore_x_selection_clipboard_set */
285
286/**
287 * Release ownership of the clipboard selection
288 * @return Returns 1 if the selection was successfully cleared,
289 * or 0 if unsuccessful.
290 *
291 */
292EAPI Eina_Bool
293ecore_x_selection_clipboard_clear(void)
294{
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
296 return _ecore_x_selection_set(None,
297 NULL,
298 0,
299 ECORE_X_ATOM_SELECTION_CLIPBOARD);
300} /* ecore_x_selection_clipboard_clear */
301
302Ecore_X_Atom
303_ecore_x_selection_target_atom_get(const char *target)
304{
305 Ecore_X_Atom x_target;
306
307 if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
308 x_target = ECORE_X_ATOM_TEXT;
309 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
310 x_target = ECORE_X_ATOM_COMPOUND_TEXT;
311 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
312 x_target = ECORE_X_ATOM_STRING;
313 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
314 x_target = ECORE_X_ATOM_UTF8_STRING;
315 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_FILENAME))
316 x_target = ECORE_X_ATOM_FILE_NAME;
317 else
318 x_target = ecore_x_atom_get(target);
319
320 return x_target;
321} /* _ecore_x_selection_target_atom_get */
322
323char *
324_ecore_x_selection_target_get(Ecore_X_Atom target)
325{
326 /* FIXME: Should not return mem allocated with strdup or X mixed,
327 * one should use free to free, the other XFree */
328 if (target == ECORE_X_ATOM_FILE_NAME)
329 return strdup(ECORE_X_SELECTION_TARGET_FILENAME);
330 else if (target == ECORE_X_ATOM_STRING)
331 return strdup(ECORE_X_SELECTION_TARGET_STRING);
332 else if (target == ECORE_X_ATOM_UTF8_STRING)
333 return strdup(ECORE_X_SELECTION_TARGET_UTF8_STRING);
334 else if (target == ECORE_X_ATOM_TEXT)
335 return strdup(ECORE_X_SELECTION_TARGET_TEXT);
336 else
337 return XGetAtomName(_ecore_x_disp, target);
338} /* _ecore_x_selection_target_get */
339
340static void
341_ecore_x_selection_request(Ecore_X_Window w,
342 Ecore_X_Atom selection,
343 const char *target_str)
344{
345 Ecore_X_Atom target, prop;
346
347 target = _ecore_x_selection_target_atom_get(target_str);
348
349 if (selection == ECORE_X_ATOM_SELECTION_PRIMARY)
350 prop = ECORE_X_ATOM_SELECTION_PROP_PRIMARY;
351 else if (selection == ECORE_X_ATOM_SELECTION_SECONDARY)
352 prop = ECORE_X_ATOM_SELECTION_PROP_SECONDARY;
353 else if (selection == ECORE_X_ATOM_SELECTION_CLIPBOARD)
354 prop = ECORE_X_ATOM_SELECTION_PROP_CLIPBOARD;
355 else
356 return;
357
358 XConvertSelection(_ecore_x_disp, selection, target, prop,
359 w, CurrentTime);
360} /* _ecore_x_selection_request */
361
362EAPI void
363ecore_x_selection_primary_request(Ecore_X_Window w,
364 const char *target)
365{
366 LOGFN(__FILE__, __LINE__, __FUNCTION__);
367 _ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_PRIMARY, target);
368} /* ecore_x_selection_primary_request */
369
370EAPI void
371ecore_x_selection_secondary_request(Ecore_X_Window w,
372 const char *target)
373{
374 LOGFN(__FILE__, __LINE__, __FUNCTION__);
375 _ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_SECONDARY, target);
376} /* ecore_x_selection_secondary_request */
377
378EAPI void
379ecore_x_selection_xdnd_request(Ecore_X_Window w,
380 const char *target)
381{
382 Ecore_X_Atom atom;
383 Ecore_X_DND_Target *_target;
384
385 LOGFN(__FILE__, __LINE__, __FUNCTION__);
386 _target = _ecore_x_dnd_target_get();
387 atom = _ecore_x_selection_target_atom_get(target);
388 XConvertSelection(_ecore_x_disp, ECORE_X_ATOM_SELECTION_XDND, atom,
389 ECORE_X_ATOM_SELECTION_PROP_XDND, w,
390 _target->time);
391} /* ecore_x_selection_xdnd_request */
392
393EAPI void
394ecore_x_selection_clipboard_request(Ecore_X_Window w,
395 const char *target)
396{
397 LOGFN(__FILE__, __LINE__, __FUNCTION__);
398 _ecore_x_selection_request(w, ECORE_X_ATOM_SELECTION_CLIPBOARD, target);
399} /* ecore_x_selection_clipboard_request */
400
401EAPI void
402ecore_x_selection_converter_atom_add(Ecore_X_Atom target,
403 Eina_Bool (*func)(char *target,
404 void *data,
405 int size,
406 void **data_ret,
407 int *size_ret,
408 Ecore_X_Atom *ttype,
409 int *tsize))
410{
411 Ecore_X_Selection_Converter *cnv;
412
413 LOGFN(__FILE__, __LINE__, __FUNCTION__);
414 cnv = converters;
415 if (converters)
416 {
417 while (1)
418 {
419 if (cnv->target == target)
420 {
421 cnv->convert = func;
422 return;
423 }
424
425 if (cnv->next)
426 cnv = cnv->next;
427 else
428 break;
429 }
430
431 cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
432 if (!cnv->next) return;
433 cnv = cnv->next;
434 }
435 else
436 {
437 converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
438 if (!converters) return;
439 cnv = converters;
440 }
441
442 cnv->target = target;
443 cnv->convert = func;
444} /* ecore_x_selection_converter_atom_add */
445
446EAPI void
447ecore_x_selection_converter_add(char *target,
448 Eina_Bool (*func)(char *target,
449 void *data,
450 int size,
451 void **data_ret,
452 int *size_ret,
453 Ecore_X_Atom *,
454 int *))
455{
456 Ecore_X_Atom x_target;
457
458 if (!func || !target)
459 return;
460
461 LOGFN(__FILE__, __LINE__, __FUNCTION__);
462 x_target = _ecore_x_selection_target_atom_get(target);
463
464 ecore_x_selection_converter_atom_add(x_target, func);
465} /* ecore_x_selection_converter_add */
466
467EAPI void
468ecore_x_selection_converter_atom_del(Ecore_X_Atom target)
469{
470 Ecore_X_Selection_Converter *cnv, *prev_cnv;
471
472 LOGFN(__FILE__, __LINE__, __FUNCTION__);
473 prev_cnv = NULL;
474 cnv = converters;
475
476 while (cnv)
477 {
478 if (cnv->target == target)
479 {
480 if (prev_cnv)
481 prev_cnv->next = cnv->next;
482 else
483 {
484 converters = cnv->next; /* This was the first converter */
485 }
486
487 free(cnv);
488
489 return;
490 }
491
492 prev_cnv = cnv;
493 cnv = cnv->next;
494 }
495} /* ecore_x_selection_converter_atom_del */
496
497EAPI void
498ecore_x_selection_converter_del(char *target)
499{
500 Ecore_X_Atom x_target;
501
502 if (!target)
503 return;
504
505 LOGFN(__FILE__, __LINE__, __FUNCTION__);
506 x_target = _ecore_x_selection_target_atom_get(target);
507 ecore_x_selection_converter_atom_del(x_target);
508} /* ecore_x_selection_converter_del */
509
510EAPI Eina_Bool
511ecore_x_selection_notify_send(Ecore_X_Window requestor,
512 Ecore_X_Atom selection,
513 Ecore_X_Atom target,
514 Ecore_X_Atom property,
515 Ecore_X_Time tim)
516{
517 XEvent xev;
518 XSelectionEvent xnotify;
519
520 LOGFN(__FILE__, __LINE__, __FUNCTION__);
521 xnotify.type = SelectionNotify;
522 xnotify.display = _ecore_x_disp;
523 xnotify.requestor = requestor;
524 xnotify.selection = selection;
525 xnotify.target = target;
526 xnotify.property = property;
527 xnotify.time = tim;
528 xnotify.send_event = True;
529 xnotify.serial = 0;
530
531 xev.xselection = xnotify;
532 return (XSendEvent(_ecore_x_disp, requestor, False, 0, &xev) > 0) ? EINA_TRUE : EINA_FALSE;
533} /* ecore_x_selection_notify_send */
534
535/* Locate and run conversion callback for specified selection target */
536EAPI Eina_Bool
537ecore_x_selection_convert(Ecore_X_Atom selection,
538 Ecore_X_Atom target,
539 void **data_ret,
540 int *size,
541 Ecore_X_Atom *targtype,
542 int *typesize)
543{
544 Ecore_X_Selection_Intern *sel;
545 Ecore_X_Selection_Converter *cnv;
546 void *data;
547 char *tgt_str;
548
549 LOGFN(__FILE__, __LINE__, __FUNCTION__);
550 sel = _ecore_x_selection_get(selection);
551 tgt_str = _ecore_x_selection_target_get(target);
552
553 for (cnv = converters; cnv; cnv = cnv->next)
554 {
555 if (cnv->target == target)
556 {
557 int r;
558 r = cnv->convert(tgt_str, sel->data, sel->length, &data, size,
559 targtype, typesize);
560 free(tgt_str);
561 if (r)
562 {
563 *data_ret = data;
564 return r;
565 }
566 else
567 return EINA_FALSE;
568 }
569 }
570
571 /* ICCCM says "If the selection cannot be converted into a form based on the target (and parameters, if any), the owner should refuse the SelectionRequest as previously described." */
572 return EINA_FALSE;
573
574 /* Default, just return the data
575 *data_ret = malloc(sel->length);
576 memcpy(*data_ret, sel->data, sel->length);
577 free(tgt_str);
578 return 1;
579 */
580} /* ecore_x_selection_convert */
581
582/* TODO: We need to work out a mechanism for automatic conversion to any requested
583 * locale using Ecore_Txt functions */
584/* Converter for standard non-utf8 text targets */
585static Eina_Bool
586_ecore_x_selection_converter_text(char *target,
587 void *data,
588 int size,
589 void **data_ret,
590 int *size_ret,
591 Ecore_X_Atom *targprop __UNUSED__,
592 int *s __UNUSED__)
593{
594 XTextProperty text_prop;
595 char *mystr;
596 XICCEncodingStyle style;
597
598 if (!data || !size)
599 return EINA_FALSE;
600
601 LOGFN(__FILE__, __LINE__, __FUNCTION__);
602 if (!strcmp(target, ECORE_X_SELECTION_TARGET_TEXT))
603 style = XTextStyle;
604 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_COMPOUND_TEXT))
605 style = XCompoundTextStyle;
606 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_STRING))
607 style = XStringStyle;
608
609#ifdef X_HAVE_UTF8_STRING
610 else if (!strcmp(target, ECORE_X_SELECTION_TARGET_UTF8_STRING))
611 style = XUTF8StringStyle;
612#endif /* ifdef X_HAVE_UTF8_STRING */
613 else
614 return EINA_FALSE;
615
616 mystr = alloca(size + 1);
617 memcpy(mystr, data, size);
618 mystr[size] = '\0';
619
620#ifdef X_HAVE_UTF8_STRING
621 if (Xutf8TextListToTextProperty(_ecore_x_disp, &mystr, 1, style,
622 &text_prop) == Success)
623 {
624 int bufsize = strlen((char *)text_prop.value) + 1;
625 *data_ret = malloc(bufsize);
626 if (!*data_ret)
627 {
628 return EINA_FALSE;
629 }
630 memcpy(*data_ret, text_prop.value, bufsize);
631 *size_ret = bufsize;
632 XFree(text_prop.value);
633 return EINA_TRUE;
634 }
635
636#else /* ifdef X_HAVE_UTF8_STRING */
637 if (XmbTextListToTextProperty(_ecore_x_disp, &mystr, 1, style,
638 &text_prop) == Success)
639 {
640 int bufsize = strlen(text_prop.value) + 1;
641 *data_ret = malloc(bufsize);
642 if (!*data_ret) return EINA_FALSE;
643 memcpy(*data_ret, text_prop.value, bufsize);
644 *size_ret = bufsize;
645 XFree(text_prop.value);
646 return EINA_TRUE;
647 }
648
649#endif /* ifdef X_HAVE_UTF8_STRING */
650 else
651 {
652 return EINA_TRUE;
653 }
654} /* _ecore_x_selection_converter_text */
655
656EAPI void
657ecore_x_selection_parser_add(const char *target,
658 void *(*func)(const char *target, void *data,
659 int size,
660 int format))
661{
662 Ecore_X_Selection_Parser *prs;
663
664 if (!target)
665 return;
666
667 LOGFN(__FILE__, __LINE__, __FUNCTION__);
668 prs = parsers;
669 if (parsers)
670 {
671 while (prs->next)
672 {
673 if (!strcmp(prs->target, target))
674 {
675 prs->parse = func;
676 return;
677 }
678
679 prs = prs->next;
680 }
681
682 prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
683 if (!prs->next) return;
684 prs = prs->next;
685 }
686 else
687 {
688 parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
689 if (!parsers) return;
690 prs = parsers;
691 }
692
693 prs->target = strdup(target);
694 prs->parse = func;
695} /* ecore_x_selection_parser_add */
696
697EAPI void
698ecore_x_selection_parser_del(const char *target)
699{
700 Ecore_X_Selection_Parser *prs, *prev_prs;
701
702 if (!target)
703 return;
704
705 LOGFN(__FILE__, __LINE__, __FUNCTION__);
706 prev_prs = NULL;
707 prs = parsers;
708
709 while (prs)
710 {
711 if (!strcmp(prs->target, target))
712 {
713 if (prev_prs)
714 prev_prs->next = prs->next;
715 else
716 {
717 parsers = prs->next; /* This was the first parser */
718 }
719
720 free(prs->target);
721 free(prs);
722
723 return;
724 }
725
726 prev_prs = prs;
727 prs = prs->next;
728 }
729} /* ecore_x_selection_parser_del */
730
731/**
732 * Change the owner and last-change time for the specified selection.
733 * @param win The owner of the specified atom.
734 * @param atom The selection atom
735 * @param time Specifies the time
736 * @since 1.1.0
737 */
738EAPI void
739ecore_x_selection_owner_set(Ecore_X_Window win,
740 Ecore_X_Atom atom,
741 Ecore_X_Time tim)
742{
743 XSetSelectionOwner(_ecore_x_disp, atom, win, tim);
744}
745
746/**
747 * Return the window that currently owns the specified selection.
748 *
749 * @param atom The specified selection atom.
750 *
751 * @return The window that currently owns the specified selection.
752 * @since 1.1.0
753 */
754EAPI Ecore_X_Window
755ecore_x_selection_owner_get(Ecore_X_Atom atom)
756{
757 return XGetSelectionOwner(_ecore_x_disp, atom);
758}
759
760/* Locate and run conversion callback for specified selection target */
761void *
762_ecore_x_selection_parse(const char *target,
763 void *data,
764 int size,
765 int format)
766{
767 Ecore_X_Selection_Parser *prs;
768 Ecore_X_Selection_Data *sel;
769
770 for (prs = parsers; prs; prs = prs->next)
771 {
772 if (!strcmp(prs->target, target))
773 {
774 sel = prs->parse(target, data, size, format);
775 if (sel) return sel;
776 }
777 }
778
779 /* Default, just return the data */
780 sel = calloc(1, sizeof(Ecore_X_Selection_Data));
781 if (!sel) return NULL;
782 sel->free = _ecore_x_selection_data_default_free;
783 sel->length = size;
784 sel->format = format;
785 sel->data = data;
786 return sel;
787} /* _ecore_x_selection_parse */
788
789static int
790_ecore_x_selection_data_default_free(void *data)
791{
792 Ecore_X_Selection_Data *sel;
793
794 sel = data;
795 free(sel->data);
796 free(sel);
797 return 1;
798} /* _ecore_x_selection_data_default_free */
799
800static void *
801_ecore_x_selection_parser_files(const char *target,
802 void *_data,
803 int size,
804 int format __UNUSED__)
805{
806 Ecore_X_Selection_Data_Files *sel;
807 char *t, *data = _data;
808 int i, is;
809 char *tmp;
810 char **t2;
811
812 if (strcmp(target, "text/uri-list") &&
813 strcmp(target, "_NETSCAPE_URL"))
814 return NULL;
815
816 sel = calloc(1, sizeof(Ecore_X_Selection_Data_Files));
817 if (!sel) return NULL;
818 ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_files_free;
819
820 if (data[size - 1])
821 {
822 /* Isn't nul terminated */
823 size++;
824 t = realloc(data, size);
825 if (!t)
826 {
827 free(sel);
828 return NULL;
829 }
830 data = t;
831 data[size - 1] = 0;
832 }
833
834 tmp = malloc(size);
835 if (!tmp)
836 {
837 free(sel);
838 return NULL;
839 }
840 i = 0;
841 is = 0;
842 while ((is < size) && (data[is]))
843 {
844 if ((i == 0) && (data[is] == '#'))
845 for (; ((data[is]) && (data[is] != '\n')); is++) ;
846 else
847 {
848 if ((data[is] != '\r') &&
849 (data[is] != '\n'))
850 tmp[i++] = data[is++];
851 else
852 {
853 while ((data[is] == '\r') || (data[is] == '\n')) is++;
854 tmp[i] = 0;
855 sel->num_files++;
856 t2 = realloc(sel->files, sel->num_files * sizeof(char *));
857 if (t2)
858 {
859 sel->files = t2;
860 sel->files[sel->num_files - 1] = strdup(tmp);
861 }
862 tmp[0] = 0;
863 i = 0;
864 }
865 }
866 }
867 if (i > 0)
868 {
869 tmp[i] = 0;
870 sel->num_files++;
871 t2 = realloc(sel->files, sel->num_files * sizeof(char *));
872 if (t2)
873 {
874 sel->files = t2;
875 sel->files[sel->num_files - 1] = strdup(tmp);
876 }
877 }
878
879 free(tmp);
880 free(data);
881
882 ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_FILES;
883 ECORE_X_SELECTION_DATA(sel)->length = sel->num_files;
884
885 return ECORE_X_SELECTION_DATA(sel);
886} /* _ecore_x_selection_parser_files */
887
888static int
889_ecore_x_selection_data_files_free(void *data)
890{
891 Ecore_X_Selection_Data_Files *sel;
892 int i;
893
894 sel = data;
895 if (sel->files)
896 {
897 for (i = 0; i < sel->num_files; i++)
898 free(sel->files[i]);
899 free(sel->files);
900 }
901
902 free(sel);
903 return 0;
904} /* _ecore_x_selection_data_files_free */
905
906static void *
907_ecore_x_selection_parser_text(const char *target __UNUSED__,
908 void *_data,
909 int size,
910 int format __UNUSED__)
911{
912 Ecore_X_Selection_Data_Text *sel;
913 unsigned char *data = _data;
914 void *t;
915
916 sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text));
917 if (!sel) return NULL;
918 if (data[size - 1])
919 {
920 /* Isn't nul terminated */
921 size++;
922 t = realloc(data, size);
923 if (!t)
924 {
925 free(sel);
926 return NULL;
927 }
928 data = t;
929 data[size - 1] = 0;
930 }
931
932 sel->text = (char *)data;
933 ECORE_X_SELECTION_DATA(sel)->length = size;
934 ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TEXT;
935 ECORE_X_SELECTION_DATA(sel)->data = data;
936 ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_text_free;
937 return sel;
938} /* _ecore_x_selection_parser_text */
939
940static int
941_ecore_x_selection_data_text_free(void *data)
942{
943 Ecore_X_Selection_Data_Text *sel;
944
945 sel = data;
946 free(sel->text);
947 free(sel);
948 return 1;
949} /* _ecore_x_selection_data_text_free */
950
951static void *
952_ecore_x_selection_parser_targets(const char *target __UNUSED__,
953 void *data,
954 int size,
955 int format __UNUSED__)
956{
957 Ecore_X_Selection_Data_Targets *sel;
958 unsigned long *targets;
959 int i;
960
961 sel = calloc(1, sizeof(Ecore_X_Selection_Data_Targets));
962 if (!sel) return NULL;
963 targets = (unsigned long *)data;
964
965 sel->num_targets = size - 2;
966 sel->targets = malloc((size - 2) * sizeof(char *));
967 if (!sel->targets)
968 {
969 free(sel);
970 return NULL;
971 }
972 for (i = 2; i < size; i++)
973 sel->targets[i - 2] = XGetAtomName(_ecore_x_disp, targets[i]);
974
975 ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_targets_free;
976 ECORE_X_SELECTION_DATA(sel)->content = ECORE_X_SELECTION_CONTENT_TARGETS;
977 ECORE_X_SELECTION_DATA(sel)->length = size;
978 ECORE_X_SELECTION_DATA(sel)->data = data;
979 return sel;
980} /* _ecore_x_selection_parser_targets */
981
982static int
983_ecore_x_selection_data_targets_free(void *data)
984{
985 Ecore_X_Selection_Data_Targets *sel;
986 int i;
987
988 sel = data;
989
990 if (sel->targets)
991 {
992 for (i = 0; i < sel->num_targets; i++)
993 XFree(sel->targets[i]);
994 free(sel->targets);
995 }
996
997 free(ECORE_X_SELECTION_DATA(sel)->data);
998 free(sel);
999 return 1;
1000} /* _ecore_x_selection_data_targets_free */
1001
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_sync.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_sync.c
new file mode 100644
index 0000000..e49fede
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_sync.c
@@ -0,0 +1,159 @@
1/*
2 * XSync code
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif /* ifdef HAVE_CONFIG_H */
8
9#include "Ecore.h"
10#include "ecore_x_private.h"
11#include "Ecore_X.h"
12#include "Ecore_X_Atoms.h"
13
14EAPI Ecore_X_Sync_Alarm
15ecore_x_sync_alarm_new(Ecore_X_Sync_Counter counter)
16{
17 Ecore_X_Sync_Alarm alarm;
18 XSyncAlarmAttributes values;
19 XSyncValue init;
20
21 LOGFN(__FILE__, __LINE__, __FUNCTION__);
22 XSyncIntToValue(&init, 0);
23 XSyncSetCounter(_ecore_x_disp, counter, init);
24
25 values.trigger.counter = counter;
26 values.trigger.value_type = XSyncAbsolute;
27 XSyncIntToValue(&values.trigger.wait_value, 1);
28 values.trigger.test_type = XSyncPositiveComparison;
29
30 XSyncIntToValue(&values.delta, 1);
31
32 values.events = True;
33
34 alarm = XSyncCreateAlarm(_ecore_x_disp,
35 XSyncCACounter |
36 XSyncCAValueType |
37 XSyncCAValue |
38 XSyncCATestType |
39 XSyncCADelta |
40 XSyncCAEvents,
41 &values);
42
43 ecore_x_sync();
44 return alarm;
45} /* ecore_x_sync_alarm_new */
46
47EAPI Eina_Bool
48ecore_x_sync_alarm_free(Ecore_X_Sync_Alarm alarm)
49{
50 LOGFN(__FILE__, __LINE__, __FUNCTION__);
51 return XSyncDestroyAlarm(_ecore_x_disp, alarm);
52} /* ecore_x_sync_alarm_free */
53
54EAPI Eina_Bool
55ecore_x_sync_counter_query(Ecore_X_Sync_Counter counter,
56 unsigned int *val)
57{
58 XSyncValue value;
59
60 LOGFN(__FILE__, __LINE__, __FUNCTION__);
61 if (XSyncQueryCounter(_ecore_x_disp, counter, &value))
62 {
63 *val = (unsigned int)XSyncValueLow32(value);
64 return EINA_TRUE;
65 }
66
67 return EINA_FALSE;
68} /* ecore_x_sync_counter_query */
69
70EAPI Ecore_X_Sync_Counter
71ecore_x_sync_counter_new(int val)
72{
73 XSyncCounter counter;
74 XSyncValue v;
75
76 LOGFN(__FILE__, __LINE__, __FUNCTION__);
77 XSyncIntToValue(&v, val);
78 counter = XSyncCreateCounter(_ecore_x_disp, v);
79 return counter;
80} /* ecore_x_sync_counter_new */
81
82EAPI void
83ecore_x_sync_counter_free(Ecore_X_Sync_Counter counter)
84{
85 LOGFN(__FILE__, __LINE__, __FUNCTION__);
86 XSyncDestroyCounter(_ecore_x_disp, counter);
87} /* ecore_x_sync_counter_free */
88
89EAPI void
90ecore_x_sync_counter_inc(Ecore_X_Sync_Counter counter,
91 int by)
92{
93 XSyncValue v;
94
95 LOGFN(__FILE__, __LINE__, __FUNCTION__);
96 XSyncIntToValue(&v, by);
97 XSyncChangeCounter(_ecore_x_disp, counter, v);
98} /* ecore_x_sync_counter_inc */
99
100EAPI void
101ecore_x_sync_counter_val_wait(Ecore_X_Sync_Counter counter,
102 int val)
103{
104 XSyncWaitCondition cond;
105 XSyncValue v, v2;
106
107 LOGFN(__FILE__, __LINE__, __FUNCTION__);
108 XSyncQueryCounter(_ecore_x_disp, counter, &v);
109 XSyncIntToValue(&v, val);
110 XSyncIntToValue(&v2, val + 1);
111 cond.trigger.counter = counter;
112 cond.trigger.value_type = XSyncAbsolute;
113 cond.trigger.wait_value = v;
114 cond.trigger.test_type = XSyncPositiveComparison;
115 cond.event_threshold = v2;
116 XSyncAwait(_ecore_x_disp, &cond, 1);
117// XSync(_ecore_x_disp, False); // dont need this
118} /* ecore_x_sync_counter_val_wait */
119
120EAPI void
121ecore_x_sync_counter_set(Ecore_X_Sync_Counter counter,
122 int val)
123{
124 XSyncValue v;
125
126 LOGFN(__FILE__, __LINE__, __FUNCTION__);
127 XSyncIntToValue(&v, val);
128 XSyncSetCounter(_ecore_x_disp, counter, v);
129}
130
131EAPI void
132ecore_x_sync_counter_2_set(Ecore_X_Sync_Counter counter,
133 int val_hi,
134 unsigned int val_lo)
135{
136 XSyncValue v;
137
138 LOGFN(__FILE__, __LINE__, __FUNCTION__);
139 XSyncIntsToValue(&v, val_lo, val_hi);
140 XSyncSetCounter(_ecore_x_disp, counter, v);
141}
142
143EAPI Eina_Bool
144ecore_x_sync_counter_2_query(Ecore_X_Sync_Counter counter,
145 int *val_hi,
146 unsigned int *val_lo)
147{
148 XSyncValue value;
149
150 LOGFN(__FILE__, __LINE__, __FUNCTION__);
151 if (XSyncQueryCounter(_ecore_x_disp, counter, &value))
152 {
153 *val_lo = (unsigned int)XSyncValueLow32(value);
154 *val_hi = (int)XSyncValueHigh32(value);
155 return EINA_TRUE;
156 }
157 return EINA_FALSE;
158}
159
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_test.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_test.c
new file mode 100644
index 0000000..c4576f9
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_test.c
@@ -0,0 +1,155 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6
7#ifdef ECORE_XTEST
8# include <X11/extensions/XTest.h>
9#endif /* ifdef ECORE_XTEST */
10
11#include "ecore_x_private.h"
12#include "Ecore_X.h"
13#include <string.h>
14
15EAPI Eina_Bool
16#ifdef ECORE_XTEST
17ecore_x_test_fake_key_down(const char *key)
18#else
19ecore_x_test_fake_key_down(const char *key __UNUSED__)
20#endif
21{
22#ifdef ECORE_XTEST
23 KeyCode keycode = 0;
24 KeySym keysym;
25
26 LOGFN(__FILE__, __LINE__, __FUNCTION__);
27 if (!strncmp(key, "Keycode-", 8))
28 keycode = atoi(key + 8);
29 else
30 {
31 keysym = XStringToKeysym(key);
32 if (keysym == NoSymbol)
33 return EINA_FALSE;
34
35 keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
36 }
37
38 if (keycode == 0)
39 return EINA_FALSE;
40
41 return XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0) ? EINA_TRUE : EINA_FALSE;
42#else /* ifdef ECORE_XTEST */
43 return EINA_FALSE;
44#endif /* ifdef ECORE_XTEST */
45} /* ecore_x_test_fake_key_down */
46
47EAPI Eina_Bool
48#ifdef ECORE_XTEST
49ecore_x_test_fake_key_up(const char *key)
50#else
51ecore_x_test_fake_key_up(const char *key __UNUSED__)
52#endif
53{
54#ifdef ECORE_XTEST
55 KeyCode keycode = 0;
56 KeySym keysym;
57
58 LOGFN(__FILE__, __LINE__, __FUNCTION__);
59 if (!strncmp(key, "Keycode-", 8))
60 keycode = atoi(key + 8);
61 else
62 {
63 keysym = XStringToKeysym(key);
64 if (keysym == NoSymbol)
65 return EINA_FALSE;
66
67 keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
68 }
69
70 if (keycode == 0)
71 return EINA_FALSE;
72
73 return XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0) ? EINA_TRUE : EINA_FALSE;
74#else /* ifdef ECORE_XTEST */
75 return EINA_FALSE;
76#endif /* ifdef ECORE_XTEST */
77} /* ecore_x_test_fake_key_up */
78
79EAPI Eina_Bool
80#ifdef ECORE_XTEST
81ecore_x_test_fake_key_press(const char *key)
82#else
83ecore_x_test_fake_key_press(const char *key __UNUSED__)
84#endif
85{
86#ifdef ECORE_XTEST
87 KeyCode keycode = 0;
88 KeySym keysym = 0;
89 int shift = 0;
90
91 LOGFN(__FILE__, __LINE__, __FUNCTION__);
92 if (!strncmp(key, "Keycode-", 8))
93 keycode = atoi(key + 8);
94 else
95 {
96 keysym = XStringToKeysym(key);
97 if (keysym == NoSymbol)
98 return EINA_FALSE;
99
100 keycode = XKeysymToKeycode(_ecore_x_disp, keysym);
101 if (XKeycodeToKeysym(_ecore_x_disp, keycode, 0) != keysym)
102 {
103 if (XKeycodeToKeysym(_ecore_x_disp, keycode, 1) == keysym)
104 shift = 1;
105 else
106 keycode = 0;
107 }
108 else
109 shift = 0;
110 }
111
112 if (keycode == 0)
113 {
114 static int mod = 0;
115 KeySym *keysyms;
116 int keycode_min, keycode_max, keycode_num;
117 int i;
118
119 XDisplayKeycodes(_ecore_x_disp, &keycode_min, &keycode_max);
120 keysyms = XGetKeyboardMapping(_ecore_x_disp, keycode_min,
121 keycode_max - keycode_min + 1,
122 &keycode_num);
123 mod = (mod + 1) & 0x7;
124 i = (keycode_max - keycode_min - mod - 1) * keycode_num;
125
126 keysyms[i] = keysym;
127 XChangeKeyboardMapping(_ecore_x_disp, keycode_min, keycode_num,
128 keysyms, (keycode_max - keycode_min));
129 XFree(keysyms);
130 XSync(_ecore_x_disp, False);
131 keycode = keycode_max - mod - 1;
132 }
133
134 if (shift)
135 XTestFakeKeyEvent(_ecore_x_disp,
136 XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 1, 0);
137
138 XTestFakeKeyEvent(_ecore_x_disp, keycode, 1, 0);
139 XTestFakeKeyEvent(_ecore_x_disp, keycode, 0, 0);
140 if (shift)
141 XTestFakeKeyEvent(_ecore_x_disp,
142 XKeysymToKeycode(_ecore_x_disp, XK_Shift_L), 0, 0);
143
144 return EINA_TRUE;
145#else /* ifdef ECORE_XTEST */
146 return EINA_FALSE;
147#endif /* ifdef ECORE_XTEST */
148} /* ecore_x_test_fake_key_press */
149
150EAPI const char *
151ecore_x_keysym_string_get(int keysym)
152{
153 return XKeysymToString(keysym);
154} /* ecore_x_keysym_string_get */
155
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_vsync.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_vsync.c
new file mode 100644
index 0000000..f054298
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_vsync.c
@@ -0,0 +1,351 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include "Ecore.h"
6#include "ecore_x_private.h"
7#include "Ecore_X.h"
8
9#include <string.h>
10#include <stdlib.h>
11#include <string.h>
12#include <unistd.h>
13#include <dlfcn.h>
14#include <sys/types.h>
15#include <sys/stat.h>
16#include <fcntl.h>
17
18#define ECORE_X_VSYNC_DRI2 1
19
20#ifdef ECORE_X_VSYNC_DRI2
21// relevant header bits of dri/drm inlined here to avoid needing external
22// headers to build
23/// drm
24typedef unsigned int drm_magic_t;
25
26typedef enum
27{
28 DRM_VBLANK_ABSOLUTE = 0x00000000,
29 DRM_VBLANK_RELATIVE = 0x00000001,
30 DRM_VBLANK_EVENT = 0x04000000,
31 DRM_VBLANK_FLIP = 0x08000000,
32 DRM_VBLANK_NEXTONMISS = 0x10000000,
33 DRM_VBLANK_SECONDARY = 0x20000000,
34 DRM_VBLANK_SIGNAL = 0x40000000
35}
36drmVBlankSeqType;
37
38typedef struct _drmVBlankReq
39{
40 drmVBlankSeqType type;
41 unsigned int sequence;
42 unsigned long signal;
43} drmVBlankReq;
44
45typedef struct _drmVBlankReply
46{
47 drmVBlankSeqType type;
48 unsigned int sequence;
49 long tval_sec;
50 long tval_usec;
51} drmVBlankReply;
52
53typedef union _drmVBlank
54{
55 drmVBlankReq request;
56 drmVBlankReply reply;
57} drmVBlank;
58
59#define DRM_EVENT_CONTEXT_VERSION 2
60
61typedef struct _drmEventContext
62{
63 int version;
64 void (*vblank_handler)(int fd,
65 unsigned int sequence,
66 unsigned int tv_sec,
67 unsigned int tv_usec,
68 void *user_data);
69 void (*page_flip_handler)(int fd,
70 unsigned int sequence,
71 unsigned int tv_sec,
72 unsigned int tv_usec,
73 void *user_data);
74} drmEventContext;
75
76static int (*sym_drmClose)(int fd) = NULL;
77static int (*sym_drmGetMagic)(int fd,
78 drm_magic_t *magic) = NULL;
79static int (*sym_drmWaitVBlank)(int fd,
80 drmVBlank *vbl) = NULL;
81static int (*sym_drmHandleEvent)(int fd,
82 drmEventContext *evctx) = NULL;
83
84//// dri
85
86static Bool (*sym_DRI2QueryExtension)(Display *display,
87 int *eventBase,
88 int *errorBase) = NULL;
89static Bool (*sym_DRI2QueryVersion)(Display *display,
90 int *major,
91 int *minor) = NULL;
92static Bool (*sym_DRI2Connect)(Display *display,
93 XID window,
94 char **driverName,
95 char **deviceName) = NULL;
96static Bool (*sym_DRI2Authenticate)(Display *display,
97 XID window,
98 drm_magic_t magic) = NULL;
99
100//// dri/drm data needed
101static int dri2_event = 0;
102static int dri2_error = 0;
103static int dri2_major = 0;
104static int dri2_minor = 0;
105static char *device_name = 0;
106static char *driver_name = 0;
107static drm_magic_t drm_magic;
108
109static int drm_fd = -1;
110static int drm_event_is_busy = 0;
111static int drm_animators_interval = 1;
112static drmEventContext drm_evctx;
113static Ecore_Fd_Handler *dri_drm_fdh = NULL;
114
115static void *dri_lib = NULL;
116static void *drm_lib = NULL;
117
118static Window dri_drm_vsync_root = 0;
119
120static void
121_dri_drm_tick_schedule(void)
122{
123 drmVBlank vbl;
124
125 vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT;
126 vbl.request.sequence = drm_animators_interval;
127 vbl.request.signal = 0;
128 sym_drmWaitVBlank(drm_fd, &vbl);
129}
130
131static void
132_dri_drm_tick_begin(void *data __UNUSED__)
133{
134 drm_event_is_busy = 1;
135 _dri_drm_tick_schedule();
136}
137
138static void
139_dri_drm_tick_end(void *data __UNUSED__)
140{
141 drm_event_is_busy = 0;
142}
143
144static void
145_dri_drm_vblank_handler(int fd __UNUSED__,
146 unsigned int frame __UNUSED__,
147 unsigned int sec __UNUSED__,
148 unsigned int usec __UNUSED__,
149 void *data __UNUSED__)
150{
151 ecore_animator_custom_tick();
152 if (drm_event_is_busy) _dri_drm_tick_schedule();
153}
154
155static Eina_Bool
156_dri_drm_cb(void *data __UNUSED__,
157 Ecore_Fd_Handler *fd_handler __UNUSED__)
158{
159 sym_drmHandleEvent(drm_fd, &drm_evctx);
160 return ECORE_CALLBACK_RENEW;
161}
162
163// yes. most evil. we dlopen libdrm and libGL etc. to manually find smbols
164// so we can be as compatible as possible given the whole mess of the
165// gl/dri/drm etc. world. and handle graceful failure at runtime not
166// compile time
167static int
168_dri_drm_link(void)
169{
170 const char *drm_libs[] =
171 {
172 "libdrm.so.2",
173 "libdrm.so.1",
174 "libdrm.so.0",
175 "libdrm.so",
176 NULL,
177 };
178 const char *dri_libs[] =
179 {
180 "libdri2.so.2",
181 "libdri2.so.1",
182 "libdri2.so.0",
183 "libdri2.so",
184 "libGL.so.4",
185 "libGL.so.3",
186 "libGL.so.2",
187 "libGL.so.1",
188 "libGL.so.0",
189 "libGL.so",
190 NULL,
191 };
192 int i, fail;
193#define SYM(lib, xx) \
194 do { \
195 sym_ ## xx = dlsym(lib, #xx); \
196 if (!(sym_ ## xx)) { \
197 fprintf(stderr, "%s\n", dlerror()); \
198 fail = 1; \
199 } \
200 } while (0)
201
202 if (dri_lib) return 1;
203 for (i = 0; drm_libs[i]; i++)
204 {
205 drm_lib = dlopen(drm_libs[i], RTLD_LOCAL | RTLD_LAZY);
206 if (drm_lib)
207 {
208 fail = 0;
209 SYM(drm_lib, drmClose);
210 SYM(drm_lib, drmWaitVBlank);
211 SYM(drm_lib, drmHandleEvent);
212 if (fail)
213 {
214 dlclose(drm_lib);
215 drm_lib = NULL;
216 }
217 else break;
218 }
219 }
220 if (!drm_lib) return 0;
221 for (i = 0; dri_libs[i]; i++)
222 {
223 dri_lib = dlopen(dri_libs[i], RTLD_LOCAL | RTLD_LAZY);
224 if (dri_lib)
225 {
226 fail = 0;
227 SYM(dri_lib, DRI2QueryExtension);
228 SYM(dri_lib, DRI2QueryVersion);
229 SYM(dri_lib, DRI2Connect);
230 SYM(dri_lib, DRI2Authenticate);
231 if (fail)
232 {
233 dlclose(dri_lib);
234 dri_lib = NULL;
235 }
236 else break;
237 }
238 }
239 if (!dri_lib)
240 {
241 dlclose(drm_lib);
242 drm_lib = NULL;
243 return 0;
244 }
245 return 1;
246}
247
248static int
249_dri_drm_init(void)
250{
251 if (!sym_DRI2QueryExtension(_ecore_x_disp, &dri2_event, &dri2_error))
252 return 0;
253 if (!sym_DRI2QueryVersion(_ecore_x_disp, &dri2_major, &dri2_minor))
254 return 0;
255 if (dri2_major < 2)
256 return 0;
257 if (!sym_DRI2Connect(_ecore_x_disp, dri_drm_vsync_root, &driver_name, &device_name))
258 return 0;
259 drm_fd = open(device_name, O_RDWR);
260 if (drm_fd < 0)
261 return 0;
262 sym_drmGetMagic(drm_fd, &drm_magic);
263 if (!sym_DRI2Authenticate(_ecore_x_disp, dri_drm_vsync_root, drm_magic))
264 {
265 close(drm_fd);
266 drm_fd = -1;
267 return 0;
268 }
269 memset(&drm_evctx, 0, sizeof(drm_evctx));
270 drm_evctx.version = DRM_EVENT_CONTEXT_VERSION;
271 drm_evctx.vblank_handler = _dri_drm_vblank_handler;
272 drm_evctx.page_flip_handler = NULL;
273
274 dri_drm_fdh = ecore_main_fd_handler_add(drm_fd, ECORE_FD_READ,
275 _dri_drm_cb, NULL, NULL, NULL);
276 if (!dri_drm_fdh)
277 {
278 close(drm_fd);
279 drm_fd = -1;
280 return 0;
281 }
282 return 1;
283}
284
285static void
286_dri_drm_shutdown(void)
287{
288 if (drm_fd >= 0)
289 {
290 close(drm_fd);
291 drm_fd = -1;
292 }
293 if (dri_drm_fdh)
294 {
295 ecore_main_fd_handler_del(dri_drm_fdh);
296 dri_drm_fdh = NULL;
297 }
298}
299
300#endif
301
302EAPI Eina_Bool
303ecore_x_vsync_animator_tick_source_set(Ecore_X_Window win)
304{
305#ifdef ECORE_X_VSYNC_DRI2
306 Ecore_X_Window root;
307
308 root = ecore_x_window_root_get(win);
309 if (root != dri_drm_vsync_root)
310 {
311 dri_drm_vsync_root = root;
312 if (dri_drm_vsync_root)
313 {
314 if (!_dri_drm_link())
315 {
316 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
317 return EINA_FALSE;
318 }
319 _dri_drm_shutdown();
320 if (!_dri_drm_init())
321 {
322 dri_drm_vsync_root = 0;
323 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
324 return EINA_FALSE;
325 }
326 ecore_animator_custom_source_tick_begin_callback_set
327 (_dri_drm_tick_begin, NULL);
328 ecore_animator_custom_source_tick_end_callback_set
329 (_dri_drm_tick_end, NULL);
330 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
331 }
332 else
333 {
334 if (drm_fd >= 0)
335 {
336 _dri_drm_shutdown();
337 ecore_animator_custom_source_tick_begin_callback_set
338 (NULL, NULL);
339 ecore_animator_custom_source_tick_end_callback_set
340 (NULL, NULL);
341 ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER);
342 }
343 }
344 }
345 return EINA_TRUE;
346#else
347 return EINA_FALSE;
348 win = 0;
349#endif
350}
351
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window.c
new file mode 100644
index 0000000..76670d3
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window.c
@@ -0,0 +1,1723 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6#include <sys/types.h>
7#include <unistd.h>
8
9#include "Ecore.h"
10#include "ecore_x_private.h"
11#include "Ecore_X.h"
12#include "Ecore_X_Atoms.h"
13
14static int ignore_num = 0;
15static Ecore_X_Window *ignore_list = NULL;
16
17/**
18 * @defgroup Ecore_X_Window_Create_Group X Window Creation Functions
19 *
20 * Functions that can be used to create an X window.
21 */
22
23/**
24 * Creates a new window.
25 * @param parent The parent window to use. If @p parent is @c 0, the root
26 * window of the default display is used.
27 * @param x X position.
28 * @param y Y position.
29 * @param w Width.
30 * @param h Height.
31 * @return The new window handle.
32 * @ingroup Ecore_X_Window_Create_Group
33 */
34EAPI Ecore_X_Window
35ecore_x_window_new(Ecore_X_Window parent,
36 int x,
37 int y,
38 int w,
39 int h)
40{
41 Window win;
42 XSetWindowAttributes attr;
43
44 LOGFN(__FILE__, __LINE__, __FUNCTION__);
45 if (parent == 0)
46 parent = DefaultRootWindow(_ecore_x_disp);
47
48 attr.backing_store = NotUseful;
49 attr.override_redirect = False;
50 attr.border_pixel = 0;
51 attr.background_pixmap = None;
52 attr.bit_gravity = NorthWestGravity;
53 attr.win_gravity = NorthWestGravity;
54 attr.save_under = False;
55 attr.do_not_propagate_mask = NoEventMask;
56 attr.event_mask = KeyPressMask |
57 KeyReleaseMask |
58 ButtonPressMask |
59 ButtonReleaseMask |
60 EnterWindowMask |
61 LeaveWindowMask |
62 PointerMotionMask |
63 ExposureMask |
64 VisibilityChangeMask |
65 StructureNotifyMask |
66 FocusChangeMask |
67 PropertyChangeMask |
68 ColormapChangeMask;
69 win = XCreateWindow(_ecore_x_disp, parent,
70 x, y, w, h, 0,
71 CopyFromParent, /*DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
72 InputOutput,
73 CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
74 CWBackingStore |
75 CWOverrideRedirect |
76/* CWColormap | */
77 CWBorderPixel |
78 CWBackPixmap |
79 CWSaveUnder |
80 CWDontPropagate |
81 CWEventMask |
82 CWBitGravity |
83 CWWinGravity,
84 &attr);
85
86 if (parent == DefaultRootWindow(_ecore_x_disp))
87 ecore_x_window_defaults_set(win);
88
89 return win;
90} /* ecore_x_window_new */
91
92/**
93 * Creates a window with the override redirect attribute set to @c True.
94 * @param parent The parent window to use. If @p parent is @c 0, the root
95 * window of the default display is used.
96 * @param x X position.
97 * @param y Y position.
98 * @param w Width.
99 * @param h Height.
100 * @return The new window handle.
101 * @ingroup Ecore_X_Window_Create_Group
102 */
103EAPI Ecore_X_Window
104ecore_x_window_override_new(Ecore_X_Window parent,
105 int x,
106 int y,
107 int w,
108 int h)
109{
110 Window win;
111 XSetWindowAttributes attr;
112
113 LOGFN(__FILE__, __LINE__, __FUNCTION__);
114 if (parent == 0)
115 parent = DefaultRootWindow(_ecore_x_disp);
116
117 attr.backing_store = NotUseful;
118 attr.override_redirect = True;
119 attr.border_pixel = 0;
120 attr.background_pixmap = None;
121 attr.bit_gravity = NorthWestGravity;
122 attr.win_gravity = NorthWestGravity;
123 attr.save_under = False;
124 attr.do_not_propagate_mask = NoEventMask;
125 attr.event_mask = KeyPressMask |
126 KeyReleaseMask |
127 ButtonPressMask |
128 ButtonReleaseMask |
129 EnterWindowMask |
130 LeaveWindowMask |
131 PointerMotionMask |
132 ExposureMask |
133 VisibilityChangeMask |
134 StructureNotifyMask |
135 FocusChangeMask |
136 PropertyChangeMask |
137 ColormapChangeMask;
138 win = XCreateWindow(_ecore_x_disp, parent,
139 x, y, w, h, 0,
140 CopyFromParent, /*DefaultDepth(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
141 InputOutput,
142 CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
143 CWBackingStore |
144 CWOverrideRedirect |
145/* CWColormap | */
146 CWBorderPixel |
147 CWBackPixmap |
148 CWSaveUnder |
149 CWDontPropagate |
150 CWEventMask |
151 CWBitGravity |
152 CWWinGravity,
153 &attr);
154 return win;
155} /* ecore_x_window_override_new */
156
157/**
158 * Creates a new input window.
159 * @param parent The parent window to use. If @p parent is @c 0, the root
160 * window of the default display is used.
161 * @param x X position.
162 * @param y Y position.
163 * @param w Width.
164 * @param h Height.
165 * @return The new window.
166 * @ingroup Ecore_X_Window_Create_Group
167 */
168EAPI Ecore_X_Window
169ecore_x_window_input_new(Ecore_X_Window parent,
170 int x,
171 int y,
172 int w,
173 int h)
174{
175 Window win;
176 XSetWindowAttributes attr;
177
178 LOGFN(__FILE__, __LINE__, __FUNCTION__);
179 if (parent == 0)
180 parent = DefaultRootWindow(_ecore_x_disp);
181
182 attr.override_redirect = True;
183 attr.do_not_propagate_mask = NoEventMask;
184 attr.event_mask = KeyPressMask |
185 KeyReleaseMask |
186 ButtonPressMask |
187 ButtonReleaseMask |
188 EnterWindowMask |
189 LeaveWindowMask |
190 PointerMotionMask |
191 ExposureMask |
192 VisibilityChangeMask |
193 StructureNotifyMask |
194 FocusChangeMask |
195 PropertyChangeMask |
196 ColormapChangeMask;
197 win = XCreateWindow(_ecore_x_disp, parent,
198 x, y, w, h, 0,
199 CopyFromParent,
200 InputOnly,
201 CopyFromParent, /*DefaultVisual(_ecore_x_disp, DefaultScreen(_ecore_x_disp)),*/
202 CWOverrideRedirect |
203 CWDontPropagate |
204 CWEventMask,
205 &attr);
206
207 if (parent == DefaultRootWindow(_ecore_x_disp))
208 {
209 }
210
211 return win;
212} /* ecore_x_window_input_new */
213
214/**
215 * @defgroup Ecore_X_Window_Properties_Group X Window Property Functions
216 *
217 * Functions that set window properties.
218 */
219
220/**
221 * Sets the default properties for the given window.
222 *
223 * The default properties set for the window are @c WM_CLIENT_MACHINE and
224 * @c _NET_WM_PID.
225 *
226 * @param win The given window.
227 * @ingroup Ecore_X_Window_Properties_Groups
228 */
229EAPI void
230ecore_x_window_defaults_set(Ecore_X_Window win)
231{
232 long pid;
233 char buf[MAXHOSTNAMELEN];
234 char *hostname[1];
235 int argc;
236 char **argv;
237 XTextProperty xprop;
238
239 LOGFN(__FILE__, __LINE__, __FUNCTION__);
240 /*
241 * Set WM_CLIENT_MACHINE.
242 */
243 gethostname(buf, MAXHOSTNAMELEN);
244 buf[MAXHOSTNAMELEN - 1] = '\0';
245 hostname[0] = buf;
246 /* The ecore function uses UTF8 which Xlib may not like (especially
247 * with older clients) */
248 /* ecore_x_window_prop_string_set(win, ECORE_X_ATOM_WM_CLIENT_MACHINE,
249 (char *)buf); */
250 if (XStringListToTextProperty(hostname, 1, &xprop))
251 {
252 XSetWMClientMachine(_ecore_x_disp, win, &xprop);
253 XFree(xprop.value);
254 }
255
256 /*
257 * Set _NET_WM_PID
258 */
259 pid = getpid();
260 ecore_x_netwm_pid_set(win, pid);
261
262 ecore_x_netwm_window_type_set(win, ECORE_X_WINDOW_TYPE_NORMAL);
263
264 ecore_app_args_get(&argc, &argv);
265 ecore_x_icccm_command_set(win, argc, argv);
266} /* ecore_x_window_defaults_set */
267
268EAPI void
269ecore_x_window_configure(Ecore_X_Window win,
270 Ecore_X_Window_Configure_Mask mask,
271 int x,
272 int y,
273 int w,
274 int h,
275 int border_width,
276 Ecore_X_Window sibling,
277 int stack_mode)
278{
279 XWindowChanges xwc;
280
281 if (!win)
282 return;
283
284 LOGFN(__FILE__, __LINE__, __FUNCTION__);
285
286 xwc.x = x;
287 xwc.y = y;
288 xwc.width = w;
289 xwc.height = h;
290 xwc.border_width = border_width;
291 xwc.sibling = sibling;
292 xwc.stack_mode = stack_mode;
293
294 XConfigureWindow(_ecore_x_disp, win, mask, &xwc);
295} /* ecore_x_window_configure */
296
297/**
298 * @defgroup Ecore_X_Window_Destroy_Group X Window Destroy Functions
299 *
300 * Functions to destroy X windows.
301 */
302
303/**
304 * Deletes the given window.
305 * @param win The given window.
306 * @ingroup Ecore_X_Window_Destroy_Group
307 */
308EAPI void
309ecore_x_window_free(Ecore_X_Window win)
310{
311 /* sorry sir, deleting the root window doesn't sound like
312 * a smart idea.
313 */
314 LOGFN(__FILE__, __LINE__, __FUNCTION__);
315 if (win)
316 XDestroyWindow(_ecore_x_disp, win);
317} /* ecore_x_window_free */
318
319/**
320 * Set if a window should be ignored.
321 * @param win The given window.
322 * @param ignore if to ignore
323 */
324EAPI void
325ecore_x_window_ignore_set(Ecore_X_Window win,
326 int ignore)
327{
328 int i, j, cnt;
329 Ecore_X_Window *t;
330
331 LOGFN(__FILE__, __LINE__, __FUNCTION__);
332 if (ignore)
333 {
334 if (ignore_list)
335 {
336 for (i = 0; i < ignore_num; i++)
337 {
338 if (win == ignore_list[i])
339 return;
340 }
341 t = realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
342 if (!t) return;
343 ignore_list = t;
344 ignore_list[ignore_num++] = win;
345 }
346 else
347 {
348 ignore_num = 0;
349 ignore_list = malloc(sizeof(Ecore_X_Window));
350 if (ignore_list)
351 ignore_list[ignore_num++] = win;
352 }
353 }
354 else
355 {
356 if (!ignore_list)
357 return;
358
359 for (cnt = ignore_num, i = 0, j = 0; i < cnt; i++)
360 {
361 if (win != ignore_list[i])
362 ignore_list[j++] = ignore_list[i];
363 else
364 ignore_num--;
365 }
366
367 if (ignore_num <= 0)
368 {
369 free(ignore_list);
370 ignore_list = NULL;
371 return;
372 }
373 t = realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
374 if (t) ignore_list = t;
375 }
376} /* ecore_x_window_ignore_set */
377
378/**
379 * Get the ignore list
380 * @param num number of windows in the list
381 * @return list of windows to ignore
382 */
383EAPI Ecore_X_Window *
384ecore_x_window_ignore_list(int *num)
385{
386 if (num)
387 *num = ignore_num;
388
389 return ignore_list;
390} /* ecore_x_window_ignore_list */
391
392/**
393 * Sends a delete request to the given window.
394 * @param win The given window.
395 * @ingroup Ecore_X_Window_Destroy_Group
396 */
397EAPI void
398ecore_x_window_delete_request_send(Ecore_X_Window win)
399{
400 XEvent xev;
401
402 /* sorry sir, deleting the root window doesn't sound like
403 * a smart idea.
404 */
405 if (!win)
406 return;
407
408 LOGFN(__FILE__, __LINE__, __FUNCTION__);
409 xev.xclient.type = ClientMessage;
410 xev.xclient.display = _ecore_x_disp;
411 xev.xclient.window = win;
412 xev.xclient.message_type = ECORE_X_ATOM_WM_PROTOCOLS;
413 xev.xclient.format = 32;
414 xev.xclient.data.l[0] = ECORE_X_ATOM_WM_DELETE_WINDOW;
415 xev.xclient.data.l[1] = CurrentTime;
416
417 XSendEvent(_ecore_x_disp, win, False, NoEventMask, &xev);
418} /* ecore_x_window_delete_request_send */
419
420/**
421 * @defgroup Ecore_X_Window_Visibility_Group X Window Visibility Functions
422 *
423 * Functions to access and change the visibility of X windows.
424 */
425
426/**
427 * Shows a window.
428 *
429 * Synonymous to "mapping" a window in X Window System terminology.
430 *
431 * @param win The window to show.
432 * @ingroup Ecore_X_Window_Visibility
433 */
434EAPI void
435ecore_x_window_show(Ecore_X_Window win)
436{
437 LOGFN(__FILE__, __LINE__, __FUNCTION__);
438 XMapWindow(_ecore_x_disp, win);
439} /* ecore_x_window_show */
440
441/**
442 * Hides a window.
443 *
444 * Synonymous to "unmapping" a window in X Window System terminology.
445 *
446 * @param win The window to hide.
447 * @ingroup Ecore_X_Window_Visibility
448 */
449EAPI void
450ecore_x_window_hide(Ecore_X_Window win)
451{
452 XEvent xev;
453 Window root;
454 int idum;
455 unsigned int uidum;
456
457 /* ICCCM: SEND unmap event... */
458 LOGFN(__FILE__, __LINE__, __FUNCTION__);
459 root = win;
460 if (ScreenCount(_ecore_x_disp) == 1)
461 root = DefaultRootWindow(_ecore_x_disp);
462 else
463 XGetGeometry(_ecore_x_disp,
464 win,
465 &root,
466 &idum,
467 &idum,
468 &uidum,
469 &uidum,
470 &uidum,
471 &uidum);
472
473 xev.xunmap.type = UnmapNotify;
474 xev.xunmap.serial = 0;
475 xev.xunmap.send_event = True;
476 xev.xunmap.display = _ecore_x_disp;
477 xev.xunmap.event = root;
478 xev.xunmap.window = win;
479 xev.xunmap.from_configure = False;
480 XSendEvent(_ecore_x_disp, xev.xunmap.event, False,
481 SubstructureRedirectMask | SubstructureNotifyMask, &xev);
482 XUnmapWindow(_ecore_x_disp, win);
483} /* ecore_x_window_hide */
484
485/**
486 * @defgroup Ecore_X_Window_Geometry_Group X Window Geometry Functions
487 *
488 * Functions that change or retrieve the geometry of X windows.
489 */
490
491/**
492 * Moves a window to the position @p x, @p y.
493 *
494 * The position is relative to the upper left hand corner of the
495 * parent window.
496 *
497 * @param win The window to move.
498 * @param x X position.
499 * @param y Y position.
500 * @ingroup Ecore_X_Window_Geometry_Group
501 */
502EAPI void
503ecore_x_window_move(Ecore_X_Window win,
504 int x,
505 int y)
506{
507 LOGFN(__FILE__, __LINE__, __FUNCTION__);
508 XMoveWindow(_ecore_x_disp, win, x, y);
509} /* ecore_x_window_move */
510
511/**
512 * Resizes a window.
513 * @param win The window to resize.
514 * @param w New width of the window.
515 * @param h New height of the window.
516 * @ingroup Ecore_X_Window_Geometry_Group
517 */
518EAPI void
519ecore_x_window_resize(Ecore_X_Window win,
520 int w,
521 int h)
522{
523 LOGFN(__FILE__, __LINE__, __FUNCTION__);
524 if (w < 1)
525 w = 1;
526
527 if (h < 1)
528 h = 1;
529
530 XResizeWindow(_ecore_x_disp, win, w, h);
531} /* ecore_x_window_resize */
532
533/**
534 * Moves and resizes a window.
535 * @param win The window to move and resize.
536 * @param x New X position of the window.
537 * @param y New Y position of the window.
538 * @param w New width of the window.
539 * @param h New height of the window.
540 * @ingroup Ecore_X_Window_Geometry_Group
541 */
542EAPI void
543ecore_x_window_move_resize(Ecore_X_Window win,
544 int x,
545 int y,
546 int w,
547 int h)
548{
549 LOGFN(__FILE__, __LINE__, __FUNCTION__);
550 if (w < 1)
551 w = 1;
552
553 if (h < 1)
554 h = 1;
555
556 XMoveResizeWindow(_ecore_x_disp, win, x, y, w, h);
557} /* ecore_x_window_move_resize */
558
559/**
560 * @defgroup Ecore_X_Window_Focus_Functions X Window Focus Functions
561 *
562 * Functions that give the focus to an X Window.
563 */
564
565/**
566 * Sets the focus to the window @p win.
567 * @param win The window to focus.
568 * @ingroup Ecore_X_Window_Focus_Functions
569 */
570EAPI void
571ecore_x_window_focus(Ecore_X_Window win)
572{
573 LOGFN(__FILE__, __LINE__, __FUNCTION__);
574 if (win == 0)
575 win = DefaultRootWindow(_ecore_x_disp); // XSetInputFocus(_ecore_x_disp, win, RevertToNone, CurrentTime);
576
577// XSetInputFocus(_ecore_x_disp, win, RevertToPointerRoot, CurrentTime);
578 XSetInputFocus(_ecore_x_disp, win, RevertToParent, CurrentTime);
579} /* ecore_x_window_focus */
580
581/**
582 * Sets the focus to the given window at a specific time.
583 * @param win The window to focus.
584 * @param t When to set the focus to the window.
585 * @ingroup Ecore_X_Window_Focus_Functions
586 */
587EAPI void
588ecore_x_window_focus_at_time(Ecore_X_Window win,
589 Ecore_X_Time t)
590{
591 LOGFN(__FILE__, __LINE__, __FUNCTION__);
592 if (win == 0)
593 win = DefaultRootWindow(_ecore_x_disp); // XSetInputFocus(_ecore_x_disp, win, RevertToNone, t);
594
595// XSetInputFocus(_ecore_x_disp, win, PointerRoot, t);
596 XSetInputFocus(_ecore_x_disp, win, RevertToParent, t);
597} /* ecore_x_window_focus_at_time */
598
599/**
600 * gets the focus to the window @p win.
601 * @return The window that has focus.
602 * @ingroup Ecore_X_Window_Focus_Functions
603 */
604EAPI Ecore_X_Window
605ecore_x_window_focus_get(void)
606{
607 Window win;
608 int revert_mode;
609
610 LOGFN(__FILE__, __LINE__, __FUNCTION__);
611 win = 0;
612 XGetInputFocus(_ecore_x_disp, &win, &revert_mode);
613 return win;
614} /* ecore_x_window_focus_get */
615
616/**
617 * @defgroup Ecore_X_Window_Z_Order_Group X Window Z Order Functions
618 *
619 * Functions that change the Z order of X windows.
620 */
621
622/**
623 * Raises the given window.
624 * @param win The window to raise.
625 * @ingroup Ecore_X_Window_Z_Order_Group
626 */
627EAPI void
628ecore_x_window_raise(Ecore_X_Window win)
629{
630 LOGFN(__FILE__, __LINE__, __FUNCTION__);
631 XRaiseWindow(_ecore_x_disp, win);
632} /* ecore_x_window_raise */
633
634/**
635 * Lowers the given window.
636 * @param win The window to lower.
637 * @ingroup Ecore_X_Window_Z_Order_Group
638 */
639EAPI void
640ecore_x_window_lower(Ecore_X_Window win)
641{
642 LOGFN(__FILE__, __LINE__, __FUNCTION__);
643 XLowerWindow(_ecore_x_disp, win);
644} /* ecore_x_window_lower */
645
646/**
647 * @defgroup Ecore_X_Window_Parent_Group X Window Parent Functions
648 *
649 * Functions that retrieve or changes the parent window of a window.
650 */
651
652/**
653 * Moves a window to within another window at a given position.
654 * @param win The window to reparent.
655 * @param new_parent The new parent window.
656 * @param x X position within new parent window.
657 * @param y Y position within new parent window.
658 * @ingroup Ecore_X_Window_Parent_Group
659 */
660EAPI void
661ecore_x_window_reparent(Ecore_X_Window win,
662 Ecore_X_Window new_parent,
663 int x,
664 int y)
665{
666 LOGFN(__FILE__, __LINE__, __FUNCTION__);
667 if (new_parent == 0)
668 new_parent = DefaultRootWindow(_ecore_x_disp);
669
670 XReparentWindow(_ecore_x_disp, win, new_parent, x, y);
671} /* ecore_x_window_reparent */
672
673/**
674 * Retrieves the size of the given window.
675 * @param win The given window.
676 * @param w Pointer to an integer into which the width is to be stored.
677 * @param h Pointer to an integer into which the height is to be stored.
678 * @ingroup Ecore_X_Window_Geometry_Group
679 */
680EAPI void
681ecore_x_window_size_get(Ecore_X_Window win,
682 int *w,
683 int *h)
684{
685 int dummy_x, dummy_y;
686
687 LOGFN(__FILE__, __LINE__, __FUNCTION__);
688 if (win == 0)
689 win = DefaultRootWindow(_ecore_x_disp);
690
691 ecore_x_drawable_geometry_get(win, &dummy_x, &dummy_y, w, h);
692} /* ecore_x_window_size_get */
693
694/**
695 * Retrieves the geometry of the given window.
696 *
697 * Note that the x & y coordingates are relative to your parent. In
698 * particular for reparenting window managers - relative to you window border.
699 * If you want screen coordinates either walk the window tree to the root,
700 * else for ecore_evas applications see ecore_evas_geometry_get(). Elementary
701 * applications can use elm_win_screen_position_get().
702 *
703 * @param win The given window.
704 * @param x Pointer to an integer in which the X position is to be stored.
705 * @param y Pointer to an integer in which the Y position is to be stored.
706 * @param w Pointer to an integer in which the width is to be stored.
707 * @param h Pointer to an integer in which the height is to be stored.
708 * @ingroup Ecore_X_Window_Geometry_Group
709 */
710EAPI void
711ecore_x_window_geometry_get(Ecore_X_Window win,
712 int *x,
713 int *y,
714 int *w,
715 int *h)
716{
717 LOGFN(__FILE__, __LINE__, __FUNCTION__);
718 if (!win)
719 win = DefaultRootWindow(_ecore_x_disp);
720
721 ecore_x_drawable_geometry_get(win, x, y, w, h);
722} /* ecore_x_window_geometry_get */
723
724/**
725 * Retrieves the width of the border of the given window.
726 * @param win The given window.
727 * @return Width of the border of @p win.
728 * @ingroup Ecore_X_Window_Geometry_Group
729 */
730EAPI int
731ecore_x_window_border_width_get(Ecore_X_Window win)
732{
733 LOGFN(__FILE__, __LINE__, __FUNCTION__);
734 /* doesn't make sense to call this on a root window */
735 if (!win)
736 return 0;
737
738 return ecore_x_drawable_border_width_get(win);
739} /* ecore_x_window_border_width_get */
740
741/**
742 * Sets the width of the border of the given window.
743 * @param win The given window.
744 * @param width The new border width.
745 * @ingroup Ecore_X_Window_Geometry_Group
746 */
747EAPI void
748ecore_x_window_border_width_set(Ecore_X_Window win,
749 int width)
750{
751 LOGFN(__FILE__, __LINE__, __FUNCTION__);
752 /* doesn't make sense to call this on a root window */
753 if (!win)
754 return;
755
756 XSetWindowBorderWidth (_ecore_x_disp, win, width);
757} /* ecore_x_window_border_width_set */
758
759/**
760 * Retrieves the depth of the given window.
761 * @param win The given window.
762 * @return Depth of the window.
763 */
764EAPI int
765ecore_x_window_depth_get(Ecore_X_Window win)
766{
767 LOGFN(__FILE__, __LINE__, __FUNCTION__);
768 return ecore_x_drawable_depth_get(win);
769} /* ecore_x_window_depth_get */
770
771/**
772 * To be documented.
773 *
774 * FIXME: To be fixed.
775 */
776EAPI void
777ecore_x_window_cursor_show(Ecore_X_Window win,
778 Eina_Bool show)
779{
780 LOGFN(__FILE__, __LINE__, __FUNCTION__);
781 if (win == 0)
782 win = DefaultRootWindow(_ecore_x_disp);
783
784 if (!show)
785 {
786 Cursor c;
787 XColor cl;
788 Pixmap p, m;
789 GC gc;
790 XGCValues gcv;
791
792 p = XCreatePixmap(_ecore_x_disp, win, 1, 1, 1);
793 m = XCreatePixmap(_ecore_x_disp, win, 1, 1, 1);
794 gc = XCreateGC(_ecore_x_disp, m, 0, &gcv);
795 XSetForeground(_ecore_x_disp, gc, 0);
796 XDrawPoint(_ecore_x_disp, m, gc, 0, 0);
797 XFreeGC(_ecore_x_disp, gc);
798 c = XCreatePixmapCursor(_ecore_x_disp, p, m, &cl, &cl, 0, 0);
799 XDefineCursor(_ecore_x_disp, win, c);
800 XFreeCursor(_ecore_x_disp, c);
801 XFreePixmap(_ecore_x_disp, p);
802 XFreePixmap(_ecore_x_disp, m);
803 }
804 else
805 XDefineCursor(_ecore_x_disp, win, 0);
806} /* ecore_x_window_cursor_show */
807
808EAPI void
809ecore_x_window_cursor_set(Ecore_X_Window win,
810 Ecore_X_Cursor c)
811{
812 LOGFN(__FILE__, __LINE__, __FUNCTION__);
813 if (c == 0)
814 XUndefineCursor(_ecore_x_disp, win);
815 else
816 XDefineCursor(_ecore_x_disp, win, c);
817} /* ecore_x_window_cursor_set */
818
819/**
820 * Finds out whether the given window is currently visible.
821 * @param win The given window.
822 * @return 1 if the window is visible, otherwise 0.
823 * @ingroup Ecore_X_Window_Visibility_Group
824 */
825EAPI int
826ecore_x_window_visible_get(Ecore_X_Window win)
827{
828 XWindowAttributes attr;
829
830 LOGFN(__FILE__, __LINE__, __FUNCTION__);
831 return XGetWindowAttributes(_ecore_x_disp, win, &attr) &&
832 (attr.map_state == IsViewable);
833} /* ecore_x_window_visible_get */
834
835typedef struct _Shadow Shadow;
836struct _Shadow
837{
838 Shadow *parent;
839 Shadow **children;
840 Window win;
841 int children_num;
842 short x, y;
843 unsigned short w, h;
844};
845
846static Shadow **shadow_base = NULL;
847static int shadow_num = 0;
848
849static Shadow *
850_ecore_x_window_tree_walk(Window win)
851{
852 Window *list = NULL;
853 Window parent_win = 0, root_win = 0;
854 unsigned int num;
855 Shadow *s, **sl;
856 XWindowAttributes att;
857
858 if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
859 return NULL; // if (att.class == InputOnly) return NULL;
860
861 if (att.map_state != IsViewable)
862 return NULL;
863
864 s = calloc(1, sizeof(Shadow));
865 if (!s)
866 return NULL;
867
868 s->win = win;
869 s->x = att.x;
870 s->y = att.y;
871 s->w = att.width;
872 s->h = att.height;
873 if (XQueryTree(_ecore_x_disp, s->win, &root_win, &parent_win,
874 &list, &num))
875 {
876 s->children = calloc(1, sizeof(Shadow *) * num);
877 if (s->children)
878 {
879 size_t i, j;
880 s->children_num = num;
881 for (i = 0; i < num; i++)
882 {
883 s->children[i] = _ecore_x_window_tree_walk(list[i]);
884 if (s->children[i])
885 s->children[i]->parent = s;
886 }
887 /* compress list down */
888 j = 0;
889 for (i = 0; i < num; i++)
890 {
891 if (s->children[i])
892 {
893 s->children[j] = s->children[i];
894 j++;
895 }
896 }
897 if (j == 0)
898 {
899 free(s->children);
900 s->children = NULL;
901 s->children_num = 0;
902 }
903 else
904 {
905 s->children_num = j;
906 sl = realloc(s->children, sizeof(Shadow *) * j);
907 if (sl)
908 s->children = sl;
909 }
910 }
911 }
912
913 if (list)
914 XFree(list);
915
916 return s;
917} /* _ecore_x_window_tree_walk */
918
919static void
920_ecore_x_window_tree_shadow_free1(Shadow *s)
921{
922 int i;
923
924 if (!s)
925 return;
926
927 if (s->children)
928 {
929 for (i = 0; i < s->children_num; i++)
930 {
931 if (s->children[i])
932 _ecore_x_window_tree_shadow_free1(s->children[i]);
933 }
934 free(s->children);
935 }
936
937 free(s);
938} /* _ecore_x_window_tree_shadow_free1 */
939
940static void
941_ecore_x_window_tree_shadow_free(void)
942{
943 int i;
944
945 if (!shadow_base)
946 return;
947
948 for (i = 0; i < shadow_num; i++)
949 {
950 if (!shadow_base[i])
951 continue;
952
953 _ecore_x_window_tree_shadow_free1(shadow_base[i]);
954 }
955 free(shadow_base);
956 shadow_base = NULL;
957 shadow_num = 0;
958} /* _ecore_x_window_tree_shadow_free */
959
960static void
961_ecore_x_window_tree_shadow_populate(void)
962{
963 Ecore_X_Window *roots;
964 int i, num;
965
966 roots = ecore_x_window_root_list(&num);
967 if (roots)
968 {
969 shadow_base = calloc(1, sizeof(Shadow *) * num);
970 if (shadow_base)
971 {
972 shadow_num = num;
973 for (i = 0; i < num; i++)
974 shadow_base[i] = _ecore_x_window_tree_walk(roots[i]);
975 }
976
977 free(roots);
978 }
979} /* _ecore_x_window_tree_shadow_populate */
980
981/*
982 static int shadow_count = 0;
983
984 static void
985 _ecore_x_window_tree_shadow_start(void)
986 {
987 shadow_count++;
988 if (shadow_count > 1) return;
989 _ecore_x_window_tree_shadow_populate();
990 }
991
992 static void
993 _ecore_x_window_tree_shadow_stop(void)
994 {
995 shadow_count--;
996 if (shadow_count != 0) return;
997 _ecore_x_window_tree_shadow_free();
998 }
999 */
1000
1001static Shadow *
1002_ecore_x_window_shadow_tree_find_shadow(Shadow *s,
1003 Window win)
1004{
1005 Shadow *ss;
1006 int i;
1007
1008 if (s->win == win)
1009 return s;
1010
1011 if (s->children)
1012 for (i = 0; i < s->children_num; i++)
1013 {
1014 if (!s->children[i])
1015 continue;
1016
1017 if ((ss =
1018 _ecore_x_window_shadow_tree_find_shadow(s->children[i], win)))
1019 return ss;
1020 }
1021
1022 return NULL;
1023} /* _ecore_x_window_shadow_tree_find_shadow */
1024
1025static Shadow *
1026_ecore_x_window_shadow_tree_find(Window base)
1027{
1028 Shadow *s;
1029 int i;
1030
1031 for (i = 0; i < shadow_num; i++)
1032 {
1033 if (!shadow_base[i])
1034 continue;
1035
1036 if ((s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], base)))
1037 return s;
1038 }
1039 return NULL;
1040} /* _ecore_x_window_shadow_tree_find */
1041
1042static int
1043_inside_rects(Shadow *s,
1044 int x,
1045 int y,
1046 int bx,
1047 int by,
1048 Ecore_X_Rectangle *rects,
1049 int num)
1050{
1051 int i, inside;
1052
1053 if (!rects) return 0;
1054 inside = 0;
1055 for (i = 0; i < num; i++)
1056 {
1057 if ((x >= s->x + bx + rects[i].x) &&
1058 (y >= s->y + by + rects[i].y) &&
1059 (x < (int)(s->x + bx + rects[i].x + rects[i].width)) &&
1060 (y < (int)(s->y + by + rects[i].y + rects[i].height)))
1061 {
1062 inside = 1;
1063 break;
1064 }
1065 }
1066 free(rects);
1067 return inside;
1068}
1069
1070static Window
1071_ecore_x_window_shadow_tree_at_xy_get_shadow(Shadow *s,
1072 int bx,
1073 int by,
1074 int x,
1075 int y,
1076 Ecore_X_Window *skip,
1077 int skip_num)
1078{
1079 Window child;
1080 int i, j;
1081 int wx, wy;
1082
1083 wx = s->x + bx;
1084 wy = s->y + by;
1085 if (!((x >= wx) && (y >= wy) && (x < (wx + s->w)) && (y < (wy + s->h))))
1086 return 0;
1087
1088 /* FIXME: get shape */
1089 {
1090 int num;
1091 Ecore_X_Rectangle *rects;
1092
1093 num = 0;
1094 rects = ecore_x_window_shape_rectangles_get(s->win, &num);
1095 if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
1096 num = 0;
1097 rects = ecore_x_window_shape_input_rectangles_get(s->win, &num);
1098 if (!_inside_rects(s, x, y, bx, by, rects, num)) return 0;
1099 }
1100
1101 if (s->children)
1102 {
1103 int skipit = 0;
1104
1105 for (i = s->children_num - 1; i >= 0; --i)
1106 {
1107 if (!s->children[i])
1108 continue;
1109
1110 skipit = 0;
1111 if (skip)
1112 for (j = 0; j < skip_num; j++)
1113 {
1114 if (s->children[i]->win == skip[j])
1115 {
1116 skipit = 1;
1117 goto onward;
1118 }
1119 }
1120
1121onward:
1122 if (!skipit)
1123 if ((child =
1124 _ecore_x_window_shadow_tree_at_xy_get_shadow(s->
1125 children[i
1126 ], wx, wy,
1127 x, y, skip,
1128 skip_num)))
1129 return child;
1130 }
1131 }
1132
1133 return s->win;
1134} /* _ecore_x_window_shadow_tree_at_xy_get_shadow */
1135
1136static Window
1137_ecore_x_window_shadow_tree_at_xy_get(Window base,
1138 int bx,
1139 int by,
1140 int x,
1141 int y,
1142 Ecore_X_Window *skip,
1143 int skip_num)
1144{
1145 Shadow *s;
1146
1147 if (!shadow_base)
1148 {
1149 _ecore_x_window_tree_shadow_populate();
1150 if (!shadow_base)
1151 return 0;
1152 }
1153
1154 s = _ecore_x_window_shadow_tree_find(base);
1155 if (!s)
1156 return 0;
1157
1158 return _ecore_x_window_shadow_tree_at_xy_get_shadow(s,
1159 bx,
1160 by,
1161 x,
1162 y,
1163 skip,
1164 skip_num);
1165} /* _ecore_x_window_shadow_tree_at_xy_get */
1166
1167/**
1168 * Retrieves the top, visible window at the given location,
1169 * but skips the windows in the list. This uses a shadow tree built from the
1170 * window tree that is only updated the first time
1171 * ecore_x_window_shadow_tree_at_xy_with_skip_get() is called, or the next time
1172 * it is called after a ecore_x_window_shadow_tree_flush()
1173 * @param base The base window to start searching from (normally root).
1174 * @param x The given X position.
1175 * @param y The given Y position.
1176 * @return The window at that position.
1177 * @ingroup Ecore_X_Window_Geometry_Group
1178 */
1179EAPI Ecore_X_Window
1180ecore_x_window_shadow_tree_at_xy_with_skip_get(Ecore_X_Window base,
1181 int x,
1182 int y,
1183 Ecore_X_Window *skip,
1184 int skip_num)
1185{
1186 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1187 return _ecore_x_window_shadow_tree_at_xy_get(base,
1188 0,
1189 0,
1190 x,
1191 y,
1192 skip,
1193 skip_num);
1194} /* ecore_x_window_shadow_tree_at_xy_with_skip_get */
1195
1196/**
1197 * Retrieves the parent window a given window has. This uses the shadow window
1198 * tree.
1199 * @param root The root window of @p win - if 0, this will be automatically determined with extra processing overhead
1200 * @param win The window to get the parent window of
1201 * @return The parent window of @p win
1202 * @ingroup Ecore_X_Window_Geometry_Group
1203 */
1204EAPI Ecore_X_Window
1205ecore_x_window_shadow_parent_get(Ecore_X_Window root __UNUSED__,
1206 Ecore_X_Window win)
1207{
1208 Shadow *s;
1209 int i;
1210
1211 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1212 if (!shadow_base)
1213 {
1214 _ecore_x_window_tree_shadow_populate();
1215 if (!shadow_base)
1216 return 0;
1217 }
1218
1219 for (i = 0; i < shadow_num; i++)
1220 {
1221 if (!shadow_base[i])
1222 continue;
1223
1224 s = _ecore_x_window_shadow_tree_find_shadow(shadow_base[i], win);
1225 if (s)
1226 {
1227 if (!s->parent)
1228 return 0;
1229
1230 return s->parent->win;
1231 }
1232 }
1233 return 0;
1234} /* ecore_x_window_shadow_parent_get */
1235
1236/**
1237 * Flushes the window shadow tree so nothing is stored.
1238 * @ingroup Ecore_X_Window_Geometry_Group
1239 */
1240EAPI void
1241ecore_x_window_shadow_tree_flush(void)
1242{
1243 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1244 _ecore_x_window_tree_shadow_free();
1245} /* ecore_x_window_shadow_tree_flush */
1246
1247/**
1248 * Retrieves the root window a given window is on.
1249 * @param win The window to get the root window of
1250 * @return The root window of @p win
1251 * @ingroup Ecore_X_Window_Geometry_Group
1252 */
1253EAPI Ecore_X_Window
1254ecore_x_window_root_get(Ecore_X_Window win)
1255{
1256 XWindowAttributes att;
1257
1258 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1259 if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
1260 return 0;
1261
1262 return att.root;
1263} /* ecore_x_window_root_get */
1264
1265static Window
1266_ecore_x_window_at_xy_get(Window base,
1267 int bx,
1268 int by,
1269 int x,
1270 int y,
1271 Ecore_X_Window *skip,
1272 int skip_num)
1273{
1274 Window *list = NULL;
1275 Window parent_win = 0, child = 0, root_win = 0;
1276 int i, j, wx, wy, ww, wh;
1277 unsigned int num;
1278
1279 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1280 if (!ecore_x_window_visible_get(base))
1281 return 0;
1282
1283 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1284 ecore_x_window_geometry_get(base, &wx, &wy, &ww, &wh);
1285 wx += bx;
1286 wy += by;
1287
1288 if (!((x >= wx) && (y >= wy) && (x < (wx + ww)) && (y < (wy + wh))))
1289 return 0;
1290
1291 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1292 if (!XQueryTree(_ecore_x_disp, base, &root_win, &parent_win, &list, &num))
1293 return base;
1294
1295 if (list)
1296 {
1297 int skipit = 0;
1298
1299 for (i = num - 1; i >= 0; --i)
1300 {
1301 skipit = 0;
1302
1303 if (skip)
1304 for (j = 0; j < skip_num; j++)
1305 {
1306 if (list[i] == skip[j])
1307 {
1308 skipit = 1;
1309 goto onward;
1310 }
1311 }
1312
1313onward:
1314 if (!skipit)
1315 if ((child =
1316 _ecore_x_window_at_xy_get(list[i], wx, wy, x, y, skip,
1317 skip_num)))
1318 {
1319 XFree(list);
1320 return child;
1321 }
1322 }
1323 XFree(list);
1324 }
1325
1326 return base;
1327} /* _ecore_x_window_at_xy_get */
1328
1329/**
1330 * Retrieves the top, visible window at the given location.
1331 * @param x The given X position.
1332 * @param y The given Y position.
1333 * @return The window at that position.
1334 * @ingroup Ecore_X_Window_Geometry_Group
1335 */
1336EAPI Ecore_X_Window
1337ecore_x_window_at_xy_get(int x,
1338 int y)
1339{
1340 Ecore_X_Window win, root;
1341
1342 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1343 /* FIXME: Proper function to determine current root/virtual root
1344 * window missing here */
1345 root = DefaultRootWindow(_ecore_x_disp);
1346
1347 ecore_x_grab();
1348 win = _ecore_x_window_at_xy_get(root, 0, 0, x, y, NULL, 0);
1349 ecore_x_ungrab();
1350
1351 return win ? win : root;
1352} /* ecore_x_window_at_xy_get */
1353
1354/**
1355 * Retrieves the top, visible window at the given location,
1356 * but skips the windows in the list.
1357 * @param x The given X position.
1358 * @param y The given Y position.
1359 * @return The window at that position.
1360 * @ingroup Ecore_X_Window_Geometry_Group
1361 */
1362EAPI Ecore_X_Window
1363ecore_x_window_at_xy_with_skip_get(int x,
1364 int y,
1365 Ecore_X_Window *skip,
1366 int skip_num)
1367{
1368 Ecore_X_Window win, root;
1369
1370 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1371 /* FIXME: Proper function to determine current root/virtual root
1372 * window missing here */
1373 root = DefaultRootWindow(_ecore_x_disp);
1374
1375 ecore_x_grab();
1376 win = _ecore_x_window_at_xy_get(root, 0, 0, x, y, skip, skip_num);
1377 ecore_x_ungrab();
1378
1379 return win ? win : root;
1380} /* ecore_x_window_at_xy_with_skip_get */
1381
1382EAPI Ecore_X_Window
1383ecore_x_window_at_xy_begin_get(Ecore_X_Window begin,
1384 int x,
1385 int y)
1386{
1387 Ecore_X_Window win;
1388
1389 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1390 ecore_x_grab();
1391 win = _ecore_x_window_at_xy_get(begin, 0, 0, x, y, NULL, 0);
1392 ecore_x_ungrab();
1393
1394 return win ? win : begin;
1395} /* ecore_x_window_at_xy_begin_get */
1396
1397/**
1398 * Retrieves the parent window of the given window.
1399 * @param win The given window.
1400 * @return The parent window of @p win.
1401 * @ingroup Ecore_X_Window_Parent_Group
1402 */
1403EAPI Ecore_X_Window
1404ecore_x_window_parent_get(Ecore_X_Window win)
1405{
1406 Window root, parent, *children = NULL;
1407 unsigned int num;
1408
1409 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1410 if (!XQueryTree(_ecore_x_disp, win, &root, &parent, &children, &num))
1411 return 0;
1412
1413 if (children)
1414 XFree(children);
1415
1416 return parent;
1417} /* ecore_x_window_parent_get */
1418
1419/**
1420 * Sets the background color of the given window.
1421 * @param win The given window
1422 * @param r red value (0...65536, 16 bits)
1423 * @param g green value (0...65536, 16 bits)
1424 * @param b blue value (0...65536, 16 bits)
1425 */
1426EAPI void
1427ecore_x_window_background_color_set(Ecore_X_Window win,
1428 unsigned short r,
1429 unsigned short g,
1430 unsigned short b)
1431{
1432 XSetWindowAttributes attr;
1433 Colormap map;
1434 XColor col;
1435
1436 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1437 col.red = r;
1438 col.green = g;
1439 col.blue = b;
1440
1441 map = DefaultColormap(_ecore_x_disp, DefaultScreen(_ecore_x_disp));
1442 XAllocColor(_ecore_x_disp, map, &col);
1443
1444 attr.background_pixel = col.pixel;
1445 XChangeWindowAttributes(_ecore_x_disp, win, CWBackPixel, &attr);
1446} /* ecore_x_window_background_color_set */
1447
1448EAPI void
1449ecore_x_window_gravity_set(Ecore_X_Window win,
1450 Ecore_X_Gravity grav)
1451{
1452 XSetWindowAttributes att;
1453
1454 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1455 att.win_gravity = grav;
1456 XChangeWindowAttributes(_ecore_x_disp, win, CWWinGravity, &att);
1457} /* ecore_x_window_gravity_set */
1458
1459EAPI void
1460ecore_x_window_pixel_gravity_set(Ecore_X_Window win,
1461 Ecore_X_Gravity grav)
1462{
1463 XSetWindowAttributes att;
1464
1465 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1466 att.bit_gravity = grav;
1467 XChangeWindowAttributes(_ecore_x_disp, win, CWBitGravity, &att);
1468} /* ecore_x_window_pixel_gravity_set */
1469
1470EAPI void
1471ecore_x_window_pixmap_set(Ecore_X_Window win,
1472 Ecore_X_Pixmap pmap)
1473{
1474 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1475 XSetWindowBackgroundPixmap(_ecore_x_disp, win, pmap);
1476} /* ecore_x_window_pixmap_set */
1477
1478EAPI void
1479ecore_x_window_area_clear(Ecore_X_Window win,
1480 int x,
1481 int y,
1482 int w,
1483 int h)
1484{
1485 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1486 XClearArea(_ecore_x_disp, win, x, y, w, h, False);
1487} /* ecore_x_window_area_clear */
1488
1489EAPI void
1490ecore_x_window_area_expose(Ecore_X_Window win,
1491 int x,
1492 int y,
1493 int w,
1494 int h)
1495{
1496 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1497 XClearArea(_ecore_x_disp, win, x, y, w, h, True);
1498} /* ecore_x_window_area_expose */
1499
1500EAPI void
1501ecore_x_window_override_set(Ecore_X_Window win,
1502 Eina_Bool override)
1503{
1504 XSetWindowAttributes att;
1505
1506 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1507 att.override_redirect = override;
1508 XChangeWindowAttributes(_ecore_x_disp, win, CWOverrideRedirect, &att);
1509} /* ecore_x_window_override_set */
1510
1511#ifdef ECORE_XRENDER
1512static Ecore_X_Window
1513_ecore_x_window_argb_internal_new(Ecore_X_Window parent,
1514 int x,
1515 int y,
1516 int w,
1517 int h,
1518 Eina_Bool override,
1519 Eina_Bool saveunder)
1520{
1521 Window win;
1522 XSetWindowAttributes attr;
1523 XWindowAttributes att;
1524 XVisualInfo *xvi;
1525 XVisualInfo vi_in;
1526 int nvi, i, scr = 0;
1527 XRenderPictFormat *fmt;
1528 Visual *vis;
1529
1530 if (parent == 0)
1531 {
1532 parent = DefaultRootWindow(_ecore_x_disp);
1533 scr = DefaultScreen(_ecore_x_disp);
1534 }
1535 else
1536 {
1537 /* ewww - round trip */
1538 XGetWindowAttributes(_ecore_x_disp, parent, &att);
1539 for (i = 0; i < ScreenCount(_ecore_x_disp); i++)
1540 {
1541 if (att.screen == ScreenOfDisplay(_ecore_x_disp, i))
1542 {
1543 scr = i;
1544 break;
1545 }
1546 }
1547 }
1548
1549 vi_in.screen = scr;
1550 vi_in.depth = 32;
1551 vi_in.class = TrueColor;
1552 xvi = XGetVisualInfo(_ecore_x_disp,
1553 VisualScreenMask |
1554 VisualDepthMask |
1555 VisualClassMask,
1556 &vi_in,
1557 &nvi);
1558 if (!xvi)
1559 return 0;
1560
1561 vis = NULL;
1562 for (i = 0; i < nvi; i++)
1563 {
1564 fmt = XRenderFindVisualFormat(_ecore_x_disp, xvi[i].visual);
1565 if ((fmt->type == PictTypeDirect) && (fmt->direct.alphaMask))
1566 {
1567 vis = xvi[i].visual;
1568 break;
1569 }
1570 }
1571 XFree (xvi);
1572
1573 attr.backing_store = NotUseful;
1574 attr.override_redirect = override;
1575 attr.colormap = XCreateColormap(_ecore_x_disp, parent,
1576 vis, AllocNone);
1577 attr.border_pixel = 0;
1578 attr.background_pixmap = None;
1579 attr.bit_gravity = NorthWestGravity;
1580 attr.win_gravity = NorthWestGravity;
1581 attr.save_under = saveunder;
1582 attr.do_not_propagate_mask = NoEventMask;
1583 attr.event_mask = KeyPressMask |
1584 KeyReleaseMask |
1585 ButtonPressMask |
1586 ButtonReleaseMask |
1587 EnterWindowMask |
1588 LeaveWindowMask |
1589 PointerMotionMask |
1590 ExposureMask |
1591 VisibilityChangeMask |
1592 StructureNotifyMask |
1593 FocusChangeMask |
1594 PropertyChangeMask |
1595 ColormapChangeMask;
1596 win = XCreateWindow(_ecore_x_disp, parent,
1597 x, y, w, h, 0,
1598 32,
1599 InputOutput,
1600 vis,
1601 CWBackingStore |
1602 CWOverrideRedirect |
1603 CWColormap |
1604 CWBorderPixel |
1605 CWBackPixmap |
1606 CWSaveUnder |
1607 CWDontPropagate |
1608 CWEventMask |
1609 CWBitGravity |
1610 CWWinGravity,
1611 &attr);
1612 XFreeColormap(_ecore_x_disp, attr.colormap);
1613
1614 if (parent == DefaultRootWindow(_ecore_x_disp))
1615 ecore_x_window_defaults_set(win);
1616
1617 return win;
1618} /* _ecore_x_window_argb_internal_new */
1619
1620#endif /* ifdef ECORE_XRENDER */
1621
1622EAPI int
1623ecore_x_window_argb_get(Ecore_X_Window win)
1624{
1625#ifdef ECORE_XRENDER
1626 XWindowAttributes att;
1627 XRenderPictFormat *fmt;
1628
1629 att.visual = 0;
1630 if (!XGetWindowAttributes(_ecore_x_disp, win, &att))
1631 return 0;
1632
1633 fmt = XRenderFindVisualFormat(_ecore_x_disp, att.visual);
1634 if (!fmt)
1635 return 0;
1636
1637 if ((fmt->type == PictTypeDirect) && (fmt->direct.alphaMask))
1638 return 1;
1639
1640 return 0;
1641#else /* ifdef ECORE_XRENDER */
1642 return 0;
1643#endif /* ifdef ECORE_XRENDER */
1644} /* ecore_x_window_argb_get */
1645
1646/**
1647 * Creates a new window.
1648 * @param parent The parent window to use. If @p parent is @c 0, the root
1649 * window of the default display is used.
1650 * @param x X position.
1651 * @param y Y position.
1652 * @param w Width.
1653 * @param h Height.
1654 * @return The new window handle.
1655 * @ingroup Ecore_X_Window_Create_Group
1656 */
1657EAPI Ecore_X_Window
1658ecore_x_window_manager_argb_new(Ecore_X_Window parent,
1659 int x,
1660 int y,
1661 int w,
1662 int h)
1663{
1664#ifdef ECORE_XRENDER
1665 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1666 return _ecore_x_window_argb_internal_new(parent, x, y, w, h, 1, 0);
1667#else /* ifdef ECORE_XRENDER */
1668 return 0;
1669#endif /* ifdef ECORE_XRENDER */
1670} /* ecore_x_window_manager_argb_new */
1671
1672/**
1673 * Creates a new window.
1674 * @param parent The parent window to use. If @p parent is @c 0, the root
1675 * window of the default display is used.
1676 * @param x X position.
1677 * @param y Y position.
1678 * @param w Width.
1679 * @param h Height.
1680 * @return The new window handle.
1681 * @ingroup Ecore_X_Window_Create_Group
1682 */
1683EAPI Ecore_X_Window
1684ecore_x_window_argb_new(Ecore_X_Window parent,
1685 int x,
1686 int y,
1687 int w,
1688 int h)
1689{
1690#ifdef ECORE_XRENDER
1691 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1692 return _ecore_x_window_argb_internal_new(parent, x, y, w, h, 0, 0);
1693#else /* ifdef ECORE_XRENDER */
1694 return 0;
1695#endif /* ifdef ECORE_XRENDER */
1696} /* ecore_x_window_argb_new */
1697
1698/**
1699 * Creates a window with the override redirect attribute set to @c True.
1700 * @param parent The parent window to use. If @p parent is @c 0, the root
1701 * window of the default display is used.
1702 * @param x X position.
1703 * @param y Y position.
1704 * @param w Width.
1705 * @param h Height.
1706 * @return The new window handle.
1707 * @ingroup Ecore_X_Window_Create_Group
1708 */
1709EAPI Ecore_X_Window
1710ecore_x_window_override_argb_new(Ecore_X_Window parent,
1711 int x,
1712 int y,
1713 int w,
1714 int h)
1715{
1716#ifdef ECORE_XRENDER
1717 LOGFN(__FILE__, __LINE__, __FUNCTION__);
1718 return _ecore_x_window_argb_internal_new(parent, x, y, w, h, 1, 0);
1719#else /* ifdef ECORE_XRENDER */
1720 return 0;
1721#endif /* ifdef ECORE_XRENDER */
1722} /* ecore_x_window_override_argb_new */
1723
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_prop.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_prop.c
new file mode 100644
index 0000000..8d5c757
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_prop.c
@@ -0,0 +1,750 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6#include <string.h>
7
8#include "Ecore.h"
9#include "ecore_x_private.h"
10#include "Ecore_X.h"
11#include "Ecore_X_Atoms.h"
12#include <inttypes.h>
13#include <limits.h>
14
15#define _ATOM_SET_CARD32(win, atom, p_val, cnt) \
16 XChangeProperty(_ecore_x_disp, win, atom, XA_CARDINAL, 32, PropModeReplace, \
17 (unsigned char *)p_val, cnt)
18
19/*
20 * Set CARD32 (array) property
21 */
22EAPI void
23ecore_x_window_prop_card32_set(Ecore_X_Window win,
24 Ecore_X_Atom atom,
25 unsigned int *val,
26 unsigned int num)
27{
28#if SIZEOF_INT == SIZEOF_LONG
29 _ATOM_SET_CARD32(win, atom, val, num);
30#else /* if SIZEOF_INT == SIZEOF_LONG */
31 long *v2;
32 unsigned int i;
33
34 LOGFN(__FILE__, __LINE__, __FUNCTION__);
35 v2 = malloc(num * sizeof(long));
36 if (!v2)
37 return;
38
39 for (i = 0; i < num; i++)
40 v2[i] = val[i];
41 _ATOM_SET_CARD32(win, atom, v2, num);
42 free(v2);
43#endif /* if SIZEOF_INT == SIZEOF_LONG */
44} /* ecore_x_window_prop_card32_set */
45
46/*
47 * Get CARD32 (array) property
48 *
49 * At most len items are returned in val.
50 * If the property was successfully fetched the number of items stored in
51 * val is returned, otherwise -1 is returned.
52 * Note: Return value 0 means that the property exists but has no elements.
53 */
54EAPI int
55ecore_x_window_prop_card32_get(Ecore_X_Window win,
56 Ecore_X_Atom atom,
57 unsigned int *val,
58 unsigned int len)
59{
60 unsigned char *prop_ret;
61 Atom type_ret;
62 unsigned long bytes_after, num_ret;
63 int format_ret;
64 unsigned int i;
65 int num;
66
67 LOGFN(__FILE__, __LINE__, __FUNCTION__);
68 prop_ret = NULL;
69 if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
70 XA_CARDINAL, &type_ret, &format_ret, &num_ret,
71 &bytes_after, &prop_ret) != Success)
72 return -1;
73
74 if (type_ret != XA_CARDINAL || format_ret != 32)
75 num = -1;
76 else if (num_ret == 0 || !prop_ret)
77 num = 0;
78 else
79 {
80 if (num_ret < len)
81 len = num_ret;
82
83 for (i = 0; i < len; i++)
84 val[i] = ((unsigned long *)prop_ret)[i];
85 num = len;
86 }
87
88 if (prop_ret)
89 XFree(prop_ret);
90
91 return num;
92} /* ecore_x_window_prop_card32_get */
93
94/*
95 * Get CARD32 (array) property of any length
96 *
97 * If the property was successfully fetched the number of items stored in
98 * val is returned, otherwise -1 is returned.
99 * Note: Return value 0 means that the property exists but has no elements.
100 */
101EAPI int
102ecore_x_window_prop_card32_list_get(Ecore_X_Window win,
103 Ecore_X_Atom atom,
104 unsigned int **plst)
105{
106 unsigned char *prop_ret;
107 Atom type_ret;
108 unsigned long bytes_after, num_ret;
109 int format_ret;
110 unsigned int i, *val;
111 int num;
112
113 LOGFN(__FILE__, __LINE__, __FUNCTION__);
114 *plst = NULL;
115 prop_ret = NULL;
116 if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
117 XA_CARDINAL, &type_ret, &format_ret, &num_ret,
118 &bytes_after, &prop_ret) != Success)
119 return -1;
120
121 if ((type_ret != XA_CARDINAL) || (format_ret != 32))
122 num = -1;
123 else if ((num_ret == 0) || (!prop_ret))
124 num = 0;
125 else
126 {
127 val = malloc(num_ret * sizeof(unsigned int));
128 if (!val)
129 {
130 if (prop_ret) XFree(prop_ret);
131 return -1;
132 }
133 for (i = 0; i < num_ret; i++)
134 val[i] = ((unsigned long *)prop_ret)[i];
135 num = num_ret;
136 *plst = val;
137 }
138
139 if (prop_ret)
140 XFree(prop_ret);
141
142 return num;
143} /* ecore_x_window_prop_card32_list_get */
144
145/*
146 * Set X ID (array) property
147 */
148EAPI void
149ecore_x_window_prop_xid_set(Ecore_X_Window win,
150 Ecore_X_Atom atom,
151 Ecore_X_Atom type,
152 Ecore_X_ID *lst,
153 unsigned int num)
154{
155#if SIZEOF_INT == SIZEOF_LONG
156 XChangeProperty(_ecore_x_disp, win, atom, type, 32, PropModeReplace,
157 (unsigned char *)lst, num);
158#else /* if SIZEOF_INT == SIZEOF_LONG */
159 unsigned long *pl;
160 unsigned int i;
161
162 LOGFN(__FILE__, __LINE__, __FUNCTION__);
163 pl = malloc(num * sizeof(long));
164 if (!pl)
165 return;
166
167 for (i = 0; i < num; i++)
168 pl[i] = lst[i];
169 XChangeProperty(_ecore_x_disp, win, atom, type, 32, PropModeReplace,
170 (unsigned char *)pl, num);
171 free(pl);
172#endif /* if SIZEOF_INT == SIZEOF_LONG */
173} /* ecore_x_window_prop_xid_set */
174
175/*
176 * Get X ID (array) property
177 *
178 * At most len items are returned in val.
179 * If the property was successfully fetched the number of items stored in
180 * val is returned, otherwise -1 is returned.
181 * Note: Return value 0 means that the property exists but has no elements.
182 */
183EAPI int
184ecore_x_window_prop_xid_get(Ecore_X_Window win,
185 Ecore_X_Atom atom,
186 Ecore_X_Atom type,
187 Ecore_X_ID *lst,
188 unsigned int len)
189{
190 unsigned char *prop_ret;
191 Atom type_ret;
192 unsigned long bytes_after, num_ret;
193 int format_ret;
194 int num;
195 unsigned i;
196
197 LOGFN(__FILE__, __LINE__, __FUNCTION__);
198 prop_ret = NULL;
199 if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
200 type, &type_ret, &format_ret, &num_ret,
201 &bytes_after, &prop_ret) != Success)
202 return -1;
203
204 if (type_ret != type || format_ret != 32)
205 num = -1;
206 else if (num_ret == 0 || !prop_ret)
207 num = 0;
208 else
209 {
210 if (num_ret < len)
211 len = num_ret;
212
213 for (i = 0; i < len; i++)
214 lst[i] = ((unsigned long *)prop_ret)[i];
215 num = len;
216 }
217
218 if (prop_ret)
219 XFree(prop_ret);
220
221 return num;
222} /* ecore_x_window_prop_xid_get */
223
224/*
225 * Get X ID (array) property
226 *
227 * If the property was successfully fetched the number of items stored in
228 * val is returned, otherwise -1 is returned.
229 * The returned array must be freed with free().
230 * Note: Return value 0 means that the property exists but has no elements.
231 */
232EAPI int
233ecore_x_window_prop_xid_list_get(Ecore_X_Window win,
234 Ecore_X_Atom atom,
235 Ecore_X_Atom type,
236 Ecore_X_ID **val)
237{
238 unsigned char *prop_ret;
239 Atom type_ret;
240 unsigned long bytes_after, num_ret;
241 int format_ret;
242 Ecore_X_Atom *alst;
243 int num;
244 unsigned i;
245
246 LOGFN(__FILE__, __LINE__, __FUNCTION__);
247 *val = NULL;
248 prop_ret = NULL;
249 if (XGetWindowProperty(_ecore_x_disp, win, atom, 0, 0x7fffffff, False,
250 type, &type_ret, &format_ret, &num_ret,
251 &bytes_after, &prop_ret) != Success)
252 return -1;
253
254 if (type_ret != type || format_ret != 32)
255 num = -1;
256 else if (num_ret == 0 || !prop_ret)
257 num = 0;
258 else
259 {
260 alst = malloc(num_ret * sizeof(Ecore_X_ID));
261 for (i = 0; i < num_ret; i++)
262 alst[i] = ((unsigned long *)prop_ret)[i];
263 num = num_ret;
264 *val = alst;
265 }
266
267 if (prop_ret)
268 XFree(prop_ret);
269
270 return num;
271} /* ecore_x_window_prop_xid_list_get */
272
273/*
274 * Remove/add/toggle X ID list item.
275 */
276EAPI void
277ecore_x_window_prop_xid_list_change(Ecore_X_Window win,
278 Ecore_X_Atom atom,
279 Ecore_X_Atom type,
280 Ecore_X_ID item,
281 int op)
282{
283 Ecore_X_ID *lst;
284 int i, num;
285
286 LOGFN(__FILE__, __LINE__, __FUNCTION__);
287 num = ecore_x_window_prop_xid_list_get(win, atom, type, &lst);
288 if (num < 0)
289 {
290 return; /* Error - assuming invalid window */
291 }
292
293 /* Is it there? */
294 for (i = 0; i < num; i++)
295 {
296 if (lst[i] == item)
297 break;
298 }
299
300 if (i < num)
301 {
302 /* Was in list */
303 if (op == ECORE_X_PROP_LIST_ADD)
304 goto done; /* Remove it */
305
306 num--;
307 for (; i < num; i++)
308 lst[i] = lst[i + 1];
309 }
310 else
311 {
312 /* Was not in list */
313 if (op == ECORE_X_PROP_LIST_REMOVE)
314 goto done; /* Add it */
315
316 num++;
317 lst = realloc(lst, num * sizeof(Ecore_X_ID));
318 lst[i] = item;
319 }
320
321 ecore_x_window_prop_xid_set(win, atom, type, lst, num);
322
323done:
324 if (lst)
325 free(lst);
326} /* ecore_x_window_prop_xid_list_change */
327
328/*
329 * Set Atom (array) property
330 */
331EAPI void
332ecore_x_window_prop_atom_set(Ecore_X_Window win,
333 Ecore_X_Atom atom,
334 Ecore_X_Atom *lst,
335 unsigned int num)
336{
337 LOGFN(__FILE__, __LINE__, __FUNCTION__);
338 ecore_x_window_prop_xid_set(win, atom, XA_ATOM, lst, num);
339} /* ecore_x_window_prop_atom_set */
340
341/*
342 * Get Atom (array) property
343 *
344 * At most len items are returned in val.
345 * If the property was successfully fetched the number of items stored in
346 * val is returned, otherwise -1 is returned.
347 * Note: Return value 0 means that the property exists but has no elements.
348 */
349EAPI int
350ecore_x_window_prop_atom_get(Ecore_X_Window win,
351 Ecore_X_Atom atom,
352 Ecore_X_Atom *lst,
353 unsigned int len)
354{
355 LOGFN(__FILE__, __LINE__, __FUNCTION__);
356 return ecore_x_window_prop_xid_get(win, atom, XA_ATOM, lst, len);
357} /* ecore_x_window_prop_atom_get */
358
359/*
360 * Get Atom (array) property
361 *
362 * If the property was successfully fetched the number of items stored in
363 * val is returned, otherwise -1 is returned.
364 * The returned array must be freed with free().
365 * Note: Return value 0 means that the property exists but has no elements.
366 */
367EAPI int
368ecore_x_window_prop_atom_list_get(Ecore_X_Window win,
369 Ecore_X_Atom atom,
370 Ecore_X_Atom **plst)
371{
372 LOGFN(__FILE__, __LINE__, __FUNCTION__);
373 return ecore_x_window_prop_xid_list_get(win, atom, XA_ATOM, plst);
374} /* ecore_x_window_prop_atom_list_get */
375
376/*
377 * Remove/add/toggle atom list item.
378 */
379EAPI void
380ecore_x_window_prop_atom_list_change(Ecore_X_Window win,
381 Ecore_X_Atom atom,
382 Ecore_X_Atom item,
383 int op)
384{
385 LOGFN(__FILE__, __LINE__, __FUNCTION__);
386 ecore_x_window_prop_xid_list_change(win, atom, XA_ATOM, item, op);
387} /* ecore_x_window_prop_atom_list_change */
388
389/*
390 * Set Window (array) property
391 */
392EAPI void
393ecore_x_window_prop_window_set(Ecore_X_Window win,
394 Ecore_X_Atom atom,
395 Ecore_X_Window *lst,
396 unsigned int num)
397{
398 LOGFN(__FILE__, __LINE__, __FUNCTION__);
399 ecore_x_window_prop_xid_set(win, atom, XA_WINDOW, lst, num);
400} /* ecore_x_window_prop_window_set */
401
402/*
403 * Get Window (array) property
404 *
405 * At most len items are returned in val.
406 * If the property was successfully fetched the number of items stored in
407 * val is returned, otherwise -1 is returned.
408 * Note: Return value 0 means that the property exists but has no elements.
409 */
410EAPI int
411ecore_x_window_prop_window_get(Ecore_X_Window win,
412 Ecore_X_Atom atom,
413 Ecore_X_Window *lst,
414 unsigned int len)
415{
416 LOGFN(__FILE__, __LINE__, __FUNCTION__);
417 return ecore_x_window_prop_xid_get(win, atom, XA_WINDOW, lst, len);
418} /* ecore_x_window_prop_window_get */
419
420/*
421 * Get Window (array) property
422 *
423 * If the property was successfully fetched the number of items stored in
424 * val is returned, otherwise -1 is returned.
425 * The returned array must be freed with free().
426 * Note: Return value 0 means that the property exists but has no elements.
427 */
428EAPI int
429ecore_x_window_prop_window_list_get(Ecore_X_Window win,
430 Ecore_X_Atom atom,
431 Ecore_X_Window **plst)
432{
433 LOGFN(__FILE__, __LINE__, __FUNCTION__);
434 return ecore_x_window_prop_xid_list_get(win, atom, XA_WINDOW, plst);
435} /* ecore_x_window_prop_window_list_get */
436
437/**
438 * To be documented.
439 *
440 * FIXME: To be fixed.
441 */
442EAPI Ecore_X_Atom
443ecore_x_window_prop_any_type(void)
444{
445 return AnyPropertyType;
446} /* ecore_x_window_prop_any_type */
447
448/**
449 * To be documented.
450 *
451 * FIXME: To be fixed.
452 */
453EAPI void
454ecore_x_window_prop_property_set(Ecore_X_Window win,
455 Ecore_X_Atom property,
456 Ecore_X_Atom type,
457 int size,
458 void *data,
459 int number)
460{
461 LOGFN(__FILE__, __LINE__, __FUNCTION__);
462 if (win == 0)
463 win = DefaultRootWindow(_ecore_x_disp);
464
465 if (size != 32)
466 XChangeProperty(_ecore_x_disp,
467 win,
468 property,
469 type,
470 size,
471 PropModeReplace,
472 (unsigned char *)data,
473 number);
474 else
475 {
476 unsigned long *dat;
477 int i, *ptr;
478
479 dat = malloc(sizeof(unsigned long) * number);
480 if (dat)
481 {
482 for (ptr = (int *)data, i = 0; i < number; i++) dat[i] = ptr[i];
483 XChangeProperty(_ecore_x_disp, win, property, type, size,
484 PropModeReplace, (unsigned char *)dat, number);
485 free(dat);
486 }
487 }
488} /* ecore_x_window_prop_property_set */
489
490/**
491 * To be documented.
492 *
493 * FIXME: To be fixed.
494 */
495EAPI int
496ecore_x_window_prop_property_get(Ecore_X_Window win,
497 Ecore_X_Atom property,
498 Ecore_X_Atom type,
499 int size __UNUSED__,
500 unsigned char **data,
501 int *num)
502{
503 Atom type_ret = 0;
504 int ret, size_ret = 0;
505 unsigned long num_ret = 0, bytes = 0, i;
506 unsigned char *prop_ret = NULL;
507
508 /* make sure these are initialized */
509 if (num)
510 *num = 0;
511
512 if (data)
513 *data = NULL;
514 else /* we can't store the retrieved data, so just return */
515 return 0;
516
517 LOGFN(__FILE__, __LINE__, __FUNCTION__);
518 if (!win)
519 win = DefaultRootWindow(_ecore_x_disp);
520
521 ret = XGetWindowProperty(_ecore_x_disp, win, property, 0, LONG_MAX,
522 False, type, &type_ret, &size_ret,
523 &num_ret, &bytes, &prop_ret);
524
525 if (ret != Success)
526 return 0;
527
528 if (!num_ret)
529 {
530 XFree(prop_ret);
531 return 0;
532 }
533
534 if (!(*data = malloc(num_ret * size_ret / 8)))
535 {
536 XFree(prop_ret);
537 return 0;
538 }
539
540 switch (size_ret) {
541 case 8:
542 for (i = 0; i < num_ret; i++)
543 (*data)[i] = prop_ret[i];
544 break;
545
546 case 16:
547 for (i = 0; i < num_ret; i++)
548 ((unsigned short *)*data)[i] = ((unsigned short *)prop_ret)[i];
549 break;
550
551 case 32:
552 for (i = 0; i < num_ret; i++)
553 ((unsigned int *)*data)[i] = ((unsigned long *)prop_ret)[i];
554 break;
555 } /* switch */
556
557 XFree(prop_ret);
558
559 if (num)
560 *num = num_ret;
561
562 return size_ret;
563} /* ecore_x_window_prop_property_get */
564
565EAPI void
566ecore_x_window_prop_property_del(Ecore_X_Window win,
567 Ecore_X_Atom property)
568{
569 LOGFN(__FILE__, __LINE__, __FUNCTION__);
570 XDeleteProperty(_ecore_x_disp, win, property);
571} /* ecore_x_window_prop_property_del */
572
573EAPI Ecore_X_Atom *
574ecore_x_window_prop_list(Ecore_X_Window win,
575 int *num_ret)
576{
577 Ecore_X_Atom *atoms;
578 Atom *atom_ret;
579 int num = 0, i;
580
581 LOGFN(__FILE__, __LINE__, __FUNCTION__);
582 if (num_ret)
583 *num_ret = 0;
584
585 atom_ret = XListProperties(_ecore_x_disp, win, &num);
586 if (!atom_ret)
587 return NULL;
588
589 atoms = malloc(num * sizeof(Ecore_X_Atom));
590 if (atoms)
591 {
592 for (i = 0; i < num; i++) atoms[i] = atom_ret[i];
593 if (num_ret)
594 *num_ret = num;
595 }
596
597 XFree(atom_ret);
598 return atoms;
599} /* ecore_x_window_prop_list */
600
601/**
602 * Set a window string property.
603 * @param win The window
604 * @param type The property
605 * @param str The string
606 *
607 * Set a window string property
608 */
609EAPI void
610ecore_x_window_prop_string_set(Ecore_X_Window win,
611 Ecore_X_Atom type,
612 const char *str)
613{
614 XTextProperty xtp;
615
616 LOGFN(__FILE__, __LINE__, __FUNCTION__);
617 if (win == 0)
618 win = DefaultRootWindow(_ecore_x_disp);
619
620 xtp.value = (unsigned char *)str;
621 xtp.format = 8;
622 xtp.encoding = ECORE_X_ATOM_UTF8_STRING;
623 xtp.nitems = strlen(str);
624 XSetTextProperty(_ecore_x_disp, win, &xtp, type);
625} /* ecore_x_window_prop_string_set */
626
627/**
628 * Get a window string property.
629 * @param win The window
630 * @param type The property
631 *
632 * Return window string property of a window. String must be free'd when done.
633 */
634EAPI char *
635ecore_x_window_prop_string_get(Ecore_X_Window win,
636 Ecore_X_Atom type)
637{
638 XTextProperty xtp;
639 char *str = NULL;
640
641 LOGFN(__FILE__, __LINE__, __FUNCTION__);
642 if (win == 0)
643 win = DefaultRootWindow(_ecore_x_disp);
644
645 if (XGetTextProperty(_ecore_x_disp, win, &xtp, type))
646 {
647 int items;
648 char **list = NULL;
649 Status s;
650
651 if (xtp.encoding == ECORE_X_ATOM_UTF8_STRING)
652 str = strdup((char *)xtp.value);
653 else
654 {
655#ifdef X_HAVE_UTF8_STRING
656 s = Xutf8TextPropertyToTextList(_ecore_x_disp, &xtp,
657 &list, &items);
658#else /* ifdef X_HAVE_UTF8_STRING */
659 s = XmbTextPropertyToTextList(_ecore_x_disp, &xtp,
660 &list, &items);
661#endif /* ifdef X_HAVE_UTF8_STRING */
662 if ((s == XLocaleNotSupported) ||
663 (s == XNoMemory) || (s == XConverterNotFound))
664 str = strdup((char *)xtp.value);
665 else if ((s >= Success) && (items > 0))
666 str = strdup(list[0]);
667
668 if (list)
669 XFreeStringList(list);
670 }
671
672 XFree(xtp.value);
673 }
674
675 return str;
676} /* ecore_x_window_prop_string_get */
677
678EAPI Eina_Bool
679ecore_x_window_prop_protocol_isset(Ecore_X_Window win,
680 Ecore_X_WM_Protocol protocol)
681{
682 Atom proto, *protos = NULL;
683 int i, protos_count = 0;
684 Eina_Bool ret = EINA_FALSE;
685
686 /* check for invalid values */
687 if (protocol >= ECORE_X_WM_PROTOCOL_NUM)
688 return EINA_FALSE;
689
690 LOGFN(__FILE__, __LINE__, __FUNCTION__);
691 proto = _ecore_x_atoms_wm_protocols[protocol];
692
693 if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
694 return ret;
695
696 for (i = 0; i < protos_count; i++)
697 if (protos[i] == proto)
698 {
699 ret = EINA_TRUE;
700 break;
701 }
702
703 XFree(protos);
704
705 return ret;
706} /* ecore_x_window_prop_protocol_isset */
707
708/**
709 * To be documented.
710 *
711 * FIXME: To be fixed.
712 */
713EAPI Ecore_X_WM_Protocol *
714ecore_x_window_prop_protocol_list_get(Ecore_X_Window win,
715 int *num_ret)
716{
717 Atom *protos = NULL;
718 int i, protos_count = 0;
719 Ecore_X_WM_Protocol *prot_ret = NULL;
720
721 LOGFN(__FILE__, __LINE__, __FUNCTION__);
722 if (!XGetWMProtocols(_ecore_x_disp, win, &protos, &protos_count))
723 return NULL;
724
725 if ((!protos) || (protos_count <= 0))
726 return NULL;
727
728 prot_ret = calloc(1, protos_count * sizeof(Ecore_X_WM_Protocol));
729 if (!prot_ret)
730 {
731 XFree(protos);
732 return NULL;
733 }
734
735 for (i = 0; i < protos_count; i++)
736 {
737 Ecore_X_WM_Protocol j;
738
739 prot_ret[i] = -1;
740 for (j = 0; j < ECORE_X_WM_PROTOCOL_NUM; j++)
741 {
742 if (_ecore_x_atoms_wm_protocols[j] == protos[i])
743 prot_ret[i] = j;
744 }
745 }
746 XFree(protos);
747 *num_ret = protos_count;
748 return prot_ret;
749} /* ecore_x_window_prop_protocol_list_get */
750
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_shape.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_shape.c
new file mode 100644
index 0000000..2e8f8ce
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_window_shape.c
@@ -0,0 +1,658 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <stdlib.h>
6
7#include "Ecore.h"
8#include "ecore_x_private.h"
9#include "Ecore_X.h"
10
11/**
12 * @defgroup Ecore_X_Window_Shape X Window Shape Functions
13 *
14 * These functions use the shape extension of the X server to change
15 * shape of given windows.
16 */
17
18/**
19 * Sets the shape of the given window to that given by the pixmap @p mask.
20 * @param win The given window.
21 * @param mask A 2-bit depth pixmap that provides the new shape of the
22 * window.
23 * @ingroup Ecore_X_Window_Shape
24 */
25EAPI void
26ecore_x_window_shape_mask_set(Ecore_X_Window win,
27 Ecore_X_Pixmap mask)
28{
29 LOGFN(__FILE__, __LINE__, __FUNCTION__);
30 XShapeCombineMask(_ecore_x_disp, win, ShapeBounding, 0, 0, mask, ShapeSet);
31} /* ecore_x_window_shape_mask_set */
32
33/**
34 * Sets the input shape of the given window to that given by the pixmap @p mask.
35 * @param win The given window.
36 * @param mask A 1-bit depth pixmap that provides the new input shape of the
37 * window.
38 * @ingroup Ecore_X_Window_Shape
39 */
40EAPI void
41ecore_x_window_shape_input_mask_set(Ecore_X_Window win,
42 Ecore_X_Pixmap mask)
43{
44 LOGFN(__FILE__, __LINE__, __FUNCTION__);
45#ifdef ShapeInput
46 XShapeCombineMask(_ecore_x_disp, win, ShapeInput, 0, 0, mask, ShapeSet);
47#else /* ifdef ShapeInput */
48 return;
49 win = mask = 0;
50#endif /* ifdef ShapeInput */
51} /* ecore_x_window_shape_input_mask_set */
52
53EAPI void
54ecore_x_window_shape_window_set(Ecore_X_Window win,
55 Ecore_X_Window shape_win)
56{
57 LOGFN(__FILE__, __LINE__, __FUNCTION__);
58 XShapeCombineShape(_ecore_x_disp,
59 win,
60 ShapeBounding,
61 0,
62 0,
63 shape_win,
64 ShapeBounding,
65 ShapeSet);
66} /* ecore_x_window_shape_window_set */
67
68EAPI void
69ecore_x_window_shape_input_window_set(Ecore_X_Window win,
70 Ecore_X_Window shape_win)
71{
72#ifdef ShapeInput
73 LOGFN(__FILE__, __LINE__, __FUNCTION__);
74 XShapeCombineShape(_ecore_x_disp,
75 win,
76 ShapeInput,
77 0,
78 0,
79 shape_win,
80 ShapeInput,
81 ShapeSet);
82#else
83 return;
84 win = shape_win = 0;
85#endif
86} /* ecore_x_window_shape_input_window_set */
87
88EAPI void
89ecore_x_window_shape_window_set_xy(Ecore_X_Window win,
90 Ecore_X_Window shape_win,
91 int x,
92 int y)
93{
94 LOGFN(__FILE__, __LINE__, __FUNCTION__);
95 XShapeCombineShape(_ecore_x_disp,
96 win,
97 ShapeBounding,
98 x,
99 y,
100 shape_win,
101 ShapeBounding,
102 ShapeSet);
103} /* ecore_x_window_shape_window_set_xy */
104
105EAPI void
106ecore_x_window_shape_input_window_set_xy(Ecore_X_Window win,
107 Ecore_X_Window shape_win,
108 int x,
109 int y)
110{
111#ifdef ShapeInput
112 LOGFN(__FILE__, __LINE__, __FUNCTION__);
113 XShapeCombineShape(_ecore_x_disp,
114 win,
115 ShapeInput,
116 x,
117 y,
118 shape_win,
119 ShapeInput,
120 ShapeSet);
121#else
122 return;
123 win = shape_win = x = y = 0;
124#endif
125} /* ecore_x_window_shape_input_window_set_xy */
126
127EAPI void
128ecore_x_window_shape_rectangle_set(Ecore_X_Window win,
129 int x,
130 int y,
131 int w,
132 int h)
133{
134 XRectangle rect;
135
136 LOGFN(__FILE__, __LINE__, __FUNCTION__);
137 rect.x = x;
138 rect.y = y;
139 rect.width = w;
140 rect.height = h;
141 XShapeCombineRectangles(_ecore_x_disp,
142 win,
143 ShapeBounding,
144 0,
145 0,
146 &rect,
147 1,
148 ShapeSet,
149 Unsorted);
150} /* ecore_x_window_shape_rectangle_set */
151
152EAPI void
153ecore_x_window_shape_input_rectangle_set(Ecore_X_Window win,
154 int x,
155 int y,
156 int w,
157 int h)
158{
159#ifdef ShapeInput
160 XRectangle rect;
161
162 LOGFN(__FILE__, __LINE__, __FUNCTION__);
163 rect.x = x;
164 rect.y = y;
165 rect.width = w;
166 rect.height = h;
167 XShapeCombineRectangles(_ecore_x_disp,
168 win,
169 ShapeInput,
170 0,
171 0,
172 &rect,
173 1,
174 ShapeSet,
175 Unsorted);
176#else
177 return;
178 win = x = y = w = h = 0;
179#endif
180} /* ecore_x_window_shape_input_rectangle_set */
181
182EAPI void
183ecore_x_window_shape_rectangles_set(Ecore_X_Window win,
184 Ecore_X_Rectangle *rects,
185 int num)
186{
187#ifdef ShapeInput
188 XRectangle *rect = NULL;
189 int i;
190
191 LOGFN(__FILE__, __LINE__, __FUNCTION__);
192 if (!rects) return;
193 if (num > 0)
194 {
195 rect = malloc(sizeof(XRectangle) * num);
196 if (!rect) return;
197 for (i = 0; i < num; i++)
198 {
199 rect[i].x = rects[i].x;
200 rect[i].y = rects[i].y;
201 rect[i].width = rects[i].width;
202 rect[i].height = rects[i].height;
203 }
204 }
205 XShapeCombineRectangles(_ecore_x_disp,
206 win,
207 ShapeBounding,
208 0,
209 0,
210 rect,
211 num,
212 ShapeSet,
213 Unsorted);
214 if (rect) free(rect);
215#else
216 return;
217 win = rects = num = 0;
218#endif
219} /* ecore_x_window_shape_rectangles_set */
220
221EAPI void
222ecore_x_window_shape_input_rectangles_set(Ecore_X_Window win,
223 Ecore_X_Rectangle *rects,
224 int num)
225{
226#ifdef ShapeInput
227 XRectangle *rect = NULL;
228 int i;
229
230 LOGFN(__FILE__, __LINE__, __FUNCTION__);
231 if (!rects) return;
232 if (num > 0)
233 {
234 rect = malloc(sizeof(XRectangle) * num);
235 if (!rect) return;
236 for (i = 0; i < num; i++)
237 {
238 rect[i].x = rects[i].x;
239 rect[i].y = rects[i].y;
240 rect[i].width = rects[i].width;
241 rect[i].height = rects[i].height;
242 }
243 }
244 XShapeCombineRectangles(_ecore_x_disp,
245 win,
246 ShapeInput,
247 0,
248 0,
249 rect,
250 num,
251 ShapeSet,
252 Unsorted);
253 if (rect) free(rect);
254#else
255 return;
256 win = rects = num = 0;
257#endif
258} /* ecore_x_window_shape_input_rectangles_set */
259
260EAPI void
261ecore_x_window_shape_rectangle_subtract(Ecore_X_Window win,
262 int x,
263 int y,
264 int w,
265 int h)
266{
267 XRectangle rect;
268
269 LOGFN(__FILE__, __LINE__, __FUNCTION__);
270 rect.x = x;
271 rect.y = y;
272 rect.width = w;
273 rect.height = h;
274 XShapeCombineRectangles(_ecore_x_disp,
275 win,
276 ShapeBounding,
277 0,
278 0,
279 &rect,
280 1,
281 ShapeSubtract,
282 Unsorted);
283} /* ecore_x_window_shape_rectangle_subtract */
284
285EAPI void
286ecore_x_window_shape_input_rectangle_subtract(Ecore_X_Window win,
287 int x,
288 int y,
289 int w,
290 int h)
291{
292#ifdef ShapeInput
293 XRectangle rect;
294
295 LOGFN(__FILE__, __LINE__, __FUNCTION__);
296 rect.x = x;
297 rect.y = y;
298 rect.width = w;
299 rect.height = h;
300 XShapeCombineRectangles(_ecore_x_disp,
301 win,
302 ShapeInput,
303 0,
304 0,
305 &rect,
306 1,
307 ShapeSubtract,
308 Unsorted);
309#else
310 return;
311 win = x = y = w = h = 0;
312#endif
313} /* ecore_x_window_shape_input_rectangle_subtract */
314
315EAPI void
316ecore_x_window_shape_window_add(Ecore_X_Window win,
317 Ecore_X_Window shape_win)
318{
319 LOGFN(__FILE__, __LINE__, __FUNCTION__);
320 XShapeCombineShape(_ecore_x_disp,
321 win,
322 ShapeBounding,
323 0,
324 0,
325 shape_win,
326 ShapeBounding,
327 ShapeUnion);
328} /* ecore_x_window_shape_window_add */
329
330EAPI void
331ecore_x_window_shape_window_add_xy(Ecore_X_Window win,
332 Ecore_X_Window shape_win,
333 int x,
334 int y)
335{
336 LOGFN(__FILE__, __LINE__, __FUNCTION__);
337 XShapeCombineShape(_ecore_x_disp,
338 win,
339 ShapeBounding,
340 x,
341 y,
342 shape_win,
343 ShapeBounding,
344 ShapeUnion);
345} /* ecore_x_window_shape_window_add_xy */
346
347EAPI void
348ecore_x_window_shape_input_window_add_xy(Ecore_X_Window win,
349 Ecore_X_Window shape_win,
350 int x,
351 int y)
352{
353#ifdef ShapeInput
354 LOGFN(__FILE__, __LINE__, __FUNCTION__);
355 XShapeCombineShape(_ecore_x_disp,
356 win,
357 ShapeInput,
358 x,
359 y,
360 shape_win,
361 ShapeInput,
362 ShapeUnion);
363#else
364 return;
365 win = shape_win = x = y = 0;
366#endif
367} /* ecore_x_window_shape_input_window_add_xy */
368
369EAPI void
370ecore_x_window_shape_rectangle_add(Ecore_X_Window win,
371 int x,
372 int y,
373 int w,
374 int h)
375{
376 XRectangle rect;
377
378 LOGFN(__FILE__, __LINE__, __FUNCTION__);
379 rect.x = x;
380 rect.y = y;
381 rect.width = w;
382 rect.height = h;
383 XShapeCombineRectangles(_ecore_x_disp,
384 win,
385 ShapeBounding,
386 0,
387 0,
388 &rect,
389 1,
390 ShapeUnion,
391 Unsorted);
392} /* ecore_x_window_shape_rectangle_add */
393
394EAPI void
395ecore_x_window_shape_input_rectangle_add(Ecore_X_Window win,
396 int x,
397 int y,
398 int w,
399 int h)
400{
401#ifdef ShapeInput
402 XRectangle rect;
403
404 LOGFN(__FILE__, __LINE__, __FUNCTION__);
405 rect.x = x;
406 rect.y = y;
407 rect.width = w;
408 rect.height = h;
409 XShapeCombineRectangles(_ecore_x_disp,
410 win,
411 ShapeInput,
412 0,
413 0,
414 &rect,
415 1,
416 ShapeUnion,
417 Unsorted);
418#else
419 return;
420 win = x = y = w = h = 0;
421#endif
422} /* ecore_x_window_shape_input_rectangle_add */
423
424EAPI void
425ecore_x_window_shape_rectangle_clip(Ecore_X_Window win,
426 int x,
427 int y,
428 int w,
429 int h)
430{
431 XRectangle rect;
432
433 LOGFN(__FILE__, __LINE__, __FUNCTION__);
434 rect.x = x;
435 rect.y = y;
436 rect.width = w;
437 rect.height = h;
438 XShapeCombineRectangles(_ecore_x_disp,
439 win,
440 ShapeBounding,
441 0,
442 0,
443 &rect,
444 1,
445 ShapeIntersect,
446 Unsorted);
447} /* ecore_x_window_shape_rectangle_clip */
448
449EAPI void
450ecore_x_window_shape_input_rectangle_clip(Ecore_X_Window win,
451 int x,
452 int y,
453 int w,
454 int h)
455{
456#ifdef ShapeInput
457 XRectangle rect;
458
459 LOGFN(__FILE__, __LINE__, __FUNCTION__);
460 rect.x = x;
461 rect.y = y;
462 rect.width = w;
463 rect.height = h;
464 XShapeCombineRectangles(_ecore_x_disp,
465 win,
466 ShapeInput,
467 0,
468 0,
469 &rect,
470 1,
471 ShapeIntersect,
472 Unsorted);
473#else
474 return;
475 win = x = y = w = h = 0;
476#endif
477} /* ecore_x_window_shape_input_rectangle_clip */
478
479EAPI void
480ecore_x_window_shape_rectangles_add(Ecore_X_Window win,
481 Ecore_X_Rectangle *rects,
482 int num)
483{
484 XRectangle *rect = NULL;
485 int i;
486
487 LOGFN(__FILE__, __LINE__, __FUNCTION__);
488 if (num > 0)
489 {
490 rect = malloc(sizeof(XRectangle) * num);
491 if (!rect) return;
492 for (i = 0; i < num; i++)
493 {
494 rect[i].x = rects[i].x;
495 rect[i].y = rects[i].y;
496 rect[i].width = rects[i].width;
497 rect[i].height = rects[i].height;
498 }
499 }
500
501 XShapeCombineRectangles(_ecore_x_disp,
502 win,
503 ShapeBounding,
504 0,
505 0,
506 rect,
507 num,
508 ShapeUnion,
509 Unsorted);
510 if (rect) free(rect);
511} /* ecore_x_window_shape_rectangles_add */
512
513EAPI void
514ecore_x_window_shape_input_rectangles_add(Ecore_X_Window win,
515 Ecore_X_Rectangle *rects,
516 int num)
517{
518#ifdef ShapeInput
519 XRectangle *rect = NULL;
520 int i;
521
522 LOGFN(__FILE__, __LINE__, __FUNCTION__);
523 if (num > 0)
524 {
525 rect = malloc(sizeof(XRectangle) * num);
526 if (!rect) return;
527 for (i = 0; i < num; i++)
528 {
529 rect[i].x = rects[i].x;
530 rect[i].y = rects[i].y;
531 rect[i].width = rects[i].width;
532 rect[i].height = rects[i].height;
533 }
534 }
535
536 XShapeCombineRectangles(_ecore_x_disp,
537 win,
538 ShapeInput,
539 0,
540 0,
541 rect,
542 num,
543 ShapeUnion,
544 Unsorted);
545 if (rect) free(rect);
546#else
547 return;
548 win = rects = num = 0;
549#endif
550} /* ecore_x_window_shape_input_rectangles_add */
551
552EAPI Ecore_X_Rectangle *
553ecore_x_window_shape_rectangles_get(Ecore_X_Window win,
554 int *num_ret)
555{
556 XRectangle *rect;
557 Ecore_X_Rectangle *rects = NULL;
558 int i, num = 0, ord;
559
560 LOGFN(__FILE__, __LINE__, __FUNCTION__);
561 rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeBounding, &num, &ord);
562 if (rect)
563 {
564 if (num < 1)
565 {
566 XFree(rect);
567 if (num_ret) *num_ret = 0;
568 return NULL;
569 }
570 rects = malloc(sizeof(Ecore_X_Rectangle) * num);
571 if (!rects)
572 {
573 XFree(rect);
574 if (num_ret) *num_ret = 0;
575 return NULL;
576 }
577 for (i = 0; i < num; i++)
578 {
579 rects[i].x = rect[i].x;
580 rects[i].y = rect[i].y;
581 rects[i].width = rect[i].width;
582 rects[i].height = rect[i].height;
583 }
584 XFree(rect);
585 }
586 if (num_ret) *num_ret = num;
587 return rects;
588} /* ecore_x_window_shape_rectangles_get */
589
590EAPI Ecore_X_Rectangle *
591ecore_x_window_shape_input_rectangles_get(Ecore_X_Window win,
592 int *num_ret)
593{
594 Ecore_X_Rectangle *rects = NULL;
595#ifdef ShapeInput
596 XRectangle *rect;
597 int i, num = 0, ord;
598
599 LOGFN(__FILE__, __LINE__, __FUNCTION__);
600 rect = XShapeGetRectangles(_ecore_x_disp, win, ShapeInput, &num, &ord);
601 if (rect)
602 {
603 if (num < 1)
604 {
605 XFree(rect);
606 if (num_ret) *num_ret = 0;
607 return NULL;
608 }
609 rects = malloc(sizeof(Ecore_X_Rectangle) * num);
610 if (!rects)
611 {
612 XFree(rect);
613 if (num_ret) *num_ret = 0;
614 return NULL;
615 }
616 for (i = 0; i < num; i++)
617 {
618 rects[i].x = rect[i].x;
619 rects[i].y = rect[i].y;
620 rects[i].width = rect[i].width;
621 rects[i].height = rect[i].height;
622 }
623 XFree(rect);
624 }
625 if (num_ret) *num_ret = num;
626 return rects;
627#else
628 // have to return fake shape input rect of size of window
629 Window dw;
630 unsigned int di;
631
632 if (num_ret) *num_ret = 0;
633 rects = malloc(sizeof(Ecore_X_Rectangle));
634 if (!rects) return NULL;
635 if (!XGetGeometry(_ecore_x_disp, win, &dw,
636 &(rects[0].x), &(rects[0].y),
637 &(rects[0].width), &(rects[0].height),
638 &di, &di))
639 {
640 free(rects);
641 return NULL;
642 }
643 if (num_ret) *num_ret = 1;
644 return rects;
645#endif
646} /* ecore_x_window_shape_input_rectangles_get */
647
648EAPI void
649ecore_x_window_shape_events_select(Ecore_X_Window win,
650 Eina_Bool on)
651{
652 LOGFN(__FILE__, __LINE__, __FUNCTION__);
653 if (on)
654 XShapeSelectInput(_ecore_x_disp, win, ShapeNotifyMask);
655 else
656 XShapeSelectInput(_ecore_x_disp, win, 0);
657} /* ecore_x_window_shape_events_select */
658
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xi2.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xi2.c
new file mode 100644
index 0000000..38a81dd
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xi2.c
@@ -0,0 +1,283 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif /* ifdef HAVE_CONFIG_H */
4
5#include <string.h>
6
7#include "Ecore.h"
8#include "ecore_x_private.h"
9#include "Ecore_X.h"
10
11#ifdef ECORE_XI2
12#include "Ecore_Input.h"
13#endif /* ifdef ECORE_XI2 */
14
15int _ecore_x_xi2_opcode = -1;
16
17#ifndef XIPointerEmulated
18#define XIPointerEmulated (1 << 16)
19#endif
20
21#ifdef ECORE_XI2
22static XIDeviceInfo *_ecore_x_xi2_devs = NULL;
23static int _ecore_x_xi2_num = 0;
24#endif /* ifdef ECORE_XI2 */
25
26void
27_ecore_x_input_init(void)
28{
29#ifdef ECORE_XI2
30 int event, error;
31 int major = 2, minor = 0;
32
33 if (!XQueryExtension(_ecore_x_disp, "XInputExtension",
34 &_ecore_x_xi2_opcode, &event, &error))
35 {
36 _ecore_x_xi2_opcode = -1;
37 return;
38 }
39
40 if (XIQueryVersion(_ecore_x_disp, &major, &minor) == BadRequest)
41 {
42 _ecore_x_xi2_opcode = -1;
43 return;
44 }
45
46 _ecore_x_xi2_devs = XIQueryDevice(_ecore_x_disp, XIAllDevices,
47 &_ecore_x_xi2_num);
48#endif /* ifdef ECORE_XI2 */
49} /* _ecore_x_input_init */
50
51void
52_ecore_x_input_shutdown(void)
53{
54#ifdef ECORE_XI2
55 if (_ecore_x_xi2_devs)
56 {
57 XIFreeDeviceInfo(_ecore_x_xi2_devs);
58 _ecore_x_xi2_devs = NULL;
59 }
60
61 _ecore_x_xi2_num = 0;
62 _ecore_x_xi2_opcode = -1;
63#endif /* ifdef ECORE_XI2 */
64} /* _ecore_x_input_shutdown */
65
66void
67_ecore_x_input_handler(XEvent *xevent)
68{
69#ifdef ECORE_XI2
70 XIDeviceEvent *evd = (XIDeviceEvent *)(xevent->xcookie.data);
71 int devid = evd->deviceid;
72 int i;
73
74 if (_ecore_x_xi2_devs)
75 {
76 for (i = 0; i < _ecore_x_xi2_num; i++)
77 {
78 XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
79
80 if (devid == dev->deviceid)
81 {
82 if (dev->use == XIMasterPointer) return;
83 if ((dev->use == XISlavePointer) &&
84 (evd->flags & XIPointerEmulated)) return;
85 }
86 }
87 }
88 switch (xevent->xcookie.evtype)
89 {
90 case XI_Motion:
91 _ecore_mouse_move
92 (evd->time,
93 0, // state
94 evd->event_x, evd->event_y,
95 evd->root_x, evd->root_y,
96 evd->event,
97 (evd->child ? evd->child : evd->event),
98 evd->root,
99 1, // same_screen
100 devid, 1, 1,
101 1.0, // pressure
102 0.0, // angle
103 evd->event_x, evd->event_y,
104 evd->root_x, evd->root_y);
105 break;
106
107 case XI_ButtonPress:
108 _ecore_mouse_button
109 (ECORE_EVENT_MOUSE_BUTTON_DOWN,
110 evd->time,
111 0, // state
112 0, // button
113 evd->event_x, evd->event_y,
114 evd->root_x, evd->root_y,
115 evd->event,
116 (evd->child ? evd->child : evd->event),
117 evd->root,
118 1, // same_screen
119 devid, 1, 1,
120 1.0, // pressure
121 0.0, // angle
122 evd->event_x, evd->event_y,
123 evd->root_x, evd->root_y);
124 break;
125
126 case XI_ButtonRelease:
127 _ecore_mouse_button
128 (ECORE_EVENT_MOUSE_BUTTON_UP,
129 evd->time,
130 0, // state
131 0, // button
132 evd->event_x, evd->event_y,
133 evd->root_x, evd->root_y,
134 evd->event,
135 (evd->child ? evd->child : evd->event),
136 evd->root,
137 1, // same_screen
138 devid, 1, 1,
139 1.0, // pressure
140 0.0, // angle
141 evd->event_x, evd->event_y,
142 evd->root_x, evd->root_y);
143 break;
144
145#ifdef XI_TouchUpdate
146 case XI_TouchUpdate:
147 _ecore_mouse_move
148 (evd->time,
149 0, // state
150 evd->event_x, evd->event_y,
151 evd->root_x, evd->root_y,
152 evd->event,
153 (evd->child ? evd->child : evd->event),
154 evd->root,
155 1, // same_screen
156 devid, 1, 1,
157 1.0, // pressure
158 0.0, // angle
159 evd->event_x, evd->event_y,
160 evd->root_x, evd->root_y);
161 break;
162
163#endif
164#ifdef XI_TouchBegin
165 case XI_TouchBegin:
166 _ecore_mouse_button
167 (ECORE_EVENT_MOUSE_BUTTON_DOWN,
168 evd->time,
169 0, // state
170 0, // button
171 evd->event_x, evd->event_y,
172 evd->root_x, evd->root_y,
173 evd->event,
174 (evd->child ? evd->child : evd->event),
175 evd->root,
176 1, // same_screen
177 devid, 1, 1,
178 1.0, // pressure
179 0.0, // angle
180 evd->event_x, evd->event_y,
181 evd->root_x, evd->root_y);
182 break;
183
184#endif
185#ifdef XI_TouchEnd
186 case XI_TouchEnd:
187 _ecore_mouse_button
188 (ECORE_EVENT_MOUSE_BUTTON_UP,
189 evd->time,
190 0, // state
191 0, // button
192 evd->event_x, evd->event_y,
193 evd->root_x, evd->root_y,
194 evd->event,
195 (evd->child ? evd->child : evd->event),
196 evd->root,
197 1, // same_screen
198 devid, 1, 1,
199 1.0, // pressure
200 0.0, // angle
201 evd->event_x, evd->event_y,
202 evd->root_x, evd->root_y);
203 break;
204
205#endif
206 default:
207 break;
208 } /* switch */
209#endif /* ifdef ECORE_XI2 */
210} /* _ecore_x_input_handler */
211
212EAPI Eina_Bool
213ecore_x_input_multi_select(Ecore_X_Window win)
214{
215#ifdef ECORE_XI2
216 int i;
217 Eina_Bool find = EINA_FALSE;
218
219 if (!_ecore_x_xi2_devs)
220 return 0;
221
222 LOGFN(__FILE__, __LINE__, __FUNCTION__);
223 for (i = 0; i < _ecore_x_xi2_num; i++)
224 {
225 XIDeviceInfo *dev = &(_ecore_x_xi2_devs[i]);
226
227 if (dev->use == XIFloatingSlave)
228 {
229 XIEventMask eventmask;
230 unsigned char mask[4] = { 0 };
231
232 eventmask.deviceid = dev->deviceid;
233 eventmask.mask_len = sizeof(mask);
234 eventmask.mask = mask;
235 XISetMask(mask, XI_ButtonPress);
236 XISetMask(mask, XI_ButtonRelease);
237 XISetMask(mask, XI_Motion);
238 XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
239 find = EINA_TRUE;
240 }
241 else if (dev->use == XISlavePointer)
242 {
243 XIDeviceInfo *atdev = NULL;
244 int j;
245
246 for (j = 0; j < _ecore_x_xi2_num; j++)
247 {
248 if (_ecore_x_xi2_devs[j].deviceid == dev->attachment)
249 atdev = &(_ecore_x_xi2_devs[j]);
250 }
251 if (((atdev) && (atdev->use != XIMasterPointer)) ||
252 (!atdev))
253 {
254 XIEventMask eventmask;
255 unsigned char mask[4] = { 0 };
256
257 eventmask.deviceid = dev->deviceid;
258 eventmask.mask_len = sizeof(mask);
259 eventmask.mask = mask;
260 XISetMask(mask, XI_ButtonPress);
261 XISetMask(mask, XI_ButtonRelease);
262 XISetMask(mask, XI_Motion);
263# ifdef XI_TouchUpdate
264 XISetMask(mask, XI_TouchUpdate);
265# endif
266# ifdef XI_TouchBegin
267 XISetMask(mask, XI_TouchBegin);
268# endif
269# ifdef XI_TouchEnd
270 XISetMask(mask, XI_TouchEnd);
271# endif
272 XISelectEvents(_ecore_x_disp, win, &eventmask, 1);
273 find = EINA_TRUE;
274 }
275 }
276 }
277
278 return find;
279#else /* ifdef ECORE_XI2 */
280 return EINA_FALSE;
281#endif /* ifdef ECORE_XI2 */
282} /* ecore_x_input_multi_select */
283
diff --git a/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xinerama.c b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xinerama.c
new file mode 100644
index 0000000..1d956b7
--- /dev/null
+++ b/libraries/ecore/src/lib/ecore_x/xlib/ecore_x_xinerama.c
@@ -0,0 +1,91 @@
1/*
2 * Xinerama code
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif /* ifdef HAVE_CONFIG_H */
8
9#include "Ecore.h"
10#include "ecore_x_private.h"
11#include "Ecore_X.h"
12#include "Ecore_X_Atoms.h"
13
14#ifdef ECORE_XINERAMA
15static XineramaScreenInfo *_xin_info = NULL;
16static int _xin_scr_num = 0;
17#endif /* ifdef ECORE_XINERAMA */
18
19EAPI int
20ecore_x_xinerama_screen_count_get(void)
21{
22#ifdef ECORE_XINERAMA
23 int event_base, error_base;
24
25 LOGFN(__FILE__, __LINE__, __FUNCTION__);
26 if (_xin_info)
27 XFree(_xin_info);
28
29 _xin_info = NULL;
30 if (XineramaQueryExtension(_ecore_x_disp, &event_base, &error_base))
31 {
32 _xin_info = XineramaQueryScreens(_ecore_x_disp, &_xin_scr_num);
33 if (_xin_info)
34 return _xin_scr_num;
35 }
36
37#endif /* ifdef ECORE_XINERAMA */
38 return 0;
39} /* ecore_x_xinerama_screen_count_get */
40
41EAPI Eina_Bool
42ecore_x_xinerama_screen_geometry_get(int screen,
43 int *x,
44 int *y,
45 int *w,
46 int *h)
47{
48 LOGFN(__FILE__, __LINE__, __FUNCTION__);
49#ifdef ECORE_XINERAMA
50 if (_xin_info)
51 {
52 int i;
53
54 for (i = 0; i < _xin_scr_num; i++)
55 {
56 if (_xin_info[i].screen_number == screen)
57 {
58 if (x)
59 *x = _xin_info[i].x_org;
60
61 if (y)
62 *y = _xin_info[i].y_org;
63
64 if (w)
65 *w = _xin_info[i].width;
66
67 if (h)
68 *h = _xin_info[i].height;
69
70 return EINA_TRUE;
71 }
72 }
73 }
74
75#endif /* ifdef ECORE_XINERAMA */
76 if (x)
77 *x = 0;
78
79 if (y)
80 *y = 0;
81
82 if (w)
83 *w = DisplayWidth(_ecore_x_disp, 0);
84
85 if (h)
86 *h = DisplayHeight(_ecore_x_disp, 0);
87
88 return EINA_FALSE;
89 screen = 0;
90} /* ecore_x_xinerama_screen_geometry_get */
91