meego-tablet-shell: Track the state of the UI explicitly
This commit is contained in:
parent
f77ce46fe5
commit
1258a4a552
@ -38,6 +38,14 @@
|
||||
* attachment.
|
||||
*/
|
||||
|
||||
enum {
|
||||
STATE_STARTING,
|
||||
STATE_LOCKED,
|
||||
STATE_HOME,
|
||||
STATE_SWITCHER,
|
||||
STATE_TASK
|
||||
};
|
||||
|
||||
struct meego_tablet_shell {
|
||||
struct wl_object object;
|
||||
|
||||
@ -59,10 +67,9 @@ struct meego_tablet_shell {
|
||||
struct wlsc_surface *switcher_surface;
|
||||
struct wl_listener switcher_listener;
|
||||
|
||||
/* FIXME: Need a state machine here. */
|
||||
int starting, locked;
|
||||
int home_active;
|
||||
int task_switcher_active;
|
||||
struct meego_tablet_client *current_client;
|
||||
|
||||
int state, previous_state;
|
||||
int long_press_active;
|
||||
struct wl_event_source *long_press_source;
|
||||
};
|
||||
@ -71,6 +78,7 @@ struct meego_tablet_client {
|
||||
struct wl_resource resource;
|
||||
struct meego_tablet_shell *shell;
|
||||
struct wl_client *client;
|
||||
struct wlsc_surface *surface;
|
||||
char *name;
|
||||
};
|
||||
|
||||
@ -96,6 +104,19 @@ sigchld_handler(int signal_number, void *data)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
meego_tablet_shell_set_state(struct meego_tablet_shell *shell, int state)
|
||||
{
|
||||
static const char *states[] = {
|
||||
"STARTING", "LOCKED", "HOME", "SWITCHER", "TASK"
|
||||
};
|
||||
|
||||
fprintf(stderr, "switching to state %s (from %s)\n",
|
||||
states[state], states[shell->state]);
|
||||
shell->previous_state = shell->state;
|
||||
shell->state = state;
|
||||
}
|
||||
|
||||
static void
|
||||
handle_zoom_surface_destroy(struct wl_listener *listener,
|
||||
struct wl_surface *surface, uint32_t time)
|
||||
@ -171,20 +192,6 @@ meego_tablet_zoom_run(struct meego_tablet_shell *shell,
|
||||
&zoom->animation.link);
|
||||
}
|
||||
|
||||
static const char *
|
||||
surface_visual(struct wlsc_surface *surface)
|
||||
{
|
||||
struct wl_compositor *c = &surface->compositor->compositor;
|
||||
|
||||
if (surface->visual == &c->argb_visual) {
|
||||
return "argb";
|
||||
} else if (surface->visual == &c->premultiplied_argb_visual) {
|
||||
return "premultiplied argb";
|
||||
} else {
|
||||
return "rgb";
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: We should be handling map, not attach... Map is when the
|
||||
* surface becomes visible, which is what we want to catch. Attach
|
||||
* will happen whenever the surface changes. */
|
||||
@ -197,25 +204,23 @@ meego_tablet_shell_attach(struct wlsc_shell *base,
|
||||
container_of(base, struct meego_tablet_shell, shell);
|
||||
|
||||
if (surface == shell->lockscreen_surface) {
|
||||
if (shell->starting) {
|
||||
if (shell->state == STATE_STARTING) {
|
||||
wlsc_compositor_fade(shell->compositor, 0.0);
|
||||
wlsc_compositor_wake(shell->compositor);
|
||||
wlsc_surface_damage(surface);
|
||||
shell->starting = 0;
|
||||
meego_tablet_shell_set_state(shell, STATE_LOCKED);
|
||||
shell->previous_state = STATE_HOME;
|
||||
}
|
||||
} else if (surface == shell->switcher_surface) {
|
||||
fprintf(stderr, "switcher attach, size %dx%d, visual %s\n",
|
||||
shell->switcher_surface->width,
|
||||
shell->switcher_surface->height,
|
||||
surface_visual(surface));
|
||||
/* */
|
||||
} else if (surface == shell->home_surface) {
|
||||
surface->x = 0;
|
||||
surface->y = 0;
|
||||
} else if (shell->surface != surface) {
|
||||
/* FIXME: Fullscreen everything else. */
|
||||
fprintf(stderr, "attach from surface %p, client %p\n",
|
||||
/* */
|
||||
} else if (shell->current_client->surface != surface &&
|
||||
shell->current_client->client == surface->surface.client) {
|
||||
fprintf(stderr, "initial attach from surface %p, client %p\n",
|
||||
surface, surface->surface.client);
|
||||
shell->surface = surface;
|
||||
meego_tablet_shell_set_state(shell, STATE_TASK);
|
||||
shell->current_client->surface = surface;
|
||||
surface->x = 0;
|
||||
surface->y = 0;
|
||||
meego_tablet_zoom_run(shell, surface);
|
||||
@ -231,7 +236,7 @@ handle_lockscreen_surface_destroy(struct wl_listener *listener,
|
||||
struct meego_tablet_shell, lockscreen_listener);
|
||||
|
||||
shell->lockscreen_surface = NULL;
|
||||
shell->locked = 0;
|
||||
meego_tablet_shell_set_state(shell, shell->previous_state);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -263,7 +268,8 @@ handle_switcher_surface_destroy(struct wl_listener *listener,
|
||||
struct meego_tablet_shell, switcher_listener);
|
||||
|
||||
shell->switcher_surface = NULL;
|
||||
shell->task_switcher_active = 0;
|
||||
if (shell->state != STATE_LOCKED)
|
||||
meego_tablet_shell_set_state(shell, shell->previous_state);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -325,19 +331,18 @@ tablet_client_poke(struct wl_client *client,
|
||||
struct meego_tablet_client *tablet_client)
|
||||
{
|
||||
struct wlsc_compositor *compositor = tablet_client->shell->compositor;
|
||||
struct wlsc_surface *surface;
|
||||
struct meego_tablet_shell *shell = tablet_client->shell;
|
||||
struct wlsc_input_device *device =
|
||||
(struct wlsc_input_device *) compositor->input_device;
|
||||
|
||||
wl_list_for_each(surface, &compositor->surface_list, link) {
|
||||
if (surface->surface.client == tablet_client->client) {
|
||||
wlsc_surface_activate(surface, device,
|
||||
wlsc_compositor_get_time());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr, "poke client %s\n", tablet_client->name);
|
||||
shell->current_client = tablet_client;
|
||||
if (tablet_client->surface) {
|
||||
wlsc_surface_activate(tablet_client->surface, device,
|
||||
wlsc_compositor_get_time());
|
||||
meego_tablet_shell_set_state(tablet_client->shell,
|
||||
STATE_TASK);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct meego_tablet_client_interface tablet_client_interface = {
|
||||
@ -370,6 +375,8 @@ tablet_shell_create_client(struct wl_client *client,
|
||||
(void (**)(void)) &tablet_client_interface;
|
||||
|
||||
wl_client_add_resource(client, &tablet_client->resource);
|
||||
tablet_client->surface = NULL;
|
||||
shell->current_client = tablet_client;
|
||||
|
||||
fprintf(stderr, "created client %p, id %d, name %s, fd %d\n",
|
||||
tablet_client->client, id, name, fd);
|
||||
@ -383,7 +390,7 @@ static const struct meego_tablet_shell_interface tablet_shell_interface = {
|
||||
};
|
||||
|
||||
static void
|
||||
launch_switcher(struct meego_tablet_shell *shell)
|
||||
launch_ux_daemon(struct meego_tablet_shell *shell)
|
||||
{
|
||||
struct wlsc_compositor *compositor = shell->compositor;
|
||||
char s[32];
|
||||
@ -427,17 +434,16 @@ launch_switcher(struct meego_tablet_shell *shell)
|
||||
static void
|
||||
toggle_switcher(struct meego_tablet_shell *shell)
|
||||
{
|
||||
struct wlsc_surface *surface = shell->switcher_surface;
|
||||
|
||||
if (surface) {
|
||||
switch (shell->state) {
|
||||
case STATE_SWITCHER:
|
||||
wl_client_post_event(shell->client, &shell->object,
|
||||
MEEGO_TABLET_SHELL_HIDE_SWITCHER);
|
||||
printf("hide switcher\n");
|
||||
/* cleanupTaskSwitcher(); */
|
||||
} else {
|
||||
shell->task_switcher_active = 1;
|
||||
break;
|
||||
default:
|
||||
wl_client_post_event(shell->client, &shell->object,
|
||||
MEEGO_TABLET_SHELL_SHOW_SWITCHER);
|
||||
meego_tablet_shell_set_state(shell, STATE_SWITCHER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -447,10 +453,16 @@ meego_tablet_shell_lock(struct wlsc_shell *base)
|
||||
struct meego_tablet_shell *shell =
|
||||
container_of(base, struct meego_tablet_shell, shell);
|
||||
|
||||
if (!shell->locked)
|
||||
if (shell->state == STATE_LOCKED)
|
||||
return;
|
||||
if (shell->state == STATE_SWITCHER)
|
||||
wl_client_post_event(shell->client, &shell->object,
|
||||
MEEGO_TABLET_SHELL_SHOW_LOCKSCREEN);
|
||||
shell->locked = 1;
|
||||
MEEGO_TABLET_SHELL_HIDE_SWITCHER);
|
||||
|
||||
wl_client_post_event(shell->client, &shell->object,
|
||||
MEEGO_TABLET_SHELL_SHOW_LOCKSCREEN);
|
||||
|
||||
meego_tablet_shell_set_state(shell, STATE_LOCKED);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -459,13 +471,14 @@ go_home(struct meego_tablet_shell *shell)
|
||||
struct wlsc_input_device *device =
|
||||
(struct wlsc_input_device *) shell->compositor->input_device;
|
||||
|
||||
if (shell->task_switcher_active)
|
||||
if (shell->state == STATE_SWITCHER)
|
||||
wl_client_post_event(shell->client, &shell->object,
|
||||
MEEGO_TABLET_SHELL_HIDE_SWITCHER);
|
||||
|
||||
wlsc_surface_activate(shell->home_surface, device,
|
||||
wlsc_compositor_get_time());
|
||||
printf("go home\n");
|
||||
|
||||
meego_tablet_shell_set_state(shell, STATE_HOME);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -485,7 +498,7 @@ menu_key_binding(struct wl_input_device *device, uint32_t time,
|
||||
{
|
||||
struct meego_tablet_shell *shell = data;
|
||||
|
||||
if (shell->locked)
|
||||
if (shell->state == STATE_LOCKED)
|
||||
return;
|
||||
|
||||
if (state)
|
||||
@ -498,7 +511,7 @@ home_key_binding(struct wl_input_device *device, uint32_t time,
|
||||
{
|
||||
struct meego_tablet_shell *shell = data;
|
||||
|
||||
if (shell->locked)
|
||||
if (shell->state == STATE_LOCKED)
|
||||
return;
|
||||
|
||||
shell->device = (struct wlsc_input_device *) device;
|
||||
@ -510,10 +523,15 @@ home_key_binding(struct wl_input_device *device, uint32_t time,
|
||||
wl_event_source_timer_update(shell->long_press_source, 0);
|
||||
shell->long_press_active = 0;
|
||||
|
||||
if (shell->home_active || shell->task_switcher_active)
|
||||
switch (shell->state) {
|
||||
case STATE_HOME:
|
||||
case STATE_SWITCHER:
|
||||
toggle_switcher(shell);
|
||||
else
|
||||
break;
|
||||
default:
|
||||
go_home(shell);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -551,7 +569,6 @@ shell_init(struct wlsc_compositor *compositor)
|
||||
|
||||
memset(shell, 0, sizeof *shell);
|
||||
shell->compositor = compositor;
|
||||
shell->locked = 1;
|
||||
|
||||
shell->object.interface = &meego_tablet_shell_interface;
|
||||
shell->object.implementation =
|
||||
@ -587,8 +604,8 @@ shell_init(struct wlsc_compositor *compositor)
|
||||
shell->shell.attach = meego_tablet_shell_attach;
|
||||
shell->shell.set_selection_focus =
|
||||
meego_tablet_shell_set_selection_focus;
|
||||
launch_switcher(shell);
|
||||
launch_ux_daemon(shell);
|
||||
|
||||
wlsc_spring_init(&compositor->fade.spring, 40.0, 1.0, 1.0);
|
||||
shell->starting = 1;
|
||||
meego_tablet_shell_set_state(shell, STATE_STARTING);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user