Problem gtk with gnome.



Hi, i have a problem using gtk_window_move with gnome. There are two
windows, and a function to move one window (not decorated) respect to
the other window (decorated) using gtk_window_move. The problem is the
result. Because not always is the expected. Sometimes the window
(undecorated) position is wrong.

This situation appear first when i use gtkwebkit with the undecorated
parent. Then i try without gtkwebkit, and usually works but not
always. So try more times if you choose the option without gtkwebkit.
The problem is show better if you attach a gtkwebkit to the not
decorated window (uncomment code in the main.c).

This program works in Ubuntu 12.04 with XFCE and not in Ubuntu 12.04 with gnome.
Can someone help me please?
I send you the main.c.
Compile: gcc -o main main.c `pkg-config --cflags --libs gtk+-2.0 webkit-1.0`

RealPos: http://imageshack.us/a/img404/861/realpos.png
BadPos: http://imageshack.us/a/img840/5949/badpos.png
BadPos2: http://imageshack.us/a/img705/3136/badpos2.png
BadPosWithWebKit: http://imageshack.us/a/img441/4392/badposwithwebkit.png
RealPosWithWebKit: http://imageshack.us/a/img528/4655/realposwithwebkit.png
#include <gtk/gtk.h>
#include <webkit/webkit.h>

typedef struct Size {
	int x;
	int y;
	int w;
	int h;
} Size;

void move(GtkWidget *videoOverlay,GtkWidget *_main, int x, int y){
	gint xOrigin,yOrigin,borderLeft,borderBottom;
	GdkRectangle fRect;

	GdkWindow *window = gtk_widget_get_window(_main); //	Getting window
	gdk_window_get_origin(window, &xOrigin,&yOrigin);  //	Parent's left-top screen coordinates
	gdk_window_get_frame_extents( window, &fRect ); //	Getting size and position including decorations
	
	//Calculating borders
	borderLeft = (fRect.width-720)/2;
	borderBottom = fRect.height - (576 + (yOrigin-fRect.y));
	
	gtk_window_move( GTK_WINDOW(videoOverlay), fRect.x+(fRect.width-720)+x-borderLeft, fRect.y+(fRect.height-576)+y-borderBottom );
	
}

void resize(GtkWidget *_overlay, int w, int h){
	GdkGeometry hints;
	hints.min_width = w;
	hints.min_height = h;
	hints.width_inc = w;
	hints.height_inc = h;
	
	GdkWindowHints mask = (GdkWindowHints) (GDK_HINT_RESIZE_INC | GDK_HINT_MIN_SIZE );

	gtk_window_set_geometry_hints (GTK_WINDOW (_overlay),
		_overlay,
		&hints,
		mask);
}

static void on_window_destroyed( GtkWidget * widget, gpointer user_data ) {
	gtk_main_quit();
}

int main(int argc, char * argv[]){
	GtkWidget *_window,*_overlay,*_view;
	Size s;
	gtk_init(NULL, NULL);
	
	// Main window initialization
	_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_position(GTK_WINDOW(_window), GTK_WIN_POS_CENTER);
	gtk_window_set_default_size(GTK_WINDOW(_window), 720, 576);
	gtk_window_set_title(GTK_WINDOW(_window), "Sample");
	gtk_widget_set_double_buffered(_window, FALSE);
		
	// Set background color
	GdkColor color;
	gdk_color_parse ("black", &color);
	gtk_widget_modify_bg (_window, GTK_STATE_NORMAL, &color);

	// Connect signals
	g_signal_connect( GTK_OBJECT(_window), "destroy", G_CALLBACK (on_window_destroyed), NULL);

	gtk_widget_show(_window);
	
	//	Create Overlay
	_overlay = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_decorated (GTK_WINDOW (_overlay), FALSE);
	gtk_window_set_resizable (GTK_WINDOW(_overlay), FALSE);
	gtk_window_set_skip_taskbar_hint( GTK_WINDOW(_overlay), TRUE );
	gtk_window_set_transient_for(GTK_WINDOW(_overlay),GTK_WINDOW(_window));
	gtk_window_set_accept_focus( GTK_WINDOW(_overlay), FALSE );
	gtk_window_set_destroy_with_parent( GTK_WINDOW(_overlay), TRUE );

	gtk_widget_realize(_overlay);
	
	//	Set overlay position
	s.y=s.x=0;
	move(_overlay,_window, s.x, s.y);
	
	//	Set overlay size
	s.w=720;
	s.h=576;
	resize(_overlay, s.w, s.h);

	gdk_window_restack(
		gtk_widget_get_window(_overlay),
		gtk_widget_get_window(_window),
		FALSE
	);
	
	gtk_widget_show(_overlay);
	
	/*
	// Create WebKit
	_view = webkit_web_view_new ();

	//	Setup webkit
	webkit_web_view_set_full_content_zoom( WEBKIT_WEB_VIEW (_view), TRUE );
	webkit_web_view_set_transparent( WEBKIT_WEB_VIEW (_view), TRUE );
	
	//	Load url
	webkit_web_view_load_uri (WEBKIT_WEB_VIEW (_view), "http://google.com.ar"; );

	//Show webkit
	gtk_container_add(GTK_CONTAINER(_overlay),_view);
	gtk_widget_show (_view);
	*/

	// Move and resize overlay
	s.y=100;
	s.x=100;
	s.w=620;
	s.h=476;
	move(_overlay,_window, s.x, s.y);
	resize(_overlay, s.w, s.h);
	
	//	Run loop
	gtk_main();
	return 0;	
}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]