Hi, Attached you find my tinkerings with the 'popup menu on keyboard shortcut' position stuff. Almost working. Only misplaced by a few pixels and I cant figure out why. So I thought I should get more eyes to look at it ;) > Are you building from cvs? We should be automatically passing -Wno- > strict-aliasing if the compiler supports it to fix this issue. I see. Well was a quite oooold local checkout dir which I kept cvs updating since like forever. So I cleared it out and did a fresh checkout and voila, it worked ;) cheers, Danny -- www.keyserver.net key id A334AEA6
Index: fm-directory-view.c =================================================================== RCS file: /cvs/gnome/nautilus/src/file-manager/fm-directory-view.c,v retrieving revision 1.640 diff -u -p -r1.640 fm-directory-view.c --- fm-directory-view.c 6 Oct 2004 19:54:32 -0000 1.640 +++ fm-directory-view.c 15 Oct 2004 16:30:03 -0000 @@ -6122,6 +6122,15 @@ void fm_directory_view_pop_up_selection_context_menu (FMDirectoryView *view, GdkEventButton *event) { + GArray *selected_item_locations; + gint count; + GdkPoint point; + GdkPoint window_origin; + GdkPoint decoration_end; + GdkPoint view_in_window; + + GtkWidget *toplevel; + g_assert (FM_IS_DIRECTORY_VIEW (view)); /* Make the context menu items not flash as they update to proper disabled, @@ -6129,10 +6138,44 @@ fm_directory_view_pop_up_selection_conte */ update_menus_if_pending (view); + point.x = EEL_DEFAULT_POPUP_MENU_DISPLACEMENT; + point.y = EEL_DEFAULT_POPUP_MENU_DISPLACEMENT; + + selected_item_locations = fm_directory_view_get_selected_icon_locations (view); + if (selected_item_locations) { + count = selected_item_locations->len; + if (count > 0) { + point = g_array_index (selected_item_locations, GdkPoint, count - 1); + /* client -> root coordinates; there should be an easier way than that */ + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view)); + if (toplevel) { + gdk_window_get_geometry (GTK_WIDGET (view)->window, &view_in_window.x, &view_in_window.y, + NULL, NULL, NULL); + gdk_window_get_root_origin (toplevel->window, &window_origin.x, &window_origin.y); + gdk_window_get_geometry (toplevel->window, &decoration_end.x, &decoration_end.y, + NULL, NULL, NULL); + + window_origin.x += decoration_end.x; + window_origin.y += decoration_end.y; + window_origin.x += view_in_window.x; + window_origin.y += view_in_window.y; + + g_warning ("window origin %d %d", window_origin.x, window_origin.y); + + point.x += window_origin.x; + point.y += window_origin.y; + } else { + /* hiss */ + } + + } + g_array_free (selected_item_locations, TRUE); + } + eel_pop_up_context_menu (create_popup_menu (view, FM_DIRECTORY_VIEW_POPUP_PATH_SELECTION), - EEL_DEFAULT_POPUP_MENU_DISPLACEMENT, - EEL_DEFAULT_POPUP_MENU_DISPLACEMENT, + point.x, point.y, event); }
Index: eel-gtk-extensions.c =================================================================== RCS file: /cvs/gnome/eel/eel/eel-gtk-extensions.c,v retrieving revision 1.54 diff -u -p -r1.54 eel-gtk-extensions.c --- eel-gtk-extensions.c 27 Oct 2003 20:10:30 -0000 1.54 +++ eel-gtk-extensions.c 15 Oct 2004 16:30:31 -0000 @@ -471,6 +471,27 @@ eel_truncate_text_for_menu_item (const c return eel_str_middle_truncate (text, MAXIMUM_MENU_TITLE_LENGTH); } +static void +popup_menu_callback (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer userdata) +{ + GdkPoint *point; + + point = (GdkPoint *)userdata; + if (point) { + if (point->x != EEL_DEFAULT_POPUP_MENU_DISPLACEMENT) { + *x = point->x; + } + + if (point->y != EEL_DEFAULT_POPUP_MENU_DISPLACEMENT) { + *y = point->y; + } + + /* FIXME push_in? whats that? */ + + g_free (point); + } +} + /** * eel_pop_up_context_menu: * @@ -492,13 +513,15 @@ eel_pop_up_context_menu (GtkMenu *m gint16 offset_y, GdkEventButton *event) { - GdkPoint offset; + GdkPoint *offset; int button; g_return_if_fail (GTK_IS_MENU (menu)); + + offset = (GdkPoint *) g_new0 (GdkPoint, 1); - offset.x = offset_x; - offset.y = offset_y; + offset->x = offset_x; + offset->y = offset_y; /* The event button needs to be 0 if we're popping up this menu from * a button release, else a 2nd click outside the menu with any button @@ -517,8 +540,8 @@ eel_pop_up_context_menu (GtkMenu *m gtk_menu_popup (menu, /* menu */ NULL, /* parent_menu_shell */ NULL, /* parent_menu_item */ - NULL, - &offset, /* data */ + (GtkMenuPositionFunc) popup_menu_callback, + offset, /* data */ button, /* button */ event ? event->time : GDK_CURRENT_TIME); /* activate_time */
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil