Allow to specify an output for a toplevel input panel surface.
Signed-off-by: Jan Arne Petersen <jpetersen@openismus.com>
struct input_method *input_method;
struct input_method_context *context;
struct display *display;
struct input_method *input_method;
struct input_method_context *context;
struct display *display;
char *preedit_string;
uint32_t preedit_style;
struct {
char *preedit_string;
uint32_t preedit_style;
struct {
struct keyboard *keyboard;
const struct layout *layout;
struct input_panel_surface *ips;
struct keyboard *keyboard;
const struct layout *layout;
struct input_panel_surface *ips;
layout = get_current_layout(virtual_keyboard);
keyboard = malloc(sizeof *keyboard);
layout = get_current_layout(virtual_keyboard);
keyboard = malloc(sizeof *keyboard);
ips = input_panel_get_input_panel_surface(virtual_keyboard->input_panel,
window_get_wl_surface(keyboard->window));
ips = input_panel_get_input_panel_surface(virtual_keyboard->input_panel,
window_get_wl_surface(keyboard->window));
- input_panel_surface_set_toplevel(ips, INPUT_PANEL_SURFACE_POSITION_CENTER_BOTTOM);
-}
-
-static void
-handle_output_configure(struct output *output, void *data)
-{
- struct virtual_keyboard *virtual_keyboard = data;
+ input_panel_surface_set_toplevel(ips,
+ output_get_wl_output(output),
+ INPUT_PANEL_SURFACE_POSITION_CENTER_BOTTOM);
- /* skip existing outputs */
- if (output_get_user_data(output))
- return;
-
- output_set_user_data(output, virtual_keyboard);
-
- keyboard_create(output, virtual_keyboard);
+ fprintf(stderr, "%s, %p\n", __FUNCTION__, output_get_wl_output(output));
}
int
main(int argc, char *argv[])
{
struct virtual_keyboard virtual_keyboard;
}
int
main(int argc, char *argv[])
{
struct virtual_keyboard virtual_keyboard;
memset(&virtual_keyboard, 0, sizeof virtual_keyboard);
memset(&virtual_keyboard, 0, sizeof virtual_keyboard);
display_set_user_data(virtual_keyboard.display, &virtual_keyboard);
display_set_global_handler(virtual_keyboard.display, global_handler);
display_set_user_data(virtual_keyboard.display, &virtual_keyboard);
display_set_global_handler(virtual_keyboard.display, global_handler);
- display_set_output_configure_handler(virtual_keyboard.display, handle_output_configure);
+
+ output = display_get_output(virtual_keyboard.display);
+ keyboard_create(output, &virtual_keyboard);
display_run(virtual_keyboard.display);
display_run(virtual_keyboard.display);
<description summary="set the surface type as a keyboard">
A keybaord surface is only shown, when a text model is active
</description>
<description summary="set the surface type as a keyboard">
A keybaord surface is only shown, when a text model is active
</description>
+ <arg name="output" type="object" interface="wl_output"/>
<arg name="position" type="uint"/>
</request>
<arg name="position" type="uint"/>
</request>
struct weston_surface *surface;
struct wl_listener surface_destroy_listener;
struct weston_surface *surface;
struct wl_listener surface_destroy_listener;
+ struct weston_output *output;
wl_list_for_each_safe(surface, next,
&shell->input_panel.surfaces, link) {
ws = surface->surface;
wl_list_for_each_safe(surface, next,
&shell->input_panel.surfaces, link) {
ws = surface->surface;
- if (!weston_surface_is_mapped(ws)) {
+ if (!ws->buffer_ref.buffer)
wl_list_insert(&shell->input_panel_layer.surface_list,
&ws->layer_link);
weston_surface_geometry_dirty(ws);
wl_list_insert(&shell->input_panel_layer.surface_list,
&ws->layer_link);
weston_surface_geometry_dirty(ws);
if (!shell->showing_input_panels)
return;
if (!shell->showing_input_panels)
return;
- wl_list_insert(&shell->input_panel_layer.surface_list,
- &surface->layer_link);
- weston_surface_geometry_dirty(surface);
- weston_surface_update_transform(surface);
- mode = surface->output->current;
+ fprintf(stderr, "%s panel: %d, output: %p\n", __FUNCTION__, ip_surface->panel, ip_surface->output);
if (ip_surface->panel) {
x = shell->text_input.surface->geometry.x + shell->text_input.cursor_rectangle.x2;
y = shell->text_input.surface->geometry.y + shell->text_input.cursor_rectangle.y2;
} else {
if (ip_surface->panel) {
x = shell->text_input.surface->geometry.x + shell->text_input.cursor_rectangle.x2;
y = shell->text_input.surface->geometry.y + shell->text_input.cursor_rectangle.y2;
} else {
- x = surface->output->x + (mode->width - width) / 2;
- y = surface->output->y + mode->height - height;
- }
+ mode = ip_surface->output->current;
- /* Don't map the input panel here, wait for
- * show_input_panels signal. */
+ x = ip_surface->output->x + (mode->width - width) / 2;
+ y = ip_surface->output->y + mode->height - height;
+ }
weston_surface_configure(surface,
x, y,
width, height);
if (show_surface) {
weston_surface_configure(surface,
x, y,
width, height);
if (show_surface) {
+ wl_list_insert(&shell->input_panel_layer.surface_list,
+ &surface->layer_link);
+ weston_surface_update_transform(surface);
weston_surface_damage(surface);
weston_slide_run(surface, surface->geometry.height, 0, NULL, NULL);
}
weston_surface_damage(surface);
weston_slide_run(surface, surface->geometry.height, 0, NULL, NULL);
}
static void
input_panel_surface_set_toplevel(struct wl_client *client,
struct wl_resource *resource,
static void
input_panel_surface_set_toplevel(struct wl_client *client,
struct wl_resource *resource,
+ struct wl_resource *output_resource,
uint32_t position)
{
struct input_panel_surface *input_panel_surface = resource->data;
uint32_t position)
{
struct input_panel_surface *input_panel_surface = resource->data;
wl_list_insert(&shell->input_panel.surfaces,
&input_panel_surface->link);
wl_list_insert(&shell->input_panel.surfaces,
&input_panel_surface->link);
+ input_panel_surface->output = output_resource->data;
input_panel_surface->panel = 0;
input_panel_surface->panel = 0;
+
+ fprintf(stderr, "%s panel: %d, output: %p\n", __FUNCTION__,
+ input_panel_surface->panel,
+ input_panel_surface->output);