I'm interested in Unity indicators and wonder if there is any tutorial on how to program them. I can use the sources of the existing ones as last resort, but I'd prefer a more friendly approach because my programming skills are quite limited.
-
Related links: askubuntu.com/q/46746/17789 askubuntu.com/q/46761/17789– con-f-useCommented Jun 13, 2011 at 17:17
-
Check out this answer as well. It describes how to create a system indicator, which has more possibilities than an app indicator. I experimented a little bit and also looked at default system indicators of Unity, like the sound and bluetooth indicator; and came up with my own example, ScreenToolsIndicator, which uses buttons and a slider as well. I chose C because sneetsher's examples were in C, but there is a C++ wrapper for GLib as well (glibmm).– okareszCommented Apr 9, 2017 at 21:40
3 Answers
Application Indicator documentation with examples and API docs are available here:
- https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators, it's API reference is HTML in the
libappindicator-doc
package. (Thanks @Sneetsher) http://developer.ubuntu.com/apps(broken)
There are not yet tutorials on Application Indicators there yet, but stay tuned for more content on the App Developer site's tutorials section:
-
2Bump. All these links are outdated and lead to 'page not found' messages. Are there any new resources I could find? The official developer.ubuntu.com/apps/qml/cookbook/… site links to this question with
Is there any tutorial for programming Unity indicators?
as title. Commented Mar 11, 2014 at 23:58 -
Broken links everywhere, See ApplicationIndicators wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators , its API reference as HTML in
libappindicator-doc
package.– user.dzCommented May 7, 2014 at 8:50 -
1There's a bug filed on the missing documentation: bugs.launchpad.net/ubuntudeveloperportal/+bug/1317065 Commented May 7, 2014 at 12:26
Here is an app indicator example in C. This is an "indicator only" version (no window) of the example provided at Ubuntu Wiki:
#include <libappindicator/app-indicator.h>
static void activate_action (GtkAction *action);
static GtkActionEntry entries[] = {
{"New", "document-new", "_New", "<control>N",
"Create a new file", G_CALLBACK(activate_action)},
{"Open", "document-open", "_Open", "<control>O",
"Open a file", G_CALLBACK(activate_action)},
{"Save", "document-save", "_Save", "<control>S",
"Save file", G_CALLBACK(activate_action)},
{"Quit", "application-exit", "_Quit", "<control>Q",
"Exit the application", G_CALLBACK(gtk_main_quit)},
};
static guint n_entries = G_N_ELEMENTS(entries);
static const gchar *ui_info =
"<ui>"
" <popup name='IndicatorPopup'>"
" <menuitem action='New' />"
" <menuitem action='Open' />"
" <menuitem action='Save' />"
" <menuitem action='Quit' />"
" </popup>"
"</ui>";
static void activate_action(GtkAction *action)
{
const gchar *name = gtk_action_get_name (action);
GtkWidget *dialog;
dialog = gtk_message_dialog_new(NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_CLOSE,
"You activated action: \"%s\"",
name);
g_signal_connect(dialog, "response",
G_CALLBACK(gtk_widget_destroy), NULL);
gtk_widget_show(dialog);
}
int main(int argc, char **argv)
{
GtkWidget* indicator_menu;
GtkActionGroup* action_group;
GtkUIManager* uim;
AppIndicator* indicator;
GError* error = NULL;
gtk_init(&argc, &argv);
/* Menus */
action_group = gtk_action_group_new("AppActions");
gtk_action_group_add_actions(action_group, entries, n_entries,
NULL);
uim = gtk_ui_manager_new();
gtk_ui_manager_insert_action_group(uim, action_group, 0);
if (!gtk_ui_manager_add_ui_from_string(uim, ui_info, -1, &error)) {
g_message("Failed to build menus: %s\n", error->message);
g_error_free(error);
error = NULL;
}
/* Indicator */
indicator = app_indicator_new("example-simple-client",
"go-jump",
APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
indicator_menu = gtk_ui_manager_get_widget(uim, "/ui/IndicatorPopup");
app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
app_indicator_set_attention_icon(indicator, "indicator-messages-new");
app_indicator_set_menu(indicator, GTK_MENU(indicator_menu));
gtk_main();
return 0;
}
-
-
@ringø Edited sergej's answer, added the working link. Effectively, it's the same link as in Jorge's answer. Commented Feb 21, 2017 at 16:34
I did a short tutorial here for creating a stop watch app indicator in python: http://www.steshadoku.com/blog/2017/elapses-creating-a-unity-stopwatch-indicator-w-python/
import gobject
import gtk
import appindicator
import os, sys
import time
from datetime import timedelta
if __name__ == "__main__":
saveseconds = 0 #global variable to save how many seconds the clock has run
dir_path = os.path.dirname(os.path.realpath(__file__))
source_id = ""
def on_timer(args=None):
savetime = int(time.time() - timestart) + saveseconds
ind.set_label(str(timedelta(seconds=savetime)))
return True
def finish(args=None):
sys.exit()
return True
def stoptime(args=None):
#print(source_id)
global saveseconds
saveseconds += int(time.time() - timestart)
gtk.timeout_remove(source_id)
return True
def starttime(args=None):
global timestart
timestart = time.time()
global source_id
source_id = gtk.timeout_add(1000, on_timer)
#sets timer to run every 1s
return True
def cleartime(args=None):
global saveseconds
saveseconds = 0
ind.set_label(str(timedelta(seconds=0)))
gtk.timeout_remove(source_id)
return True
#format below is category name, icon
ind = appindicator.Indicator ("simple-clock-client", "hourglass", appindicator.CATEGORY_APPLICATION_STATUS, dir_path)
ind.set_status (appindicator.STATUS_ACTIVE)
ind.set_label("Elapses"); #name of program and initial display
##Setup Menu Items
menu = gtk.Menu()
stop = gtk.MenuItem("Stop")
stop.connect("activate", stoptime)
stop.show()
menu.append(stop)
start = gtk.MenuItem("Start")
start.connect("activate", starttime)
start.show()
menu.append(start)
clear = gtk.MenuItem("Clear")
clear.connect("activate", cleartime)
clear.show()
menu.append(clear)
exit = gtk.MenuItem("Exit")
exit.connect("activate", finish)
exit.show()
menu.append(exit)
ind.set_menu(menu) #set the menu with added items
gtk.main()
-
1I didn't look into the actual code, but for one thing: you have indentation errors. Both here and in the linked tutorial. Commented Feb 21, 2017 at 15:27
-
No, there's one space of indentation . . . just one, which makes it absolutely painful to read the code and doesn't conform to Python's PEP8 standard Commented Feb 21, 2017 at 16:26