Veja o manual de referência: link
arg0 : The AppIndicator object
arg1 : How many steps the scroll wheel has taken
arg2 : (type Gdk.ScrollDirection) Which direction the wheel went in
user_data : user data set when the signal handler was connected.
Estou novamente na mesma posição, quando tive a pergunta Qual é a maneira correta de usar g_signal_connect () em C ++ para quicklists de unidade dinâmica?
Lá fui informado de que a assinatura do meu método estático estava incorreta e que eu tinha que adicionar um argumento de impressão na frente dos outros. Agora eu tenho o mesmo problema, mas para a função chamada para o sinal "rolagem-evento" que eu quero fazer no meu indicador.
Mais especificamente:
//connecting indicator with the scroll-event and altogether with the function indicator_scrolled
g_signal_connect(G_OBJECT(appindicator), "scroll-event", G_CALLBACK(&indicator_scrolled), (gpointer)this);
Esta é a função indicator_scrolled:
gboolean indicator_scrolled(GtkStatusIcon *status_icon, GdkEventScroll *event, gpointer data){
cout << "The indicator was scrolled\n";
MainWindow* m = (MainWindow*)data;
m->action_on_scroll();
}
Eu posso ver a mensagem "Indicator was scrolled", mas o programa falhou. Adicionando um argumento de guima na frente dos outros não resolveu o problema.
Então, qual é a assinatura correta para essa função para que ela funcione? Como posso encontrar qual é a assinatura correta a cada vez para evitar esse tipo de pergunta? (Na outra pergunta, o usuário George Edison falou sobre valgrind
, mas ele não esclareceu)
Por favor, não aconselhe que os AppIndicators não são a maneira correta de usar o Ubuntu + Qt, por favor veja a questão Faça sniqt reconhecer todas as habilidades de bandeja (ou criar um indicador de trabalho no Qt)
Editar: Após os testes, coincidentemente, descobri que um argumento de orientação precisa ser colocado entre os argumentos GtkStatusIcon e GdkEventScroll. Mas eu realmente gostaria de saber uma maneira de descobrir qual é a assinatura de função correta.
Veja o manual de referência: link
arg0 : The AppIndicator object
arg1 : How many steps the scroll wheel has taken
arg2 : (type Gdk.ScrollDirection) Which direction the wheel went in
user_data : user data set when the signal handler was connected.
A partir de hoje, após algumas pesquisas e tentativas, esse é meu retorno de chamada de evento de rolagem:
static void indicator_scrolled(AppIndicator *indicator, guint steps, GdkScrollDirection direction)
{
if (direction == GDK_SCROLL_DOWN)
g_print("DOWN\n");
else if (direction == GDK_SCROLL_UP)
g_print("UP\n");
else if (direction == GDK_SCROLL_SMOOTH)
g_print("SMOOTH\n");
}
Durante uma rolagem eu estou recebendo apenas um UP / DOWN, e então algum SMOOTH (na mesma direção).
Eu não tenho ideia de como gerenciar a direção suave, pois eu preciso da estrutura GdkEventScroll não vista em nenhum lugar; Estou implementando um volume para cima / para baixo no indicador de meu aplicativo e manterei uma sinalização de direção global para que a suavização a seguir seja aplicada na direção atual, mas acho que isso é apenas uma solução alternativa para uma implementação documentada e ruim que é libappindicator .