comparison gtk/dw.c @ 1470:a317c2ec1d4c

On GTK2 gtk_window_move() needs to be called after mapping the window... but before calling gdk_window_get_frame_extents() so do it in another step. Also a couple minor code fixes on GTK2 and GTK3.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 20 Dec 2011 14:30:10 +0000
parents b9efb744cfbd
children 26dbd11399d6
comparison
equal deleted inserted replaced
1469:b9efb744cfbd 1470:a317c2ec1d4c
2658 */ 2658 */
2659 int dw_window_show(HWND handle) 2659 int dw_window_show(HWND handle)
2660 { 2660 {
2661 int _locked_by_me = FALSE; 2661 int _locked_by_me = FALSE;
2662 GtkWidget *defaultitem; 2662 GtkWidget *defaultitem;
2663 int x = 0, y = 0;
2663 #if GTK_MAJOR_VERSION > 1 2664 #if GTK_MAJOR_VERSION > 1
2664 GtkWidget *mdi; 2665 GtkWidget *mdi;
2665 #endif 2666 #endif
2666 2667
2667 if (!handle) 2668 if (!handle)
2668 return 0; 2669 return 0;
2669 2670
2670 DW_MUTEX_LOCK; 2671 DW_MUTEX_LOCK;
2672 /* GTK 2 needs extra help moving the window after being mapped */
2673 if(!GTK_WIDGET_MAPPED(handle))
2674 {
2675 x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_absolutex"));
2676 y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_absolutey"));
2677 }
2671 gtk_widget_show(handle); 2678 gtk_widget_show(handle);
2672 #if GTK_MAJOR_VERSION > 1 2679 #if GTK_MAJOR_VERSION > 1
2673 if ((mdi = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_mdi")) && GTK_IS_MDI(mdi)) 2680 if ((mdi = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_mdi")) && GTK_IS_MDI(mdi))
2674 { 2681 {
2675 gtk_mdi_set_state(GTK_MDI(mdi), handle, CHILD_NORMAL); 2682 gtk_mdi_set_state(GTK_MDI(mdi), handle, CHILD_NORMAL);
2676 } 2683 }
2677 else 2684 else
2678 #endif 2685 #endif
2679 { 2686 if(GTK_IS_WINDOW(handle))
2687 {
2688 /* Move the window to where it should be so gdk_window_get_frame_extents()
2689 * called from dw_window_set_pos() and dw_window_set_size() don't make the
2690 * window appear in a bad location on the screen.
2691 */
2692 if(x || y)
2693 {
2694 gtk_window_move(GTK_WINDOW(handle), x, y);
2695 /* Clear out the data so we don't do it again */
2696 gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutex", NULL);
2697 gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutey", NULL);
2698 }
2680 if (GTK_WIDGET(handle)->window) 2699 if (GTK_WIDGET(handle)->window)
2681 { 2700 {
2682 int width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_width")); 2701 int width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_width"));
2683 int height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_height")); 2702 int height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_height"));
2684 2703
2693 } 2712 }
2694 2713
2695 /* If we had a position request before shown */ 2714 /* If we had a position request before shown */
2696 if (gtk_object_get_data(GTK_OBJECT(handle), "_dw_pos")) 2715 if (gtk_object_get_data(GTK_OBJECT(handle), "_dw_pos"))
2697 { 2716 {
2698 int x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_x")); 2717 x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_x"));
2699 int y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_y")); 2718 y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_y"));
2700 2719
2701 /* Call the position function again now that we are realized */ 2720 /* Call the position function again now that we are realized */
2702 dw_window_set_pos(handle, x, y); 2721 dw_window_set_pos(handle, x, y);
2703 /* Clear out the data so we don't do it again */ 2722 /* Clear out the data so we don't do it again */
2704 gtk_object_set_data(GTK_OBJECT(handle), "_dw_pos", NULL); 2723 gtk_object_set_data(GTK_OBJECT(handle), "_dw_pos", NULL);
10385 gtk_object_set_data(GTK_OBJECT(handle), "_dw_y", GINT_TO_POINTER(y)); 10404 gtk_object_set_data(GTK_OBJECT(handle), "_dw_y", GINT_TO_POINTER(y));
10386 gtk_object_set_data(GTK_OBJECT(handle), "_dw_pos", GINT_TO_POINTER(1)); 10405 gtk_object_set_data(GTK_OBJECT(handle), "_dw_pos", GINT_TO_POINTER(1));
10387 /* Check to see if there is a pending size request too */ 10406 /* Check to see if there is a pending size request too */
10388 width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_width")); 10407 width = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_width"));
10389 height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_height")); 10408 height = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(handle), "_dw_height"));
10390 if(width | height) 10409 if(!width || !height)
10391 { 10410 {
10392 /* Ask what GTK is planning on suggesting for the window size */ 10411 /* Ask what GTK is planning on suggesting for the window size */
10393 gtk_window_get_size(GTK_WINDOW(handle), !width ? &width : NULL, !height ? &height : NULL); 10412 gtk_window_get_size(GTK_WINDOW(handle), !width ? &width : NULL, !height ? &height : NULL);
10394 } 10413 }
10395 /* Add the frame size to it */ 10414 /* Add the frame size to it */
10409 if((vert & 0xf) == DW_GRAV_CENTER) 10428 if((vert & 0xf) == DW_GRAV_CENTER)
10410 newy += ((gdk_screen_height() / 2) - (height / 2)); 10429 newy += ((gdk_screen_height() / 2) - (height / 2));
10411 else if((vert & 0xf) == DW_GRAV_BOTTOM) 10430 else if((vert & 0xf) == DW_GRAV_BOTTOM)
10412 newy = gdk_screen_height() - height - x; 10431 newy = gdk_screen_height() - height - x;
10413 } 10432 }
10414 /* Finally move the window into place */ 10433 if(GTK_WIDGET_MAPPED(handle))
10415 gtk_window_move(GTK_WINDOW(handle), newx, newy); 10434 {
10435 /* Finally move the window into place */
10436 gtk_window_move(GTK_WINDOW(handle), newx, newy);
10437 }
10438 else
10439 {
10440 gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutex", GINT_TO_POINTER(newx));
10441 gtk_object_set_data(GTK_OBJECT(handle), "_dw_absolutey", GINT_TO_POINTER(newy));
10442 }
10416 #else 10443 #else
10417 gtk_widget_set_uposition(handle, x, y); 10444 gtk_widget_set_uposition(handle, x, y);
10418 #endif 10445 #endif
10419 } 10446 }
10420 else if(handle->window) 10447 else if(handle->window)
10469 if(handle && handle->window) 10496 if(handle && handle->window)
10470 { 10497 {
10471 /* If it is a toplevel window */ 10498 /* If it is a toplevel window */
10472 if(GTK_IS_WINDOW(handle)) 10499 if(GTK_IS_WINDOW(handle))
10473 { 10500 {
10474 if(handle->window && gdk_window_is_visible(handle->window)) 10501 if(handle->window && GTK_WIDGET_MAPPED(handle))
10475 { 10502 {
10476 GdkRectangle frame; 10503 GdkRectangle frame;
10477 10504
10478 /* Calculate the border rectangle */ 10505 /* Calculate the border rectangle */
10479 gdk_window_get_frame_extents(handle->window, &frame); 10506 gdk_window_get_frame_extents(handle->window, &frame);