たぶん、エキスパンダーを表示したい方法で描画するテーマに切り替えてみてください。三角形が1つであることを承認するように「強制」すると、一部のユーザーが少し失礼だと思うかもしれません。エキスパンダーを引き、これを変更する機会を拒否する唯一の方法です。
それは特にテーマが作成されたものです-誰もが彼女が望む外観を持つことができるように.
まあ、とにかく残念なことに、実際には GTK はバージョン 2 からバージョン 3 に移行中なので、使用しているバージョンによっては別のシグナルを上書きする必要があります。
GTK 3 では、"draw" シグナルで既に cairo コンテキストを取得しているため、少し簡単になるはずですが、GTK 2 でも可能です。ここでは、"expose-event" シグナルを使用する必要があります。
例として、GTK バージョン 2 でそれを行う方法のスニペットを示します。私は本物のアーティストではないので、見栄えがよくないかもしれませんが、きっと素敵なデザインを思いつくでしょう。
...ああ、それと、状態に応じて塗り方を変えることを忘れないでください...
#include <gtk/gtk.h>
#include <cairo.h>
gboolean draw (GtkWidget *widget, GdkEventExpose *event, gpointer data) {
cairo_t *cr;
cr = gdk_cairo_create (widget->window);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_move_to (cr, 0, 0);
cairo_line_to (cr, 0, 10);
cairo_line_to (cr, 10, 5);
cairo_close_path (cr);
cairo_stroke (cr);
return TRUE;
}
int main (int argc, char *argv[]) {
gtk_init (&argc, &argv);
GtkWidget *window;
GtkWidget *expander;
window = g_object_new (GTK_TYPE_WINDOW, NULL);
expander = g_object_new (GTK_TYPE_EXPANDER, NULL);
gtk_container_add (GTK_CONTAINER (window), expander);
g_signal_connect (expander, "expose-event", draw, NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
編集:
私が見たように、1 つのインスタンスだけの外観を変更するのではなく、すべてのエキスパンダーの外観を変更したいようです。これを実現するには、次のようにデフォルト ハンドラーを上書きする必要があります。
#include <gtk/gtk.h>
#include <cairo.h>
gboolean draw (GtkWidget *widget, GdkEventExpose *event) {
cairo_t *cr;
cr = gdk_cairo_create (widget->window);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_move_to (cr, 0, 0);
cairo_line_to (cr, 0, 10);
cairo_line_to (cr, 10, 5);
cairo_close_path (cr);
cairo_stroke (cr);
return TRUE;
}
int main (int argc, char *argv[]) {
gtk_init (&argc, &argv);
GtkWidget *window;
GtkWidget *expander;
GtkWidgetClass *klass;
window = g_object_new (GTK_TYPE_WINDOW, NULL);
expander = g_object_new (GTK_TYPE_EXPANDER, NULL);
gtk_container_add (GTK_CONTAINER (window), expander);
klass = g_type_class_peek (GTK_TYPE_EXPANDER);
klass->expose_event = draw;
gtk_widget_show_all (window);
gtk_main ();
return 0;
}