From 24482e66283b1e00240866eaf73d46308de0ee57 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sat, 24 Jul 1999 16:41:54 +0000 Subject: [PATCH] r30: When you open a menu with nothing selected, the item under the pointer is selected until the menu is closed. Icons are positioned vertically according to their heights (and are trimmed if too tall). --- ROX-Filer/src/dnd.c | 1 + ROX-Filer/src/filer.c | 18 ++++++++++++++---- ROX-Filer/src/filer.h | 2 ++ ROX-Filer/src/menu.c | 41 ++++++++++++++++++++++++++++++++++++----- ROX-Filer/src/menu.h | 3 ++- 5 files changed, 55 insertions(+), 10 deletions(-) diff --git a/ROX-Filer/src/dnd.c b/ROX-Filer/src/dnd.c index 50315462..14f465b2 100644 --- a/ROX-Filer/src/dnd.c +++ b/ROX-Filer/src/dnd.c @@ -355,6 +355,7 @@ void drag_data_get(GtkWidget *widget, filer_window); to_send = string->str; to_send_length = string->len; + delete_once_sent = TRUE; g_string_free(string, FALSE); break; default: diff --git a/ROX-Filer/src/filer.c b/ROX-Filer/src/filer.c index f8900fae..8854611a 100644 --- a/ROX-Filer/src/filer.c +++ b/ROX-Filer/src/filer.c @@ -28,6 +28,8 @@ #include "apps.h" #include "mount.h" +#define MAX_ICON_HEIGHT 42 + FilerWindow *window_with_focus = NULL; /* When a child process that changes a directory dies we need to know @@ -258,6 +260,7 @@ static void add_item(FilerWindow *filer_window, char *leafname) /* XXX: Must be a better way... */ item->pix_width = ((GdkPixmapPrivate *) item->image->pixmap)->width; + item->pix_height = ((GdkPixmapPrivate *) item->image->pixmap)->height; item_width = MAX(item->pix_width, item->text_width) + 4; @@ -306,16 +309,21 @@ static void draw_item(GtkWidget *widget, if (item->image) { + int image_y; + gdk_gc_set_clip_mask(gc, item->image->mask); - gdk_gc_set_clip_origin(gc, image_x, area->y + 8); + + image_y = MAX(0, MAX_ICON_HEIGHT - item->pix_height); + gdk_gc_set_clip_origin(gc, image_x, area->y + image_y); gdk_draw_pixmap(widget->window, gc, item->image->pixmap, 0, 0, /* Source x,y */ - image_x, area->y + 8, /* Dest x,y */ - -1, -1); + image_x, area->y + image_y, /* Dest x,y */ + -1, MIN(item->pix_height, MAX_ICON_HEIGHT)); if (item->flags & ITEM_FLAG_SYMLINK) { + gdk_gc_set_clip_origin(gc, image_x, area->y + 8); gdk_gc_set_clip_mask(gc, default_pixmap[TYPE_SYMLINK].mask); gdk_draw_pixmap(widget->window, gc, @@ -329,6 +337,7 @@ static void draw_item(GtkWidget *widget, int type = item->flags & ITEM_FLAG_MOUNTED ? TYPE_MOUNTED : TYPE_UNMOUNTED; + gdk_gc_set_clip_origin(gc, image_x, area->y + 8); gdk_gc_set_clip_mask(gc, default_pixmap[type].mask); gdk_draw_pixmap(widget->window, gc, @@ -361,7 +370,7 @@ static void draw_item(GtkWidget *widget, void show_menu(Collection *collection, GdkEventButton *event, int item, gpointer user_data) { - show_filer_menu((FilerWindow *) user_data, event); + show_filer_menu((FilerWindow *) user_data, event, item); } void scan_dir(FilerWindow *filer_window) @@ -507,6 +516,7 @@ void filer_opendir(char *path, gboolean panel, Side panel_side) filer_window->dir = NULL; /* Not scanning */ filer_window->panel = panel; filer_window->panel_side = panel_side; + filer_window->temp_item_selected = FALSE; filer_window->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); diff --git a/ROX-Filer/src/filer.h b/ROX-Filer/src/filer.h index 6aa2ec04..1a4e496d 100644 --- a/ROX-Filer/src/filer.h +++ b/ROX-Filer/src/filer.h @@ -33,6 +33,7 @@ struct _FilerWindow char *path; /* pathname */ Collection *collection; gboolean panel; + gboolean temp_item_selected; Side panel_side; /* Scanning */ @@ -49,6 +50,7 @@ struct _FileItem int text_width; int pix_width; + int pix_height; MaskedPixmap *image; }; diff --git a/ROX-Filer/src/menu.c b/ROX-Filer/src/menu.c index abc69e81..cf0e3c78 100644 --- a/ROX-Filer/src/menu.c +++ b/ROX-Filer/src/menu.c @@ -27,6 +27,8 @@ GtkAccelGroup *panel_keys; /* Static prototypes */ static void position_menu(GtkMenu *menu, gint *x, gint *y, gpointer data); +static void menu_closed(GtkWidget *widget); + static void refresh(gpointer data, guint action, GtkWidget *widget); static void mount(gpointer data, guint action, GtkWidget *widget); static void delete(gpointer data, guint action, GtkWidget *widget); @@ -100,27 +102,34 @@ void menu_init() filer_keys = gtk_accel_group_new(); item_factory = gtk_item_factory_new(GTK_TYPE_MENU, - "", + "", filer_keys); gtk_item_factory_create_items(item_factory, sizeof(filer_menu_def) / sizeof(*filer_menu_def), filer_menu_def, NULL); - filer_menu = gtk_item_factory_get_widget(item_factory, ""); + filer_menu = gtk_item_factory_get_widget(item_factory, ""); panel_keys = gtk_accel_group_new(); item_factory = gtk_item_factory_new(GTK_TYPE_MENU, - "", + "", panel_keys); gtk_item_factory_create_items(item_factory, sizeof(panel_menu_def) / sizeof(*panel_menu_def), panel_menu_def, NULL); - panel_menu = gtk_item_factory_get_widget(item_factory, ""); + panel_menu = gtk_item_factory_get_widget(item_factory, ""); menurc = choices_find_path_load("menus"); if (menurc) gtk_item_factory_parse_rc(menurc); + + gtk_signal_connect(GTK_OBJECT(panel_menu), "unmap_event", + GTK_SIGNAL_FUNC(menu_closed), NULL); + gtk_signal_connect(GTK_OBJECT(filer_menu), "unmap_event", + GTK_SIGNAL_FUNC(menu_closed), NULL); + + gtk_accel_group_lock(panel_keys); } /* Save the keybindings... */ @@ -161,7 +170,8 @@ static void position_menu(GtkMenu *menu, gint *x, gint *y, gpointer data) *y = CLAMP(*y, 0, sheight - requisition.height); } -void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event) +void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event, + int item) { int pos[] = {event->x_root, event->y_root}; @@ -178,12 +188,33 @@ void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event) } } + if (filer_window->panel) + collection_clear_selection(filer_window->collection); + if (filer_window->collection->number_selected == 0 && item >= 0) + { + collection_select_item(filer_window->collection, item); + filer_window->temp_item_selected = TRUE; + } + else + filer_window->temp_item_selected = FALSE; + gtk_menu_popup(filer_window->panel ? GTK_MENU(panel_menu) : GTK_MENU(filer_menu), NULL, NULL, position_menu, (gpointer) pos, event->button, event->time); } +static void menu_closed(GtkWidget *widget) +{ + g_return_if_fail(window_with_focus != NULL); + + if (window_with_focus->temp_item_selected) + { + collection_clear_selection(window_with_focus->collection); + window_with_focus->temp_item_selected = FALSE; + } +} + /* Actions */ static void refresh(gpointer data, guint action, GtkWidget *widget) diff --git a/ROX-Filer/src/menu.h b/ROX-Filer/src/menu.h index 300c01e1..c5fabe00 100644 --- a/ROX-Filer/src/menu.h +++ b/ROX-Filer/src/menu.h @@ -9,4 +9,5 @@ extern GtkAccelGroup *filer_keys; void menu_init(void); void menu_finish(void); -void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event); +void show_filer_menu(FilerWindow *filer_window, GdkEventButton *event, + int item); -- 2.11.4.GIT