LINUX.ORG.RU

Наследование класса в Gtk (GtkCellRendererPixbuf)


0

0

В продолжение вопроса: хочу создать класс-наследник GtkCellRendererPixbuf, который бы генерил сигнал при клике на него.

Вот что с ходу вышло (pastebin, класс CellRendererPixbuf):
CellRendererPixbuf.h
CellRendererPixbuf.c

И застрял на том, что не понимаю, как надо emit'ить сигнал. Подскажите, пожалуйста, как это делается? В исходники GtkCellRendererToggle смотрел, но запутался. Заодно, если не сложно, посмотрите на код -- все ли верно написал. Спасибо.


P.S. Копипаст утомляет, что бы сделать примитивнейший класс-наследник; либо я просто пока не умею готовить Gtk :).

★★★

Опять ты?) По-моему, в gtkcellrenderertoggle.c всё понятно описано. activate у тебя не надо вызывать явно, лучше генерировать сигнал, который потом может быть присоединён в нужном месте. И в чём конкретно сложность с созданием и генерированием сигнала?

anonymous
()
Ответ на: комментарий от anonymous

1. Не понимаю как зарегистрировать сигнал. Делаю:

enum {
ACTIVATED,
LAST_SIGNAL
};

static guint activate_cell_signals[LAST_SIGNAL] = { 0 };

static void cell_renderer_pixbuf_class_init(CellRendererPixbufClass* klass)
{
...
activate_cell_signals[ACTIVATED] =
g_signal_new (I_("activated"),
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (CellRendererPixbufClass, activated),
NULL, NULL,
_gtk_marshal_VOID__STRING,
G_TYPE_NONE, 1,
G_TYPE_STRING);
}

Получаю при компиляции:
error: ‘_gtk_marshal_VOID__STRING’ undeclared

2. Не понимаю когда и где нужно генерировать этот сигнал.

Буду благодарен за тыкание носом как это сделать конкретно в моем примере, ибо уже прилично забуксовал на этом классе.

kondor ★★★
() автор топика
Ответ на: комментарий от anonymous

> Подключи "gtkmarshalers.h"

<gtk/gtkmarshal.h>, ибо "gtkmarshalers.h" отсутствует среди стандартных заголовочных файлов.

> pastebin лежит.


Уже поднялся :).

> В функции activate


Спасибо, попробую вечером -- тот environment сейчас не под рукой.

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

Посколько pastebin поднялся
на gtkmarshalers.h забей

Сигнал создать так:

activate_cell_signals[ACTIVATED] =  g_signal_new  ("activated", G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (CellRendererPixbufClass, activated),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 1,
G_TYPE_STRING);

В заголовке

struct _CellRendererPixbufClass
{
    GtkCellRendererPixbufClass parent_class; 
    void (* activated) (CellRendererPixbuf *cell_renderer);
};

В функции activate 
g_signal_emit (cell, activate_cell_signals[ACTIVATED], 0, path);

Вместо <gtk/gtk.h> быстрее будет #include <gtk/gtkcellrenderer.h>

Дальше подключаешь в нужном месте

anonymous
()
Ответ на: комментарий от anonymous

Спасибо. Правда не работает :).
http://pastebin.com/m59aa6568 -- header
http://pastebin.com/m36480938 -- source

Подключается вот так:
   g_signal_connect(enabledCellRndr, "activated",
                    G_CALLBACK(cell_state_changed), app_data);

Обработчик не вызывается -- проверял как обычно, g_print()'ом в начале функции. Такое ощущение, что сигнал не генерируется.

kondor ★★★
() автор топика
Ответ на: комментарий от anonymous

Нет, не вызывается.

Пока писал ответ, нашел аналогичный код в Google: http://google.com/codesearch?hl=en&q=show:JsaDzlvtcB8:KRbVuz2QLWE:yK1gbbq...

Но он тоже не работал: ни переопределенный activate, ни хэндлер не вызывались. Начал глядеть код, где он используется и нашел вот такую забавную штуковину (атрибут 'mode'):

g_object_set (render,
"mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
"xalign", 0.5, NULL);

После установки этого атрибута экземпляру cellrenderer'а мой код так же заработал.

Спасибо большое за помощь!

kondor ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.