Finding the position of a button in a gtk dialog



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);

          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;                                                                                                                                                                                     

}

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 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;
}


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