Gui для проигрывателя mpg123
Название слишком пышное. Я не собирался писать GUI, их и так 100500
Было бы интересно многим
Хорошо. "C" тоже конструктор, но если в bash мы запускаем утилиты, то в "C" используем функции.
Объявляем функции, в самом начале пишем:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib/gstdio.h>
Объявлякм глобальные переменные.
GtkStatusIcon *tray_icon;
В данном случае одну.
Секция main, обычно в самом конце:
int main(int argc, char **argv) { /* argc это число аргументов (перепенная типа int), argv сами аргументы (имена, переменная char), * - указатель */
pid_t pid; /* переменная для pid */
char media[128]="mpg123 \""; /* переменная media строка до 128 символов */
for(int i=1; i<argc; i++) strcat(media,argv[i]); /* цикл for пока i меньше argc, strcat добавляет аргумент № i в конец строки media */
strcat(media,"\""); /*закрываем кавычки */
switch(pid=fork()) { /* форкаем прцесс */
case -1:
exit(1);
case 0:
system(media); /* Запускаем плеер */
kill(getppid(),15);
raise(15);
default:
gtk_init(&argc, &argv);
tray_icon = create_tray_icon(); /* Запускаем иконку в трее */
gtk_main();
kill(pid,15);
} /* kill обеспечивает уничтожение иторого процесса по окончании первого (гарантированное взаимоуничтожение) */
return 0;
}
Эта секция описывает иконку;
static GtkStatusIcon *create_tray_icon() {
tray_icon = gtk_status_icon_new();
g_signal_connect(G_OBJECT(tray_icon), "activate", G_CALLBACK(tray_icon_on_click), NULL); /* отсылка к действию по ЛКМ */
gtk_status_icon_set_from_stock(tray_icon,"gtk-media-stop"); /* отображаемая иконка */
gtk_status_icon_set_tooltip(tray_icon," Выключить mpg123 "); /* подсказка */
gtk_status_icon_set_visible(tray_icon, TRUE); /* запуск иконки */
return tray_icon;
}
Секция действия по клику
static void tray_icon_on_click(GtkStatusIcon *status_icon, gpointer user_data)
{
system("killall mpg123"); /* вырубаем проигрыватель */
gtk_main_quit(); /* выходим из gtk (убираем иконку) */
}
Понятно, или не очень?