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