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

GtkMenuPositionFunc



/*
>I am writting an app with keyboard controls and would like a popup menu
>that uses
>x and y coordinates instead of the mouse positon.  In the gtk_menu_popup()
>one of the arguments is GtkMenuPositionFunc which seems to do what I want.
>However, I can't figure out how to use it.  Can someone point me to an
>example or code snippet.

Here is a working example that shows how to define 
the origin x,y and size w,h of a pop up menu. It also 
shows how to define the color of a menuitem. 

Carlos

----------------------------------------------------------------
*/
#include <gtk/gtk.h>

void set_position (GtkMenu *menu, gint *px, gint *py, gpointer data)
{
gint w, h;
GtkWidget *button = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (menu), "button");

gdk_window_get_size (button->window, &w, &h);
gdk_window_get_origin (button->window, px, py);
*py += h;
}

static gint button_press (GtkWidget *widget, GdkEvent *event)
{
gint w, h;
GtkWidget *button = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (widget), "button");

gdk_window_get_size (button->window, &w, &h);
gtk_widget_set_usize (widget, w, 0);
if (event->type == GDK_BUTTON_PRESS) 
  {GdkEventButton *bevent = (GdkEventButton *) event;
  gtk_menu_popup (GTK_MENU(widget), NULL, NULL, set_position, 
  NULL, bevent->button, bevent->time);
  return TRUE;
  }
return FALSE;
}

static void handle_menuitem (gchar *string)
{
printf("%s\n", string);
}

int main (int argc, char *argv[])
{

GtkWidget *window;
GtkWidget *button;
GtkWidget *menu;
GtkWidget *menuitem;
GtkWidget *label;
GdkColor  color;
GtkStyle  *newstyle;
char buf[128];
int i;

gtk_init (&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize( GTK_WIDGET (window), 100, 100);
gtk_window_set_title(GTK_WINDOW (window), "GTK MENU");
gtk_signal_connect(GTK_OBJECT (window), "delete_event",
(GtkSignalFunc) gtk_main_quit, NULL);

menu = gtk_menu_new();
button = gtk_button_new_with_label("press me");
gtk_signal_connect_object (GTK_OBJECT(button), "event",
GTK_SIGNAL_FUNC (button_press), GTK_OBJECT(menu));
gtk_object_set_data (GTK_OBJECT (menu), "button", button);
gtk_widget_show(button);

for (i = 0; i < 3; i++)
  {
  menuitem = gtk_menu_item_new ();
  sprintf(buf, "menuitem - %d", i);
  label = gtk_label_new (buf);
  gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
  gtk_container_add (GTK_CONTAINER (menuitem), label);
  gdk_color_parse ("red", &color);
  newstyle = gtk_style_copy (gtk_widget_get_style (menuitem));
  newstyle->fg[GTK_STATE_NORMAL] = color;
  newstyle->fg[GTK_STATE_ACTIVE] = color;
  newstyle->fg[GTK_STATE_PRELIGHT] = color;
  newstyle->fg[GTK_STATE_SELECTED] = color;
  newstyle->fg[GTK_STATE_INSENSITIVE] = color;
  gtk_widget_set_style (label, newstyle);
  gtk_widget_show (label);
  gtk_menu_append(GTK_MENU (menu), menuitem);
  gtk_signal_connect_object (GTK_OBJECT (menuitem), "activate",
  GTK_SIGNAL_FUNC (handle_menuitem), (gpointer) g_strdup(buf));
  gtk_widget_show (menuitem);
  }
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (window);
gtk_main ();
}



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