[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
GtkMenuPositionFunc
- From: Carlos Pereira <carlos pehoe civil ist utl pt>
- To: gtk-app-devel-list redhat com
- Subject: GtkMenuPositionFunc
- Date: Sun, 27 Feb 2000 16:54:39 GMT
/*
>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]