Come creare gli indicatori di unità?


25

Sono interessato agli indicatori di Unity e mi chiedo se ci sono tutorial su come programmarli. Posso usare le fonti di quelle esistenti come ultima risorsa, ma preferirei un approccio più amichevole perché le mie capacità di programmazione sono piuttosto limitate.



Dai un'occhiata anche a questa risposta. Descrive come creare un indicatore di sistema , che ha più possibilità di un indicatore di app. Ho sperimentato un po 'e ho anche guardato gli indicatori di sistema predefiniti di Unity, come l'indicatore audio e bluetooth; e ho trovato il mio esempio, ScreenToolsIndicator , che utilizza anche pulsanti e un dispositivo di scorrimento . Ho scelto C perché gli esempi di sneetsher erano in C, ma esiste anche un wrapper C ++ per GLib (glibmm).
Okaresz,

Risposte:


21

La documentazione relativa all'indicatore dell'applicazione con esempi e documenti API è disponibile qui:

Non ci sono ancora tutorial sugli Indicatori di applicazione, ma resta sintonizzato per ulteriori contenuti nella sezione tutorial del sito per sviluppatori di app:


2
Bump. Tutti questi collegamenti sono obsoleti e portano a messaggi 'pagina non trovata'. Ci sono nuove risorse che potrei trovare? Il sito ufficiale developer.ubuntu.com/apps/qml/cookbook/… si collega a questa domanda con Is there any tutorial for programming Unity indicators?il titolo.
Daniel W.

Collegamenti interrotti ovunque, vedi ApplicationIndicators wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators , il suo riferimento API come HTML nel libappindicator-docpacchetto.
user.dz

1
C'è un bug archiviato nella documentazione mancante: bugs.launchpad.net/ubuntudeveloperportal/+bug/1317065
Jorge Castro

4

Ecco un esempio di indicatore di app in C. Questa è una versione "solo indicatore" (senza finestra) dell'esempio fornito su 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;
}

Link restituisce 404
Anello Ø

@ ringø Modificata la risposta di sergej, aggiunto il link funzionante. In effetti, è lo stesso collegamento della risposta di Jorge.
Sergiy Kolodyazhnyy,

1

Ho fatto un breve tutorial qui per creare un indicatore di app cronometro 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()

1
Non ho esaminato il codice reale, ma per prima cosa: hai errori di rientro. Sia qui che nel tutorial collegato.
Jacob Vlijm,

No, c'è uno spazio di rientro. . . solo uno, il che rende assolutamente doloroso leggere il codice e non è conforme allo standard PEP8 di Python
Sergiy Kolodyazhnyy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.