Deskmenu

Deskmenu is a small desktop app launcher. By default is shows couple of apps and launches them when selected. Written in plain Ano script, no C involved.

Deskmenu demonstrates how to attach menu to widget and external command calling in widget callback function, as well how to set some window attributes, like borderless and keep-above.

User interface

Menu pops up by pressing middle mouse button, or alternatively keep <ctrl> key pressed while pressing left mouse button.

Compilation

Easiest way to get Deskmenu running is to go to examples directory in package root, and run:

$ ./build.sh gui_deskmenu

build.sh script compiles Ano script, menu and widget definitions to C, copies source files in place and pops up instructions what to do next. Follow them. Check also examples/README for more info.

Screenshots

Internet menu opened

Preview

;
; This little application pops up a launcher menu.
;
; @ANO_SCRIPT_NAME		gui_deskmenu
; @ANO_SCRIPT_VERSION		0.0.2
; @ANO_SCRIPT_DESCRIPTION	Simple application launcher menu
;
; @ANO_FLAGS_VAR_NAME_SUBS	[x]
; @ANO_FLAGS_VAR_WARN_UNUSED	[ ]
;
; Copyright (c) 2016-2023, Jani Salonen <salojan at goto10 piste co>
; All rights reserved.
;

	; Global uninitialized variables
	var	[handle] handle_window_main

	; Initialize windowing system
	window_init

	; Open main window
	window_open (NULL, NULL, \
		[handle] @0, [uint] 1, [uint] 0, [uint] 0, \
		[int] -1, [int] -1, [uint] 200, [uint] 40, \
		NULL, NULL, NULL, NULL, NULL, NULL, \
		NULL, NULL, "cb_destroy", \
		NULL, NULL, NULL, "cb_open")
	end

callback cb_open (_hnd) {
	mov	handle_window_main (_hnd)

	; Window to above all others, 1 = above, 1 = set
	window_set_attrs (handle_window_main, 1, 1)
	; Window border off, 3 = border, 0 = unset
	window_set_attrs (handle_window_main, 3, 0)

	; Map main window
	window_map (handle_window_main)
}

callback cb_destroy {
	window_close (handle_window_main)

	exit
}

callback cb_button_press (_x, _y, _x_root, _y_root, _state, _button) {
}

callback cb_exit (_item, _position, _tag, _flag) {
	jmp	"cb_destroy"
}

callback cb_launch (_item, _position, _tag, _flag) {
	; Internet menu
	cmp	_tag (1)
	jne	"cb_launch_1"
	call	"cb_launch_it" ("firefox")
	end
: "cb_launch_1"
	cmp	_tag (2)
	jne	"cb_launch_2"
	call	"cb_launch_it" ("opera")
	end
: "cb_launch_2"
	; Multimedia menu
	cmp	_tag (10)
	jne	"cb_launch_10"
	call	"cb_launch_it" ("vlc")
	end
: "cb_launch_10"
}

function cb_launch_it (_app) {
	; Execute the application
	exec (_app)
}
;
; Copyright (c) 2016-2023, Jani Salonen <salojan at goto10 piste co>
; All rights reserved.
;
; @WIDGET_USE_BOUNDING_BOXES no
;

window "1" {
	set "0" {
		widget "background" {
			name		"background"
			state		enable

			color		"rgb:#000000"
		}

		widget "block" {
			name		"launcher"
			state		enable

			position	x = 0, y = 0
			size		width = 200, height = 40

			color		"rgba:#ffffddff"

			border		color = rgba:#5aa6bbff, thickness = 2

			; This empty callback is needed for menu to pop up
			action		buttonpress = cb_button_press
		}

		widget "label" {
			name		"label"
			state		enable

			position	x = 100, y = 4

			label		"MMB to start", \
					charset = UTF-8, size = 12, \
					color = rgb:#441111, \
					justification = center
		}
	}
}
;
; Copyright (c) 2016-2023, Jani Salonen <salojan at goto10 piste co>
; All rights reserved.
;

;
; container_type "name" {
;
window "1" {
	widget "launcher" {
		;
		; menu "name" {									optional_icon
		;
		menu "Internet" {								examples/datafiles/dm_inet.tga
			;
			; type "name",		id,	callback_func,		flags,		optional_icon
			;
			item "Firefox",		1,	cb_launch,		none,		examples/datafiles/dm_inet_ff.tga
			item "Opera",		2,	cb_launch,		none,		examples/datafiles/dm_inet_op.tga
		}

		menu "Multimedia" {								examples/datafiles/dm_mm.tga
			item "VLC Player",	10,	cb_launch,		none,		examples/datafiles/dm_mm_vlc.tga
		}

		menu "Session" {								examples/datafiles/dm_ss.tga
			item "Exit Deskmenu",	20,	cb_exit,		none,		examples/datafiles/dm_ss_exit.tga
		}
	}
}

Copyright © 2023, Jani Salonen <salojan at goto10 piste co>. Piste is finnish word and means dot. All rights reserved.