понедельник, 21 февраля 2011 г.

Запись части монитора на видеоролик

Используем для этого утилиту ffmpeg.
#ffmpeg -f x11grab -r 10 -s 500x440 -i :0.0+200,200 -vcodec ffv1 Desktop/output.avi
+200,200 - это координаты верхнего левого угла отслеживаемой области экрана в пикселах;
500x440 - размеры отслеживаемой области в пикселах;
10 - число кадров в секунду.
Чтобы конвертировать в другой формат видео можно использовать команду типа такой:
#ffmpeg -i Desktop/output.avi -vcodec qtrle Desktop/output.mov
В данном примере все действия выполнялись из домашней директории пользователя на компьютерах с Debian squeeze и lenny. Файлы с видео записывались на десктоп.

среда, 2 февраля 2011 г.

Пример простейшего применения Glade для создания графического интерфейса приложения

При использовании Glade значительно сокращается объем кода. Код, который соответствует собственно описанию интерфейса, практически полностью "переезжает" в xml-файл, который можно "подсоединить" вызовом функции gtk_builder_add_from_file. Упомянутый xml-файл создается в Glade.
Здесь продемонстрируется минимальный код приложения, которое показывает в главном окне всего два виджета: GtkEntry и GtkLabel. При вводе некоего текста в GtkEntry этот текст будет отображаться в GtkLabel.
Создание соответствующего интерфейса в Glade тривиально и больших комментариев не требует. Запускаем Glade.

Оставляем как есть. Жмем Close.
Далее создаем окно приложения:

Добавляем в него вертикальный ящик с тремя ячейками:

Далее вставляем в эти ячейки наши GtkEntry и GtkLabel, а также кнопку выхода из приложения:


Для обработки сигнала clicked кнопки выхода выбираем стандартный gtk_main_quit. А для обработки сигнала changed (находим его в GtkEditable) выбираем любой предлагаемый вариант (не возбраняется и свой вариант набрать). Выберем on_entry1_changed. Не забываем потом написать код для этой функции.
А вот собственно код нашего приложения:

/*labelAndEntry.c*/
#include <gtk/gtk.h>

typedef struct _ddata ddata;
struct _ddata{
GtkWidget* window1;
GtkWidget* entry1;
GtkWidget* label1;
GtkWidget* button1;
} ;

ddata* myData;

int
main( int argc, char **argv )
{
GtkBuilder *builder;
GtkWidget *window;
GError *error = NULL;

/* инициализируем GTK+ */
gtk_init( &argc, &argv );

/* создаем новый объект типа GtkBuilder */
builder = gtk_builder_new();
/* загружаем пользовательский интерфес из файла, который мы создали в Glade */
if( ! gtk_builder_add_from_file( builder, "entryAndLabel.xml", &error ) )
{
g_warning( "%s", error->message );
g_free( error );
return( 1 );
}

myData = g_slice_new(ddata);
myData->window1 = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );
myData->entry1 = GTK_WIDGET( gtk_builder_get_object( builder, "entry1" ) );
myData->label1 = GTK_WIDGET( gtk_builder_get_object( builder, "label1" ) );
myData->button1 = GTK_WIDGET( gtk_builder_get_object( builder, "button1" ) );
/*
заметим, что имена полей структуры myData не обязаны совпадать со вторым аргументом функции gtk_builder_get object, они произвольны. Но этот второй аргумент должен совпадать с именем виджета, которое мы задали ему в окне "Doc Properties" Glade во вкладке General
*/
/* Get main window pointer from UI */
// window = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );

/* "связываем" сигналы с объектами графического интерфейса */
// gtk_builder_connect_signals( builder, NULL );
gtk_builder_connect_signals( builder, myData );
/* разрушаем объект builder, так как он нам больше не нужен */
g_object_unref( G_OBJECT( builder ) );

/* даем команду показать главное окно приложения, а остальные виджеты отображаются объектом GtkBuilder */
gtk_widget_show( myData -> window1 );

/* стартуем */
gtk_main();
g_slice_free(ddata, myData);
return( 0 );
}
void
on_entry1_changed (GtkEditable *editable,
gpointer user_data) {
puts("changed!");
gtk_label_set_text(GTK_LABEL(myData->label1), gtk_entry_get_text(GTK_ENTRY(editable) ));
}
/*
имя этой функции должно совпадать с именем, которое мы дали обработчику соответствующего события (у нас - changed) в окне "Doc Properties" и вкладке Signals.
*/

Компилируем:
$ gcc -o labelAndEntry labelAndEntry.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
Запускаем на выполнение. Должно получиться следующее:

Если запустить наше прилодение из командной строки, то также при вводе какого-либо символа в GtkEntry, в консоли будет выводиться сообщение "changed!". При нажатии на кнопку будет осуществлен выход.
Все вышеописанное выполнялось в Debian squeeze.