comparison gtk/dw.c @ 1452:dbe16031ffb4

Changes for GTK to make top-level windows act more like on other platforms. Menubar should be separate from the rest of the layout... added a Grid for GTK3 and Table for GTK2 to hold the menubar in a static position. Also potential stability fixes when destroying a menubar from a window.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 14 Dec 2011 08:22:54 +0000
parents 95ca625b8ffc
children 677ca99a8700
comparison
equal deleted inserted replaced
1451:95ca625b8ffc 1452:dbe16031ffb4
3403 } 3403 }
3404 else 3404 else
3405 #endif 3405 #endif
3406 { 3406 {
3407 GtkWidget *box = dw_box_new(DW_VERT, 0); 3407 GtkWidget *box = dw_box_new(DW_VERT, 0);
3408 3408 GtkWidget *table = gtk_table_new(2, 1, FALSE);
3409
3410 gtk_widget_show_all(table);
3411
3409 last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); 3412 last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3410 3413
3411 gtk_window_set_title(GTK_WINDOW(tmp), title); 3414 gtk_window_set_title(GTK_WINDOW(tmp), title);
3412 if(!(flStyle & DW_FCF_SIZEBORDER)) 3415 if(!(flStyle & DW_FCF_SIZEBORDER))
3413 gtk_window_set_policy(GTK_WINDOW(tmp), FALSE, FALSE, TRUE); 3416 gtk_window_set_policy(GTK_WINDOW(tmp), FALSE, FALSE, TRUE);
3452 gdk_window_reparent(GTK_WIDGET(tmp)->window, GTK_WIDGET(hwndOwner)->window, 0, 0); 3455 gdk_window_reparent(GTK_WIDGET(tmp)->window, GTK_WIDGET(hwndOwner)->window, 0, 0);
3453 3456
3454 if(flStyle & DW_FCF_SIZEBORDER) 3457 if(flStyle & DW_FCF_SIZEBORDER)
3455 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_size", GINT_TO_POINTER(1)); 3458 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_size", GINT_TO_POINTER(1));
3456 3459
3457 gtk_container_add(GTK_CONTAINER(tmp), box); 3460 gtk_table_attach(GTK_TABLE(table), box, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0);
3461 gtk_container_add(GTK_CONTAINER(tmp), table);
3458 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_boxhandle", (gpointer)box); 3462 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_boxhandle", (gpointer)box);
3463 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_table", (gpointer)table);
3459 } 3464 }
3460 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle)); 3465 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle));
3461 DW_MUTEX_UNLOCK; 3466 DW_MUTEX_UNLOCK;
3462 return tmp; 3467 return tmp;
3463 } 3468 }
3709 GtkWidget *box; 3714 GtkWidget *box;
3710 HMENUI tmp = 0; 3715 HMENUI tmp = 0;
3711 3716
3712 DW_MUTEX_LOCK; 3717 DW_MUTEX_LOCK;
3713 if(GTK_IS_WINDOW(location) && 3718 if(GTK_IS_WINDOW(location) &&
3714 (box = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_boxhandle"))) 3719 (box = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_table")))
3715 { 3720 {
3716 /* If there is an existing menu bar, remove it */ 3721 /* If there is an existing menu bar, remove it */
3717 GtkWidget *oldmenu = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_menubar"); 3722 GtkWidget *oldmenu = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_menubar");
3718 if(oldmenu) 3723 if(oldmenu)
3719 gtk_widget_destroy(oldmenu); 3724 gtk_widget_destroy(oldmenu);
3720 /* Create a new menu bar */ 3725 /* Create a new menu bar */
3721 tmp = gtk_menu_bar_new(); 3726 tmp = gtk_menu_bar_new();
3722 gtk_widget_show(tmp); 3727 gtk_widget_show(tmp);
3723 accel_group = gtk_accel_group_new(); 3728 accel_group = gtk_accel_group_new();
3724 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); 3729 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_accel", (gpointer)accel_group);
3730 /* Save pointers to each other */
3725 gtk_object_set_data(GTK_OBJECT(location), "_dw_menubar", (gpointer)tmp); 3731 gtk_object_set_data(GTK_OBJECT(location), "_dw_menubar", (gpointer)tmp);
3726 dw_box_pack_end(box, (HWND)tmp, -1, -1, TRUE, FALSE, 0); 3732 gtk_object_set_data(GTK_OBJECT(tmp), "_dw_window", (gpointer)location);
3727 3733 gtk_table_attach(GTK_TABLE(box), tmp, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
3728 } 3734 }
3729 DW_MUTEX_UNLOCK; 3735 DW_MUTEX_UNLOCK;
3730 return tmp; 3736 return tmp;
3731 } 3737 }
3732 3738
3738 void dw_menu_destroy(HMENUI *menu) 3744 void dw_menu_destroy(HMENUI *menu)
3739 { 3745 {
3740 if(menu && *menu) 3746 if(menu && *menu)
3741 { 3747 {
3742 int _locked_by_me = FALSE; 3748 int _locked_by_me = FALSE;
3749 GtkWidget *window;
3743 3750
3744 DW_MUTEX_LOCK; 3751 DW_MUTEX_LOCK;
3752 /* If it is a menu bar, try to delete the reference to it */
3753 if(GTK_IS_MENU_BAR(*menu) &&
3754 (window = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(*menu), "_dw_window")))
3755 gtk_object_set_data(GTK_OBJECT(window), "_dw_menubar", NULL);
3756 /* Actually destroy the menu */
3745 gtk_widget_destroy(*menu); 3757 gtk_widget_destroy(*menu);
3746 *menu = NULL; 3758 *menu = NULL;
3747 DW_MUTEX_UNLOCK; 3759 DW_MUTEX_UNLOCK;
3748 } 3760 }
3749 } 3761 }