struct wl_display *display;
struct wl_compositor *compositor;
struct wl_shell *shell;
+ struct wl_shell *desktop_shell;
struct wl_shm *shm;
struct wl_data_device_manager *data_device_manager;
} wl;
{
int x, y;
} root;
- unsigned int win;
- unsigned int event_win;
- unsigned int root_win;
+ unsigned int window;
+ unsigned int event_window;
+ unsigned int root_window;
unsigned int timestamp;
};
{
int x, y;
} root;
- unsigned int win;
- unsigned int event_win;
- unsigned int root_win;
+ unsigned int window;
+ unsigned int event_window;
+ unsigned int root_window;
unsigned int timestamp;
};
EAPI void ecore_wl_input_grab(Ecore_Wl_Input *input, Ecore_Wl_Window *win, unsigned int button);
EAPI void ecore_wl_input_ungrab(Ecore_Wl_Input *input, unsigned int timestamp);
+EAPI struct wl_list ecore_wl_outputs_get(void);
+
EAPI Ecore_Wl_Window *ecore_wl_window_new(Ecore_Wl_Window *parent, int x, int y, int w, int h, int buffer_type);
EAPI void ecore_wl_window_free(Ecore_Wl_Window *win);
EAPI void ecore_wl_window_move(Ecore_Wl_Window *win, int x, int y);
EAPI void ecore_wl_window_transparent_set(Ecore_Wl_Window *win, Eina_Bool transparent);
EAPI void ecore_wl_window_update_size(Ecore_Wl_Window *win, int w, int h);
EAPI struct wl_surface *ecore_wl_window_surface_get(Ecore_Wl_Window *win);
+EAPI struct wl_shell_surface *ecore_wl_window_shell_surface_get(Ecore_Wl_Window *win);
EAPI Ecore_Wl_Window *ecore_wl_window_find(unsigned int id);
EAPI void ecore_wl_window_type_set(Ecore_Wl_Window *win, Ecore_Wl_Window_Type type);
EAPI void ecore_wl_window_pointer_set(Ecore_Wl_Window *win, struct wl_buffer *buffer, int hot_x, int hot_y, unsigned int timestamp);
+EAPI void ecore_wl_window_parent_set(Ecore_Wl_Window *win, Ecore_Wl_Window *parent);
#endif
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, int x, int y);
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_in_send(Ecore_Wl_Input *input, unsigned int timestamp);
LOGFN(__FILE__, __LINE__, __FUNCTION__);
input->grab = NULL;
+ input->grab_button = 0;
+
if (input->pointer_focus)
- {
- printf("Ungrab: %d\n", timestamp);
- }
+ _ecore_wl_input_pointer_focus_set(input, input->pointer_focus,
+ timestamp, input->sx, input->sy);
}
void
input->sx = sx;
input->sy = sy;
+ if (!(input->grab && input->grab_button))
+ _ecore_wl_input_pointer_focus_set(input, input->pointer_focus,
+ timestamp, sx, sy);
+
/* TODO: FIXME: NB: Weston window code has set pointer image here also */
_ecore_wl_input_mouse_move_send(input, timestamp);
}
if ((input->pointer_focus) && (!input->grab) && (state))
ecore_wl_input_grab(input, input->pointer_focus, button);
-// _ecore_wl_input_mouse_move_send(input, timestamp);
-
- if ((button >= BTN_SIDE) && (button <= BTN_BACK))
- {
- /* TODO: raise mouse wheel */
- printf("Raise Mouse Wheel Event\n");
- }
- else
+ if (input->grab)
{
if (state)
{
+
input->button = button;
_ecore_wl_input_mouse_down_send(input, timestamp);
}
{
_ecore_wl_input_mouse_up_send(input, timestamp);
input->button = 0;
-
- if ((input->grab) && (input->grab_button == button))
- ecore_wl_input_ungrab(input, timestamp);
}
}
+
+ if ((input->grab) && (input->grab_button == button) && (!state))
+ ecore_wl_input_ungrab(input, timestamp);
}
static void
if (!(input = data)) return;
- /* _pointer_x = sx; */
- /* _pointer_y = sy; */
-
- /* input->sx = sx; */
- /* input->sy = sy; */
-
-// _ecore_wl_input_mouse_move_send(input, timestamp);
+ if ((win = wl_surface_get_user_data(surface)))
+ win->pointer_device = input;
+ else
+ return;
- win = input->pointer_focus;
- if ((win) && (win->surface != surface))
- {
- if (!input->button)
- _ecore_wl_input_pointer_focus_remove(input, timestamp);
- }
+ input->sx = sx;
+ input->sy = sy;
- if (surface)
- {
- if ((win = wl_surface_get_user_data(surface)))
- {
- input->pointer_focus = win;
- win->pointer_device = input;
- }
- /* if (input->button) */
- /* { */
- /* _ecore_wl_input_mouse_up_send(input, timestamp); */
- /* input->button = 0; */
- /* } */
- /* else */
- _ecore_wl_input_mouse_in_send(input, timestamp);
- }
+ _ecore_wl_input_pointer_focus_set(input, win, timestamp, sx, sy);
}
static void
if (!(input = data)) return;
+ input->keyboard_focus = wl_surface_get_user_data(surface);
+
end = keys->data + keys->size;
input->modifiers = 0;
for (k = keys->data; k < end; k++)
input->modifiers |= _ecore_wl_disp->xkb->map->modmap[*k];
- if (surface)
- {
- if ((win = wl_surface_get_user_data(surface)))
- {
- input->keyboard_focus = win;
- win->keyboard_device = input;
- }
- else
- input->keyboard_focus = NULL;
- _ecore_wl_input_focus_in_send(input, timestamp);
- }
+ win = input->keyboard_focus;
+ win->keyboard_device = input;
+
+ _ecore_wl_input_focus_in_send(input, timestamp);
}
static void
LOGFN(__FILE__, __LINE__, __FUNCTION__);
+ if (!(win = input->keyboard_focus)) return;
+
+ win->keyboard_device = NULL;
+
_ecore_wl_input_focus_out_send(input, timestamp);
- if ((win = input->keyboard_focus))
- win->keyboard_device = NULL;
+
input->keyboard_focus = NULL;
}
static void
+_ecore_wl_input_pointer_focus_set(Ecore_Wl_Input *input, Ecore_Wl_Window *focus, unsigned int timestamp, int x, int y)
+{
+ if ((focus) && (focus == input->pointer_focus)) return;
+
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ input->sx = x;
+ input->sy = y;
+
+ if (input->pointer_focus)
+ {
+ Ecore_Wl_Window *nwin;
+
+ nwin = input->pointer_focus;
+ _ecore_wl_input_mouse_out_send(input, timestamp);
+ input->pointer_focus = NULL;
+ nwin->pointer_device = NULL;
+ }
+
+ if (focus)
+ {
+ input->pointer_focus = focus;
+ _ecore_wl_input_mouse_in_send(input, timestamp);
+ 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__);
- if (!input->button)
- _ecore_wl_input_mouse_out_send(input, timestamp);
+ win = input->pointer_focus;
- if ((win = input->pointer_focus))
- win->pointer_device = NULL;
+ _ecore_wl_input_pointer_focus_set(input, NULL, timestamp, 0, 0);
input->pointer_focus = NULL;
+ if (win) win->pointer_device = NULL;
}
static void
ev->modifiers = input->modifiers;
ev->timestamp = timestamp;
- if (input->pointer_focus)
+ if (input->grab)
{
- ev->win = input->pointer_focus->id;
- ev->event_win = input->pointer_focus->id;
+ 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;
}
ecore_event_add(ECORE_WL_EVENT_MOUSE_IN, ev, NULL, NULL);
ev->modifiers = input->modifiers;
ev->timestamp = timestamp;
- if (input->pointer_focus)
+ if (input->grab)
{
- ev->win = input->pointer_focus->id;
- ev->event_win = input->pointer_focus->id;
+ 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;
}
ecore_event_add(ECORE_WL_EVENT_MOUSE_OUT, ev, NULL, NULL);
ev->multi.x = input->sx;
ev->multi.y = input->sy;
- if (input->pointer_focus)
+ 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->multi.x = input->sx;
ev->multi.y = input->sy;
- if (input->pointer_focus)
+ 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;
/* TODO: handle horizontal scroll */
}
- if (input->pointer_focus)
+ 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;
if (!(input = win->keyboard_device))
{
if (win->parent)
- input = win->parent->keyboard_device;
+ {
+ if (!(input = win->parent->keyboard_device))
+ input = win->parent->pointer_device;
+ }
}
+ if ((!input) || (!input->input_device)) return;
+
+ ecore_wl_input_ungrab(input, input->timestamp);
wl_shell_surface_move(win->shell_surface, input->input_device,
input->timestamp);
}
{
Ecore_Wl_Input *input;
- input = win->keyboard_device;
+ if (!(input = win->keyboard_device))
+ {
+ if (win->parent)
+ {
+ if (!(input = win->parent->keyboard_device))
+ input = win->parent->pointer_device;
+ }
+ }
+
+ if ((!input) || (!input->input_device)) return;
+
+ ecore_wl_input_ungrab(input, input->timestamp);
wl_shell_surface_resize(win->shell_surface, input->input_device,
input->timestamp, location);
}
if (win->surface) return;
win->surface = wl_compositor_create_surface(_ecore_wl_disp->wl.compositor);
-
wl_surface_set_user_data(win->surface, win);
win->shell_surface =
break;
case ECORE_WL_WINDOW_TYPE_MENU:
wl_shell_surface_set_popup(win->shell_surface,
- win->parent->pointer_device->input_device,
- win->parent->pointer_device->timestamp,
+ _ecore_wl_disp->input->input_device,
+ _ecore_wl_disp->input->timestamp,
+ /* win->parent->pointer_device->input_device, */
+ /* win->parent->pointer_device->timestamp, */
win->parent->shell_surface,
win->allocation.x, win->allocation.y, 0);
break;
case ECORE_WL_WINDOW_TYPE_TOPLEVEL:
- default:
wl_shell_surface_set_toplevel(win->shell_surface);
break;
+ default:
+ break;
}
if (win->type != ECORE_WL_WINDOW_TYPE_FULLSCREEN)
wl_region_add(win->region.input, win->allocation.x, win->allocation.y,
win->allocation.w, win->allocation.h);
}
+
if (!win->transparent)
{
win->region.opaque =
return win->surface;
}
+/* @since 1.2 */
+EAPI struct wl_shell_surface *
+ecore_wl_window_shell_surface_get(Ecore_Wl_Window *win)
+{
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ if (!win) return NULL;
+ return win->shell_surface;
+}
+
EAPI Ecore_Wl_Window *
ecore_wl_window_find(unsigned int id)
{
buffer, hot_x, hot_y);
}
+/* @since 1.2 */
+EAPI void
+ecore_wl_window_parent_set(Ecore_Wl_Window *win, Ecore_Wl_Window *parent)
+{
+ LOGFN(__FILE__, __LINE__, __FUNCTION__);
+
+ win->parent = parent;
+}
+
/* local functions */
static void
_ecore_wl_window_cb_configure(void *data, struct wl_shell_surface *shell_surface __UNUSED__, unsigned int timestamp, unsigned int edges, int w, int h)