[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: RE: how to position a gtk submenu on top of gtkmenu
- From: "shankar rajan" <shankvio rediffmail com>
- To: gtk-app-devel-list gnome org
- Subject: Re: RE: how to position a gtk submenu on top of gtkmenu
- Date: 22 Mar 2007 20:03:41 -0000
Hi Madhu,
Thanks! It worked.
What I find is that the main menu vanishes once the sub menu appears.
Is there any way that I can retain the previous main menu also.
When I use mouse, it seems to work but with keyboard it does not.
Attaching the sample code for submenu activate.
Regards,
Shankvio
//Previously sent code will work; just replace submenuitem_response() with this new one.
static gboolean submenuitem_response (GtkMenuItem *menu_item, gpointer user_data)
{
//Main Menu..
gtk_menu_popup ( GTK_MENU(menu), NULL, NULL, menu_position_func,
menu_bar, 0, gtk_get_current_event_time ());
//Sub Menu
gtk_menu_popup ( GTK_MENU(user_data), NULL, NULL,
submenu_position_func , menu_bar, 0, gtk_get_current_event_time ());
return TRUE;
}
//signal handler
g_signal_connect(G_OBJECT (menu_items), "activate", G_CALLBACK (submenuitem_response), (gpointer) menu1);
-------------------------------------------------------------------
On Thu, 22 Mar 2007 Madhusudan E wrote :
>Hi Shankar....
>I have faced the same problem, while developing an application for mobile.
>The am just suggesting you, based on whatever I did. This may not be the
>intended solution.
>For your Main Menu don't attach a sub menu. On click of the item pop up
>another main menu. You can position this Main menu so as to look as a sub
>menu.
>
>Rgds,
>Madhusudan E
>- 9980527224
>
>
>
>-----Original Message-----
> From: gtk-app-devel-list-bounces gnome org
>[mailto:gtk-app-devel-list-bounces gnome org] On Behalf Of shankar rajan
>Sent: Thursday, March 22, 2007 2:59 PM
>To: gtk-app-devel-list gnome org
>Subject: how to position a gtk submenu on top of gtkmenu
>
>Hi ALl,
>I have a strange requirement. I am developing an application for mobile
>where menubar is at the bottom.
>I have menu popping up from menubar and I am also able to position it using
>GtkMenuPositionFunc. However if the main menu has a sub menu for one of the
>gtk item in it, the GtkMenuPositionFunc doesn't seem to have any affect for
>positioning the sub menu. It always appears by the side of the main menu
>item though I am positioning it some where else.( overlapping the main menu
>because of mobile screen size.) How do I fix this issue. Kindly help.
>I am pasting the entire code here for your sake.
>Regards,
>Shankvio
>
>
>
>#include <stdio.h>
>
>#include <gtk/gtk.h>
>
>#include <gdk/gdkkeysyms.h>
>
>
>
>static gboolean button_press (GtkWidget *, GdkEvent *);
>
>static void menuitem_response (gchar *);
>
>static gboolean submenuitem_response (GtkWidget *menu_item, gpointer
>user_data);
>
>GtkWidget *menu_bar;
>
>GtkWidget *vbox;
>
>
>
>/* Print a string when a menu item is selected */
>
>
>
>static void menuitem_response( gchar *string )
>
>{
>
>
> printf ("%s\n", string);
>
>// gtk_main_quit();
>
>}
>
>
>
>void callback( GtkWidget *widget,
>
> gpointer data )
>
>{
>
> gtk_main_quit();
>
>}
>
>
>
>
>
>GtkWidget *menu_items;
>
>GtkWidget *menu;
>
>GtkWidget *menu_items_sub;
>
>int main( int argc,
>
> char *argv[] )
>
>{
>
>
>
> GtkWidget *window;
>
>// GtkWidget *menu_bar;
>
> GtkWidget *root_menu;
>
> GtkWidget *button;
>
> GtkWidget *menu1;
>
> char buf[128];
>
> int i;
>
>
>
> gtk_init (&argc, &argv);
>
>
>
> /* create a new window */
>
> window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>
> gtk_widget_set_size_request (GTK_WIDGET (window), 400, 200);
>
> gtk_window_set_title (GTK_WINDOW (window), "GTK Menu Test");
>
> g_signal_connect (G_OBJECT (window), "delete_event",
>
> G_CALLBACK (gtk_main_quit), NULL);
>
>
>
> /* Init the menu-widget, and remember -- never
>
> * gtk_show_widget() the menu widget!!
>
> * This is the menu that holds the menu items, the one that
>
> * will pop up when you click on the "Root Menu" in the app */
>
> menu = gtk_menu_new ();
>
> menu1 = gtk_menu_new ();
>
>
>
> /* Next we make a little loop that makes three menu-entries for
>"test-menu".
>
> * Notice the call to gtk_menu_shell_append. Here we are adding a list
>of
>
> * menu items to our menu. Normally, we'd also catch the "clicked"
>
> * signal on each of the menu items and setup a callback for it,
>
> * but it's omitted here to save space. */
>
>
>
> for (i = 0; i < 5; i++)
>
> {
>
> /* Copy the names to the buf. */
>
> sprintf (buf, "Submenu - %d", i);
>
>
>
> /* Create a new menu-item with a name... */
>
> menu_items_sub = gtk_menu_item_new_with_label (buf);
>
>
>
> /* ...and add it to the menu. */
>
> gtk_menu_shell_append (GTK_MENU_SHELL (menu1), menu_items_sub);
>
>
>
> /* Do something interesting when the menuitem is selected */
>
> g_signal_connect_swapped (G_OBJECT (menu_items_sub), "activate",
>
> G_CALLBACK (menuitem_response),
>
> (gpointer) g_strdup (buf));
>
>
>
> /* Show the widget */
>
> gtk_widget_show (menu_items_sub);
>
> }
>
>
>
> for (i = 0; i < 7; i++)
>
> {
>
> /* Copy the names to the buf. */
>
> sprintf (buf, "Test-Mainundermenu - %d", i);
>
>
>
> /* Create a new menu-item with a name... */
>
> menu_items = gtk_menu_item_new_with_label (buf);
>
>
>
> /* ...and add it to the menu. */
>
> gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
>
>
>
> /* Do something interesting when the menuitem is selected */
>
> g_signal_connect_swapped (G_OBJECT (menu_items), "activate",
>
> G_CALLBACK (menuitem_response),
>
> (gpointer) g_strdup (buf));
>
>
>
> /* Show the widget */
>
> gtk_widget_show (menu_items);
>
> }
>
>
>
> //gtk_menu_shell_append (GTK_MENU_SHELL (menu_items), menu1);
>
> /* This is the root menu, and will be the label
>
> * displayed on the menu bar. There won't be a signal handler attached,
>
> * as it only pops up the rest of the menu when pressed. */
>
> root_menu = gtk_menu_item_new_with_label ("Root Menu");
>
>
>
> gtk_widget_show (root_menu);
>
>
>
> /* Now we specify that we want our newly created "menu" to be the menu
>
> * for the "root menu" */
>
> gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu);
>
> gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_items), menu1);
>
>
>
> //g_signal_connect(G_OBJECT (menu1), "event", G_CALLBACK
>(submenuitem_response), NULL);
>
> g_signal_connect(G_OBJECT (menu_items), "activate", G_CALLBACK
>(submenuitem_response), (gpointer) menu1);
>
>
>
> /* A vbox to put a menu and a button in: */
>
> vbox = gtk_vbox_new (FALSE, 0);
>
> gtk_container_add (GTK_CONTAINER (window), vbox);
>
> gtk_widget_show (vbox);
>
>
>
> /* Create a menu-bar to hold the menus and add it to our main window */
>
> menu_bar = gtk_menu_bar_new ();
>
> gtk_box_pack_end (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2);
>
> gtk_widget_show (menu_bar);
>
>
>
> /* Create a button to which to attach menu as a popup */
>
> button = gtk_button_new_with_label ("press me");
>
> g_signal_connect_swapped (G_OBJECT (button), "event", G_CALLBACK
>(button_press), G_OBJECT (menu));
>
> //g_signal_connect_swapped (G_OBJECT (button), "event", G_CALLBACK
>(button_press), G_OBJECT (menu));
>
>
>
> gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC
>(callback), G_OBJECT( menu) );
>
>
>
> gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 2);
>
> gtk_widget_show (button);
>
>
>
> /* And finally we append the menu-item to the menu-bar -- this is the
>
> * "root" menu-item I have been raving about =) */
>
> gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu);
>
> //gtk_widget_set_uposition(menu, 0, 0);
>
>
>
> /* always display the window as the last step so it all splashes on
>
> * the screen at once. */
>
> gtk_widget_show (window);
>
>
>
> gtk_main ();
>
>
>
> return 0;
>
>}
>
>
>
>/* Respond to a button-press by posting a menu passed in as widget.
>
> *
>
> * Note that the "widget" argument is the menu being posted, NOT
>
> * the button that was pressed. ---------- bcoz of swapping.
> */
>
>static void
>
>submenu_position_func (GtkMenu *menu,
>
> gint *x,
>
> gint *y,
>
> gboolean *push_in,
>
> gpointer user_data)
>
>{
>
> GtkWidget *widget = GTK_WIDGET (user_data);
>
> GtkRequisition req;
>
>
>
> gdk_window_get_origin (widget->window, x, y);
>
>
>
> gtk_widget_size_request (GTK_WIDGET (menu), &req);
>
> *y -= req.height;
>
>
>
>
>
> *push_in = FALSE;
>
>}
>
>
>
>static void
>
>menu_position_func (GtkMenu *menu,
>
> gint *x,
>
> gint *y,
>
> gboolean *push_in,
>
> gpointer user_data)
>
>{
>
> GtkWidget *widget = GTK_WIDGET (user_data);
>
> GtkRequisition req;
>
> GtkRequisition req1;
>
>
>
> gdk_window_get_origin (widget->window, x, y);
>
>
>
> gtk_widget_size_request (GTK_WIDGET (menu), &req);
>
> gtk_widget_size_request (GTK_WIDGET (widget), &req1);
>
> *y -= req.height;
>
>
>
> *push_in = FALSE;
>
>}
>
>
>
>int flag = 0;
>
>static gboolean button_press( GtkWidget *widget,
>
> GdkEvent *event )
>
>{
>
> gint x, y;
>
> if (event->key.keyval == GDK_F5)// || event->type == GDK_KEY_PRESS)
>
> {
>
> GdkEventButton *bevent = (GdkEventButton *) event;
>
> GtkWidget *menu = gtk_menu_item_get_submenu
>(GTK_MENU_ITEM(menu_items));
>
> gtk_menu_popup (GTK_MENU (widget), NULL, NULL, menu_position_func ,
>menu_bar, bevent->button, bevent->time);
>
>
>
> return TRUE;
>
> }
>
>
>
> /* Tell calling code that we have not handled this event; pass it on. */
>
> return FALSE;
>
>}
>
>
>
>static gboolean submenuitem_response (GtkWidget *menu_item, gpointer
>user_data)
>
>{
>
> GdkEvent *event = gtk_get_current_event();
>
> GtkWidget *submenu = gtk_menu_item_get_submenu
>(GTK_MENU_ITEM(menu_item));
>
> gtk_menu_popup ( GTK_MENU(submenu), NULL, NULL, submenu_position_func
>, menu_bar, 0, gtk_get_current_event_time ());
>
>
>
> return TRUE;
>
>}
>
>_______________________________________________
>gtk-app-devel-list mailing list
>gtk-app-devel-list gnome org
>http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
>
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]