comparison gtk3/dw.c @ 1124:aff4aeca858f

Experimental change to use GtkGrid instead of GtkTable for GTK3. This fixes the box left/top alignment inconsistency with the other platforms that existed in GTK1 and GTK2. However this uses gtk_grid_insert_row/column() which was introduced in GTK 3.1(2).
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 30 Aug 2011 02:04:45 +0000
parents e52c710e6d08
children 95d7eb4e85c6
comparison
equal deleted inserted replaced
1123:38856b5bb72e 1124:aff4aeca858f
380 /* Local data */ 380 /* Local data */
381 static GtkWidgetClass *parent_class = NULL; 381 static GtkWidgetClass *parent_class = NULL;
382 382
383 static void gtk_mdi_class_init(GtkMdiClass *class) 383 static void gtk_mdi_class_init(GtkMdiClass *class)
384 { 384 {
385 GObjectClass *object_class;
386 GtkWidgetClass *widget_class; 385 GtkWidgetClass *widget_class;
387 GtkContainerClass *container_class; 386 GtkContainerClass *container_class;
388 387
389 object_class = (GObjectClass *) class;
390 widget_class = (GtkWidgetClass *) class; 388 widget_class = (GtkWidgetClass *) class;
391 container_class = (GtkContainerClass *) class; 389 container_class = (GtkContainerClass *) class;
392 390
393 parent_class = g_type_class_ref (GTK_TYPE_CONTAINER); 391 parent_class = g_type_class_ref (GTK_TYPE_CONTAINER);
394 392
437 435
438 GdkColor color; 436 GdkColor color;
439 gint i, j; 437 gint i, j;
440 GdkCursor *cursor; 438 GdkCursor *cursor;
441 GdkPixbuf *pixbuf; 439 GdkPixbuf *pixbuf;
442 GtkStyle *style;
443 440
444 child_box = gtk_event_box_new (); 441 child_box = gtk_event_box_new ();
445 child_widget_box = gtk_event_box_new (); 442 child_widget_box = gtk_event_box_new ();
446 top_event_box = gtk_event_box_new (); 443 top_event_box = gtk_event_box_new ();
447 bottom_event_box = gtk_event_box_new (); 444 bottom_event_box = gtk_event_box_new ();
478 gtk_container_add (GTK_CONTAINER (top_event_box), label); 475 gtk_container_add (GTK_CONTAINER (top_event_box), label);
479 gtk_container_add (GTK_CONTAINER (child_widget_box), child_widget); 476 gtk_container_add (GTK_CONTAINER (child_widget_box), child_widget);
480 gtk_widget_set_size_request (bottom_event_box, 2, 2); 477 gtk_widget_set_size_request (bottom_event_box, 2, 2);
481 478
482 479
483 style = gtk_widget_get_default_style ();
484 pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **)minimize_xpm); 480 pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **)minimize_xpm);
485 image = gtk_image_new_from_pixbuf(pixbuf); 481 image = gtk_image_new_from_pixbuf(pixbuf);
486 gtk_widget_show(image); 482 gtk_widget_show(image);
487 gtk_container_add (GTK_CONTAINER (button[0]), image); 483 gtk_container_add (GTK_CONTAINER (button[0]), image);
488 pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **) maximize_xpm); 484 pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **) maximize_xpm);
2494 void dw_window_reparent(HWND handle, HWND newparent) 2490 void dw_window_reparent(HWND handle, HWND newparent)
2495 { 2491 {
2496 int _locked_by_me = FALSE; 2492 int _locked_by_me = FALSE;
2497 2493
2498 DW_MUTEX_LOCK; 2494 DW_MUTEX_LOCK;
2499 gdk_window_reparent(gtk_widget_get_window(GTK_WIDGET(handle)), newparent ? gtk_widget_get_window(GTK_WIDGET(newparent)) : GDK_ROOT_WINDOW(), 0, 0); 2495 gdk_window_reparent(gtk_widget_get_window(GTK_WIDGET(handle)), newparent ? gtk_widget_get_window(GTK_WIDGET(newparent)) : gdk_get_default_root_window(), 0, 0);
2500 DW_MUTEX_UNLOCK; 2496 DW_MUTEX_UNLOCK;
2501 } 2497 }
2502 2498
2503 /* 2499 /*
2504 * Sets the default font used on text based widgets. 2500 * Sets the default font used on text based widgets.
2857 { 2853 {
2858 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user"); 2854 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user");
2859 if(tmp) 2855 if(tmp)
2860 handle2 = tmp; 2856 handle2 = tmp;
2861 } 2857 }
2862 else if(GTK_IS_TABLE(handle)) 2858 else if(GTK_IS_GRID(handle))
2863 { 2859 {
2864 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_eventbox"); 2860 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_eventbox");
2865 if(tmp) 2861 if(tmp)
2866 handle2 = tmp; 2862 handle2 = tmp;
2867 } 2863 }
3022 { 3018 {
3023 GtkWidget *tmp, *eventbox; 3019 GtkWidget *tmp, *eventbox;
3024 int _locked_by_me = FALSE; 3020 int _locked_by_me = FALSE;
3025 3021
3026 DW_MUTEX_LOCK; 3022 DW_MUTEX_LOCK;
3027 tmp = gtk_table_new(1, 1, FALSE); 3023 tmp = gtk_grid_new();
3028 eventbox = gtk_event_box_new(); 3024 eventbox = gtk_event_box_new();
3029 3025
3030 gtk_widget_show(eventbox); 3026 gtk_widget_show(eventbox);
3031 g_object_set_data(G_OBJECT(tmp), "_dw_eventbox", (gpointer)eventbox); 3027 g_object_set_data(G_OBJECT(tmp), "_dw_eventbox", (gpointer)eventbox);
3032 g_object_set_data(G_OBJECT(tmp), "_dw_boxtype", GINT_TO_POINTER(type)); 3028 g_object_set_data(G_OBJECT(tmp), "_dw_boxtype", GINT_TO_POINTER(type));
3049 3045
3050 DW_MUTEX_LOCK; 3046 DW_MUTEX_LOCK;
3051 tmp = gtk_scrolled_window_new(NULL, NULL); 3047 tmp = gtk_scrolled_window_new(NULL, NULL);
3052 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (tmp), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); 3048 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (tmp), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
3053 3049
3054 box = gtk_table_new(1, 1, FALSE); 3050 box = gtk_grid_new();
3055 eventbox = gtk_event_box_new(); 3051 eventbox = gtk_event_box_new();
3056 3052
3057 gtk_widget_show(eventbox); 3053 gtk_widget_show(eventbox);
3058 g_object_set_data(G_OBJECT(box), "_dw_eventbox", (gpointer)eventbox); 3054 g_object_set_data(G_OBJECT(box), "_dw_eventbox", (gpointer)eventbox);
3059 g_object_set_data(G_OBJECT(box), "_dw_boxtype", GINT_TO_POINTER(type)); 3055 g_object_set_data(G_OBJECT(box), "_dw_boxtype", GINT_TO_POINTER(type));
3136 DW_MUTEX_LOCK; 3132 DW_MUTEX_LOCK;
3137 frame = gtk_frame_new(NULL); 3133 frame = gtk_frame_new(NULL);
3138 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); 3134 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
3139 gtk_frame_set_label(GTK_FRAME(frame), title && *title ? title : NULL); 3135 gtk_frame_set_label(GTK_FRAME(frame), title && *title ? title : NULL);
3140 3136
3141 tmp = gtk_table_new(1, 1, FALSE); 3137 tmp = gtk_grid_new();
3142 gtk_container_set_border_width(GTK_CONTAINER(tmp), pad); 3138 gtk_container_set_border_width(GTK_CONTAINER(tmp), pad);
3143 g_object_set_data(G_OBJECT(tmp), "_dw_boxtype", GINT_TO_POINTER(type)); 3139 g_object_set_data(G_OBJECT(tmp), "_dw_boxtype", GINT_TO_POINTER(type));
3144 g_object_set_data(G_OBJECT(tmp), "_dw_boxpad", GINT_TO_POINTER(pad)); 3140 g_object_set_data(G_OBJECT(tmp), "_dw_boxpad", GINT_TO_POINTER(pad));
3145 g_object_set_data(G_OBJECT(frame), "_dw_boxhandle", (gpointer)tmp); 3141 g_object_set_data(G_OBJECT(frame), "_dw_boxhandle", (gpointer)tmp);
3146 gtk_container_add(GTK_CONTAINER(frame), tmp); 3142 gtk_container_add(GTK_CONTAINER(frame), tmp);
3727 * Parameters: 3723 * Parameters:
3728 * id: An ID to be used with dw_window_from_id() or 0L. 3724 * id: An ID to be used with dw_window_from_id() or 0L.
3729 */ 3725 */
3730 HWND dw_mle_new(unsigned long id) 3726 HWND dw_mle_new(unsigned long id)
3731 { 3727 {
3732 GtkWidget *tmp, *tmpbox, *scroller; 3728 GtkWidget *tmp, *tmpbox;
3733 int _locked_by_me = FALSE; 3729 int _locked_by_me = FALSE;
3734 3730
3735 DW_MUTEX_LOCK; 3731 DW_MUTEX_LOCK;
3736 tmpbox = gtk_scrolled_window_new (NULL, NULL); 3732 tmpbox = gtk_scrolled_window_new (NULL, NULL);
3737 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(tmpbox), 3733 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(tmpbox),
3739 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(tmpbox), GTK_SHADOW_ETCHED_IN); 3735 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(tmpbox), GTK_SHADOW_ETCHED_IN);
3740 tmp = gtk_text_view_new(); 3736 tmp = gtk_text_view_new();
3741 gtk_container_add (GTK_CONTAINER(tmpbox), tmp); 3737 gtk_container_add (GTK_CONTAINER(tmpbox), tmp);
3742 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tmp), GTK_WRAP_NONE); 3738 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tmp), GTK_WRAP_NONE);
3743 3739
3744 scroller = NULL;
3745 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 3740 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
3746 g_object_set_data(G_OBJECT(tmpbox), "_dw_user", (gpointer)tmp); 3741 g_object_set_data(G_OBJECT(tmpbox), "_dw_user", (gpointer)tmp);
3747 gtk_widget_show(tmp); 3742 gtk_widget_show(tmp);
3748 gtk_widget_show(tmpbox); 3743 gtk_widget_show(tmpbox);
3749 DW_MUTEX_UNLOCK; 3744 DW_MUTEX_UNLOCK;
7641 break; 7636 break;
7642 } 7637 }
7643 } 7638 }
7644 } 7639 }
7645 } 7640 }
7646 7641 }
7647 }
7648
7649 } 7642 }
7650 7643
7651 /* Using domain sockets on unix for IPC */ 7644 /* Using domain sockets on unix for IPC */
7652 /* Create a named event semaphore which can be 7645 /* Create a named event semaphore which can be
7653 * opened from other processes. 7646 * opened from other processes.
8018 exit(exitcode); 8011 exit(exitcode);
8019 } 8012 }
8020 8013
8021 #define DW_EXPAND (GTK_EXPAND | GTK_SHRINK | GTK_FILL) 8014 #define DW_EXPAND (GTK_EXPAND | GTK_SHRINK | GTK_FILL)
8022 8015
8023 /* Internal function that changes the attachment properties in a table. */
8024 void _rearrange_table(GtkWidget *widget, gpointer data)
8025 {
8026 gint pos = GPOINTER_TO_INT(data);
8027 GtkContainer *cont = g_object_get_data(G_OBJECT(widget), "_dw_table");
8028 guint oldpos;
8029
8030 /* Drop out if missing table */
8031 if(!cont)
8032 return;
8033
8034 /* Check orientation */
8035 if(pos < 0)
8036 {
8037 /* Horz */
8038 pos = -(pos + 1);
8039 gtk_container_child_get(cont, widget, "left-attach", &oldpos, NULL);
8040 if(oldpos >= pos)
8041 {
8042 gtk_container_child_set(cont, widget, "left-attach", (oldpos + 1), "right-attach", (oldpos+2), NULL);
8043 }
8044 }
8045 else
8046 {
8047 /* Vert */
8048 gtk_container_child_get(cont, widget, "top-attach", &oldpos, NULL);
8049 if(oldpos >= pos)
8050 {
8051 gtk_container_child_set(cont, widget, "top-attach", (oldpos + 1), "bottom-attach", (oldpos+2), NULL);
8052 }
8053 }
8054 }
8055
8056 /* Internal box packing function called by the other 3 functions */ 8016 /* Internal box packing function called by the other 3 functions */
8057 void _dw_box_pack(HWND box, HWND item, int index, int width, int height, int hsize, int vsize, int pad, char *funcname) 8017 void _dw_box_pack(HWND box, HWND item, int index, int width, int height, int hsize, int vsize, int pad, char *funcname)
8058 { 8018 {
8059 int warn = FALSE, _locked_by_me = FALSE; 8019 int warn = FALSE, _locked_by_me = FALSE;
8060 GtkWidget *tmp, *tmpitem, *image = NULL; 8020 GtkWidget *tmp, *tmpitem, *image = NULL;
8099 } 8059 }
8100 } 8060 }
8101 8061
8102 tmpitem = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_boxhandle"); 8062 tmpitem = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_boxhandle");
8103 8063
8104 if(GTK_IS_TABLE(box)) 8064 if(GTK_IS_GRID(box))
8105 { 8065 {
8106 int boxcount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(box), "_dw_boxcount")); 8066 int boxcount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(box), "_dw_boxcount"));
8107 int boxtype = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(box), "_dw_boxtype")); 8067 int boxtype = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(box), "_dw_boxtype"));
8108 int x, y;
8109 8068
8110 /* If the item being packed is a box, then we use it's padding 8069 /* If the item being packed is a box, then we use it's padding
8111 * instead of the padding specified on the pack line, this is 8070 * instead of the padding specified on the pack line, this is
8112 * due to a bug in the OS/2 and Win32 renderer and a limitation 8071 * due to a bug in the OS/2 and Win32 renderer and a limitation
8113 * of the GtkTable class. 8072 * of the GtkTable class.
8114 */ 8073 */
8115 if(GTK_IS_TABLE(item) || (tmpitem && GTK_IS_TABLE(tmpitem))) 8074 if(GTK_IS_GRID(item) || (tmpitem && GTK_IS_GRID(tmpitem)))
8116 { 8075 {
8117 GtkWidget *eventbox = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_eventbox"); 8076 GtkWidget *eventbox = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_eventbox");
8118 8077
8119 /* NOTE: I left in the ability to pack boxes with a size, 8078 /* NOTE: I left in the ability to pack boxes with a size,
8120 * this eliminates that by forcing the size to 0. 8079 * this eliminates that by forcing the size to 0.
8139 if(index < 0) 8098 if(index < 0)
8140 index = 0; 8099 index = 0;
8141 if(index > boxcount) 8100 if(index > boxcount)
8142 index = boxcount; 8101 index = boxcount;
8143 8102
8103 g_object_set_data(G_OBJECT(item), "_dw_table", box);
8104 /* Set the expand attribute on the widgets now instead of the container */
8105 gtk_widget_set_vexpand(item, vsize);
8106 gtk_widget_set_hexpand(item, hsize);
8107 /* Use the margin property as padding */
8108 g_object_set(G_OBJECT(item), "margin", pad, NULL);
8109 /* Add to the grid using insert...
8110 * rows for vertical boxes and columns for horizontal.
8111 */
8144 if(boxtype == DW_VERT) 8112 if(boxtype == DW_VERT)
8145 { 8113 {
8146 x = 0; 8114 gtk_grid_insert_row(GTK_GRID(box), index);
8147 y = index; 8115 gtk_grid_attach(GTK_GRID(box), item, 0, index, 1, 1);
8148 gtk_table_resize(GTK_TABLE(box), boxcount + 1, 1);
8149 } 8116 }
8150 else 8117 else
8151 { 8118 {
8152 x = index; 8119 gtk_grid_insert_column(GTK_GRID(box), index);
8153 y = 0; 8120 gtk_grid_attach(GTK_GRID(box), item, index, 0, 1, 1);
8154 gtk_table_resize(GTK_TABLE(box), 1, boxcount + 1); 8121 }
8155 }
8156
8157 g_object_set_data(G_OBJECT(item), "_dw_table", box);
8158 if(index < boxcount)
8159 gtk_container_forall(GTK_CONTAINER(box),_rearrange_table, GINT_TO_POINTER(boxtype == DW_VERT ? index : -(index+1)));
8160 gtk_table_attach(GTK_TABLE(box), item, x, x + 1, y, y + 1, hsize ? DW_EXPAND : 0, vsize ? DW_EXPAND : 0, pad, pad);
8161 g_object_set_data(G_OBJECT(box), "_dw_boxcount", GINT_TO_POINTER(boxcount + 1)); 8122 g_object_set_data(G_OBJECT(box), "_dw_boxcount", GINT_TO_POINTER(boxcount + 1));
8123 /* Set the requested size of the widget */
8162 if(GTK_IS_SCROLLED_WINDOW(item)) 8124 if(GTK_IS_SCROLLED_WINDOW(item))
8163 { 8125 {
8164 gtk_scrolled_window_set_min_content_width(GTK_SCROLLED_WINDOW(item), width); 8126 gtk_scrolled_window_set_min_content_width(GTK_SCROLLED_WINDOW(item), width);
8165 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(item), height); 8127 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(item), height);
8166 } 8128 }
8192 gtk_widget_show(vbox); 8154 gtk_widget_show(vbox);
8193 } 8155 }
8194 8156
8195 gtk_container_set_border_width(GTK_CONTAINER(box), pad); 8157 gtk_container_set_border_width(GTK_CONTAINER(box), pad);
8196 8158
8197 if(GTK_IS_TABLE(item) || (tmpitem && GTK_IS_TABLE(tmpitem))) 8159 if(GTK_IS_GRID(item) || (tmpitem && GTK_IS_GRID(tmpitem)))
8198 { 8160 {
8199 GtkWidget *eventbox = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_eventbox"); 8161 GtkWidget *eventbox = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_eventbox");
8200 8162
8201 /* NOTE: I left in the ability to pack boxes with a size, 8163 /* NOTE: I left in the ability to pack boxes with a size,
8202 * this eliminates that by forcing the size to 0. 8164 * this eliminates that by forcing the size to 0.
8773 8735
8774 pagearray[pageid] = page; 8736 pagearray[pageid] = page;
8775 8737
8776 label = gtk_label_new(text ? text : ""); 8738 label = gtk_label_new(text ? text : "");
8777 8739
8778 if(GTK_IS_TABLE(page)) 8740 if(GTK_IS_GRID(page))
8779 { 8741 {
8780 pad = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(page), "_dw_boxpad")); 8742 pad = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(page), "_dw_boxpad"));
8781 gtk_container_set_border_width(GTK_CONTAINER(page), pad); 8743 gtk_container_set_border_width(GTK_CONTAINER(page), pad);
8782 } 8744 }
8783 8745
9166 9128
9167 g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL); 9129 g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
9168 g_list_free(list); 9130 g_list_free(list);
9169 } 9131 }
9170 } 9132 }
9133 DW_MUTEX_UNLOCK;
9171 return retval; 9134 return retval;
9172 } 9135 }
9173 9136
9174 /* 9137 /*
9175 * Returns the index to the item in the list currently selected. 9138 * Returns the index to the item in the list currently selected.