summaryrefslogtreecommitdiff
path: root/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/ecore_evas/engines/win32/ecore_evas_win32.c')
-rw-r--r--src/modules/ecore_evas/engines/win32/ecore_evas_win32.c383
1 files changed, 281 insertions, 102 deletions
diff --git a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
index 39def9d49f..623515da95 100644
--- a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
+++ b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
@@ -54,6 +54,8 @@
#define ECORE_EVAS_EVENT_COUNT 11
+#define EE_SZ(sz_) (ee->sz_ == 0) ? 1 : (ee->sz_)
+
static int _ecore_evas_init_count = 0;
static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
@@ -62,11 +64,16 @@ static const int interface_win32_version = 1;
typedef struct _Ecore_Evas_Engine_Data_Win32 Ecore_Evas_Engine_Data_Win32;
-struct _Ecore_Evas_Engine_Data_Win32 {
+struct _Ecore_Evas_Engine_Data_Win32
+{
Ecore_Win32_Window *parent;
- struct {
- unsigned char region : 1;
- unsigned char fullscreen : 1;
+ Ecore_Evas_Selection_Callbacks clipboard;
+ Eina_Future *delivery;
+ struct
+ {
+ unsigned char region : 1;
+ unsigned char fullscreen : 1;
+ unsigned char maximized : 1;
} state;
};
@@ -94,6 +101,7 @@ static Eina_Bool _ecore_evas_win32_event_window_delete_request(void *data EINA_U
static Eina_Bool _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
+
/* Private functions */
static int
@@ -370,13 +378,13 @@ _ecore_evas_win32_event_window_configure(void *data EINA_UNUSED, int type EINA_U
if (ECORE_EVAS_PORTRAIT(ee))
{
- evas_output_size_set(ee->evas, ee->w, ee->h);
- evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+ evas_output_size_set(ee->evas, EE_SZ(w), EE_SZ(h));
+ evas_output_viewport_set(ee->evas, 0, 0, EE_SZ(w), EE_SZ(h));
}
else
{
- evas_output_size_set(ee->evas, ee->h, ee->w);
- evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+ evas_output_size_set(ee->evas, EE_SZ(h), EE_SZ(w));
+ evas_output_viewport_set(ee->evas, 0, 0, EE_SZ(h), EE_SZ(w));
}
if (ee->prop.avoid_damage)
{
@@ -427,9 +435,11 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type
{
struct {
struct {
+ unsigned char maximized : 1;
unsigned char fullscreen : 1;
} win32;
struct {
+ Eina_Bool maximized : 1;
Eina_Bool fullscreen : 1;
} prop;
} prev;
@@ -449,12 +459,16 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type
wdata = ee->engine.data;
prev.win32.fullscreen = wdata->state.fullscreen;
+ prev.win32.maximized = wdata->state.maximized;
prev.prop.fullscreen = ee->prop.fullscreen;
+ prev.prop.maximized = ee->prop.maximized;
wdata->state.fullscreen = 0;
+ wdata->state.maximized = 0;
ee->prop.fullscreen = EINA_FALSE;
+ ee->prop.maximized = EINA_FALSE;
/* we get the states status */
ecore_win32_window_state_get(e->window, &state, &num);
@@ -468,6 +482,10 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type
ee->prop.fullscreen = 1;
wdata->state.fullscreen = 1;
break;
+ case ECORE_WIN32_WINDOW_STATE_MAXIMIZED:
+ ee->prop.maximized = 1;
+ wdata->state.maximized = 1;
+ break;
default:
break;
}
@@ -476,7 +494,9 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type
}
if ((prev.win32.fullscreen != wdata->state.fullscreen) ||
- (prev.prop.fullscreen != ee->prop.fullscreen))
+ (prev.prop.fullscreen != ee->prop.fullscreen) ||
+ (prev.win32.maximized != wdata->state.maximized) ||
+ (prev.prop.maximized != ee->prop.maximized))
{
if (ee->func.fn_state_change)
ee->func.fn_state_change(ee);
@@ -501,6 +521,8 @@ _ecore_evas_win32_state_update(Ecore_Evas *ee)
state[num++] = ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT;
if (ee->prop.maximized)
state[num++] = ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ;
+ if (ee->prop.maximized)
+ state[num++] = ECORE_WIN32_WINDOW_STATE_MAXIMIZED;
// if (bd->client.netwm.state.shaded)
// state[num++] = ECORE_WIN32_WINDOW_STATE_SHADED;
/* if (ee->prop.focus_skip) */
@@ -599,13 +621,13 @@ _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int heigh
x, y, width, height);
if (ECORE_EVAS_PORTRAIT(ee))
{
- evas_output_size_set(ee->evas, ee->w, ee->h);
- evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+ evas_output_size_set(ee->evas, EE_SZ(w), EE_SZ(h));
+ evas_output_viewport_set(ee->evas, 0, 0, EE_SZ(w), EE_SZ(h));
}
else
{
- evas_output_size_set(ee->evas, ee->h, ee->w);
- evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+ evas_output_size_set(ee->evas, EE_SZ(h), EE_SZ(w));
+ evas_output_viewport_set(ee->evas, 0, 0, EE_SZ(h), EE_SZ(w));
}
if (ee->prop.avoid_damage)
{
@@ -664,13 +686,13 @@ _ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
h, w);
if (ECORE_EVAS_PORTRAIT(ee))
{
- evas_output_size_set(ee->evas, ee->w, ee->h);
- evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
+ evas_output_size_set(ee->evas, EE_SZ(w), EE_SZ(h));
+ evas_output_viewport_set(ee->evas, 0, 0, EE_SZ(w), EE_SZ(h));
}
else
{
- evas_output_size_set(ee->evas, ee->h, ee->w);
- evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
+ evas_output_size_set(ee->evas, EE_SZ(h), EE_SZ(w));
+ evas_output_viewport_set(ee->evas, 0, 0, EE_SZ(h), EE_SZ(w));
}
if (ee->func.fn_resize) ee->func.fn_resize(ee);
}
@@ -824,7 +846,8 @@ _ecore_evas_win32_activate(Ecore_Evas *ee)
{
INF("ecore evas activate");
- ecore_win32_window_focus((Ecore_Win32_Window *)ee->prop.window);
+ ecore_evas_show(ee);
+ ecore_win32_window_activate((Ecore_Win32_Window *)ee->prop.window);
}
static void
@@ -967,6 +990,30 @@ _ecore_evas_win32_override_set(Ecore_Evas *ee, Eina_Bool on)
}
static void
+_ecore_evas_win32_maximized_set(Ecore_Evas *ee, Eina_Bool on)
+{
+ Ecore_Evas_Engine_Data_Win32 *wdata = ee->engine.data;
+
+ INF("ecore evas maximized set");
+
+ wdata->state.maximized = !!on;
+ if (ee->should_be_visible)
+ {
+ struct _Ecore_Win32_Window *window;
+
+ window = (Ecore_Win32_Window *)ee->prop.window;
+ ecore_win32_window_maximized_set(window, on);
+ }
+ else
+ {
+ if (ee->prop.maximized == on) return;
+ ee->prop.maximized = on;
+ wdata->state.maximized = on;
+ _ecore_evas_win32_state_update(ee);
+ }
+}
+
+static void
_ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, Eina_Bool on)
{
Ecore_Evas_Engine_Data_Win32 *wdata = ee->engine.data;
@@ -1197,93 +1244,225 @@ _ecore_evas_win32_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi)
*ydpi = y_dpi;
}
+static Eina_Value
+_delivery(void *data, const Eina_Value value EINA_UNUSED, const Eina_Future *dead_future EINA_UNUSED)
+{
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Data_Win32 *edata = ee->engine.data;
+ Eina_Rw_Slice slice;
+ const char *mime_type = NULL;
+
+ EINA_SAFETY_ON_NULL_GOTO(edata->delivery, end);
+
+ for (unsigned int i = 0; i < eina_array_count(edata->clipboard.available_types); ++i)
+ {
+ mime_type = eina_array_data_get(edata->clipboard.available_types, i);
+ if (eina_str_has_prefix(mime_type, "text/"))
+ break;
+ }
+ if (mime_type)
+ {
+ edata->clipboard.delivery(ee, 1, ECORE_EVAS_SELECTION_BUFFER_COPY_AND_PASTE_BUFFER, mime_type, &slice);
+ EINA_SAFETY_ON_FALSE_GOTO(ecore_win32_clipboard_set((Ecore_Win32_Window *)ee->prop.window, slice.mem, slice.len, mime_type), end);
+ }
+ else
+ {
+ ERR("No compatible mime type found");
+ }
+
+end:
+ return EINA_VALUE_EMPTY;
+}
+
+static Eina_Bool
+_ecore_evas_win32_selection_claim(Ecore_Evas *ee, unsigned int seat, Ecore_Evas_Selection_Buffer selection, Eina_Array *available_types, Ecore_Evas_Selection_Internal_Delivery delivery, Ecore_Evas_Selection_Internal_Cancel cancel)
+{
+ Ecore_Evas_Engine_Data_Win32 *edata = ee->engine.data;
+
+ if (selection != ECORE_EVAS_SELECTION_BUFFER_COPY_AND_PASTE_BUFFER)
+ return EINA_FALSE;
+
+ if (!delivery && !cancel)
+ {
+ edata->clipboard.delivery = NULL;
+ edata->clipboard.cancel = NULL;
+ eina_array_clean(edata->clipboard.available_types);
+ ecore_win32_clipboard_clear((Ecore_Win32_Window *)ee->prop.window);
+ return EINA_TRUE;
+ }
+ else
+ {
+ if (edata->clipboard.cancel)
+ {
+ edata->clipboard.cancel(ee, seat, selection);
+ eina_array_free(edata->clipboard.available_types);
+ }
+
+ edata->delivery = efl_loop_job(efl_main_loop_get());
+ eina_future_then(edata->delivery, _delivery, ee);
+ edata->clipboard.delivery = delivery;
+ edata->clipboard.cancel = cancel;
+ edata->clipboard.available_types = available_types;
+ return EINA_TRUE;
+ }
+}
+
+Eina_Future*
+_ecore_evas_win32_selection_request(Ecore_Evas *ee EINA_UNUSED, unsigned int seat EINA_UNUSED, Ecore_Evas_Selection_Buffer selection, Eina_Array *acceptable_type)
+{
+ Eina_Future *future;
+ Eina_Promise *promise;
+ const char *mime_type = NULL;
+
+ if (selection != ECORE_EVAS_SELECTION_BUFFER_COPY_AND_PASTE_BUFFER)
+ return eina_future_rejected(efl_loop_future_scheduler_get(efl_main_loop_get()), ecore_evas_no_selection);
+
+ promise = efl_loop_promise_new(efl_main_loop_get());
+ future = eina_future_new(promise);
+
+ for (unsigned int i = 0; i < eina_array_count(acceptable_type); ++i)
+ {
+ mime_type = eina_array_data_get(acceptable_type, i);
+ if (eina_str_has_prefix(mime_type, "text/"))
+ break;
+ }
+ if (!mime_type)
+ {
+ eina_promise_reject(promise, ecore_evas_no_matching_type);
+ }
+ else
+ {
+ size_t size;
+ void *data;
+ Eina_Content *content;
+ Eina_Rw_Slice slice;
+
+ data = ecore_win32_clipboard_get((Ecore_Win32_Window *)ee->prop.window, &size, mime_type);
+ if (size != 0)
+ {
+ if (eina_str_has_prefix(mime_type, "text/"))
+ {
+ //ensure that we always have a \0 at the end, there is no assertion that \0 is included here.
+ slice.len = size + 1;
+ slice.mem = eina_memdup(data, size, EINA_TRUE);
+ free(data);
+ }
+ else
+ {
+ slice.len = size;
+ slice.mem = data;
+ }
+ content = eina_content_new(eina_rw_slice_slice_get(slice), mime_type);
+ free(slice.mem); //memory got duplicated in eina_content_new
+ if (!content) // construction can fail because of some validation reasons
+ eina_promise_reject(promise, ecore_evas_no_matching_type);
+ else
+ eina_promise_resolve(promise, eina_value_content_init(content));
+ }
+ else
+ eina_promise_reject(promise, ecore_evas_no_matching_type);
+ }
+ return future;
+}
+
+static Eina_Bool
+_ecore_evas_win32_selection_has_owner(Ecore_Evas *ee EINA_UNUSED, unsigned int seat EINA_UNUSED, Ecore_Evas_Selection_Buffer selection)
+{
+ return (selection == ECORE_EVAS_SELECTION_BUFFER_COPY_AND_PASTE_BUFFER);
+}
+
static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
{
_ecore_evas_win32_free,
- NULL,
- NULL,
- NULL,
- NULL,
- _ecore_evas_win32_callback_delete_request_set,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- _ecore_evas_win32_move,
- NULL,
- _ecore_evas_win32_resize,
- _ecore_evas_win32_move_resize,
- _ecore_evas_win32_rotation_set,
- _ecore_evas_win32_shaped_set,
- _ecore_evas_win32_show,
- _ecore_evas_win32_hide,
- _ecore_evas_win32_raise,
- _ecore_evas_win32_lower,
- _ecore_evas_win32_activate,
- _ecore_evas_win32_title_set,
- NULL, /* _ecore_evas_x_name_class_set */
- _ecore_evas_win32_size_min_set,
- _ecore_evas_win32_size_max_set,
- _ecore_evas_win32_size_base_set,
- _ecore_evas_win32_size_step_set,
- _ecore_evas_win32_object_cursor_set,
- _ecore_evas_win32_object_cursor_unset,
- NULL, /* _ecore_evas_x_layer_set */
- _ecore_evas_win32_focus_set,
- _ecore_evas_win32_iconified_set,
- _ecore_evas_win32_borderless_set,
- _ecore_evas_win32_override_set,
- NULL,
- _ecore_evas_win32_fullscreen_set,
- NULL, /* _ecore_evas_x_avoid_damage_set */
- NULL, /* _ecore_evas_x_withdrawn_set */
- NULL, /* _ecore_evas_x_sticky_set */
- NULL, /* _ecore_evas_x_ignore_events_set */
- _ecore_evas_win32_alpha_set,
- NULL, //transparent
- NULL, // profiles_set
- NULL, // profile_set
-
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
-
- NULL, // render
- _ecore_evas_win32_screen_geometry_get,
- _ecore_evas_win32_screen_dpi_get,
- NULL,
- NULL, // msg_send
-
- NULL, // pointer_xy_get
- NULL, // pointer_warp
-
- NULL, // wm_rot_preferred_rotation_set
- NULL, // wm_rot_available_rotations_set
- NULL, // wm_rot_manual_rotation_done_set
- NULL, // wm_rot_manual_rotation_done
-
- NULL, // aux_hints_set
-
- NULL, // fn_animator_register
- NULL, // fn_animator_unregister
-
- NULL, // fn_evas_changed
- NULL, //fn_focus_device_set
- NULL, //fn_callback_focus_device_in_set
- NULL, //fn_callback_focus_device_out_set
- NULL, //fn_callback_device_mouse_in_set
- NULL, //fn_callback_device_mouse_out_set
- NULL, //fn_pointer_device_xy_get
- NULL, //fn_prepare
- NULL, //fn_last_tick_get
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ _ecore_evas_win32_callback_delete_request_set,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ _ecore_evas_win32_move,
+ NULL,
+ _ecore_evas_win32_resize,
+ _ecore_evas_win32_move_resize,
+ _ecore_evas_win32_rotation_set,
+ _ecore_evas_win32_shaped_set,
+ _ecore_evas_win32_show,
+ _ecore_evas_win32_hide,
+ _ecore_evas_win32_raise,
+ _ecore_evas_win32_lower,
+ _ecore_evas_win32_activate,
+ _ecore_evas_win32_title_set,
+ NULL, /* _ecore_evas_x_name_class_set */
+ _ecore_evas_win32_size_min_set,
+ _ecore_evas_win32_size_max_set,
+ _ecore_evas_win32_size_base_set,
+ _ecore_evas_win32_size_step_set,
+ _ecore_evas_win32_object_cursor_set,
+ _ecore_evas_win32_object_cursor_unset,
+ NULL, /* _ecore_evas_x_layer_set */
+ _ecore_evas_win32_focus_set,
+ _ecore_evas_win32_iconified_set,
+ _ecore_evas_win32_borderless_set,
+ _ecore_evas_win32_override_set,
+ _ecore_evas_win32_maximized_set,
+ _ecore_evas_win32_fullscreen_set,
+ NULL, /* _ecore_evas_x_avoid_damage_set */
+ NULL, /* _ecore_evas_x_withdrawn_set */
+ NULL, /* _ecore_evas_x_sticky_set */
+ NULL, /* _ecore_evas_x_ignore_events_set */
+ _ecore_evas_win32_alpha_set,
+ NULL, //transparent
+ NULL, // profiles_set
+ NULL, // profile_set
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ NULL, // render
+ _ecore_evas_win32_screen_geometry_get,
+ _ecore_evas_win32_screen_dpi_get,
+ NULL,
+ NULL, // msg_send
+
+ NULL, // pointer_xy_get
+ NULL, // pointer_warp
+
+ NULL, // wm_rot_preferred_rotation_set
+ NULL, // wm_rot_available_rotations_set
+ NULL, // wm_rot_manual_rotation_done_set
+ NULL, // wm_rot_manual_rotation_done
+
+ NULL, // aux_hints_set
+
+ NULL, // fn_animator_register
+ NULL, // fn_animator_unregister
+
+ NULL, // fn_evas_changed
+ NULL, //fn_focus_device_set
+ NULL, //fn_callback_focus_device_in_set
+ NULL, //fn_callback_focus_device_out_set
+ NULL, //fn_callback_device_mouse_in_set
+ NULL, //fn_callback_device_mouse_out_set
+ NULL, //fn_pointer_device_xy_get
+ NULL, //fn_prepare
+ NULL, //fn_last_tick_get
+ _ecore_evas_win32_selection_claim, //fn_selection_claim
+ _ecore_evas_win32_selection_has_owner, //fn_selection_has_owner
+ _ecore_evas_win32_selection_request, //fn_selection_request
+ NULL, //fn_dnd_start
+ NULL, //fn_dnd_stop
};
#endif /* BUILD_ECORE_EVAS_WIN32 */