Browse Source

cwd input line works/filter handling works/clipping label widget/flashing removed -mig

Miguel de Icaza 27 years ago
parent
commit
f29db51778
10 changed files with 277 additions and 75 deletions
  1. 10 0
      gnome/ChangeLog
  2. 6 3
      gnome/Makefile.in
  3. 137 0
      gnome/gcliplabel.c
  4. 42 0
      gnome/gcliplabel.h
  5. 7 5
      gnome/gdesktop.c
  6. 1 0
      gnome/glayout.c
  7. 24 8
      gnome/gmain.c
  8. 48 56
      gnome/gscreen.c
  9. 0 1
      gnome/gwidget.c
  10. 2 2
      src/panel.h

+ 10 - 0
gnome/ChangeLog

@@ -1,3 +1,13 @@
+1998-03-23  Miguel de Icaza  <miguel@nuclecu.unam.mx>
+
+	* 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  <federico@nuclecu.unam.mx>
 
 	* gtrans.c (create_transparent_text_window): Set the window's

+ 6 - 3
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

+ 137 - 0
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 <string.h>
+#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;
+}
+
+
+
+

+ 42 - 0
gnome/gcliplabel.h

@@ -0,0 +1,42 @@
+#ifndef __GTK_CLIP_LABEL_H__
+#define __GTK_CLIP_LABEL_H__
+
+
+#include <gdk/gdk.h>
+#include <gtk/gtklabel.h>
+
+#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__ */

+ 7 - 5
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))

+ 1 - 0
gnome/glayout.c

@@ -17,6 +17,7 @@
 #include "boxes.h"
 #include "panelize.h"
 #include "gcmd.h"
+#include "gcliplabel.h"
 
 #define UNDEFINED_INDEX -1
 

+ 24 - 8
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);
 }

+ 48 - 56
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, "<readlink failed>");
+			gtk_clip_label_set (label, "<readlink failed>");
 		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;
-
-	/* 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);
+	*filter_w = in;
 
-	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);

+ 0 - 1
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);
 }

+ 2 - 2
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;