Jak stworzyć wskaźniki jedności?

25

Interesują mnie wskaźniki Jedności i zastanawiam się, czy jest jakiś samouczek na temat ich programowania. Mogę wykorzystać źródła istniejących jako ostateczność, ale wolę bardziej przyjazne podejście, ponieważ moje umiejętności programowania są dość ograniczone.

rsuarez
źródło
Sprawdź również odpowiedź. Opisuje, jak utworzyć wskaźnik systemowy , który ma więcej możliwości niż wskaźnik aplikacji. Trochę eksperymentowałem, a także spojrzałem na domyślne wskaźniki systemowe Unity, takie jak wskaźnik dźwięku i Bluetooth; i wymyśliłem własny przykład ScreenToolsIndicator , który używa również przycisków i suwaka . Wybrałem C, ponieważ przykłady sneetshera były w C, ale istnieje również opakowanie C ++ dla GLib (glibmm).
okaresz

Odpowiedzi:

21

Dokumentacja wskaźnika aplikacji z przykładami i dokumentami API jest dostępna tutaj:

Nie ma jeszcze samouczków na temat wskaźników aplikacji, ale czekaj na więcej treści w sekcji samouczków witryny App Developer:

Jorge Castro
źródło
2
Guz. Wszystkie te linki są nieaktualne i prowadzą do komunikatów „nie znaleziono strony”. Czy są jakieś nowe zasoby, które mogę znaleźć? Oficjalna witryna developer.ubuntu.com/apps/qml/cookbook/… prowadzi do tego pytania Is there any tutorial for programming Unity indicators?jako tytuł.
Daniel W.
Uszkodzone linki wszędzie, patrz ApplicationIndicators wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators , jego odwołanie do API jako HTML w libappindicator-docpakiecie.
user.dz
1
W brakującej dokumentacji zgłoszono błąd: bugs.launchpad.net/ubuntudeveloperportal/+bug/1317065
Jorge Castro
4

Oto przykładowy wskaźnik aplikacji w C. Jest to wersja „tylko wskaźnikowa” (bez okna) przykładu podanego na 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;
}
sergej
źródło
Link daje 404
Pierścień Ø
@ ringø Edytowano odpowiedź sergej, dodano działający link. W rzeczywistości jest to ten sam link, co w odpowiedzi Jorge.
Sergiy Kolodyazhnyy
1

Zrobiłem tutaj krótki samouczek dotyczący tworzenia wskaźnika aplikacji stopwatch w pythonie: 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()
dohkoo
źródło
1
Nie patrzyłem na rzeczywisty kod, ale z jednej strony: masz błędy wcięcia. Zarówno tutaj, jak i w połączonym samouczku.
Jacob Vlijm
Nie, jest jedna przestrzeń wcięć. . . tylko jeden, co sprawia, że ​​czytanie kodu jest całkowicie bolesne i nie jest zgodne ze standardem PEP8 Pythona
Sergiy Kolodyazhnyy