From f29db51778b0603f73a6e9891c10f234daabcf70 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Tue, 24 Mar 1998 05:25:56 +0000 Subject: [PATCH] cwd input line works/filter handling works/clipping label widget/flashing removed -mig --- gnome/ChangeLog | 10 ++++ gnome/Makefile.in | 9 ++- gnome/gcliplabel.c | 137 +++++++++++++++++++++++++++++++++++++++++++++ gnome/gcliplabel.h | 42 ++++++++++++++ gnome/gdesktop.c | 12 ++-- gnome/glayout.c | 1 + gnome/gmain.c | 32 ++++++++--- gnome/gscreen.c | 104 ++++++++++++++++------------------ gnome/gwidget.c | 1 - src/panel.h | 4 +- 10 files changed, 277 insertions(+), 75 deletions(-) create mode 100644 gnome/gcliplabel.c create mode 100644 gnome/gcliplabel.h diff --git a/gnome/ChangeLog b/gnome/ChangeLog index 9c0ac471b..144c00a87 100644 --- a/gnome/ChangeLog +++ b/gnome/ChangeLog @@ -1,3 +1,13 @@ +1998-03-23 Miguel de Icaza + + * gscreen.c (x_fill_panel): Colors are properly displayed now. + + Use the clipped labels. + + * gcliplabel.c, gcliplabel.h: Derived label that does label + clipping (it does not request the allocation for the whole string, + but settles with whatever is provided in the size_allocation). + 1998-03-23 Federico Mena Quintero * gtrans.c (create_transparent_text_window): Set the window's diff --git a/gnome/Makefile.in b/gnome/Makefile.in index 7e93a74b9..1a64650b5 100644 --- a/gnome/Makefile.in +++ b/gnome/Makefile.in @@ -31,7 +31,8 @@ GNOMESRCS = \ gcmd.c \ gprop.c \ gmc-chargrid.c \ - gpageprop.c + gpageprop.c \ + gcliplabel.c GNOMEHDRS = \ gmain.h \ @@ -42,7 +43,8 @@ GNOMEHDRS = \ gcmd.h \ gprop.h \ gpageprop.h \ - gmc-chargrid.h + gmc-chargrid.h \ + gcliplabel.h ICONS = \ $(srcdir)/directory-ok.xpm \ @@ -83,7 +85,8 @@ OBJS = $(LOBJS) $(OOBJS) \ gmc-chargrid.o \ gview.o \ gprop.o \ - gpageprop.o + gpageprop.o \ + gcliplabel.o # # Distribution variables diff --git a/gnome/gcliplabel.c b/gnome/gcliplabel.c new file mode 100644 index 000000000..c85f3a1a4 --- /dev/null +++ b/gnome/gcliplabel.c @@ -0,0 +1,137 @@ +/* + * (C) 1998 The Free Software Foundation + * + * Author: Miguel de Icaza (miguel@kernel.org) + * + * Clipped label: This label is differnt from the one on Gtk as it + * does requests no space, but uses all that is given to it. + * + * It does not queue an resize when changing the text. + * */ + +#include +#include "gcliplabel.h" + + +static void gtk_clip_label_class_init (GtkClipLabelClass *klass); +static void gtk_clip_label_size_request (GtkWidget *widget, + GtkRequisition *requisition); +static void gtk_clip_label_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); + +static GtkLabelClass *parent_class = NULL; + +guint +gtk_clip_label_get_type () +{ + static guint label_type = 0; + + if (!label_type) + { + GtkTypeInfo clip_label_info = + { + "GtkClipLabel", + sizeof (GtkClipLabel), + sizeof (GtkClipLabelClass), + (GtkClassInitFunc) gtk_clip_label_class_init, + (GtkObjectInitFunc) NULL, + (GtkArgSetFunc) NULL, + (GtkArgGetFunc) NULL + }; + + label_type = gtk_type_unique (gtk_label_get_type (), &clip_label_info); + } + + return label_type; +} + +static void +gtk_clip_label_class_init (GtkClipLabelClass *class) +{ + GtkWidgetClass *widget_class; + + parent_class = gtk_type_class (gtk_label_get_type ()); + + widget_class = (GtkWidgetClass*) class; + widget_class->size_request = gtk_clip_label_size_request; + widget_class->size_allocate = gtk_clip_label_size_allocate; +} + +void +gtk_clip_label_set (GtkLabel *label, + const char *str) +{ + char* p; + + g_return_if_fail (label != NULL); + g_return_if_fail (GTK_IS_LABEL (label)); + g_return_if_fail (str != NULL); + + if (label->label) + g_free (label->label); + label->label = g_strdup (str); + + if (label->row) + g_slist_free (label->row); + label->row = NULL; + label->row = g_slist_append (label->row, label->label); + p = label->label; + while ((p = strchr(p, '\n'))) + label->row = g_slist_append (label->row, ++p); + + if (GTK_WIDGET_VISIBLE (label)) + { + if (GTK_WIDGET_MAPPED (label)) + gdk_window_clear_area (GTK_WIDGET (label)->window, + GTK_WIDGET (label)->allocation.x, + GTK_WIDGET (label)->allocation.y, + GTK_WIDGET (label)->allocation.width, + GTK_WIDGET (label)->allocation.height); + gtk_widget_queue_draw (GTK_WIDGET (label)); + } +} + +GtkWidget* +gtk_clip_label_new (const char *str) +{ + GtkClipLabel *label; + + g_return_val_if_fail (str != NULL, NULL); + + label = gtk_type_new (gtk_clip_label_get_type ()); + + gtk_label_set (GTK_LABEL (label), str); + + return GTK_WIDGET (label); +} + +static void +gtk_clip_label_size_request (GtkWidget *widget, + GtkRequisition *requisition) +{ + GtkClipLabel *label; + GSList *row; + + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_CLIP_LABEL (widget)); + g_return_if_fail (requisition != NULL); + + label = GTK_CLIP_LABEL (widget); + + ((GtkWidgetClass *)parent_class)->size_request (widget, requisition); + + requisition->width = GTK_LABEL (label)->misc.xpad * 2; +} + +static void +gtk_clip_label_size_allocate (GtkWidget *widget, + GtkAllocation *alloc) +{ + ((GtkWidgetClass *)parent_class)->size_allocate (widget, alloc); + + widget->requisition.width = alloc->width; +} + + + + diff --git a/gnome/gcliplabel.h b/gnome/gcliplabel.h new file mode 100644 index 000000000..e0540fefb --- /dev/null +++ b/gnome/gcliplabel.h @@ -0,0 +1,42 @@ +#ifndef __GTK_CLIP_LABEL_H__ +#define __GTK_CLIP_LABEL_H__ + + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#define GTK_CLIP_LABEL(obj) GTK_CHECK_CAST (obj, gtk_clip_label_get_type (), GtkClipLabel) +#define GTK_CLIP_LABEL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_clip_label_get_type (), GtkClipLabelClass) +#define GTK_IS_CLIP_LABEL(obj) GTK_CHECK_TYPE (obj, gtk_clip_label_get_type ()) + + +typedef struct _GtkClipLabel GtkClipLabel; +typedef struct _GtkClipLabelClass GtkClipLabelClass; + +struct _GtkClipLabel +{ + GtkLabel misc; +}; + +struct _GtkClipLabelClass +{ + GtkLabelClass parent_class; +}; + + +guint gtk_clip_label_get_type (void); +GtkWidget* gtk_clip_label_new (const char *str); +void gtk_clip_label_set (GtkLabel *label, + const char *str); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* __GTK_CLIP_LABEL_H__ */ diff --git a/gnome/gdesktop.c b/gnome/gdesktop.c index bb204a6ac..03990908d 100644 --- a/gnome/gdesktop.c +++ b/gnome/gdesktop.c @@ -96,11 +96,13 @@ get_desktop_icon (char *pathname) fname = regex_command (x_basename (pathname), "Icon", 0, 0); /* Try the GNOME icon */ - full_fname = gnome_unconditional_pixmap_file (fname); - if (exist_file (full_fname)) - return full_fname; - g_free (full_fname); - + if (fname){ + full_fname = gnome_unconditional_pixmap_file (fname); + if (exist_file (full_fname)) + return full_fname; + g_free (full_fname); + } + /* Try a mc icon */ full_fname = concat_dir_and_file (ICONDIR, fname); if (exist_file (full_fname)) diff --git a/gnome/glayout.c b/gnome/glayout.c index b171d278a..1e444bd9b 100644 --- a/gnome/glayout.c +++ b/gnome/glayout.c @@ -17,6 +17,7 @@ #include "boxes.h" #include "panelize.h" #include "gcmd.h" +#include "gcliplabel.h" #define UNDEFINED_INDEX -1 diff --git a/gnome/gmain.c b/gnome/gmain.c index 0e54c6a69..6b0ace576 100644 --- a/gnome/gmain.c +++ b/gnome/gmain.c @@ -322,19 +322,35 @@ dialog_panel_callback (struct Dlg_head *h, int id, int msg) { WPanel *p; WInput *in; + void *current_widget; /* The widget.wdata of the current widget */ if (msg == DLG_KEY && id == '\n'){ if (h->current->widget->callback == (callback_fn) panel_callback) return 0; - /* - * If this was a keystroke, and the current widget is not the - * panel, it is the filter - */ - p = (WPanel *) h->current->next->widget; - in = (WInput *) h->current->widget; - - set_panel_filter_to (p, strdup (in->buffer)); + /* Find out which one of the widgets is the WPanel */ + p = (WPanel *) find_widget_type (h, (callback_fn) panel_callback); + g_return_if_fail (p != 0); + + current_widget = (void *) h->current->widget; + + printf ("Got an enter\n"); + if (current_widget == p->filter_w){ + printf ("It is the filter\n"); + + in = (WInput *) current_widget; + set_panel_filter_to (p, strdup (in->buffer)); + } + + if (current_widget == p->current_dir){ + WInput *in = p->current_dir; + + do_panel_cd (p, in->buffer, cd_parse_command); + assign_text (in, p->cwd); + update_input (in); + + return MSG_HANDLED; + } } return default_dlg_callback (h, id, msg); } diff --git a/gnome/gscreen.c b/gnome/gscreen.c index 214068365..111139877 100644 --- a/gnome/gscreen.c +++ b/gnome/gscreen.c @@ -29,6 +29,7 @@ #include "dialog.h" #include "gdesktop.h" #include "gpageprop.h" +#include "gcliplabel.h" /* The pixmaps */ #include "directory.xpm" @@ -70,7 +71,8 @@ repaint_file (WPanel *panel, int file_index, int move, int attr, int isstatus) void show_dir (WPanel *panel) { - gtk_entry_set_text (GTK_ENTRY (panel->current_dir), panel->cwd); + assign_text (panel->current_dir, panel->cwd); + update_input (panel->current_dir); } static void @@ -134,8 +136,8 @@ x_fill_panel (WPanel *panel) col++; } gtk_clist_append (cl, texts); - - color = file_entry_color (fe); + + color = file_compute_color (fe->f.marked ? MARKED : NORMAL, fe); panel_file_list_set_row_colors (cl, i, color); if (type_col != -1) panel_file_list_set_type_bitmap (cl, i, type_col, color, fe); @@ -191,7 +193,6 @@ x_select_item (WPanel *panel) gtk_clist_select_row (clist, panel->selected, 0); if (gtk_clist_row_is_visible (clist, panel->selected) != GTK_VISIBILITY_FULL){ - printf ("No fue visible %d\n", panel->selected); gtk_clist_moveto (clist, panel->selected, 0, 0.5, 0.0); } } @@ -205,8 +206,8 @@ x_unselect_item (WPanel *panel) void x_filter_changed (WPanel *panel) { - gtk_entry_set_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (panel->filter_w))), - panel->filter ? panel->filter : ""); + assign_text (panel->filter_w, panel->filter ? panel->filter : ""); + update_input (panel->filter_w); } void @@ -226,7 +227,7 @@ panel_file_list_configure_contents (GtkWidget *file_list, WPanel *panel, int mai int char_width, usable_pixels, extra_pixels, width; int total_columns, extra_columns; int expand_space, extra_space, shrink_space; - int lost_pixels; + int lost_pixels, display_the_mini_info; /* Pass 1: Count minimum columns, * set field_len to default to the requested_field_len @@ -264,7 +265,16 @@ panel_file_list_configure_contents (GtkWidget *file_list, WPanel *panel, int mai } else extra_space = expand_space = 0; + /* Hack: the default mini-info display only gets displayed + * if panel->estimated_total is not zero, ie, if this has been + * initialized for the first time. + */ + + display_the_mini_info = (panel->estimated_total == 0); panel->estimated_total = total_columns; + + if (display_the_mini_info) + display_mini_info (panel); /* If we dont have enough space, shorten the fields */ if (used_columns > total_columns){ @@ -672,7 +682,6 @@ panel_build_selected_file_list (WPanel *panel, int *file_list_len) if (panel->dir.list [i].f.marked) total_len += (cwdlen + panel->dir.list [i].fnamelen + 1); - printf ("Total lenght: %d\n", total_len); data = copy = xmalloc (total_len, "build_selected_file_list"); for (i = 0; i < panel->count; i++) if (panel->dir.list [i].f.marked){ @@ -715,8 +724,6 @@ panel_drag_request (GtkWidget *widget, GdkEventDragRequest *event, WPanel *panel static void panel_drop_enter (GtkWidget *widget, GdkEvent *event) { - printf ("%s\n", event->type == GDK_DROP_ENTER ? "DROP ENTER" : - (event->type == GDK_DROP_LEAVE ? "DROP LEAVE" : "?")); } static void @@ -902,14 +909,8 @@ panel_switch_new_display_mode (WPanel *panel) panel_update_contents (panel); } -static void -change_cwd (GtkWidget *entry, WPanel *panel) -{ - printf ("Cambiando a...%s\n", "xxx"); -} - static GtkWidget * -panel_create_cwd (Dlg_head *h, WPanel *panel, GtkWidget **the_entry) +panel_create_cwd (Dlg_head *h, WPanel *panel, void **entry) { WInput *in; @@ -919,11 +920,7 @@ panel_create_cwd (Dlg_head *h, WPanel *panel, GtkWidget **the_entry) /* Force the creation of the gtk widget */ send_message_to (h, (Widget *) in, WIDGET_INIT, 0); - *the_entry = gnome_entry_gtk_entry (GNOME_ENTRY (in->widget.wdata)); - gtk_signal_connect (GTK_OBJECT (*the_entry), - "activate", - GTK_SIGNAL_FUNC (change_cwd), panel); - + *entry = in; return GTK_WIDGET (in->widget.wdata); } @@ -932,7 +929,7 @@ panel_change_filter (GtkWidget *entry, WPanel *panel) { char *reg_exp; - reg_exp = gtk_entry_get_text (GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (entry)))); + reg_exp = ((WInput *)panel->filter_w)->buffer; set_panel_filter_to (panel, strdup (reg_exp)); } @@ -1098,11 +1095,11 @@ void display_mini_info (WPanel *panel) { GtkLabel *label = GTK_LABEL (panel->ministatus); - + if (panel->searching){ char *str = copy_strings ("Search: ", panel->search_buffer, NULL); - gtk_label_set (label, str); + gtk_clip_label_set (label, str); free (str); return; } @@ -1110,11 +1107,12 @@ display_mini_info (WPanel *panel) if (panel->marked){ char buffer [120]; - sprintf (buffer, " %s bytes in %d files%s", + sprintf (buffer, " %s bytes in %d file%s", size_trunc_sep (panel->total), panel->marked, panel->marked == 1 ? "" : "s"); - gtk_label_set (label, buffer); + gtk_clip_label_set (label, buffer); + return; } if (S_ISLNK (panel->dir.list [panel->selected].buf.st_mode)){ @@ -1130,10 +1128,10 @@ display_mini_info (WPanel *panel) link_target [len] = 0; str = copy_strings ("-> ", link_target, NULL); - gtk_label_set (label, str); + gtk_clip_label_set (label, str); free (str); } else - gtk_label_set (label, ""); + gtk_clip_label_set (label, ""); return; } @@ -1144,14 +1142,13 @@ display_mini_info (WPanel *panel) buffer = xmalloc (len + 2, "display_mini_info"); format_file (buffer, panel, panel->selected, panel->estimated_total-2, 0, 1); buffer [len] = 0; - gtk_label_set (label, buffer); - + gtk_clip_label_set (label, buffer); free (buffer); } } static GtkWidget * -panel_create_filter (Dlg_head *h, WPanel *panel, GtkWidget **filter_w) +panel_create_filter (Dlg_head *h, WPanel *panel, void **filter_w) { GtkWidget *fhbox; GtkWidget *button; @@ -1191,18 +1188,9 @@ panel_create_filter (Dlg_head *h, WPanel *panel, GtkWidget **filter_w) /* Force the creation of the gtk widget */ send_message_to (h, (Widget *) in, WIDGET_INIT, 0); - *filter_w = (GtkWidget *) in->widget.wdata; + *filter_w = in; - /* We do not want the focus by default (and the previos add_widget just gave it to us) */ - h->current = h->current->prev; - - gtk_signal_connect (GTK_OBJECT (gnome_entry_gtk_entry (GNOME_ENTRY (*filter_w))), - "activate", - GTK_SIGNAL_FUNC (panel_change_filter), - panel); - - gtk_box_pack_start (GTK_BOX (fhbox), *filter_w, TRUE, TRUE, 0); - gtk_widget_show (*filter_w); + gtk_box_pack_start (GTK_BOX (fhbox), GTK_WIDGET (in->widget.wdata), TRUE, TRUE, 0); return fhbox; } @@ -1211,33 +1199,38 @@ void x_create_panel (Dlg_head *h, widget_data parent, WPanel *panel) { GtkWidget *status_line, *filter, *vbox; - GtkWidget *ministatus_align, *frame, *cwd; + GtkWidget *frame, *cwd; panel->table = gtk_table_new (2, 1, 0); panel->list = panel_create_file_list (panel); + filter = panel_create_filter (h, panel, &panel->filter_w); cwd = panel_create_cwd (h, panel, &panel->current_dir); - - filter = panel_create_filter (h, panel, (GtkWidget **) &panel->filter_w); + + /* We do not want the focus by default (and the previos add_widget just gave it to us) */ + h->current = h->current->prev; /* ministatus */ - ministatus_align = gtk_alignment_new (0.0, 0.0, 1.0, 1.0); - panel->ministatus = gtk_label_new (""); - gtk_container_add (GTK_CONTAINER (ministatus_align), panel->ministatus); - + panel->ministatus = gtk_clip_label_new (""); + gtk_misc_set_alignment (GTK_MISC (panel->ministatus), 0.0, 0.0); + gtk_misc_set_padding (GTK_MISC (panel->ministatus), 3, 0); status_line = gtk_hbox_new (0, 0); - + gtk_label_set_justify (GTK_LABEL (panel->ministatus), GTK_JUSTIFY_LEFT); gtk_box_pack_start (GTK_BOX (status_line), cwd, 1, 1, 0); gtk_box_pack_end (GTK_BOX (status_line), filter, 0, 0, 0); - + /* The statusbar */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_border_width (GTK_CONTAINER (frame), 3); - panel->status = gtk_label_new (""); + + panel->status = gtk_clip_label_new (""); + gtk_misc_set_alignment (GTK_MISC (panel->status), 0.0, 0.5); + gtk_misc_set_padding (GTK_MISC (panel->status), 3, 0); gtk_container_add (GTK_CONTAINER (frame), panel->status); - + gtk_label_set_justify (GTK_LABEL (panel->status), GTK_JUSTIFY_LEFT); + gtk_table_attach (GTK_TABLE (panel->table), panel->list, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_EXPAND | GTK_FILL | GTK_SHRINK, @@ -1246,10 +1239,9 @@ x_create_panel (Dlg_head *h, widget_data parent, WPanel *panel) gtk_table_attach (GTK_TABLE (panel->table), status_line, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0); - gtk_table_attach (GTK_TABLE (panel->table), ministatus_align, 0, 1, 2, 3, + gtk_table_attach (GTK_TABLE (panel->table), panel->ministatus, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0, 0); - gtk_table_attach (GTK_TABLE (panel->table), frame, 0, 1, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 0); diff --git a/gnome/gwidget.c b/gnome/gwidget.c index abd4f9a29..01be7fdb5 100644 --- a/gnome/gwidget.c +++ b/gnome/gwidget.c @@ -259,7 +259,6 @@ x_update_input (WInput *in) return; gtk_entry_set_text (entry, in->buffer); - printf ("POniendo el putno en %d\n", in->point); gtk_entry_set_position (entry, in->point); gtk_widget_draw (GTK_WIDGET (gnome_entry), NULL); } diff --git a/src/panel.h b/src/panel.h index cfcc631a9..145210069 100644 --- a/src/panel.h +++ b/src/panel.h @@ -112,11 +112,11 @@ typedef struct { /* These are standard GtkWidgets */ void *table; void *list; - void *current_dir; - void *filter_w; void *status; void *ministatus; + void *filter_w; /* A WInput* */ + void *current_dir; /* A WInput* */ int estimated_total; #endif } WPanel;