Hmmm... I'm running ubuntu 8.10 also, but with compiz. I just switched to metacity and I see what you're talking about. The code below works for me in both metacity and compiz if I make pop a toplevel window:
- popup = gtk_window_new (GTK_WINDOW_POPUP); + popup = gtk_window_new (GTK_WINDOW_TOPLEVEL); Hope this helps, Larry On Sun, 2008-11-30 at 21:02 -0500, Larry Reaves wrote: > Hi, > I think this patch should do what you want: > > --- test.orig.c 2008-11-30 20:40:21.000000000 -0500 > +++ test.c 2008-11-30 20:49:57.000000000 -0500 > @@ -78,7 +78,11 @@ > { > gtk_widget_show_all(popup); > focus_window(window); > - > + g_debug("unfocus al popup"); > + set_focus = FALSE; > + focus_window(window); > + gtk_widget_grab_focus(view); > + gtk_window_set_decorated(GTK_WINDOW(popup),FALSE); > //g_timeout_add(2000,focus_window,window); > } > } > @@ -86,10 +90,22 @@ > { > if (GTK_WIDGET_VISIBLE(GTK_WIDGET(popup))) > { > - g_debug("focus al popup"); > - set_focus = TRUE; > - focus_window(popup); > - gtk_widget_grab_focus(popup_view); > + if (set_focus == FALSE) > + { > + g_debug("focus al popup"); > + set_focus = TRUE; > + focus_window(popup); > + gtk_widget_grab_focus(popup_view); > + gtk_window_set_decorated(GTK_WINDOW(popup),TRUE); > + } > + else > + { > + g_debug("unfocus al popup"); > + set_focus = FALSE; > + focus_window(window); > + gtk_widget_grab_focus(view); > + gtk_window_set_decorated(GTK_WINDOW(popup),FALSE); > + } > } > } > > @@ -103,7 +119,7 @@ > gtk_window_set_transient_for(GTK_WINDOW(popup),GTK_WINDOW(window)); > gtk_window_set_focus_on_map(GTK_WINDOW(popup), FALSE); > gtk_window_set_type_hint(GTK_WINDOW(popup), > - GDK_WINDOW_TYPE_HINT_TOOLTIP); > + GDK_WINDOW_TYPE_HINT_NORMAL); > gtk_window_set_decorated(GTK_WINDOW(popup),FALSE); > gtk_container_set_border_width(GTK_CONTAINER(popup),2); > gtk_window_resize(GTK_WINDOW(popup),200,200); > @@ -112,6 +128,8 @@ > gtk_container_add(GTK_CONTAINER(scroll),popup_view); > gtk_container_add(GTK_CONTAINER(popup),scroll); > > + g_signal_connect(popup, "key-release-event", > + G_CALLBACK(key_press), NULL); > /*g_signal_connect(popup, "show", G_CALLBACK(show_cb), NULL); > g_signal_connect(popup, "realize", G_CALLBACK(realize_cb), > NULL); g_signal_connect(popup, "map", G_CALLBACK(map_cb), NULL); > > > Summary of changes: > 1. set type hint to be 'normal' instead of 'tooltip' > 2. connect up key-release-event to popup also, so when it has focus we > can get out of it > 3. on f6, only grab focus if we don't have it and add decorations > 4. if we do have it, return focus to main window and remove decorations > 5. if we hide popup while it has focus, remove decorations and focus > > So, you open the app and the main window has focus. Pressing F5 will > show the popup, but focus will remain with the main window. Pressing F5 > again will hide it. If F6 is pressed while the popup is open, it will > grab focus and become decorated. While it has focus, it can remove > decorations and pass focus back via F6. F5 also returns focus and > removes decorations, but also hides the window. If this is not the > desired behavior, let me know and I'll see if I can help. > > P.S. > I'm not sure what you're trying to do with gtk_window_set_default, but > it isn't doing anything... I get: > > (test:19164): Gtk-CRITICAL **: gtk_window_set_default: assertion > `GTK_WIDGET_CAN_DEFAULT (default_widget)' failed > > at runtime. devhelp says: > Before making a widget the default widget, you must set the > GTK_CAN_DEFAULT flag on the widget you'd like to make the default using > GTK_WIDGET_SET_FLAGS(). > However, I'm not sure you need the call in the first place to achieve > your desired behavior. > > -Larry Reaves > <[EMAIL PROTECTED]> > > > > On Mon, 2008-12-01 at 00:47 +0100, Perriman wrote: > > Hi all, > > > > I want to create a GTK_WINDOW_POPUP and change the type > > to GTK_WINDOW_TOPLEVEL. > > > > If you have used eclipse, when you are writting you can see a > > calltip (but the focus is in the editor) and if you press F2, then the > > calltip window gets the focus and show the decoration. > > > > I'm trying for two weeks and I cannot do the same in the > > example program. If I set GTK_WINDOW_POPUP then I cannot set the focus > > to the window and, If I use GTK_WINDOW_TOPLEVEL then the window lost > > the focus. If I show the popup window and set the focus to the main > > window, it does not work... I'm desperated.... > > > > Can you help me? > > > > Thank you again!! > > > > El Sun, 30 Nov 2008 23:37:29 +0100 > > Perriman <[EMAIL PROTECTED]> escribió: > > > > > Hi Michael > > > > > > I paste the code: > > > > > > #include <gtk/gtk.h> > > > #include <gdk/gdkkeysyms.h> > > > > > > static GtkWidget *window; > > > static GtkWidget *view; > > > static GtkWidget *popup; > > > static GtkWidget *popup_view; > > > static gboolean set_focus = FALSE; > > > > > > static void > > > destroy_cb(GtkObject *object,gpointer user_data) > > > { > > > gtk_main_quit (); > > > } > > > > > > static gboolean > > > focus_window(gpointer win) > > > { > > > g_debug("focus win"); > > > gtk_window_present_with_time(GTK_WINDOW(win),GDK_CURRENT_TIME); > > > gtk_window_activate_focus(GTK_WINDOW(win)); > > > gtk_widget_grab_focus(GTK_WIDGET(win)); > > > return FALSE; > > > } > > > > > > > > > static void > > > show_cb(GtkWidget *widget, gpointer user_data) > > > { > > > g_debug("show popup"); > > > focus_window(window); > > > } > > > > > > static void > > > realize_cb(GtkWidget *widget, gpointer user_data) > > > { > > > g_debug("realize popup"); > > > focus_window(window); > > > } > > > > > > static void > > > focus_in_cb(GtkWidget *widget, gpointer user_data) > > > { > > > g_debug("focus-in"); > > > //focus_window(window); > > > } > > > > > > static void > > > focus_out_win_cb(GtkWidget *widget, gpointer user_data) > > > { > > > g_debug("focus-out-win"); > > > /* if (!set_focus) > > > focus_window(window); > > > else > > > set_focus = FALSE; > > > */ > > > } > > > > > > static void > > > map_cb(GtkWidget *widget, gpointer user_data) > > > { > > > g_debug("map popup"); > > > focus_window(window); > > > } > > > > > > static gboolean > > > key_press(GtkWidget *widget, > > > GdkEventKey *event, > > > gpointer user_data) > > > { > > > if (event->keyval == GDK_F5) > > > { > > > if (GTK_WIDGET_VISIBLE(GTK_WIDGET(popup))) > > > { > > > gtk_widget_hide(popup); > > > } > > > else > > > { > > > gtk_widget_show_all(popup); > > > focus_window(window); > > > > > > //g_timeout_add(2000,focus_window,window); > > > } > > > } > > > else if (event->keyval == GDK_F6) > > > { > > > if (GTK_WIDGET_VISIBLE(GTK_WIDGET(popup))) > > > { > > > g_debug("focus al popup"); > > > set_focus = TRUE; > > > focus_window(popup); > > > gtk_widget_grab_focus(popup_view); > > > } > > > } > > > > > > return FALSE; > > > } > > > > > > GtkWidget* > > > create_popup (void) > > > { > > > popup = gtk_window_new(GTK_WINDOW_TOPLEVEL); > > > gtk_window_set_transient_for(GTK_WINDOW(popup),GTK_WINDOW(window)); > > > gtk_window_set_focus_on_map(GTK_WINDOW(popup), FALSE); > > > gtk_window_set_type_hint(GTK_WINDOW(popup), > > > GDK_WINDOW_TYPE_HINT_TOOLTIP); > > > gtk_window_set_decorated(GTK_WINDOW(popup),FALSE); > > > gtk_container_set_border_width(GTK_CONTAINER(popup),2); > > > gtk_window_resize(GTK_WINDOW(popup),200,200); > > > popup_view = gtk_text_view_new(); > > > GtkWidget *scroll = gtk_scrolled_window_new(NULL,NULL); > > > gtk_container_add(GTK_CONTAINER(scroll),popup_view); > > > gtk_container_add(GTK_CONTAINER(popup),scroll); > > > > > > /*g_signal_connect(popup, "show", G_CALLBACK(show_cb), NULL); > > > g_signal_connect(popup, "realize", G_CALLBACK(realize_cb), > > > NULL); g_signal_connect(popup, "map", G_CALLBACK(map_cb), NULL); > > > g_signal_connect(popup, "focus-in-event", > > > G_CALLBACK(focus_in_cb), NULL); */ > > > > > > return popup; > > > } > > > > > > GtkWidget* > > > create_window (void) > > > { > > > window = gtk_window_new(GTK_WINDOW_TOPLEVEL); > > > gtk_window_resize(GTK_WINDOW(window),800,600); > > > view = gtk_text_view_new(); > > > gtk_window_set_default(GTK_WINDOW(window),view); > > > GtkWidget *scroll = gtk_scrolled_window_new(NULL,NULL); > > > gtk_container_add(GTK_CONTAINER(scroll),view); > > > gtk_container_add(GTK_CONTAINER(window),scroll); > > > g_signal_connect(view, "key-release-event", > > > G_CALLBACK(key_press), NULL); > > > g_signal_connect(window, "destroy", G_CALLBACK(destroy_cb), > > > NULL); g_signal_connect(window, "focus-out-event", > > > G_CALLBACK(focus_out_win_cb), NULL); > > > return window; > > > } > > > > > > int > > > main (int argc, char *argv[]) > > > { > > > GtkWidget *window; > > > > > > gtk_set_locale (); > > > gtk_init (&argc, &argv); > > > > > > window = create_window (); > > > popup = create_popup(); > > > gtk_widget_show_all (window); > > > > > > gtk_main (); > > > return 0; > > > } > > > > > > > > > > > > > > > > > > El Sat, 29 Nov 2008 16:50:09 -0600 > > > Michael Cronenworth <[EMAIL PROTECTED]> escribió: > > > > > > > Perriman wrote: > > > > > > > > > > Can you help me?? (I attach the example) > > > > > > > > > > > > > > > > > > > > > > > Sorry, I don't see the example. > > _______________________________________________ > > gtk-app-devel-list mailing list > > gtk-app-devel-list@gnome.org > > http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list