[PATCH 4/6 weston] clients: desktop-shell: show tooltip for panel items
Kristian Høgsberg
hoegsberg at gmail.com
Mon May 21 09:47:11 PDT 2012
On Mon, May 21, 2012 at 04:47:48PM +0300, Tiago Vignatti wrote:
> A timer is set whenever there's pointer motion inside a panel launcher item;
> if the pointer stills inside the item after stopped for 500ms, then tooltip
> shows up.
I think most of this should be part of the tooltip code in window.c.
Basically, I'd expect just a widget_set_tooltip(window, text, x, y)
function that a widget can call from its motion handler. Then the
tooltip code in window.c will handle the timer, cancelling the tooltip
on leave etc. Or maybe just widget_set_tooltop(widget, text), and
then the widget code will do it all.
Kristian
> Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
> ---
> clients/desktop-shell.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 81 insertions(+)
>
> diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c
> index 7554df3..19b644e 100644
> --- a/clients/desktop-shell.c
> +++ b/clients/desktop-shell.c
> @@ -31,6 +31,9 @@
> #include <cairo.h>
> #include <sys/wait.h>
> #include <linux/input.h>
> +#include <sys/timerfd.h>
> +#include <sys/epoll.h>
> +#include <libgen.h>
>
> #include <wayland-client.h>
> #include "window.h"
> @@ -82,6 +85,10 @@ struct panel_launcher {
> int focused, pressed;
> const char *path;
> struct wl_list link;
> +
> + struct task tooltip_task;
> + int tooltip_fd;
> + float last_x, last_y;
> };
>
> struct unlock_dialog {
> @@ -248,7 +255,9 @@ panel_launcher_leave_handler(struct widget *widget,
> struct input *input, void *data)
> {
> struct panel_launcher *launcher = data;
> + struct window *parent = launcher->panel->window;
>
> + window_destroy_tooltip(parent);
> launcher->focused = 0;
> widget_schedule_redraw(widget);
> }
> @@ -267,6 +276,74 @@ panel_launcher_button_handler(struct widget *widget,
> }
>
> static void
> +tooltip_func(struct task *task, uint32_t events)
> +{
> + struct panel_launcher *launcher =
> + container_of(task, struct panel_launcher, tooltip_task);
> + uint64_t exp;
> + struct window *parent = launcher->panel->window;
> + const int offset_y = 27;
> +
> + read(launcher->tooltip_fd, &exp, sizeof (uint64_t));
> +
> + if (launcher->focused)
> + window_create_tooltip(parent, launcher->last_x,
> + launcher->last_y + offset_y,
> + basename((char *)launcher->path));
> +}
> +
> +#define TOOLTIP_TIMEOUT 500
> +static int
> +tooltip_timer_reset(struct panel_launcher *launcher)
> +{
> + struct itimerspec its;
> +
> + its.it_interval.tv_sec = 0;
> + its.it_interval.tv_nsec = 0;
> + its.it_value.tv_sec = TOOLTIP_TIMEOUT / 1000;
> + its.it_value.tv_nsec = (TOOLTIP_TIMEOUT % 1000) * 1000 * 1000;
> + if (timerfd_settime(launcher->tooltip_fd, 0, &its, NULL) < 0) {
> + fprintf(stderr, "could not set timerfd\n: %m");
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static int
> +tooltip_timer_create(struct display *display, struct panel_launcher *launcher)
> +{
> + /* FIXME: fd here is never closed anywhere; maybe we need a
> + * panel_launcher_destroy for such. */
> + launcher->tooltip_fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
> + if (launcher->tooltip_fd < 0) {
> + fprintf(stderr, "could not create timerfd\n: %m");
> + return -1;
> + }
> +
> + launcher->tooltip_task.run = tooltip_func;
> + display_watch_fd(display, launcher->tooltip_fd, EPOLLIN,
> + &launcher->tooltip_task);
> +
> + tooltip_timer_reset(launcher);
> + return 0;
> +}
> +
> +static int
> +panel_launcher_motion_handler(struct widget *widget,
> + struct input *input, uint32_t time,
> + float x, float y, void *data)
> +{
> + struct panel_launcher *launcher = data;
> +
> + tooltip_timer_reset(launcher);
> + launcher->last_x = x;
> + launcher->last_y = y;
> +
> + return POINTER_LEFT_PTR;
> +}
> +
> +static void
> panel_button_handler(struct widget *widget,
> struct input *input, uint32_t time,
> uint32_t button, uint32_t state, void *data)
> @@ -353,6 +430,10 @@ panel_add_launcher(struct panel *panel, const char *icon, const char *path)
> panel_launcher_button_handler);
> widget_set_redraw_handler(launcher->widget,
> panel_launcher_redraw_handler);
> + widget_set_motion_handler(launcher->widget,
> + panel_launcher_motion_handler);
> +
> + tooltip_timer_create(window_get_display(panel->window), launcher);
> }
>
> enum {
> --
> 1.7.9.5
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list