Index: uspace/app/taskbar/meson.build
===================================================================
--- uspace/app/taskbar/meson.build	(revision 4c6fd56b8079778d8d40e0d5ffc6a1e8e8ad2b5b)
+++ uspace/app/taskbar/meson.build	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -1,4 +1,4 @@
 #
-# Copyright (c) 2022 Jiri Svoboda
+# Copyright (c) 2023 Jiri Svoboda
 # All rights reserved.
 #
@@ -32,4 +32,5 @@
 	'main.c',
 	'taskbar.c',
+	'tbsmenu.c',
 	'wndlist.c',
 )
@@ -38,8 +39,10 @@
 	'clock.c',
 	'taskbar.c',
+	'tbsmenu.c',
 	'wndlist.c',
 	'test/clock.c',
 	'test/main.c',
 	'test/taskbar.c',
+	'test/tbsmenu.c',
 	'test/wndlist.c',
 )
Index: uspace/app/taskbar/taskbar.c
===================================================================
--- uspace/app/taskbar/taskbar.c	(revision 4c6fd56b8079778d8d40e0d5ffc6a1e8e8ad2b5b)
+++ uspace/app/taskbar/taskbar.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -39,5 +39,4 @@
 #include <str.h>
 #include <ui/fixed.h>
-#include <ui/label.h>
 #include <ui/resource.h>
 #include <ui/ui.h>
@@ -46,4 +45,5 @@
 #include "clock.h"
 #include "taskbar.h"
+#include "tbsmenu.h"
 #include "wndlist.h"
 
@@ -98,5 +98,4 @@
 	gfx_rect_t scr_rect;
 	gfx_rect_t rect;
-	ui_resource_t *ui_res;
 	errno_t rc;
 
@@ -161,5 +160,4 @@
 
 	ui_window_set_cb(taskbar->window, &window_cb, (void *)taskbar);
-	ui_res = ui_window_get_res(taskbar->window);
 
 	rc = ui_fixed_create(&taskbar->fixed);
@@ -169,26 +167,23 @@
 	}
 
-	rc = ui_label_create(ui_res, "HelenOS", &taskbar->label);
-	if (rc != EOK) {
-		printf("Error creating label.\n");
-		goto error;
-	}
-
-	ui_window_get_app_rect(taskbar->window, &rect);
-	if (ui_is_textmode(taskbar->ui)) {
-		rect.p0.x += 1;
-	} else {
-		rect.p0.x += 10;
-	}
-	ui_label_set_rect(taskbar->label, &rect);
-	ui_label_set_halign(taskbar->label, gfx_halign_left);
-	ui_label_set_valign(taskbar->label, gfx_valign_center);
-
-	rc = ui_fixed_add(taskbar->fixed, ui_label_ctl(taskbar->label));
-	if (rc != EOK) {
-		printf("Error adding control to layout.\n");
-		ui_label_destroy(taskbar->label);
-		goto error;
-	}
+	rc = tbsmenu_create(taskbar->window, taskbar->fixed, &taskbar->tbsmenu);
+	if (rc != EOK) {
+		printf("Error creating start menu.\n");
+		goto error;
+	}
+
+	if (ui_is_textmode(taskbar->ui)) {
+		rect.p0.x = params.rect.p0.x + 1;
+		rect.p0.y = 0;
+		rect.p1.x = params.rect.p0.x + 9;
+		rect.p1.y = 1;
+	} else {
+		rect.p0.x = params.rect.p0.x + 5;
+		rect.p0.y = 4;
+		rect.p1.x = params.rect.p0.x + 84;
+		rect.p1.y = 32 - 4;
+	}
+
+	tbsmenu_set_rect(taskbar->tbsmenu, &rect);
 
 	rc = wndlist_create(taskbar->window, taskbar->fixed, &taskbar->wndlist);
@@ -199,5 +194,5 @@
 
 	if (ui_is_textmode(taskbar->ui)) {
-		rect.p0.x = params.rect.p0.x + 9;
+		rect.p0.x = params.rect.p0.x + 10;
 		rect.p0.y = 0;
 		rect.p1.x = params.rect.p1.x - 10;
@@ -257,4 +252,6 @@
 	if (taskbar->wndlist != NULL)
 		wndlist_destroy(taskbar->wndlist);
+	if (taskbar->tbsmenu != NULL)
+		tbsmenu_destroy(taskbar->tbsmenu);
 	if (taskbar->window != NULL)
 		ui_window_destroy(taskbar->window);
@@ -270,4 +267,6 @@
 	ui_fixed_remove(taskbar->fixed, taskbar_clock_ctl(taskbar->clock));
 	taskbar_clock_destroy(taskbar->clock);
+	wndlist_destroy(taskbar->wndlist);
+	tbsmenu_destroy(taskbar->tbsmenu);
 	ui_window_destroy(taskbar->window);
 	ui_destroy(taskbar->ui);
Index: uspace/app/taskbar/tbsmenu.c
===================================================================
--- uspace/app/taskbar/tbsmenu.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
+++ uspace/app/taskbar/tbsmenu.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup taskbar
+ * @{
+ */
+/** @file Task bar start menu
+ */
+
+#include <gfx/coord.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <ui/fixed.h>
+#include <ui/menu.h>
+#include <ui/menuentry.h>
+#include <ui/resource.h>
+#include <ui/ui.h>
+#include <ui/window.h>
+#include "tbsmenu.h"
+
+static void tbsmenu_smenu_close_req(ui_menu_t *, void *);
+
+/** Start menu callbacks */
+static ui_menu_cb_t tbsmenu_smenu_cb = {
+	.close_req = tbsmenu_smenu_close_req,
+};
+
+static void tbsmenu_button_clicked(ui_pbutton_t *, void *);
+
+/** Start button callbacks */
+static ui_pbutton_cb_t tbsmenu_button_cb = {
+	.clicked = tbsmenu_button_clicked
+};
+
+/** Create task bar start menu.
+ *
+ * @param window Containing window
+ * @param fixed Fixed layout to which start button will be added
+ * @param rtbsmenu Place to store pointer to new start menu
+ * @return @c EOK on success or an error code
+ */
+errno_t tbsmenu_create(ui_window_t *window, ui_fixed_t *fixed,
+    tbsmenu_t **rtbsmenu)
+{
+	ui_resource_t *res = ui_window_get_res(window);
+	tbsmenu_t *tbsmenu = NULL;
+	ui_menu_entry_t *tentry;
+	errno_t rc;
+
+	tbsmenu = calloc(1, sizeof(tbsmenu_t));
+	if (tbsmenu == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	rc = ui_pbutton_create(res, "Start", &tbsmenu->sbutton);
+	if (rc != EOK)
+		goto error;
+
+	ui_pbutton_set_cb(tbsmenu->sbutton, &tbsmenu_button_cb,
+	    (void *)tbsmenu);
+
+	rc = ui_fixed_add(fixed, ui_pbutton_ctl(tbsmenu->sbutton));
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_menu_create(window, &tbsmenu->smenu);
+	if (rc != EOK)
+		goto error;
+
+	ui_menu_set_cb(tbsmenu->smenu, &tbsmenu_smenu_cb, (void *)tbsmenu);
+
+	rc = ui_menu_entry_create(tbsmenu->smenu, "~N~avigator", "", &tentry);
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_menu_entry_create(tbsmenu->smenu, "Text ~E~ditor", "", &tentry);
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_menu_entry_create(tbsmenu->smenu, "~T~erminal", "", &tentry);
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_menu_entry_create(tbsmenu->smenu, "~C~alculator", "", &tentry);
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_menu_entry_create(tbsmenu->smenu, "~U~I Demo", "", &tentry);
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_menu_entry_create(tbsmenu->smenu, "~G~FX Demo", "", &tentry);
+	if (rc != EOK)
+		goto error;
+
+	tbsmenu->window = window;
+	tbsmenu->fixed = fixed;
+	list_initialize(&tbsmenu->entries);
+
+	*rtbsmenu = tbsmenu;
+	return EOK;
+error:
+	if (tbsmenu != NULL)
+		ui_pbutton_destroy(tbsmenu->sbutton);
+	if (tbsmenu != NULL)
+		free(tbsmenu);
+	return rc;
+}
+
+/** Set window list rectangle.
+ *
+ * @param tbsmenu Window list
+ * @param rect Rectangle
+ */
+void tbsmenu_set_rect(tbsmenu_t *tbsmenu, gfx_rect_t *rect)
+{
+	tbsmenu->rect = *rect;
+	ui_pbutton_set_rect(tbsmenu->sbutton, rect);
+}
+
+/** Destroy task bar start menu.
+ *
+ * @param tbsmenu Start menu
+ */
+void tbsmenu_destroy(tbsmenu_t *tbsmenu)
+{
+	tbsmenu_entry_t *entry;
+
+	// TODO Close libstartmenu
+
+	/* Destroy entries */
+	entry = tbsmenu_first(tbsmenu);
+	while (entry != NULL) {
+		(void)tbsmenu_remove(tbsmenu, entry, false);
+		entry = tbsmenu_first(tbsmenu);
+	}
+
+	ui_fixed_remove(tbsmenu->fixed, ui_pbutton_ctl(tbsmenu->sbutton));
+	ui_pbutton_destroy(tbsmenu->sbutton);
+	ui_menu_destroy(tbsmenu->smenu);
+
+	free(tbsmenu);
+}
+
+/** Remove entry from window list.
+ *
+ * @param tbsmenu Window list
+ * @param entry Window list entry
+ * @param paint @c true to repaint window list
+ * @return @c EOK on success or an error code
+ */
+errno_t tbsmenu_remove(tbsmenu_t *tbsmenu, tbsmenu_entry_t *entry,
+    bool paint)
+{
+	errno_t rc = EOK;
+
+	assert(entry->tbsmenu == tbsmenu);
+
+	list_remove(&entry->lentries);
+
+	// TODO Destroy menu entry
+	free(entry);
+	return rc;
+}
+
+/** Handle start menu close request.
+ *
+ * @param menu Menu
+ * @param arg Argument (tbsmenu_t *)
+ * @param wnd_id Window ID
+ */
+static void tbsmenu_smenu_close_req(ui_menu_t *menu, void *arg)
+{
+	tbsmenu_t *tbsmenu = (tbsmenu_t *)arg;
+
+	(void)tbsmenu;
+	ui_menu_close(menu);
+}
+
+/** Get first start menu entry.
+ *
+ * @param tbsmenu Start menu
+ * @return First entry or @c NULL if the menu is empty
+ */
+tbsmenu_entry_t *tbsmenu_first(tbsmenu_t *tbsmenu)
+{
+	link_t *link;
+
+	link = list_first(&tbsmenu->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, tbsmenu_entry_t, lentries);
+}
+
+/** Get last start menu entry.
+ *
+ * @param tbsmenu Start menu
+ * @return Last entry or @c NULL if the menu is empty
+ */
+tbsmenu_entry_t *tbsmenu_last(tbsmenu_t *tbsmenu)
+{
+	link_t *link;
+
+	link = list_last(&tbsmenu->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, tbsmenu_entry_t, lentries);
+}
+
+/** Get next start menu entry.
+ *
+ * @param cur Current entry
+ * @return Next entry or @c NULL if @a cur is the last entry
+ */
+tbsmenu_entry_t *tbsmenu_next(tbsmenu_entry_t *cur)
+{
+	link_t *link;
+
+	link = list_next(&cur->lentries, &cur->tbsmenu->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, tbsmenu_entry_t, lentries);
+}
+
+/** Get number of start menu entries.
+ *
+ * @param tbsmenu Start menu
+ * @return Number of entries
+ */
+size_t tbsmenu_count(tbsmenu_t *tbsmenu)
+{
+	return list_count(&tbsmenu->entries);
+}
+
+/** Start button was clicked.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (tbsmenu_entry_t *)
+ */
+static void tbsmenu_button_clicked(ui_pbutton_t *pbutton, void *arg)
+{
+	tbsmenu_t *tbsmenu = (tbsmenu_t *)arg;
+
+	if (!ui_menu_is_open(tbsmenu->smenu)) {
+		// XXX ev_pos_id is not set!!!
+		(void) ui_menu_open(tbsmenu->smenu, &tbsmenu->rect,
+		    tbsmenu->ev_pos_id);
+	} else {
+		/* menu is open */
+		ui_menu_close(tbsmenu->smenu);
+	}
+}
+
+/** @}
+ */
Index: uspace/app/taskbar/tbsmenu.h
===================================================================
--- uspace/app/taskbar/tbsmenu.h	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
+++ uspace/app/taskbar/tbsmenu.h	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup taskbar
+ * @{
+ */
+/**
+ * @file Task bar start menu
+ */
+
+#ifndef TBSMENU_H
+#define TBSMENU_H
+
+#include <errno.h>
+#include <gfx/coord.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <ui/fixed.h>
+#include <ui/window.h>
+#include <wndmgt.h>
+#include "types/tbsmenu.h"
+
+extern errno_t tbsmenu_create(ui_window_t *, ui_fixed_t *, tbsmenu_t **);
+extern void tbsmenu_set_rect(tbsmenu_t *, gfx_rect_t *);
+extern void tbsmenu_destroy(tbsmenu_t *);
+extern errno_t tbsmenu_remove(tbsmenu_t *, tbsmenu_entry_t *, bool);
+extern tbsmenu_entry_t *tbsmenu_first(tbsmenu_t *);
+extern tbsmenu_entry_t *tbsmenu_last(tbsmenu_t *);
+extern tbsmenu_entry_t *tbsmenu_next(tbsmenu_entry_t *);
+extern size_t tbsmenu_count(tbsmenu_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/app/taskbar/test/main.c
===================================================================
--- uspace/app/taskbar/test/main.c	(revision 4c6fd56b8079778d8d40e0d5ffc6a1e8e8ad2b5b)
+++ uspace/app/taskbar/test/main.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -33,4 +33,5 @@
 PCUT_IMPORT(clock);
 PCUT_IMPORT(taskbar);
+PCUT_IMPORT(tbsmenu);
 PCUT_IMPORT(wndlist);
 
Index: uspace/app/taskbar/test/tbsmenu.c
===================================================================
--- uspace/app/taskbar/test/tbsmenu.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
+++ uspace/app/taskbar/test/tbsmenu.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <pcut/pcut.h>
+#include <ui/fixed.h>
+#include <ui/ui.h>
+#include <ui/window.h>
+#include "../tbsmenu.h"
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(tbsmenu);
+
+/* Test creating and destroying taskbar start menu */
+PCUT_TEST(create_destroy)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_wnd_params_t params;
+	ui_window_t *window = NULL;
+	ui_fixed_t *fixed = NULL;
+	tbsmenu_t *tbsmenu = NULL;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Hello";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(window);
+
+	rc = ui_fixed_create(&fixed);
+	ui_window_add(window, ui_fixed_ctl(fixed));
+
+	rc = tbsmenu_create(window, fixed, &tbsmenu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	tbsmenu_destroy(tbsmenu);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+PCUT_EXPORT(tbsmenu);
Index: uspace/app/taskbar/types/taskbar.h
===================================================================
--- uspace/app/taskbar/types/taskbar.h	(revision 4c6fd56b8079778d8d40e0d5ffc6a1e8e8ad2b5b)
+++ uspace/app/taskbar/types/taskbar.h	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -43,4 +43,5 @@
 #include <ui/window.h>
 #include "clock.h"
+#include "tbsmenu.h"
 #include "wndlist.h"
 
@@ -53,5 +54,6 @@
 	/** Fixed layout */
 	ui_fixed_t *fixed;
-	ui_label_t *label;
+	/** Start menu */
+	tbsmenu_t *tbsmenu;
 	/** Window list */
 	wndlist_t *wndlist;
Index: uspace/app/taskbar/types/tbsmenu.h
===================================================================
--- uspace/app/taskbar/types/tbsmenu.h	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
+++ uspace/app/taskbar/types/tbsmenu.h	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2023 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup taskbar
+ * @{
+ */
+/**
+ * @file Task bar start menu
+ */
+
+#ifndef TYPES_TBSMENU_H
+#define TYPES_TBSMENU_H
+
+#include <adt/list.h>
+#include <gfx/coord.h>
+#include <stdbool.h>
+#include <ui/pbutton.h>
+#include <ui/fixed.h>
+#include <ui/menu.h>
+#include <ui/window.h>
+
+/** Taskbar window list entry */
+typedef struct {
+	/** Containing start menu */
+	struct tbsmenu *tbsmenu;
+	/** Link to tbsmenu->entries */
+	link_t lentries;
+} tbsmenu_entry_t;
+
+/** Task bar start menu */
+typedef struct tbsmenu {
+	/** Containing window */
+	ui_window_t *window;
+
+	/** Layout to which we add start button */
+	ui_fixed_t *fixed;
+
+	/** Start button rectangle */
+	gfx_rect_t rect;
+
+	/** Start button */
+	ui_pbutton_t *sbutton;
+
+	/** Start menu */
+	ui_menu_t *smenu;
+
+	/** Start menu entries (of tbsmenu_entry_t) */
+	list_t entries;
+
+	// TODO libstartmenu instance
+
+	/** Position ID of last position event */
+	sysarg_t ev_pos_id;
+} tbsmenu_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/app/taskbar/types/wndlist.h
===================================================================
--- uspace/app/taskbar/types/wndlist.h	(revision 4c6fd56b8079778d8d40e0d5ffc6a1e8e8ad2b5b)
+++ uspace/app/taskbar/types/wndlist.h	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -69,5 +69,5 @@
 	ui_window_t *window;
 
-	/** Layout to which we add window buttoons */
+	/** Layout to which we add window buttons */
 	ui_fixed_t *fixed;
 
Index: uspace/app/taskbar/wndlist.c
===================================================================
--- uspace/app/taskbar/wndlist.c	(revision 4c6fd56b8079778d8d40e0d5ffc6a1e8e8ad2b5b)
+++ uspace/app/taskbar/wndlist.c	(revision 7e6603784b2bbda102aa3edc13f5c1d8326b4a66)
@@ -45,5 +45,4 @@
 #include <ui/ui.h>
 #include <ui/window.h>
-#include "clock.h"
 #include "wndlist.h"
 
@@ -85,5 +84,4 @@
  * @param window Containing window
  * @param fixed Fixed layout to which buttons will be added
- * @param wndmgt Window management service
  * @param rwndlist Place to store pointer to new window list
  * @return @c EOK on success or an error code
@@ -178,5 +176,8 @@
 }
 
-/** Destroy task bar window list. */
+/** Destroy task bar window list.
+ *
+ * @param wndlist Window list
+ */
 void wndlist_destroy(wndlist_t *wndlist)
 {
@@ -469,7 +470,5 @@
 }
 
-/** Compute and set window list entry rectangle.
- *
- * Compute rectangle for window list entry and set it.
+/** Unpaint window list entry.
  *
  * @param entry Window list entry
