From: Ning Tang <ning.t...@intel.com> Launcher is totally depend on layout and add layout redraw function to manage drawing launchers.
Signed-off-by: Ning Tang <tecto...@gmail.com> --- clients/tablet-shell.c | 133 +++++++++++++++++++++++++++++++++---------------- weston-tablet.ini | 3 ++ 2 files changed, 94 insertions(+), 42 deletions(-) diff --git a/clients/tablet-shell.c b/clients/tablet-shell.c index c4ec5e7..3a0f04c 100644 --- a/clients/tablet-shell.c +++ b/clients/tablet-shell.c @@ -46,7 +46,6 @@ struct tablet { struct homescreen { struct window *window; struct widget *widget; - struct wl_list launcher_list; struct wl_list layout_list; }; @@ -63,6 +62,7 @@ struct layout { struct wl_list link; int pressed; int showing; + int offset; int hmargin; int vmargin; @@ -71,7 +71,6 @@ struct layout { struct launcher { struct widget *widget; - struct homescreen *homescreen; struct layout *layout; cairo_surface_t *icon; int focused, pressed; @@ -86,11 +85,17 @@ static char *key_launcher_icon; static char *key_launcher_path; static void launcher_section_done(void *data); static void layout_section_done(void *data); +static int launcher_size; +static int key_layout_rows; +static int key_layout_columns; static const struct config_key shell_config_keys[] = { { "lockscreen-icon", CONFIG_KEY_STRING, &key_lockscreen_icon }, { "lockscreen", CONFIG_KEY_STRING, &key_lockscreen_background }, { "homescreen", CONFIG_KEY_STRING, &key_homescreen_background }, + { "layout-rows", CONFIG_KEY_UNSIGNED_INTEGER, &key_layout_rows }, + { "layout-columns", CONFIG_KEY_UNSIGNED_INTEGER, &key_layout_columns }, + { "icon-size", CONFIG_KEY_UNSIGNED_INTEGER, &launcher_size }, }; static const struct config_key launcher_config_keys[] = { @@ -156,9 +161,7 @@ homescreen_draw(struct widget *widget, void *data) cairo_surface_t *surface; struct rectangle allocation; cairo_t *cr; - struct launcher *launcher; - const int rows = 4, columns = 5, icon_width = 128, icon_height = 128; - int x, y, i, width, height, vmargin, hmargin, vpadding, hpadding; + struct layout *layout; surface = window_get_surface(homescreen->window); cr = cairo_create(surface); @@ -166,29 +169,16 @@ homescreen_draw(struct widget *widget, void *data) widget_get_allocation(widget, &allocation); paint_background(cr, key_homescreen_background, &allocation); - cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - - width = allocation.width - columns * icon_width; - hpadding = width / (columns + 1); - hmargin = (width - hpadding * (columns - 1)) / 2; - - height = allocation.height - rows * icon_height; - vpadding = height / (rows + 1); - vmargin = (height - vpadding * (rows - 1)) / 2; - - x = hmargin; - y = vmargin; - i = 0; - - wl_list_for_each(launcher, &homescreen->launcher_list, link) { - widget_set_allocation(launcher->widget, - x, y, icon_width, icon_height); - x += icon_width + hpadding; - i++; - if (i == columns) { - x = hmargin; - y += icon_height + vpadding; - i = 0; + /* draw current layout */ + wl_list_for_each(layout, &homescreen->layout_list, link) { + if (layout->showing) { + widget_set_allocation(layout->widget, + layout->hmargin, + layout->vmargin, + allocation.width + - 2 * layout->hmargin, + allocation.height + - 2 * layout->vmargin); } } @@ -375,7 +365,7 @@ launcher_button_handler(struct widget *widget, if (state == WL_POINTER_BUTTON_STATE_RELEASED) { launcher_activate(launcher); launcher->pressed = 0; - } else if (state == WL_POINTER_BUTTON_STATE_PRESSED) + } else if (state == WL_POINTER_BUTTON_STATE_PRESSED) launcher->pressed = 1; } @@ -385,12 +375,20 @@ launcher_redraw_handler(struct widget *widget, void *data) struct launcher *launcher = data; cairo_surface_t *surface; struct rectangle allocation; + struct rectangle layout_allocation; cairo_t *cr; - surface = window_get_surface(launcher->homescreen->window); - cr = cairo_create(surface); - widget_get_allocation(widget, &allocation); + widget_get_allocation(launcher->layout->homescreen->widget, + &layout_allocation); + + /* avoid drawing out of bounding. */ + if (allocation.x <= (0 - allocation.width) || + allocation.x > layout_allocation.width) + return; + + surface = window_get_surface(launcher->layout->homescreen->window); + cr = cairo_create(surface); if (launcher->pressed) { allocation.x++; allocation.y++; @@ -410,12 +408,53 @@ launcher_redraw_handler(struct widget *widget, void *data) } static void +layout_redraw_handler(struct widget *widget, void *data) +{ + struct layout *layout = data; + struct launcher *launcher; + struct rectangle allocation; + const int icon_width = launcher_size, icon_height = launcher_size; + int x, y, i, width, height, vpadding, hpadding; + + if (layout->showing != 1) + return; + + widget_get_allocation(widget, &allocation); + width = allocation.width - key_layout_columns * icon_width; + /* width between icons */ + hpadding = width / (key_layout_columns - 1); + + height = allocation.height - key_layout_rows * icon_height; + vpadding = height / (key_layout_rows - 1); + + x = allocation.x + layout->offset; + y = allocation.y; + i = 0; + + wl_list_for_each(launcher, &layout->launcher_list, link) { + if (x < allocation.width + 2 * layout->hmargin) { + widget_set_allocation(launcher->widget, x, y, + icon_width, icon_height); + } else { + widget_set_allocation(launcher->widget, + 0, 0, 0, 0); + } + x += icon_width + hpadding; + i++; + if (i == key_layout_columns) { + x = allocation.x + layout->offset; + y += icon_height + vpadding; + i = 0; + } + } +} + +static void tablet_shell_add_layout(struct tablet *tablet) { struct layout *layout; struct homescreen *homescreen = tablet->homescreen; struct rectangle allocation; - char *index_image; widget_get_allocation(homescreen->widget, &allocation); layout = malloc(sizeof *layout); @@ -428,22 +467,31 @@ tablet_shell_add_layout(struct tablet *tablet) if (wl_list_empty(&homescreen->layout_list)) { layout->showing = 1; } + layout->offset = 0; /* let layout know number of layouts */ layout->layout_list = &homescreen->layout_list; wl_list_insert(homescreen->layout_list.prev, &layout->link); + widget_set_redraw_handler(layout->widget, + layout_redraw_handler); } static void -tablet_shell_add_launcher(struct tablet *tablet, - const char *icon, const char *path) +layout_add_launcher(struct tablet *tablet, + const char *icon, const char *path) { struct launcher *launcher; + struct layout *layout = NULL; struct homescreen *homescreen = tablet->homescreen; + wl_list_for_each(layout, &homescreen->layout_list, link) { + } + /* find the last layout */ + layout = __wl_container_of(layout->link.prev, layout, link); + launcher = malloc(sizeof *launcher); - launcher->path = strdup(path); + memset(launcher, 0, sizeof *launcher); launcher->icon = load_cairo_surface(icon); if ( !launcher->icon || cairo_surface_status (launcher->icon) != CAIRO_STATUS_SUCCESS) { @@ -451,9 +499,13 @@ tablet_shell_add_launcher(struct tablet *tablet, free(launcher); return; } + launcher->path = strdup(path); - launcher->homescreen = homescreen; - launcher->widget = widget_add_widget(homescreen->widget, launcher); + launcher->layout = layout; + + wl_list_insert(layout->launcher_list.prev, &launcher->link); + + launcher->widget = widget_add_widget(layout->widget, launcher); widget_set_enter_handler(launcher->widget, launcher_enter_handler); widget_set_leave_handler(launcher->widget, @@ -462,8 +514,6 @@ tablet_shell_add_launcher(struct tablet *tablet, launcher_button_handler); widget_set_redraw_handler(launcher->widget, launcher_redraw_handler); - - wl_list_insert(&homescreen->launcher_list, &launcher->link); } static void @@ -476,7 +526,7 @@ launcher_section_done(void *data) return; } - tablet_shell_add_launcher(tablet, key_launcher_icon, key_launcher_path); + layout_add_launcher(tablet, key_launcher_icon, key_launcher_path); free(key_launcher_icon); key_launcher_icon = NULL; @@ -527,7 +577,6 @@ int main(int argc, char *argv[]) tablet.homescreen = homescreen_create(&tablet); tablet_shell_set_homescreen(tablet.tablet_shell, window_get_wl_surface(tablet.homescreen->window)); - wl_list_init(&tablet.homescreen->launcher_list); wl_list_init(&tablet.homescreen->layout_list); config_file = config_file_path("weston-tablet.ini"); diff --git a/weston-tablet.ini b/weston-tablet.ini index d38b87a..b5239a8 100644 --- a/weston-tablet.ini +++ b/weston-tablet.ini @@ -4,6 +4,9 @@ lockscreen-icon=/usr/share/weston/org.tizen.gallery.png lockscreen=/usr/share/backgrounds/gnome/Garden.jpg homescreen=/usr/share/backgrounds/gnome/Aqua.jpg animation=zoom +layout-rows=6 +layout-columns=8 +icon-size=64 [layout] [launcher] -- 1.7.11.5 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel