Forum Linux.pl

Programowanie => C/C++ - GNOME/Gtk => Wątek zaczęty przez: arturromarr w 2018-01-29, 09:28:10

Tytuł: Program uruchamiany na pasku zadań. GTK, C
Wiadomość wysłana przez: arturromarr w 2018-01-29, 09:28:10
Cześć,
Chciałem się dowiedzieć jaki jest mechanizm wyświetlania się programu jako aktywnej ikonki (z własnym menu).
Czy to są polecenia środowisk graficznych, czy są wspólne dla różnych?
Chciałem osiągnąć efekt podobny jak ma program cryptkeeper. Po uruchomieniu pojawia się jako ikonka na pasku i ma pod prawym i lewym klawiszem myszy dwa własne menu.
(https://images81.fotosik.pl/976/67b734590c60990agen.png)
Piszę aplikację w C pod GTK.
Jeśli ktoś się zetknął z tą tematyką to proszę o jakieś naprowadzenie.

Pozdrawiam
Tytuł: Odp: Program uruchamiany na pasku zadań. GTK, C
Wiadomość wysłana przez: Paweł Kraszewski w 2018-01-29, 10:51:18
Obecnie chyba najbardzie międzysystemowym (międzyokienkowym) rozwiazaniem jest libappindicator (https://launchpad.net/libappindicator).

#include <gtk/gtk.h>
#include <libappindicator/app-indicator.h>

/*
 FROM: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators

 gcc example.c `pkg-config --cflags gtk+-2.0` -I/usr/include/libappindicator-0.1/  -o example `pkg-config --libs gtk+-2.0` -L/usr/lib -lappindicator
*/

static void Quit_menu()
{
    printf( "Leaving ..." );
    gtk_main_quit();
}

static void gtkCallback( GtkWidget *action )
{
    const gchar *name = gtk_widget_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;
    GtkWidget *menuItem1;
    GtkWidget *menuItem2;

    AppIndicator *indicator;
    gtk_init( &argc, &argv );

    /* Indicator */
    indicator = app_indicator_new( "example-simple-client",
                                   "/home/your/iconfullpath/icon.png",
                                   APP_INDICATOR_CATEGORY_APPLICATION_STATUS );

    app_indicator_set_status( indicator, APP_INDICATOR_STATUS_ACTIVE );
    app_indicator_set_icon( indicator, "/home/your/iconfullpath/icon.png" );

    indicator_menu = gtk_menu_new();

    menuItem1 = gtk_image_menu_item_new_with_label( "message" );
    g_signal_connect( menuItem1, "activate", G_CALLBACK( gtkCallback ), NULL );
    gtk_menu_shell_insert( GTK_MENU_SHELL( indicator_menu ), menuItem1, 0 );
    gtk_widget_show( menuItem1 );

    menuItem2 = gtk_image_menu_item_new_with_label( "Quit" );
    gtk_menu_shell_insert( GTK_MENU_SHELL( indicator_menu ), menuItem2, 1 );
    gtk_widget_show( menuItem2 );

    g_signal_connect( menuItem2, "activate", G_CALLBACK( Quit_menu ), NULL );

    app_indicator_set_menu( indicator, GTK_MENU( indicator_menu ) );

    gtk_main();

    return 0;
}


Sprawdzałem na Xubuntu Artful, działa. Wymaga libappindicator-dev.
Tytuł: Odp: Program uruchamiany na pasku zadań. GTK, C
Wiadomość wysłana przez: 1709 w 2018-01-29, 11:32:13
Cytuj
Czy to są polecenia środowisk graficznych, czy są wspólne dla różnych?
Programistą nie jestem ( nie pomogę profesjonalnie )
ale mogę pokazać jak ja używam tego na potrzeby własnej aplikacji w bashu.

 w trayu  https://github.com/tele1/Mur/blob/master/data/system_tray/sit.c
skrypt do skompilowania tego  https://github.com/tele1/Mur/blob/master/data/system_tray/sit.build
skrypt wyswietlający ikonkę w trayu i który uruchomi skrypt po kliknięciu lewym  lub drugi skrypt po kliknięciu prawym klawiszem ( czyli w tym przypadku okienko )
https://github.com/tele1/Mur/blob/master/mur

i jeszcze to znalazłem
https://www.codeproject.com/Articles/27142/Minimize-to-tray-with-GTK
https://github.com/zserge/tray
http://blog.sacaluta.com/2007/08/gtk-system-tray-icon-example.html
https://developer.gnome.org/gtk3/stable/GtkStatusIcon.html