Index: work/gtk/fixed_dockbox/Makefile =================================================================== --- work/gtk/fixed_dockbox/Makefile (nonexistent) +++ work/gtk/fixed_dockbox/Makefile (revision 25440) @@ -0,0 +1,12 @@ +TRUNK=../../../trunk +CFLAGS=-g -Wall -I $(TRUNK)/src_plugins `pkg-config --cflags gtk+-2.0` +LDFLAGS=-g `pkg-config --libs gtk+-2.0` +#CFLAGS=-g -Wall -I $(TRUNK)/src_plugins -DPCB_GTK3 `pkg-config --cflags gtk+-3.0` +#LDFLAGS=-g `pkg-config --libs gtk+-3.0` + +all: fixed_dockbox + +fixed_dockbox: fixed_dockbox.o + +clean: + rm *.o fixed_dockbox \ No newline at end of file Index: work/gtk/fixed_dockbox/fixed_dockbox.c =================================================================== --- work/gtk/fixed_dockbox/fixed_dockbox.c (nonexistent) +++ work/gtk/fixed_dockbox/fixed_dockbox.c (revision 25440) @@ -0,0 +1,100 @@ +#include + +/* dockbox children in order: + 1. frame + 2. control +*/ + +static void dockbox_resize(GtkWidget *dockbox, GtkAllocation *af, gpointer user_data) +{ + GList *ch = gtk_container_get_children(GTK_CONTAINER(dockbox)); + GtkWidget *wctrl = ch->next->data; + GtkWidget *wframe = ch->data; + gint x, y, w, h, yoffs; + GtkAllocation ctrl_alloc, frame_alloc; + + gtk_widget_get_allocation(wctrl, &ctrl_alloc); + yoffs = ctrl_alloc.height/4; + x = af->width - ctrl_alloc.width - 8; + y = 0; + if ((ctrl_alloc.x != x) || (ctrl_alloc.y != y)) + gtk_fixed_move(GTK_FIXED(dockbox), wctrl, x, y); + + gtk_widget_get_allocation(wframe, &frame_alloc); + w = af->width; + h = af->height - yoffs; + if ((w != frame_alloc.width) || (h != frame_alloc.height)) + gtk_widget_set_size_request(wframe, w, h); + + gtk_widget_get_allocation(wframe, &frame_alloc); + x = 0; + y = yoffs; + if ((frame_alloc.x != x) || (frame_alloc.y != y)) + gtk_fixed_move(GTK_FIXED(dockbox), wframe, x, y); +} + +static GtkWidget *pcb_gtk_dockbox(const char *label, GtkWidget *ctrl, GtkWidget **frame_out) +{ + GtkWidget *frame, *db; + + db = gtk_fixed_new(); + frame = gtk_frame_new(label); + + gtk_container_add(GTK_CONTAINER(db), frame); + gtk_container_add(GTK_CONTAINER(db), ctrl); + + g_signal_connect(G_OBJECT(db), "size-allocate", G_CALLBACK(dockbox_resize), NULL); + *frame_out = frame; + return db; +} + +static void create_widgets(GtkWidget *window, const char *label, const char **text) +{ + const char **s; + GtkWidget *db, *ctrl, *but, *frame, *vbox; + + ctrl = gtk_hbox_new(FALSE, 0); + + but = gtk_button_new_with_label("~"); + gtk_box_pack_start(GTK_BOX(ctrl), but, TRUE, TRUE, 0); + but = gtk_button_new_with_label("x"); + gtk_box_pack_start(GTK_BOX(ctrl), but, TRUE, TRUE, 0); + + db = pcb_gtk_dockbox(label, ctrl, &frame); + + vbox = gtk_vbox_new(FALSE, 3); + gtk_container_add(GTK_CONTAINER(frame), vbox); + for(s = text; *s != NULL; s++) { + GtkWidget *label = gtk_label_new(*s); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + } + + gtk_container_add(GTK_CONTAINER(window), db); +} + +int main(int argc, char **argv) +{ + GtkWidget *window; + static const char *text[] = { + "dock", + "children labels", + "jsut to have", + "something in", + "the box", + NULL + }; + + gtk_init(&argc, &argv); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + g_signal_connect(G_OBJECT(window), "destroy", gtk_main_quit, NULL); + +/* WARNING: must not set: gtk_window_set_default_size(GTK_WINDOW(window), 10, 400);*/ + + create_widgets(window, "title", text); + gtk_widget_show_all(window); + + gtk_main(); + + return 0; +}