¿Cómo crear indicadores de Unidad?

25

Estoy interesado en los indicadores de Unity y me pregunto si hay algún tutorial sobre cómo programarlos. Puedo usar las fuentes de los existentes como último recurso, pero preferiría un enfoque más amigable porque mis habilidades de programación son bastante limitadas.

rsuarez
fuente
Mira esta respuesta también. Describe cómo crear un indicador del sistema , que tiene más posibilidades que un indicador de aplicación. Experimenté un poco y también miré los indicadores predeterminados del sistema de Unity, como el indicador de sonido y bluetooth; y se me ocurrió mi propio ejemplo, ScreenToolsIndicator , que también usa botones y un control deslizante . Elegí C porque los ejemplos de sneetsher estaban en C, pero también hay un contenedor C ++ para GLib (glibmm).
okaresz

Respuestas:

21

La documentación del indicador de aplicación con ejemplos y documentos API están disponibles aquí:

Todavía no hay tutoriales sobre los Indicadores de aplicación, pero esté atento para obtener más contenido en la sección de tutoriales del sitio para desarrolladores de aplicaciones:

Jorge Castro
fuente
2
Bache. Todos estos enlaces están desactualizados y conducen a mensajes de "página no encontrada". ¿Hay algún recurso nuevo que pueda encontrar? El sitio oficial developer.ubuntu.com/apps/qml/cookbook/… enlaza a esta pregunta con el Is there any tutorial for programming Unity indicators?título.
Daniel W.
Enlaces rotos en todas partes, vea ApplicationIndicators wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators , su referencia API como HTML en el libappindicator-docpaquete.
user.dz
1
Hay un error en la documentación que falta: bugs.launchpad.net/ubuntudeveloperportal/+bug/1317065
Jorge Castro
4

Aquí hay un ejemplo de indicador de aplicación en C. Esta es una versión de "solo indicador" (sin ventana) del ejemplo proporcionado en 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
fuente
Enlace produce 404
Anillo Ø
@ ringø Editó la respuesta de sergej, agregó el enlace de trabajo. Efectivamente, es el mismo enlace que en la respuesta de Jorge.
Sergiy Kolodyazhnyy
1

Hice un breve tutorial aquí para crear un indicador de aplicación de cronómetro en 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
fuente
1
No examiné el código real, pero para empezar: tienes errores de sangría. Tanto aquí como en el tutorial vinculado.
Jacob Vlijm
No, hay un espacio de sangría. . . solo uno, lo que hace que sea absolutamente doloroso leer el código y no se ajusta al estándar PEP8 de Python
Sergiy Kolodyazhnyy