Como criar indicadores Unity?

25

Estou interessado nos indicadores do Unity e me pergunto se existe algum tutorial sobre como programá-los. Posso usar as fontes das existentes como último recurso, mas prefiro uma abordagem mais amigável, porque minhas habilidades de programação são bastante limitadas.

rsuarez
fonte
Confira esta resposta também. Ele descreve como criar um indicador de sistema , que tem mais possibilidades do que um indicador de aplicativo. Eu experimentei um pouco e também observei os indicadores padrão do sistema do Unity, como o indicador de som e bluetooth; e criei meu próprio exemplo, ScreenToolsIndicator , que também usa botões e um controle deslizante . Eu escolhi C porque os exemplos de sneetsher estavam em C, mas também existe um wrapper C ++ para GLib (glibmm).
okaresz

Respostas:

21

A documentação do Indicador de aplicativo com exemplos e documentos da API está disponível aqui:

Ainda não há tutoriais sobre Indicadores de aplicativo, mas fique atento a mais conteúdo na seção de tutoriais do site do desenvolvedor de aplicativos:

Jorge Castro
fonte
2
Colisão. Todos esses links estão desatualizados e levam a mensagens de 'página não encontrada'. Existem novos recursos que eu poderia encontrar? O site oficial developer.ubuntu.com/apps/qml/cookbook/… vincula esta pergunta com Is there any tutorial for programming Unity indicators?o título.
11114 Daniel W.
Links quebrados em todos os lugares, consulte ApplicationIndicators wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators , sua referência de API como HTML no libappindicator-docpacote.
User.dz
1
Existe um bug arquivado na documentação que está faltando: bugs.launchpad.net/ubuntudeveloperportal/+bug/1317065
Jorge Castro
4

Aqui está um exemplo de indicador de aplicativo em C. Esta é uma versão "apenas indicador" (sem janela) do exemplo fornecido no 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
fonte
O link rende 404
Anel Ø
@ ringø Resposta editada do sergej, adicionada o link de trabalho. Efetivamente, é o mesmo link da resposta de Jorge.
Sergiy Kolodyazhnyy
1

Fiz um breve tutorial aqui para criar um indicador de aplicativo de cronômetro em 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()
dohkoo
fonte
1
Eu não procurei no código real, mas por um lado: você tem erros de indentação. Aqui e no tutorial vinculado.
Jacob Vlijm
Não, há um espaço de recuo. . . apenas um, o que torna absolutamente doloroso para ler o código e não se conforma com o padrão PEP8 do Python
Sergiy Kolodyazhnyy