Mercurial > dwindows
comparison gtk3/dw.c @ 1005:751522e9f3ac
Switchted to using dw_paned_pack*() to pack the splitbar on GTK3.
This allows us to use built-in proportional support so we don't have to do it ourselves.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Mon, 09 May 2011 14:05:52 +0000 |
parents | 4ef0e878fe06 |
children | 0469e278453c |
comparison
equal
deleted
inserted
replaced
1004:cb81c08bd8c3 | 1005:751522e9f3ac |
---|---|
9054 | 9054 |
9055 /* Reposition the bar according to the percentage */ | 9055 /* Reposition the bar according to the percentage */ |
9056 static gint _splitbar_size_allocate(GtkWidget *widget, GtkAllocation *event, gpointer data) | 9056 static gint _splitbar_size_allocate(GtkWidget *widget, GtkAllocation *event, gpointer data) |
9057 { | 9057 { |
9058 float *percent = (float *)g_object_get_data(G_OBJECT(widget), "_dw_percent"); | 9058 float *percent = (float *)g_object_get_data(G_OBJECT(widget), "_dw_percent"); |
9059 int lastwidth = (int)g_object_get_data(G_OBJECT(widget), "_dw_lastwidth"); | |
9060 int lastheight = (int)g_object_get_data(G_OBJECT(widget), "_dw_lastheight"); | |
9061 | 9059 |
9062 /* Prevent infinite recursion ;) */ | 9060 /* Prevent infinite recursion ;) */ |
9063 if(!percent || (lastwidth == event->width && lastheight == event->height)) | 9061 if(!percent || event->width < 20 || event->height < 20) |
9064 return FALSE; | 9062 return FALSE; |
9065 | |
9066 lastwidth = event->width; lastheight = event->height; | |
9067 | |
9068 g_object_set_data(G_OBJECT(widget), "_dw_lastwidth", GINT_TO_POINTER(lastwidth)); | |
9069 g_object_set_data(G_OBJECT(widget), "_dw_lastheight", GINT_TO_POINTER(lastheight)); | |
9070 | 9063 |
9071 if(GTK_IS_HPANED(widget)) | 9064 if(GTK_IS_HPANED(widget)) |
9072 gtk_paned_set_position(GTK_PANED(widget), (int)(event->width * (*percent / 100.0))); | 9065 gtk_paned_set_position(GTK_PANED(widget), (int)(event->width * (*percent / 100.0))); |
9073 if(GTK_IS_VPANED(widget)) | 9066 if(GTK_IS_VPANED(widget)) |
9074 gtk_paned_set_position(GTK_PANED(widget), (int)(event->height * (*percent / 100.0))); | 9067 gtk_paned_set_position(GTK_PANED(widget), (int)(event->height * (*percent / 100.0))); |
9075 g_object_set_data(G_OBJECT(widget), "_dw_waiting", NULL); | 9068 g_object_set_data(G_OBJECT(widget), "_dw_percent", NULL); |
9069 free(percent); | |
9076 return FALSE; | 9070 return FALSE; |
9077 } | |
9078 | |
9079 /* Figure out the new percentage */ | |
9080 static void _splitbar_accept_position(GObject *object, GParamSpec *pspec, gpointer data) | |
9081 { | |
9082 GtkWidget *widget = (GtkWidget *)data; | |
9083 float *percent = (float *)g_object_get_data(G_OBJECT(widget), "_dw_percent"); | |
9084 int size = 0, position = gtk_paned_get_position(GTK_PANED(widget)); | |
9085 | |
9086 if(!percent || g_object_get_data(G_OBJECT(widget), "_dw_waiting")) | |
9087 return; | |
9088 | |
9089 if(GTK_IS_VPANED(widget)) | |
9090 size = gtk_widget_get_allocated_height(widget); | |
9091 else if(GTK_IS_HPANED(widget)) | |
9092 size = gtk_widget_get_allocated_width(widget); | |
9093 | |
9094 if(size > 0) | |
9095 *percent = ((float)(position * 100) / (float)size); | |
9096 } | 9071 } |
9097 | 9072 |
9098 /* | 9073 /* |
9099 * Creates a splitbar window (widget) with given parameters. | 9074 * Creates a splitbar window (widget) with given parameters. |
9100 * Parameters: | 9075 * Parameters: |
9113 DW_MUTEX_LOCK; | 9088 DW_MUTEX_LOCK; |
9114 if(type == DW_HORZ) | 9089 if(type == DW_HORZ) |
9115 tmp = gtk_hpaned_new(); | 9090 tmp = gtk_hpaned_new(); |
9116 else | 9091 else |
9117 tmp = gtk_vpaned_new(); | 9092 tmp = gtk_vpaned_new(); |
9118 gtk_paned_add1(GTK_PANED(tmp), topleft); | 9093 gtk_paned_pack1(GTK_PANED(tmp), topleft, TRUE, TRUE); |
9119 gtk_paned_add2(GTK_PANED(tmp), bottomright); | 9094 gtk_paned_pack2(GTK_PANED(tmp), bottomright, TRUE, TRUE); |
9120 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); | 9095 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); |
9121 *percent = 50.0; | 9096 *percent = 50.0; |
9122 g_object_set_data(G_OBJECT(tmp), "_dw_percent", (gpointer)percent); | 9097 g_object_set_data(G_OBJECT(tmp), "_dw_percent", (gpointer)percent); |
9123 g_object_set_data(G_OBJECT(tmp), "_dw_waiting", GINT_TO_POINTER(1)); | |
9124 g_signal_connect(G_OBJECT(tmp), "size-allocate", G_CALLBACK(_splitbar_size_allocate), NULL); | 9098 g_signal_connect(G_OBJECT(tmp), "size-allocate", G_CALLBACK(_splitbar_size_allocate), NULL); |
9125 g_signal_connect(G_OBJECT(tmp), "notify::position", G_CALLBACK(_splitbar_accept_position), (gpointer)tmp); | |
9126 gtk_widget_show(tmp); | 9099 gtk_widget_show(tmp); |
9127 DW_MUTEX_UNLOCK; | 9100 DW_MUTEX_UNLOCK; |
9128 return tmp; | 9101 return tmp; |
9129 } | 9102 } |
9130 | 9103 |