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