summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Hertzfeld <andy@src.gnome.org>2001-01-04 03:12:38 +0000
committerAndy Hertzfeld <andy@src.gnome.org>2001-01-04 03:12:38 +0000
commitc612160a293468bd88512ca7dfa241e29c129419 (patch)
tree5baa9df5669bd1814c53128c60c57fa81a8b6c78
parent1adcc36e4a555f5aa432db9a552a8a118b872c41 (diff)
downloadnautilus-c612160a293468bd88512ca7dfa241e29c129419.tar.gz
tweaked broken stop-on-criticals stuff
* components/rss-control/main.c: (main): tweaked broken stop-on-criticals stuff * components/rss-control/nautilus-rss-control.c: (free_rss_data_item), (nautilus_rss_control_clear_items), (nautilus_rss_control_destroy), (rss_logo_callback), (rss_read_done_callback), (load_rss_file), (draw_rss_items), (nautilus_rss_control_button_press_event): made it extract urls for rss items and keep them in a structure, and then activate them when clicked. Also, keep around file handles in instance data so we can cancel any pending async I/O when the object is destroyed. * data/top/Makefile.am: add sample controls to novice home directory * data/top/Clock: sample control * data/top/Slashdot: sample control * src/file-manager/fm-icon-view.c: (get_icon_control_callback): added check for non-zero moniker length
-rw-r--r--ChangeLog25
-rw-r--r--components/rss-control/main.c2
-rw-r--r--components/rss-control/nautilus-rss-control.c86
-rw-r--r--data/top/Clock3
-rw-r--r--data/top/Makefile.am2
-rw-r--r--data/top/Slashdot3
-rw-r--r--src/file-manager/fm-icon-view.c2
7 files changed, 106 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index aaf98d43d..9e98a0393 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,30 @@
2001-01-03 Andy Hertzfeld <andy@eazel.com>
+ * components/rss-control/main.c: (main):
+ tweaked broken stop-on-criticals stuff
+
+ * components/rss-control/nautilus-rss-control.c:
+ (free_rss_data_item), (nautilus_rss_control_clear_items),
+ (nautilus_rss_control_destroy), (rss_logo_callback),
+ (rss_read_done_callback), (load_rss_file), (draw_rss_items),
+ (nautilus_rss_control_button_press_event):
+ made it extract urls for rss items and keep them in a structure,
+ and then activate them when clicked.
+
+ Also, keep around file handles in instance data so we can cancel
+ any pending async I/O when the object is destroyed.
+
+ * data/top/Makefile.am:
+ add sample controls to novice home directory
+ * data/top/Clock:
+ sample control
+ * data/top/Slashdot:
+ sample control
+ * src/file-manager/fm-icon-view.c: (get_icon_control_callback):
+ added check for non-zero moniker length
+
+2001-01-03 Andy Hertzfeld <andy@eazel.com>
+
* components/rss-control/nautilus-rss-control.c:
(nautilus_rss_control_initialize), (nautilus_rss_control_destroy),
(rss_read_done_callback), (nautilus_rss_control_draw),
diff --git a/components/rss-control/main.c b/components/rss-control/main.c
index 5af15140c..24e82e463 100644
--- a/components/rss-control/main.c
+++ b/components/rss-control/main.c
@@ -85,7 +85,7 @@ main (int argc, char *argv[])
"GnomeVFS-CORBA",
"GnomeVFS-pthread",
"Gtk",
- "GdkPixbuf",
+ "Gdk-Pixbuf",
"Nautilus",
"Nautilus-Authenticate",
"Nautilus-Tree",
diff --git a/components/rss-control/nautilus-rss-control.c b/components/rss-control/nautilus-rss-control.c
index 2869e4905..1bfade7ea 100644
--- a/components/rss-control/nautilus-rss-control.c
+++ b/components/rss-control/nautilus-rss-control.c
@@ -52,11 +52,15 @@
#include <libnautilus-extensions/nautilus-xml-extensions.h>
#include <libnautilus-extensions/nautilus-font-factory.h>
+/* private instance variables */
struct _NautilusRSSControlDetails {
char* rss_uri;
BonoboObject *control;
NautilusScalableFont *font;
+ NautilusReadFileHandle *load_file_handle;
+ NautilusPixbufLoadHandle *load_image_handle;
+
int items_v_offset;
char* title;
@@ -67,6 +71,14 @@ struct _NautilusRSSControlDetails {
GList *items;
};
+/* per item structure for rss items */
+typedef struct {
+ char *item_title;
+ char *item_url;
+
+} RSSItemData;
+
+#define RSS_ITEM_HEIGHT 15
static void nautilus_rss_control_initialize_class (NautilusRSSControlClass *klass);
static void nautilus_rss_control_initialize (NautilusRSSControl *view);
@@ -201,10 +213,18 @@ nautilus_rss_control_initialize (NautilusRSSControl *rss_control)
}
static void
-nautilus_rss_control_clear_items (NautilusRSSControl *rss_control)
+free_rss_data_item (RSSItemData *item)
{
+ g_free (item->item_title);
+ g_free (item->item_url);
+ g_free (item);
+}
+
+static void
+nautilus_rss_control_clear_items (NautilusRSSControl *rss_control)
+{
if (rss_control->details->items != NULL) {
- nautilus_g_list_free_deep (rss_control->details->items);
+ nautilus_g_list_free_deep_custom (rss_control->details->items, (GFunc) free_rss_data_item, NULL);
rss_control->details->items = NULL;
}
}
@@ -218,7 +238,15 @@ nautilus_rss_control_destroy (GtkObject *object)
g_free (rss_control->details->rss_uri);
g_free (rss_control->details->title);
g_free (rss_control->details->main_uri);
+
+ if (rss_control->details->load_file_handle != NULL) {
+ nautilus_read_file_cancel (rss_control->details->load_file_handle);
+ }
+ if (rss_control->details->load_image_handle != NULL) {
+ nautilus_cancel_gdk_pixbuf_load (rss_control->details->load_image_handle);
+ }
+
if (rss_control->details->logo != NULL) {
gdk_pixbuf_unref (rss_control->details->logo);
}
@@ -274,6 +302,8 @@ rss_logo_callback (GnomeVFSResult error, GdkPixbuf *pixbuf, gpointer callback_d
NautilusRSSControl *rss_control;
rss_control = NAUTILUS_RSS_CONTROL (callback_data);
+ rss_control->details->load_image_handle = NULL;
+
if (rss_control->details->logo) {
gdk_pixbuf_unref (rss_control->details->logo);
}
@@ -294,22 +324,24 @@ rss_read_done_callback (GnomeVFSResult result,
char *file_contents,
gpointer callback_data)
{
+ RSSItemData *item_parameters;
xmlDocPtr rss_document;
xmlNodePtr image_node, channel_node;
xmlNodePtr current_node, title_node, temp_node, uri_node;
char *image_uri, *title, *temp_str;
NautilusRSSControl *rss_control;
- NautilusPixbufLoadHandle *load_image_handle;
char *buffer;
+ rss_control = NAUTILUS_RSS_CONTROL (callback_data);
+ rss_control->details->load_file_handle = NULL;
+
/* make sure the read was successful */
if (result != GNOME_VFS_OK) {
g_assert (file_contents == NULL);
return;
}
- rss_control = NAUTILUS_RSS_CONTROL (callback_data);
/* Parse the rss file with gnome-xml. The gnome-xml parser requires a zero-terminated array. */
buffer = g_realloc (file_contents, file_size + 1);
@@ -348,7 +380,7 @@ rss_read_done_callback (GnomeVFSResult result,
if (uri_node != NULL) {
image_uri = xmlNodeGetContent (uri_node);
if (image_uri != NULL) {
- load_image_handle = nautilus_gdk_pixbuf_load_async (image_uri, rss_logo_callback, rss_control);
+ rss_control->details->load_image_handle = nautilus_gdk_pixbuf_load_async (image_uri, rss_logo_callback, rss_control);
xmlFree (image_uri);
}
}
@@ -361,9 +393,20 @@ rss_read_done_callback (GnomeVFSResult result,
if (nautilus_strcmp (current_node->name, "item") == 0) {
title_node = nautilus_xml_get_child_by_name (current_node, "title");
if (title_node) {
+ item_parameters = (RSSItemData*) g_new0 (RSSItemData, 1);
+
title = xmlNodeGetContent (title_node);
- rss_control->details->items = g_list_append (rss_control->details->items, g_strdup (title));
+ item_parameters->item_title = g_strdup (title);
xmlFree (title);
+ temp_node = nautilus_xml_get_child_by_name (current_node, "link");
+
+ if (temp_node) {
+ temp_str = xmlNodeGetContent (temp_node);
+ item_parameters->item_url = g_strdup (temp_str);
+ xmlFree (temp_str);
+ }
+
+ rss_control->details->items = g_list_append (rss_control->details->items, item_parameters);
}
}
current_node = current_node->next;
@@ -376,13 +419,13 @@ rss_read_done_callback (GnomeVFSResult result,
gtk_widget_queue_draw (GTK_WIDGET (rss_control));
}
-/* load the rs file asynchronously */
+/* load the rss file asynchronously */
static void
load_rss_file (NautilusRSSControl *rss_control)
{
char *title;
/* load the uri asynchrounously, calling a completion routine when completed */
- nautilus_read_entire_file_async (rss_control->details->rss_uri, rss_read_done_callback, rss_control);
+ rss_control->details->load_file_handle = nautilus_read_entire_file_async (rss_control->details->rss_uri, rss_read_done_callback, rss_control);
/* put up a title that's displayed while we wait */
title = g_strdup_printf ("Loading %s", rss_control->details->rss_uri);
@@ -497,6 +540,7 @@ static int
draw_rss_items (NautilusRSSControl *rss_control, GdkPixbuf *pixbuf, int v_offset)
{
GList *current_item;
+ RSSItemData *item_data;
int bullet_width, bullet_height;
int text_width, text_height, maximum_height;
@@ -515,9 +559,10 @@ draw_rss_items (NautilusRSSControl *rss_control, GdkPixbuf *pixbuf, int v_offset
while (current_item != NULL) {
/* draw the text */
+ item_data = (RSSItemData*) current_item->data;
nautilus_scalable_font_measure_text (rss_control->details->font,
12, 12,
- current_item->data, strlen (current_item->data),
+ item_data->item_title, strlen (item_data->item_title),
&text_width,
&text_height);
@@ -525,7 +570,7 @@ draw_rss_items (NautilusRSSControl *rss_control, GdkPixbuf *pixbuf, int v_offset
20, v_offset,
NULL,
12, 12,
- current_item->data, strlen (current_item->data),
+ item_data->item_title, strlen (item_data->item_title),
NAUTILUS_RGB_COLOR_BLACK,
NAUTILUS_OPACITY_NONE);
@@ -538,7 +583,7 @@ draw_rss_items (NautilusRSSControl *rss_control, GdkPixbuf *pixbuf, int v_offset
2, v_offset - 2, 1.0, 1.0, GDK_PIXBUF_ALPHA_BILEVEL, 192);
}
- v_offset += 15;
+ v_offset += RSS_ITEM_HEIGHT;
current_item = current_item->next;
if (v_offset > maximum_height) {
break;
@@ -609,16 +654,27 @@ nautilus_rss_control_expose (GtkWidget *widget, GdkEventExpose *event)
static gboolean
nautilus_rss_control_button_press_event (GtkWidget *widget, GdkEventButton *event)
{
+ GList *selected_item;
NautilusRSSControl *rss_control;
+ RSSItemData *item_data;
char *command;
- int result;
-
+ int result, which_item;
+
rss_control = NAUTILUS_RSS_CONTROL (widget);
-
- if (event->x < (widget->allocation.x + rss_control->details->items_v_offset)) {
+ if (event->y < (widget->allocation.y + rss_control->details->items_v_offset)) {
command = g_strdup_printf ("nautilus %s", rss_control->details->main_uri);
result = system (command);
g_free (command);
+ } else {
+ which_item = (event->y - (widget->allocation.y + rss_control->details->items_v_offset)) / RSS_ITEM_HEIGHT;
+ if (which_item < (int) g_list_length (rss_control->details->items)) {
+ selected_item = g_list_nth (rss_control->details->items, which_item);
+ item_data = (RSSItemData*) selected_item->data;
+
+ command = g_strdup_printf ("nautilus %s", item_data->item_url);
+ result = system (command);
+ g_free (command);
+ }
}
return FALSE;
diff --git a/data/top/Clock b/data/top/Clock
new file mode 100644
index 000000000..63a4033ea
--- /dev/null
+++ b/data/top/Clock
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<NAUTILUS_OBJECT NAUTILUS_LINK="Nautilus Link" CUSTOM_ICON="computer" LINK="hardware:overview"
+CONTROL_MONIKER="OAFIID:bonobo_clock:d42cc651-44ae-4f69-a10d-a0b6b2cc6ecc" CONTROL_DATA=""/>
diff --git a/data/top/Makefile.am b/data/top/Makefile.am
index 4587b716d..ba482cd22 100644
--- a/data/top/Makefile.am
+++ b/data/top/Makefile.am
@@ -4,8 +4,10 @@ topdir = $(datadir)/nautilus/top
top_DATA = \
.nautilus-metafile.xml \
+ Clock \
Computer \
Services \
+ Slashdot \
$(NULL)
EXTRA_DIST = $(top_DATA)
diff --git a/data/top/Slashdot b/data/top/Slashdot
new file mode 100644
index 000000000..843fbeab1
--- /dev/null
+++ b/data/top/Slashdot
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<NAUTILUS_OBJECT NAUTILUS_LINK="Nautilus Link" CUSTOM_ICON="computer" LINK="hardware:overview"
+CONTROL_MONIKER="OAFIID:nautilus_rss_control:1230" CONTROL_DATA="http://www.slashdot.org/slashdot.rdf"/>
diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c
index c285d7a7f..e2a8770a4 100644
--- a/src/file-manager/fm-icon-view.c
+++ b/src/file-manager/fm-icon-view.c
@@ -1656,7 +1656,7 @@ get_icon_control_callback (NautilusIconContainer *container,
path = gnome_vfs_get_local_path_from_uri (uri);
if (path != NULL) {
nautilus_link_local_get_component_info (path, &control_moniker, &control_data);
- if (control_moniker) {
+ if (control_moniker && strlen (control_moniker) > 0) {
g_message ("got moniker %s", control_moniker);
ui_container = fm_directory_view_get_bonobo_ui_container (FM_DIRECTORY_VIEW (icon_view));
*control = bonobo_widget_new_control (control_moniker, ui_container);