1998-10-30 Federico Mena Quintero <federico@nuclecu.unam.mx>

* gdesktop.c: We are now using the new desktop icon code.  It is
	not yet complete, but what is there does work.  We have icon
	creation, auto-layout and snapping.  Next step is drag and drop
	and popup menus.

	* glayout.c: #ifdef out the stuff that uses the old desktop code.
	I will replace it gradually.
	* gmain.c: Likewise.
	* gscreen.c: Likewise.
This commit is contained in:
Miguel de Icaza 1998-10-30 23:22:35 +00:00
parent 8e3b730338
commit f64d6da2e4
7 changed files with 210 additions and 18 deletions

View File

@ -1,3 +1,15 @@
1998-10-30 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gdesktop.c: We are now using the new desktop icon code. It is
not yet complete, but what is there does work. We have icon
creation, auto-layout and snapping. Next step is drag and drop
and popup menus.
* glayout.c: #ifdef out the stuff that uses the old desktop code.
I will replace it gradually.
* gmain.c: Likewise.
* gscreen.c: Likewise.
1998-10-27 Miguel de Icaza <miguel@nuclecu.unam.mx> 1998-10-27 Miguel de Icaza <miguel@nuclecu.unam.mx>
* gscreen.c (panel_icon_list_button_release): Remove unused * gscreen.c (panel_icon_list_button_release): Remove unused

View File

@ -118,7 +118,7 @@ desktop_icon_init (DesktopIcon *dicon)
dicon->text = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (dicon->canvas)), dicon->text = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (dicon->canvas)),
gnome_icon_text_item_get_type (), gnome_icon_text_item_get_type (),
NULL); NULL);
gnome_icon_text_item_select (GNOME_ICON_TEXT_ITEM (dicon->text), TRUE);
dicon->w_changed_id = gtk_signal_connect (GTK_OBJECT (dicon->text), "width_changed", dicon->w_changed_id = gtk_signal_connect (GTK_OBJECT (dicon->text), "width_changed",
(GtkSignalFunc) size_changed, (GtkSignalFunc) size_changed,
dicon); dicon);
@ -203,7 +203,7 @@ set_text (DesktopIcon *dicon, char *text)
gnome_icon_text_item_configure (GNOME_ICON_TEXT_ITEM (dicon->text), gnome_icon_text_item_configure (GNOME_ICON_TEXT_ITEM (dicon->text),
0, icon_height + SPACING, 0, icon_height + SPACING,
#if 0 #if 1
DESKTOP_SNAP_X, DESKTOP_SNAP_X,
#else #else
SNAP_X, SNAP_X,
@ -306,7 +306,7 @@ create_window_shape (DesktopIcon *dicon, int icon_width, int icon_height, int te
im = GNOME_CANVAS_IMAGE (dicon->icon)->im; im = GNOME_CANVAS_IMAGE (dicon->icon)->im;
gdk_imlib_render (im, icon_width, icon_height); gdk_imlib_render (im, icon_width, icon_height);
im_mask = gdk_imlib_move_mask (im); im_mask = gdk_imlib_move_mask (im);
#if 0 #if 1
if (im_mask && desktop_use_shaped_icons) { if (im_mask && desktop_use_shaped_icons) {
#else #else
if (im_mask && want_transparent_icons) { if (im_mask && want_transparent_icons) {
@ -372,7 +372,7 @@ desktop_icon_reshape (DesktopIcon *dicon)
text_height = y2 - y1 + 1; text_height = y2 - y1 + 1;
/* Calculate new size of widget */ /* Calculate new size of widget */
#if 0 #if 1
dicon->width = MAX (icon_width, DESKTOP_SNAP_X); dicon->width = MAX (icon_width, DESKTOP_SNAP_X);
#else #else
dicon->width = MAX (icon_width, SNAP_X); dicon->width = MAX (icon_width, SNAP_X);

View File

@ -5,11 +5,14 @@
* Authors: Federico Mena <federico@nuclecu.unam.mx> * Authors: Federico Mena <federico@nuclecu.unam.mx>
* Miguel de Icaza <miguel@nuclecu.unam.mx> * Miguel de Icaza <miguel@nuclecu.unam.mx>
*/ */
#if 0 #if 1
#include <config.h> #include <config.h>
#include <gnome.h> #include <gnome.h>
#include "dialog.h"
#include "gdesktop.h" #include "gdesktop.h"
#include "gdesktop-icon.h"
#include "gmetadata.h" #include "gmetadata.h"
#include "fs.h"
#include "../vfs/vfs.h" #include "../vfs/vfs.h"
@ -35,14 +38,92 @@ int desktop_snap_icons = FALSE;
/* The computed name of the user's desktop directory */ /* The computed name of the user's desktop directory */
static char *desktop_directory; static char *desktop_directory;
/* Layout information: number of rows/columns for the layout slots, and the array of slots */ /* Layout information: number of rows/columns for the layout slots, and the array of slots. Each
* slot is an integer that specifies the number of icons that belong to that slot.
*/
static int layout_cols; static int layout_cols;
static int layout_rows; static int layout_rows;
static int *layout_slots; static int *layout_slots;
/* The list of desktop icons */ /* The list of desktop icons (desktop_icon_info structures) */
static GList *desktop_icons; static GList *desktop_icons;
#define l_slots(x, y) (layout_slots[(x) * layout_rows + (y)])
/* Looks for a free slot in the layout_slots array and returns the coordinates that coorespond to
* it. "Free" means it either has zero icons in it, or it has the minimum number of icons of all
* the slots.
*/
static void
get_icon_auto_pos (int *x, int *y)
{
int min, min_x, min_y;
int u, v;
int val;
min = l_slots (0, 0);
min_x = min_y = 0;
for (u = 0; u < layout_cols; u++)
for (v = 0; v < layout_rows; v++) {
val = l_slots (u, v);
if (val == 0) {
/* Optimization: if it is zero, return immediately */
*x = u * DESKTOP_SNAP_X;
*y = v * DESKTOP_SNAP_Y;
return;
} else if (val < min) {
min = val;
min_x = u;
min_y = v;
}
}
*x = min_x * DESKTOP_SNAP_X;
*y = min_y * DESKTOP_SNAP_Y;
}
/* Snaps the specified position to the icon grid. It looks for the closest free spot on the grid,
* or the closest one that has the least number of icons in it.
*/
static void
get_icon_snap_pos (int *x, int *y)
{
int min, min_x, min_y;
int min_dist;
int sx, sy;
int u, v;
int val, dist;
int dx, dy;
min = l_slots (0, 0);
min_x = min_y = 0;
min_dist = INT_MAX;
sx = DESKTOP_SNAP_X * (*x / DESKTOP_SNAP_X);
sy = DESKTOP_SNAP_Y * (*y / DESKTOP_SNAP_Y);
for (u = 0; u < layout_cols; u++)
for (v = 0; v < layout_rows; v++) {
val = l_slots (u, v);
dx = sx - u;
dy = sy - v;
dist = dx * dx + dy * dy;
if (((val == min) && (dist < min_dist)) || (val < min)) {
min_dist = dist;
min_x = u;
min_y = v;
}
}
*x = min_x * DESKTOP_SNAP_X;
*y = min_y * DESKTOP_SNAP_Y;
}
/* Places a desktop icon. If auto_pos is true, then the function will look for a place to position /* Places a desktop icon. If auto_pos is true, then the function will look for a place to position
* the icon automatically, else it will use the specified coordinates, snapped to the grid if the * the icon automatically, else it will use the specified coordinates, snapped to the grid if the
@ -51,14 +132,31 @@ static GList *desktop_icons;
static void static void
desktop_icon_info_place (struct desktop_icon_info *dii, int auto_pos, int xpos, int ypos) desktop_icon_info_place (struct desktop_icon_info *dii, int auto_pos, int xpos, int ypos)
{ {
/* FIXME */ int u, v;
if (auto_pos)
get_icon_auto_pos (&xpos, &ypos);
else if (desktop_snap_icons)
get_icon_snap_pos (&xpos, &ypos);
/* Increase the number of icons in the corresponding slot */
u = xpos / DESKTOP_SNAP_X;
v = ypos / DESKTOP_SNAP_Y;
l_slots (u, v)++;
/* Move the icon */
dii->x = xpos;
dii->y = ypos;
gtk_widget_set_uposition (dii->dicon, xpos, ypos);
} }
/* Creates a new desktop icon. The filename is the pruned filename inside the desktop directory. /* Creates a new desktop icon. The filename is the pruned filename inside the desktop directory.
* If auto_pos is true, then the function will look for a place to position the icon automatically, * If auto_pos is true, then the function will look for a place to position the icon automatically,
* else it will use the specified coordinates. * else it will use the specified coordinates. It does not show the icon.
*/ */
static void static struct desktop_icon_info *
desktop_icon_info_new (char *filename, int auto_pos, int xpos, int ypos) desktop_icon_info_new (char *filename, int auto_pos, int xpos, int ypos)
{ {
struct desktop_icon_info *dii; struct desktop_icon_info *dii;
@ -69,7 +167,7 @@ desktop_icon_info_new (char *filename, int auto_pos, int xpos, int ypos)
icon_name = meta_get_icon_for_file (full_name); icon_name = meta_get_icon_for_file (full_name);
dii = g_new (struct desktop_icon_info, 1); dii = g_new (struct desktop_icon_info, 1);
dii->widget = desktop_icon_new (icon_name, filename); dii->dicon = desktop_icon_new (icon_name, filename);
dii->filename = g_strdup (filename); dii->filename = g_strdup (filename);
dii->selected = FALSE; dii->selected = FALSE;
@ -77,15 +175,39 @@ desktop_icon_info_new (char *filename, int auto_pos, int xpos, int ypos)
g_free (icon_name); g_free (icon_name);
desktop_icon_info_place (dii, auto_pos, xpos, ypos); desktop_icon_info_place (dii, auto_pos, xpos, ypos);
gtk_widget_show (dii->dicon);
desktop_icons = g_list_append (desktop_icons, dii);
return dii;
}
/* Frees a desktop icon information structure, and destroy the icon widget. Does not remove the
* structure from the desktop_icons list!
*/
static void
desktop_icon_info_free (struct desktop_icon_info *dii)
{
int u, v;
gtk_widget_destroy (dii->dicon);
/* Decrease the number of icons in the corresponding slot */
u = dii->x / DESKTOP_SNAP_X;
v = dii->y / DESKTOP_SNAP_Y;
l_slots (u, v)--;
g_assert (l_slots (u, v) >= 0);
g_free (dii->filename);
g_free (dii);
} }
/* Creates the layout information array */ /* Creates the layout information array */
static void static void
create_layout_info (void) create_layout_info (void)
{ {
layout_cols = gdk_screen_width () / DESKTOP_SNAP_X; layout_cols = (gdk_screen_width () + DESKTOP_SNAP_X - 1) / DESKTOP_SNAP_X;
layout_rows = gdk_screen_height () / DESKTOP_SNAP_Y; layout_rows = (gdk_screen_height () + DESKTOP_SNAP_Y - 1) / DESKTOP_SNAP_Y;
layout_slots = g_new0 (int, layout_cols * layout_rows); layout_slots = g_new0 (int, layout_cols * layout_rows);
} }
@ -129,6 +251,8 @@ load_initial_desktop_icons (void)
DIR *dir; DIR *dir;
char *full_name; char *full_name;
int have_pos, x, y; int have_pos, x, y;
GList *list;
struct desktop_icon_info *dii;
dir = mc_opendir (desktop_directory); dir = mc_opendir (desktop_directory);
if (!dir) { if (!dir) {
@ -147,12 +271,19 @@ load_initial_desktop_icons (void)
full_name = g_concat_dir_and_file (desktop_directory, dirent->d_name); full_name = g_concat_dir_and_file (desktop_directory, dirent->d_name);
have_pos = meta_get_icon_pos (full_name, &x, &y); have_pos = meta_get_icon_pos (full_name, &x, &y);
desktop_icon_info_new (dirent->d_name, have_pos, x, y); desktop_icon_info_new (dirent->d_name, !have_pos, x, y);
g_free (full_name); g_free (full_name);
} }
mc_closedir (dir); mc_closedir (dir);
/* Show all the icons */
for (list = desktop_icons; list; list = list->next) {
dii = list->data;
gtk_widget_show (dii->dicon);
}
} }
/** /**
@ -181,7 +312,7 @@ desktop_destroy (void)
/* Destroy the desktop icons */ /* Destroy the desktop icons */
for (list = desktop_icons; list; list = list->next) for (list = desktop_icons; list; list = list->next)
desktop_icon_info_free (dii->data); desktop_icon_info_free (list->data);
g_list_free (desktop_icons); g_list_free (desktop_icons);
desktop_icons = NULL; desktop_icons = NULL;

View File

@ -9,7 +9,7 @@
#ifndef GDESKTOP_H #ifndef GDESKTOP_H
#define GDESKTOP_H #define GDESKTOP_H
#if 0 #if 1
/* Snap granularity for desktop icons -- maybe these should be calculated in terms of the font size? */ /* Snap granularity for desktop icons -- maybe these should be calculated in terms of the font size? */
@ -35,6 +35,32 @@ void desktop_destroy (void);
enum {
TARGET_URI_LIST,
TARGET_URL_LIST,
TARGET_TEXT_PLAIN,
};
typedef enum {
application,
directory,
file
} icon_t;
/* A structure that describes each icon on the desktop */
typedef struct {
GnomeDesktopEntry *dentry;
GtkWidget *widget;
icon_t type;
int x, y;
int grid_x, grid_y;
char *pathname;
} desktop_icon_t;
GtkWidget *make_transparent_window (char *file);
#else #else
#define MC_LIB_DESKTOP "mc.desktop" #define MC_LIB_DESKTOP "mc.desktop"

View File

@ -329,7 +329,9 @@ GnomeUIInfo gnome_panel_commands_menu [] = {
}; };
GnomeUIInfo gnome_panel_desktop_menu [] = { GnomeUIInfo gnome_panel_desktop_menu [] = {
#if 0
{ GNOME_APP_UI_ITEM, N_("_Arrange icons"), N_("Arranges the icons on the desktop"), gnome_arrange_icons }, { GNOME_APP_UI_ITEM, N_("_Arrange icons"), N_("Arranges the icons on the desktop"), gnome_arrange_icons },
#endif
/* { GNOME_APP_UI_TOGGLEITEM, N_("Desktop grid"), N_("Use a grid for laying out icons"), gnome_toggle_snap }, */ /* { GNOME_APP_UI_TOGGLEITEM, N_("Desktop grid"), N_("Use a grid for laying out icons"), gnome_toggle_snap }, */
{ GNOME_APP_UI_ENDOFINFO, 0, 0 } { GNOME_APP_UI_ENDOFINFO, 0, 0 }
}; };

View File

@ -504,8 +504,11 @@ create_panels (void)
GList *p, *g; GList *p, *g;
char *geo; char *geo;
WPanel *panel; WPanel *panel;
#if 1
desktop_init ();
#else
start_desktop (); start_desktop ();
#endif
cmdline = command_new (0, 0, 0); cmdline = command_new (0, 0, 0);
the_hint = label_new (0, 0, 0, NULL); the_hint = label_new (0, 0, 0, NULL);
@ -539,7 +542,11 @@ create_panels (void)
run_dlg (desktop_dlg); run_dlg (desktop_dlg);
/* shutdown gnome specific bits of midnight commander */ /* shutdown gnome specific bits of midnight commander */
#if 1
desktop_destroy ();
#else
stop_desktop (); stop_desktop ();
#endif
} }
static void static void

View File

@ -533,10 +533,14 @@ static struct {
context_menu_callback callback; context_menu_callback callback;
} file_actions [] = { } file_actions [] = {
{ N_("Properties"), F_SINGLE | F_PANEL, (context_menu_callback) panel_action_properties }, { N_("Properties"), F_SINGLE | F_PANEL, (context_menu_callback) panel_action_properties },
#if 0
{ N_("Properties"), F_SINGLE | F_DICON, (context_menu_callback) desktop_icon_properties }, { N_("Properties"), F_SINGLE | F_DICON, (context_menu_callback) desktop_icon_properties },
#endif
{ "", F_SINGLE, NULL }, { "", F_SINGLE, NULL },
{ N_("Open"), F_PANEL | F_ALL, (context_menu_callback) panel_action_open }, { N_("Open"), F_PANEL | F_ALL, (context_menu_callback) panel_action_open },
#if 0
{ N_("Open"), F_DICON | F_ALL, (context_menu_callback) desktop_icon_execute }, { N_("Open"), F_DICON | F_ALL, (context_menu_callback) desktop_icon_execute },
#endif
{ N_("Open with"), F_PANEL | F_ALL, (context_menu_callback) panel_action_open_with }, { N_("Open with"), F_PANEL | F_ALL, (context_menu_callback) panel_action_open_with },
{ N_("View"), F_PANEL | F_NOTDIR, (context_menu_callback) panel_action_view }, { N_("View"), F_PANEL | F_NOTDIR, (context_menu_callback) panel_action_view },
{ N_("View unfiltered"), F_PANEL | F_NOTDIR, (context_menu_callback) panel_action_view_unfiltered }, { N_("View unfiltered"), F_PANEL | F_NOTDIR, (context_menu_callback) panel_action_view_unfiltered },
@ -564,7 +568,9 @@ common_menu_t common_panel_actions [] = {
}; };
common_menu_t common_dicon_actions [] = { common_menu_t common_dicon_actions [] = {
#if 0
{ N_("Delete"), (context_menu_callback) desktop_icon_delete }, { N_("Delete"), (context_menu_callback) desktop_icon_delete },
#endif
{ NULL, NULL } { NULL, NULL }
}; };
@ -1065,7 +1071,9 @@ panel_icon_list_drag_data_received (GtkWidget *widget,
else else
dir = g_strdup (panel->cwd); dir = g_strdup (panel->cwd);
} }
#if 0
drop_on_directory (selection_data, context, context->suggested_action, dir, 0); drop_on_directory (selection_data, context, context->suggested_action, dir, 0);
#endif
free (dir); free (dir);
update_one_panel_widget (panel, 0, UP_KEEPSEL); update_one_panel_widget (panel, 0, UP_KEEPSEL);
@ -1104,7 +1112,9 @@ panel_clist_drag_data_received (GtkWidget *widget,
else else
dir = g_strdup (panel->cwd); dir = g_strdup (panel->cwd);
} }
#if 0
drop_on_directory (selection_data, context, context->suggested_action, dir, 0); drop_on_directory (selection_data, context, context->suggested_action, dir, 0);
#endif
free (dir); free (dir);
update_one_panel_widget (panel, 0, UP_KEEPSEL); update_one_panel_widget (panel, 0, UP_KEEPSEL);
@ -1234,7 +1244,9 @@ panel_clist_drop_data_available (GtkWidget *widget, GdkEventDropDataAvailable *d
g_assert (row < panel->count); g_assert (row < panel->count);
} }
#if 0
drop_on_directory (data, drop_dir, 0); drop_on_directory (data, drop_dir, 0);
#endif
if (drop_dir != panel->cwd) if (drop_dir != panel->cwd)
free (drop_dir); free (drop_dir);
@ -1586,7 +1598,9 @@ panel_icon_list_drop_data_available (GtkWidget *widget, GdkEventDropDataAvailabl
else else
drop_dir = panel->cwd; drop_dir = panel->cwd;
} }
#if 0
drop_on_directory (data, drop_dir, 0); drop_on_directory (data, drop_dir, 0);
#endif
if (drop_dir != panel->cwd) if (drop_dir != panel->cwd)
free (drop_dir); free (drop_dir);