# include <config.h>
#endif
-#include "Ecore.h"
-#include "ecore_private.h"
-#include "Ecore_Input.h"
+/**
+ * NB: Events that receive a 'serial' instead of timestamp
+ *
+ * input_device_attach (for pointer image)
+ * input_device_button_event (button press/release)
+ * input_device_key_press
+ * input_device_pointer_enter
+ * input_device_pointer_leave
+ * input_device_keyboard_enter
+ * input_device_keyboard_leave
+ * input_device_touch_down
+ * input_device_touch_up
+ *
+ **/
+
#include "ecore_wl_private.h"
-#include "Ecore_Wayland.h"
/* FIXME: This gives BTN_LEFT/RIGHT/MIDDLE for linux systems ...
* What about other OSs ?? */
static void _ecore_wl_input_cb_motion(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int timestamp, int sx, int sy);
static void _ecore_wl_input_cb_button(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int button, unsigned int state);
static void _ecore_wl_input_cb_axis(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int timestamp, unsigned int axis, int value);
-static void _ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp __UNUSED__, unsigned int key, unsigned int state);
+static void _ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int key, unsigned int state);
static void _ecore_wl_input_cb_pointer_enter(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface, int sx, int sy);
-static void _ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__);
+static void _ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface);
static void _ecore_wl_input_cb_keyboard_enter(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface, struct wl_array *keys);
-static void _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__);
+static void _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface);
static void _ecore_wl_input_cb_touch_down(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, struct wl_surface *surface __UNUSED__, int id __UNUSED__, int x, int y);
static void _ecore_wl_input_cb_touch_up(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, int id __UNUSED__);
static void _ecore_wl_input_cb_touch_motion(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int timestamp, int id __UNUSED__, int x, int y);
static void _ecore_wl_input_cb_data_drop(void *data, struct wl_data_device *data_device);
static void _ecore_wl_input_cb_data_selection(void *data, struct wl_data_device *data_device, struct wl_data_offer *offer);
-static void _ecore_wl_input_keyboard_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp);
-static void _ecore_wl_input_pointer_focus_set(Ecore_Wl_Input *input, Ecore_Wl_Window *focus, unsigned int timestamp);
-static void _ecore_wl_input_pointer_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp);
-static void _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, unsigned int timestamp);
+static void _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_in_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_out_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
-static void _ecore_wl_input_focus_in_send(Ecore_Wl_Input *input, unsigned int timestamp);
-static void _ecore_wl_input_focus_out_send(Ecore_Wl_Input *input, unsigned int timestamp);
-static void _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, unsigned int timestamp);
-static void _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, unsigned int timestamp);
+static void _ecore_wl_input_focus_in_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_focus_out_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
+static void _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp);
static void _ecore_wl_input_mouse_wheel_send(Ecore_Wl_Input *input, unsigned int axis, int value, unsigned int timestamp);
/* wayland interfaces */
}
EAPI void
-ecore_wl_input_ungrab(Ecore_Wl_Input *input, unsigned int timestamp)
+ecore_wl_input_ungrab(Ecore_Wl_Input *input)
{
LOGFN(__FILE__, __LINE__, __FUNCTION__);
input->grab = NULL;
input->grab_button = 0;
-
- if (input->pointer_focus)
- _ecore_wl_input_pointer_focus_set(input, input->pointer_focus,
- timestamp);
}
void
{
if (!input) return;
- _ecore_wl_input_keyboard_focus_remove(input, 0);
- _ecore_wl_input_pointer_focus_remove(input, 0);
-
if (input->drag_source) _ecore_wl_dnd_del(input->drag_source);
input->drag_source = NULL;
input->timestamp = timestamp;
- if (!(input->grab && input->grab_button))
- _ecore_wl_input_pointer_focus_set(input, input->pointer_focus,
- timestamp);
-
/* TODO: FIXME: NB: Weston window code has set pointer image here also */
- _ecore_wl_input_mouse_move_send(input, timestamp);
+ if (input->pointer_focus)
+ _ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
}
static void
input->timestamp = timestamp;
input->display->serial = serial;
- _ecore_wl_input_mouse_move_send(input, timestamp);
+// _ecore_wl_input_mouse_move_send(input, timestamp);
- if ((input->pointer_focus) && (!input->grab) && (state))
- ecore_wl_input_grab(input, input->pointer_focus, button);
+ if (state)
+ {
+ if ((input->pointer_focus) && (!input->grab) && (state))
+ ecore_wl_input_grab(input, input->pointer_focus, button);
- if (input->grab)
+ input->button = button;
+ _ecore_wl_input_mouse_down_send(input, input->pointer_focus,
+ timestamp);
+ }
+ else
{
- if (state)
- {
+ _ecore_wl_input_mouse_up_send(input, input->pointer_focus,
+ timestamp);
+ input->button = 0;
- input->button = button;
- _ecore_wl_input_mouse_down_send(input, timestamp);
- }
- else
- {
- _ecore_wl_input_mouse_up_send(input, timestamp);
- input->button = 0;
- }
+ if ((input->grab) && (input->grab_button == button) && (!state))
+ ecore_wl_input_ungrab(input);
}
- if ((input->grab) && (input->grab_button == button) && (!state))
- ecore_wl_input_ungrab(input, timestamp);
+// _ecore_wl_input_mouse_move_send(input, timestamp);
}
static void
}
static void
-_ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp __UNUSED__, unsigned int key, unsigned int state)
+_ecore_wl_input_cb_key(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, unsigned int timestamp, unsigned int key, unsigned int state)
{
Ecore_Wl_Input *input;
Ecore_Wl_Window *win;
if (!(input = data)) return;
+ input->timestamp = timestamp;
input->display->serial = serial;
win = input->keyboard_focus;
if ((!win) || (win->keyboard_device != input)) return;
if (!(input = data)) return;
- input->display->serial = serial;
- input->pointer_enter_serial = serial;
+ if (!input->timestamp)
+ {
+ struct timeval tv;
- if ((win = wl_surface_get_user_data(surface)))
- win->pointer_device = input;
- else
- return;
+ gettimeofday(&tv, NULL);
+ input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+ }
input->sx = sx;
input->sy = sy;
+ input->display->serial = serial;
+ input->pointer_enter_serial = serial;
+
+ if (!(win = wl_surface_get_user_data(surface))) return;
+
+ win->pointer_device = input;
+ input->pointer_focus = win;
+
+ _ecore_wl_input_mouse_move_send(input, win, input->timestamp);
+ _ecore_wl_input_mouse_in_send(input, win, input->timestamp);
+
+ /* NB: This whole 'if' below is a major HACK due to wayland's stupidness
+ * of not sending a mouse_up (or any notification at all for that matter)
+ * when a move or resize grab is finished */
+ if (input->grab)
+ {
+ /* NB: This COULD mean a move has finished, or it could mean that
+ * a 'drag' is being done to a different surface */
+
+ if ((input->grab == win) && (win->moving))
+ {
+ /* NB: 'Fake' a mouse_up for move finished */
+ win->moving = EINA_FALSE;
+ _ecore_wl_input_mouse_up_send(input, win, input->timestamp);
+
+ input->button = 0;
+
+ if ((input->grab) && (input->grab_button == BTN_LEFT))
+ ecore_wl_input_ungrab(input);
+ }
+ else if ((input->grab == win) && (win->resizing))
+ {
+ /* NB: 'Fake' a mouse_up for resize finished */
+ win->resizing = EINA_FALSE;
+ _ecore_wl_input_mouse_up_send(input, win, input->timestamp);
+
+ input->button = 0;
- _ecore_wl_input_mouse_move_send(input, input->timestamp);
- _ecore_wl_input_pointer_focus_set(input, win, input->timestamp);
+ if ((input->grab) && (input->grab_button == BTN_LEFT))
+ ecore_wl_input_ungrab(input);
+ }
+ /* FIXME: Test d-n-d and potentially add needed case here */
+ }
}
static void
-_ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__)
+_ecore_wl_input_cb_pointer_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface)
{
Ecore_Wl_Input *input;
+ Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
input->display->serial = serial;
- _ecore_wl_input_mouse_move_send(input, input->timestamp);
- _ecore_wl_input_pointer_focus_remove(input, input->timestamp);
+ if (!surface) return;
+ if (!(win = wl_surface_get_user_data(surface))) return;
+
+ win->pointer_device = NULL;
+ input->pointer_focus = NULL;
+
+ _ecore_wl_input_mouse_move_send(input, win, input->timestamp);
+ _ecore_wl_input_mouse_out_send(input, win, input->timestamp);
+
+ if (input->grab)
+ {
+ /* move or resize started */
+
+ /* printf("Pointer Leave WITH a Grab\n"); */
+ }
}
static void
if (!(input = data)) return;
- input->display->serial = serial;
- input->keyboard_focus = wl_surface_get_user_data(surface);
+ if (!input->timestamp)
+ {
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+ }
end = keys->data + keys->size;
input->modifiers = 0;
for (k = keys->data; k < end; k++)
input->modifiers |= _ecore_wl_disp->xkb->map->modmap[*k];
- win = input->keyboard_focus;
+ input->display->serial = serial;
+
+ if (!(win = wl_surface_get_user_data(surface))) return;
+
win->keyboard_device = input;
+ input->keyboard_focus = win;
- _ecore_wl_input_focus_in_send(input, input->timestamp);
+ /* FIXME: NB: This may need to be 'serial' */
+ _ecore_wl_input_focus_in_send(input, win, input->timestamp);
}
static void
-_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface __UNUSED__)
+_ecore_wl_input_cb_keyboard_leave(void *data, struct wl_input_device *input_device __UNUSED__, unsigned int serial, struct wl_surface *surface)
{
Ecore_Wl_Input *input;
+ Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(input = data)) return;
+
+ if (!input->timestamp)
+ {
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ input->timestamp = (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+ }
+
input->display->serial = serial;
- _ecore_wl_input_keyboard_focus_remove(input, input->timestamp);
+
+ if (!surface) return;
+ if (!(win = wl_surface_get_user_data(surface))) return;
+
+ win->keyboard_device = NULL;
+ input->keyboard_focus = NULL;
+
+ _ecore_wl_input_focus_out_send(input, win, input->timestamp);
}
static void
input->button = 0;
input->sx = x;
input->sy = y;
- _ecore_wl_input_mouse_down_send(input, timestamp);
+ _ecore_wl_input_mouse_down_send(input, input->pointer_focus, timestamp);
}
static void
/* input->timestamp = timestamp; */
input->button = 0;
input->display->serial = serial;
- _ecore_wl_input_mouse_up_send(input, timestamp);
+ _ecore_wl_input_mouse_up_send(input, input->pointer_focus, timestamp);
}
static void
input->sx = x;
input->sy = y;
- _ecore_wl_input_mouse_move_send(input, timestamp);
+ _ecore_wl_input_mouse_move_send(input, input->pointer_focus, timestamp);
}
static void
}
static void
-_ecore_wl_input_keyboard_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp)
-{
- Ecore_Wl_Window *win;
-
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
- if (!(win = input->keyboard_focus)) return;
-
- win->keyboard_device = NULL;
-
- _ecore_wl_input_focus_out_send(input, timestamp);
-
- input->keyboard_focus = NULL;
-}
-
-static void
-_ecore_wl_input_pointer_focus_set(Ecore_Wl_Input *input, Ecore_Wl_Window *focus, unsigned int timestamp)
-{
- Ecore_Wl_Window *ofocus = NULL;
-
- if ((focus) && (focus == input->pointer_focus)) return;
-
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
- if ((ofocus = input->pointer_focus))
- {
- if (input->grab) ofocus = input->grab;
- _ecore_wl_input_mouse_out_send(input, ofocus, timestamp);
- input->pointer_focus = NULL;
- ofocus->pointer_device = NULL;
- }
-
- if (focus)
- {
- Ecore_Wl_Window *win;
-
- win = focus;
- if (input->grab) win = input->grab;
-
- _ecore_wl_input_mouse_in_send(input, win, timestamp);
- input->pointer_focus = focus;
- focus->pointer_device = input;
- }
-}
-
-static void
-_ecore_wl_input_pointer_focus_remove(Ecore_Wl_Input *input, unsigned int timestamp)
-{
- Ecore_Wl_Window *win;
-
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
- win = input->pointer_focus;
-
- _ecore_wl_input_pointer_focus_set(input, NULL, timestamp);
-
- input->pointer_focus = NULL;
- if (win) win->pointer_device = NULL;
-}
-
-static void
-_ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, unsigned int timestamp)
+_ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Event_Mouse_Move *ev;
-// Ecore_Event *event;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
- ev->root.x = input->sx;
- ev->root.y = input->sy;
+ /* ev->root.x = input->sx; */
+ /* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
ev->multi.device = 0;
ev->multi.radius = 1;
ev->multi.x = input->sx;
ev->multi.y = input->sy;
- if (input->grab)
- {
- ev->window = input->grab->id;
- ev->event_window = input->grab->id;
- }
- else if (input->pointer_focus)
- {
- ev->window = input->pointer_focus->id;
- ev->event_window = input->pointer_focus->id;
- }
+ ev->window = win->id;
+ ev->event_window = win->id;
ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
}
ev->x = input->sx;
ev->y = input->sy;
- ev->root.x = input->sx;
- ev->root.y = input->sy;
+ /* ev->root.x = input->sx; */
+ /* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
- ev->root.x = input->sx;
- ev->root.y = input->sy;
+ /* ev->root.x = input->sx; */
+ /* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
ev->timestamp = timestamp;
}
static void
-_ecore_wl_input_focus_in_send(Ecore_Wl_Input *input, unsigned int timestamp)
+_ecore_wl_input_focus_in_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Wl_Event_Focus_In *ev;
if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Focus_In)))) return;
ev->timestamp = timestamp;
- if (input->keyboard_focus)
- ev->win = input->keyboard_focus->id;
+ ev->win = win->id;
ecore_event_add(ECORE_WL_EVENT_FOCUS_IN, ev, NULL, NULL);
}
static void
-_ecore_wl_input_focus_out_send(Ecore_Wl_Input *input, unsigned int timestamp)
+_ecore_wl_input_focus_out_send(Ecore_Wl_Input *input __UNUSED__, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Wl_Event_Focus_Out *ev;
if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Focus_Out)))) return;
ev->timestamp = timestamp;
- if (input->keyboard_focus)
- ev->win = input->keyboard_focus->id;
+ ev->win = win->id;
ecore_event_add(ECORE_WL_EVENT_FOCUS_OUT, ev, NULL, NULL);
}
static void
-_ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, unsigned int timestamp)
+_ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Event_Mouse_Button *ev;
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
- ev->root.x = input->sx;
- ev->root.y = input->sy;
+ /* ev->root.x = input->sx; */
+ /* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
/* FIXME: Need to get these from wayland somehow */
ev->multi.x = input->sx;
ev->multi.y = input->sy;
- if (input->grab)
- {
- ev->window = input->grab->id;
- ev->event_window = input->grab->id;
- }
- else if (input->pointer_focus)
- {
- ev->window = input->pointer_focus->id;
- ev->event_window = input->pointer_focus->id;
- }
+ ev->window = win->id;
+ ev->event_window = win->id;
ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL);
}
static void
-_ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, unsigned int timestamp)
+_ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int timestamp)
{
Ecore_Event_Mouse_Button *ev;
ev->timestamp = timestamp;
ev->x = input->sx;
ev->y = input->sy;
- ev->root.x = input->sx;
- ev->root.y = input->sy;
+ /* ev->root.x = input->sx; */
+ /* ev->root.y = input->sy; */
ev->modifiers = input->modifiers;
/* FIXME: Need to get these from wayland somehow */
ev->multi.x = input->sx;
ev->multi.y = input->sy;
- if (input->grab)
- {
- ev->window = input->grab->id;
- ev->event_window = input->grab->id;
- }
- else if (input->pointer_focus)
- {
- ev->window = input->pointer_focus->id;
- ev->event_window = input->pointer_focus->id;
- }
+ ev->window = win->id;
+ ev->event_window = win->id;
ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL);
}
ev->modifiers = input->modifiers;
ev->x = input->sx;
ev->y = input->sy;
- ev->root.x = input->sx;
- ev->root.y = input->sy;
+ /* ev->root.x = input->sx; */
+ /* ev->root.y = input->sy; */
if (axis == WL_INPUT_DEVICE_AXIS_VERTICAL_SCROLL)
{
# include <config.h>
#endif
-#include "Ecore.h"
-#include "ecore_private.h"
#include "ecore_wl_private.h"
-#include "Ecore_Wayland.h"
/* local function prototypes */
+static void _ecore_wl_window_cb_ping(void *data __UNUSED__, struct wl_shell_surface *shell_surface, unsigned int serial);
static void _ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int edges, int w, int h);
static void _ecore_wl_window_cb_popup_done(void *data, struct wl_shell_surface *shell_surface __UNUSED__);
static void _ecore_wl_window_configure_send(Ecore_Wl_Window *win, int w, int h, unsigned int timestamp);
/* wayland listeners */
static const struct wl_shell_surface_listener _ecore_wl_shell_surface_listener =
{
+ _ecore_wl_window_cb_ping,
_ecore_wl_window_cb_configure,
_ecore_wl_window_cb_popup_done
};
}
if (win->region.input) wl_region_destroy(win->region.input);
+ win->region.input = NULL;
if (win->region.opaque) wl_region_destroy(win->region.opaque);
-
+ win->region.opaque = NULL;
if (win->shell_surface) wl_shell_surface_destroy(win->shell_surface);
win->shell_surface = NULL;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!win) return;
+
win->allocation.x = x;
win->allocation.y = y;
+
if (win->shell_surface)
{
Ecore_Wl_Input *input;
if ((!input) || (!input->input_device)) return;
- ecore_wl_input_ungrab(input, input->timestamp);
wl_shell_surface_move(win->shell_surface, input->input_device,
input->display->serial);
}
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!win) return;
+
win->allocation.w = w;
win->allocation.h = h;
+
if (win->type != ECORE_WL_WINDOW_TYPE_FULLSCREEN)
{
win->region.input =
wl_region_add(win->region.input, win->allocation.x, win->allocation.y,
win->allocation.w, win->allocation.h);
}
+
if (!win->transparent)
{
win->region.opaque =
if ((!input) || (!input->input_device)) return;
- ecore_wl_input_ungrab(input, input->timestamp);
wl_shell_surface_resize(win->shell_surface, input->input_device,
input->display->serial, location);
}
case ECORE_WL_WINDOW_BUFFER_TYPE_SHM:
if (win->surface)
{
- int dx = 0, dy = 0;
-
- if ((win->server_allocation.w != win->allocation.w) ||
- (win->server_allocation.h != win->allocation.h))
- {
- dx = win->allocation.w - win->server_allocation.w;
- dy = win->allocation.h - win->server_allocation.h;
- if (buffer)
- wl_surface_attach(win->surface, buffer, dx, dy);
- }
- else
- {
- if (buffer)
- wl_surface_attach(win->surface, buffer, x, y);
- }
+ if (buffer)
+ wl_surface_attach(win->surface, buffer, x, y);
win->server_allocation = win->allocation;
}
return;
}
+ if (win->surface)
+ wl_surface_damage(win->surface, 0, 0,
+ win->allocation.w, win->allocation.h);
+
if (win->region.input)
{
wl_surface_set_input_region(win->surface, win->region.input);
wl_region_destroy(win->region.opaque);
win->region.opaque = NULL;
}
-
- if (win->surface)
- wl_surface_damage(win->surface, 0, 0,
- win->allocation.w, win->allocation.h);
}
/**
win->allocation.h = h;
}
+EAPI void
+ecore_wl_window_update_location(Ecore_Wl_Window *win, int x, int y)
+{
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!win) return;
+ win->allocation.x = x;
+ win->allocation.y = y;
+}
+
EAPI struct wl_surface *
ecore_wl_window_surface_get(Ecore_Wl_Window *win)
{
/* local functions */
static void
+_ecore_wl_window_cb_ping(void *data __UNUSED__, struct wl_shell_surface *shell_surface, unsigned int serial)
+{
+ wl_shell_surface_pong(shell_surface, serial);
+}
+
+static void
_ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int edges, int w, int h)
{
Ecore_Wl_Window *win;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(win = data)) return;
+
if ((w <= 0) || (h <= 0)) return;
- win->edges = edges;
- win->allocation.w = w;
- win->allocation.h = h;
- if (win->region.input) wl_region_destroy(win->region.input);
- win->region.input = NULL;
- if (win->region.opaque) wl_region_destroy(win->region.opaque);
- win->region.opaque = NULL;
- /* FIXME: 0 timestamp here may not work. need to test */
- _ecore_wl_window_configure_send(win, w, h, 0);
+ if ((win->allocation.w != w) || (win->allocation.h != h))
+ {
+ win->edges = edges;
+ if (win->region.input) wl_region_destroy(win->region.input);
+ win->region.input = NULL;
+ if (win->region.opaque) wl_region_destroy(win->region.opaque);
+ win->region.opaque = NULL;
+
+ /* FIXME: 0 timestamp here may not work. need to test */
+ _ecore_wl_window_configure_send(win, w, h, 0);
+ }
}
static void
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if (!(win = data)) return;
- ecore_wl_input_ungrab(win->pointer_device, 0);
+ ecore_wl_input_ungrab(win->pointer_device);
}
static void