Mercurial > dwindows
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. |