I am trying to find the position of a button in a gtk dialog.
but getting some strange results..
approach i am using is :
i will find the distance of the button from its parent, and then its
parent's distance form its parent .. and so on, till i get toplevel
window.
then i am adding the decoration's height, border's width and distance of top level window from origin of root window(0,0).
i am getting same (x,y) pair for the each level of iteration :(.
sample code i wrote is attached with this mail...
It will be great if someone can point out the mistake or can tell the correct code for this.
code is :
/*
call as :gcc `pkg-config --cflags --libs gtk+-2.0` codename.c
./a.out
then press "button1" in the dialog.
*/
#include <gtk/gtk.h>
gboolean GtkWidgetGetPos(GtkWidget *widget, int *x, int *y)
{
printf(" entered GtkWidgetGetPos\n");
if(!widget)
return FALSE; //return false;
if(GTK_IS_WINDOW(widget))
{
int win_x, win_y;
gtk_window_get_position(GTK_WINDOW(widget), &win_x, &win_y);
if(x)
*x = win_x;
if(y)
*y = win_y;
printf("1 widget : %p , x = %d , y = %d\n",widget,win_x,win_y);
return TRUE ; // return true;
}
else if(GTK_WIDGET_REALIZED(widget))
{
int win_x, win_y;
gdk_window_get_position(widget->window, &win_x, &win_y);
if(x)
*x = win_x;
if(y)
*y = win_y;
printf("2 widget : %p , x = %d , y = %d\n",widget,win_x,win_y);
return TRUE; //return true;
}
else
{
if(x)
*x = 0;
if(y)
*y = 0;
printf("widget : %p , x = %d , y = %d\n",widget,*x,*y);
return FALSE ; //return false;
}
}
void GtkWidgetGetAbsolutePos(GtkWidget *widget, int *x, int *y)
{
printf(" entered GtkWidgetGetAbsolutePos\n");
int myX = 0, myY = 0;
int tempX, tempY;
//find position of widget w.r.t. toplevel window
while(widget && !GTK_WIDGET_TOPLEVEL(widget))
{
tempX = 0;
tempY = 0;
GtkWidgetGetPos(widget, &tempX, &tempY);
printf(" left GtkWidgetGetPos\n");
myX += tempX;
myY += tempY;
widget = widget->parent;
}
if (widget)
{
tempX = 0;
tempY = 0;
GtkWidgetGetPos(widget, &tempX, &tempY);
printf(" left GtkWidgetGetPos\n");
myX += tempX;
myY += tempY;
if(GTK_WIDGET_MAPPED(widget))
{
gint win_x, win_y, win_width, win_height;
gdk_window_get_geometry(widget->window, &win_x, &win_y, &win_width, &win_height, NULL);
GdkRectangle win_rect;
gdk_window_get_frame_extents(widget->window, &win_rect);
//We assume that the bottom border is equivalent to the side borders.
int border_width = (win_rect.width - win_width) / 2;
int title_width = (win_rect.height - win_height) - border_width;
myX += border_width;
myY += title_width;
}
}
if (x)
*x = myX;
if (y)
*y = myY;
printf(" leaving GtkWidgetGetAbsolutePos\n");
}
void iterate_container(GtkWidget *container)
{
printf(" entered iterate_container\n");
GtkWidget *retVal = NULL;
GList *children = gtk_container_get_children(GTK_CONTAINER(container));
GList *current_child = NULL;
for(current_child = children; ((retVal == NULL) && (current_child != NULL)); current_child = current_child->next)
{
gtk_widget_realize(GTK_WIDGET(current_child->data));
if(GTK_IS_BUTTON(current_child->data))
{
printf("inside button\n");
char* lbl =(char*)gtk_button_get_label(GTK_BUTTON(current_child->data));
if(lbl)
{
int x = 0,y = 0;
printf("calling GtkWidgetGetAbsolutePos \n");
GtkWidgetGetAbsolutePos(GTK_WIDGET(current_child->data),&x,&y);
// gdk_window_get_position(GTK_WIDGET(current_child->data)->window,&x,&y);
printf("x = %d , y = %d\n",x,y);
}
printf("leaving button\n");
}
if (GTK_IS_CONTAINER(current_child->data))
iterate_container(GTK_WIDGET(current_child->data));
}
g_list_free(children);
printf(" leaving iterate_container\n");
return ;//retVal;
}
/* This is a callback function. The data arguments are ignored
* in this example. More on callbacks below. */
static void hello( GtkWidget *widget,
gpointer data )
{
g_print ("Hello World\n");
iterate_container(GTK_WIDGET(data));
}
static gboolean delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
g_print ("delete event occurred\n");
//return TRUE; // return true;
return FALSE; // return false; // this will call destroy fn...
}
static void destroy( GtkWidget *widget,
gpointer data )
{
g_print("inside... destroy");
gtk_main_quit ();
}
int main( int argc,
char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *box1;
GtkWidget *label;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 200);
box1 = gtk_vbox_new (FALSE , 10);
gtk_container_add (GTK_CONTAINER (window), box1);
GtkWidget *hscale;
hscale = gtk_hscale_new_with_range( 0.0, 1300.0 , 50.0);
gtk_scale_set_value_pos(GTK_SCALE(hscale),GTK_POS_RIGHT);
gtk_box_pack_start (GTK_BOX(box1), hscale, TRUE,TRUE, 0);
gtk_widget_show (hscale);
GtkWidget *scrollbar;
GtkWidget *seperator;
GtkObject *adj1;
adj1 = gtk_adjustment_new (0.0, 0.0, 201.0, 0.1, 1.0, 1.0);
scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT(adj1));
gtk_box_pack_start (GTK_BOX (box1), scrollbar, TRUE, TRUE, 0);
gtk_widget_show (scrollbar);
GtkWidget *frame;
frame = gtk_frame_new ("Normal Label");
label = gtk_label_new ("This is a Normal label");
gtk_container_add (GTK_CONTAINER (frame), label);
gtk_widget_show(label);
gtk_box_pack_start (GTK_BOX (box1), frame, FALSE, FALSE, 0);
gtk_widget_show(frame);
label = gtk_label_new("LABEL ");
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_box_pack_start (GTK_BOX(box1), label, TRUE,TRUE, 0);
gtk_widget_show (label);
GtkWidget *checkButton;
checkButton = gtk_check_button_new_with_label("check button");
gtk_box_pack_start (GTK_BOX(box1), checkButton, TRUE,TRUE, 0);
gtk_widget_show (checkButton);
GtkWidget *cal;
cal = gtk_calendar_new();
gtk_box_pack_start (GTK_BOX(box1), cal, TRUE,TRUE, 0);
gtk_widget_show (cal);
GtkTooltips *tooltips;
tooltips = gtk_tooltips_new ();
button = gtk_button_new_with_label ("Button 1");
gtk_tooltips_set_tip (tooltips, button, "This is button 1", NULL);
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (hello), (void*) window);
gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
gtk_widget_show (button);
gtk_widget_show (box1);
gtk_widget_show (window);
gtk_main ();
return 0;
}
--
********************************************************************************
* LiFe iS BeaUTiFuL, LiVE iT To THe FuLLeST ----- CHiRaG JuNeJa *
********************************************************************************