1
1

1999-02-22 Miguel de Icaza <miguel@nuclecu.unam.mx>

* gdesktop.c (desktop_icon_info_open): Launch a panel at the
	location of the mount point.

	* gmount.c (setup_devices): Use g_list_free, not g_free.  Fed,
	test your fixes to my code ;-)

	* glayout.c (create_container): Add a Desktop menu if the WM is
	not GNOME compliant.
Этот коммит содержится в:
Miguel de Icaza 1999-02-23 01:56:09 +00:00
родитель 0cacebab2a
Коммит aca0afd352
6 изменённых файлов: 97 добавлений и 31 удалений

Просмотреть файл

@ -1,5 +1,14 @@
1999-02-22 Miguel de Icaza <miguel@nuclecu.unam.mx>
* gdesktop.c (desktop_icon_info_open): Launch a panel at the
location of the mount point.
* gmount.c (setup_devices): Use g_list_free, not g_free. Fed,
test your fixes to my code ;-)
* glayout.c (create_container): Add a Desktop menu if the WM is
not GNOME compliant.
* gdesktop.c (setup_motif_dnd_proxy): Use Window instead of
gint32, fix from George Lebl.
(setup_xdnd_proxy): ditto.

Просмотреть файл

@ -57,6 +57,9 @@ static int layout_cols;
static int layout_rows;
static struct layout_slot *layout_slots;
int desktop_wm_is_gnome_compliant = -1;
#define l_slots(u, v) (layout_slots[(u) * layout_rows + (v)])
/* The last icon to be selected */
@ -369,8 +372,8 @@ typedef struct {
* specified position if user_pos is TRUE. If it is FALSE, the icons will be
* auto-placed.
*/
static void
reload_desktop_icons (int user_pos, int xpos, int ypos)
void
desktop_reload_icons (int user_pos, int xpos, int ypos)
{
struct dirent *dirent;
DIR *dir;
@ -569,8 +572,8 @@ reload_desktop_icons (int user_pos, int xpos, int ypos)
}
/* Perform automatic arrangement of the desktop icons */
static void
arrange_desktop_icons (void)
void
desktop_arrange_icons (void)
{
GList *icons, *l;
int xpos, ypos;
@ -902,12 +905,15 @@ find_command (char **known_locations)
}
gboolean
is_mountable (char *filename, file_entry *fe, int *is_mounted)
is_mountable (char *filename, file_entry *fe, int *is_mounted, char **point)
{
char buffer [128];
char buffer [128], *p;
umode_t mode;
struct stat s;
if (point)
*point = NULL;
if (!S_ISLNK (fe->buf.st_mode))
return FALSE;
@ -921,9 +927,13 @@ is_mountable (char *filename, file_entry *fe, int *is_mounted)
if (readlink (filename, buffer, sizeof (buffer)) == -1)
return FALSE;
if (!is_block_device_mountable (buffer))
p = is_block_device_mountable (buffer);
if (!p)
return FALSE;
if (point)
*point = p;
*is_mounted = is_block_device_mounted (buffer);
return TRUE;
@ -1021,13 +1031,12 @@ try_to_mount (char *filename, file_entry *fe)
{
int x;
if (!is_mountable (filename, fe, &x))
if (!is_mountable (filename, fe, &x, NULL))
return FALSE;
return do_mount_umount (filename, TRUE);
}
/**
* desktop_icon_info_open:
* @dii: The desktop icon to open.
@ -1051,7 +1060,20 @@ desktop_icon_info_open (DesktopIconInfo *dii)
if (S_ISDIR (fe->buf.st_mode) || link_isdir (fe))
new_panel_at (filename);
else {
if (!try_to_mount (filename, fe)) {
int is_mounted;
char *point;
int launch = FALSE;
if (is_mountable (filename, fe, &is_mounted, &point)){
if (!is_mounted){
if (try_to_mount (filename, fe))
launch = TRUE;
} else
launch = TRUE;
if (launch)
new_panel_at (point);
} else {
if (is_exe (fe->buf.st_mode) && if_link_is_exe (desktop_directory, fe))
my_system (EXECUTE_AS_SHELL, shell, filename);
else
@ -1108,7 +1130,7 @@ do_popup_menu (DesktopIconInfo *dii, GdkEventButton *event)
filename = g_concat_dir_and_file (desktop_directory, dii->filename);
if (gpopup_do_popup (event, NULL, dii, 0, filename) != -1)
reload_desktop_icons (FALSE, 0, 0);
desktop_reload_icons (FALSE, 0, 0);
g_free (filename);
}
@ -1423,7 +1445,7 @@ drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *sel
static void
drag_end (GtkWidget *widget, GdkDragContext *context, gpointer data)
{
reload_desktop_icons (FALSE, 0, 0);
desktop_reload_icons (FALSE, 0, 0);
}
/* Set up a desktop icon as a DnD source */
@ -1587,7 +1609,7 @@ icon_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gin
return; /* eeeek */
if (gdnd_perform_drop (context, data, desktop_directory, fe))
reload_desktop_icons (FALSE, 0, 0);
desktop_reload_icons (FALSE, 0, 0);
file_entry_free (fe);
}
@ -1966,7 +1988,7 @@ desktop_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x,
directory = g_strndup (desktop_directory, p - desktop_directory);
if (gdnd_perform_drop (context, data, directory, desktop_fe))
reload_desktop_icons (TRUE, x, y);
desktop_reload_icons (TRUE, x, y);
g_free (directory);
file_entry_free (desktop_fe);
@ -2074,7 +2096,7 @@ find_click_proxy_window (void)
static void
handle_arrange_icons (GtkWidget *widget, gpointer data)
{
arrange_desktop_icons ();
desktop_arrange_icons ();
}
/* Callback for creating a new panel window */
@ -2084,23 +2106,29 @@ handle_new_window (GtkWidget *widget, gpointer data)
new_panel_at (gnome_user_home_dir);
}
void
desktop_rescan_devices (void)
{
gmount_setup_devices (TRUE);
desktop_reload_icons (FALSE, 0, 0);
}
/* Callback for rescanning the mountable devices */
static void
handle_rescan_devices (GtkWidget *widget, gpointer data)
{
gmount_setup_devices (TRUE);
reload_desktop_icons (FALSE, 0, 0);
desktop_rescan_devices ();
}
/* Callback for rescanning the desktop directory */
static void
handle_rescan_desktop (GtkWidget *widget, gpointer data)
{
reload_desktop_icons (FALSE, 0, 0);
desktop_reload_icons (FALSE, 0, 0);
}
/* The popup menu for the desktop */
static GnomeUIInfo desktop_popup_items[] = {
GnomeUIInfo desktop_popup_items[] = {
GNOMEUIINFO_ITEM_NONE (N_("Arrange Icons"), NULL, handle_arrange_icons),
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_NONE (N_("Create New Window"), NULL, handle_new_window),
@ -2402,9 +2430,11 @@ setup_desktop_click_proxy_window (void)
{
click_proxy_gdk_window = find_click_proxy_window ();
if (!click_proxy_gdk_window) {
desktop_wm_is_gnome_compliant = 0;
g_warning ("Root window clicks will not work as no GNOME-compliant window manager could be found!");
return;
}
desktop_wm_is_gnome_compliant = 1;
/* Make the proxy window send events to the invisible proxy widget */
gdk_window_set_user_data (click_proxy_gdk_window, proxy_invisible);
@ -2524,7 +2554,7 @@ desktop_init (void)
gicon_init ();
create_layout_info ();
create_desktop_dir ();
reload_desktop_icons (FALSE, 0, 0);
desktop_reload_icons (FALSE, 0, 0);
/* Create the proxy window and initialize all proxying stuff */

Просмотреть файл

@ -52,7 +52,12 @@ void desktop_icon_info_delete (DesktopIconInfo *dii);
file_entry *file_entry_from_file (char *filename);
void file_entry_free (file_entry *fe);
gboolean is_mountable (char *filename, file_entry *fe, int *is_mounted);
gboolean is_mountable (char *filename, file_entry *fe, int *is_mounted, char **mount_point);
gboolean do_mount_umount (char *filename, gboolean is_mount);
void desktop_arrange_icons (void);
void desktop_rescan_devices (void);
void desktop_reload_icons (int user_pos, int xpos, int ypos);
extern int desktop_wm_is_gnome_compliant;
#endif

Просмотреть файл

@ -267,6 +267,12 @@ run_cmd (void)
}
}
static void
do_desktop_rescan_devices (void)
{
desktop_reload_icons (FALSE, 0, 0);
}
void configure_box (void);
GtkCheckMenuItem *gnome_toggle_snap (void);
@ -360,12 +366,21 @@ GnomeUIInfo gnome_panel_about_menu [] = {
GNOMEUIINFO_END
};
GnomeUIInfo gnome_panel_desktop_menu [] = {
GNOMEUIINFO_ITEM_NONE (N_("Arrange Icons"), NULL, desktop_arrange_icons),
GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_NONE (N_("Rescan Mountable Devices"), NULL, desktop_rescan_devices),
GNOMEUIINFO_ITEM_NONE (N_("Rescan Desktop"), NULL, do_desktop_rescan_devices),
GNOMEUIINFO_END
};
#define GNOME_PANEL_MENU_DESKTOP_INDEX 5
GnomeUIInfo gnome_panel_menu [] = {
GNOMEUIINFO_MENU_FILE_TREE(gnome_panel_file_menu),
GNOMEUIINFO_MENU_EDIT_TREE(gnome_panel_edit_menu),
GNOMEUIINFO_SUBTREE(N_("_Layout"),gnome_panel_layout_menu),
GNOMEUIINFO_SUBTREE(N_("_Commands"),gnome_panel_commands_menu),
GNOMEUIINFO_MENU_HELP_TREE(gnome_panel_about_menu),
GNOMEUIINFO_SUBTREE(N_("_Desktop"), gnome_panel_desktop_menu),
GNOMEUIINFO_END
};
@ -516,6 +531,10 @@ create_container (Dlg_head *h, char *name, char *geometry)
vbox = gtk_vbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
gnome_app_set_contents (GNOME_APP (app), vbox);
if (desktop_wm_is_gnome_compliant == 1)
gnome_panel_menu [GNOME_PANEL_MENU_DESKTOP_INDEX].type = GNOME_APP_UI_ENDOFINFO;
gnome_app_create_menus_with_data (GNOME_APP (app), gnome_panel_menu, panel);
create_new_menu (GNOME_APP (app), panel);

Просмотреть файл

@ -96,12 +96,17 @@ void free (void *ptr);
#ifdef MOUNTED_GETMNTENT1
gboolean
/*
* Returns wheter devname is mountable:
* NULL if it is not or
* g_strdup()ed string with the mount point
*/
char *
is_block_device_mountable (char *devname)
{
FILE *f;
struct mntent *mnt;
gboolean retval = FALSE;
char *retval = NULL;
if (getuid () == 0)
return TRUE;
@ -112,7 +117,7 @@ is_block_device_mountable (char *devname)
while ((mnt = getmntent (f))){
if (strstr (mnt->mnt_opts, "user")){
retval = TRUE;
retval = g_strdup (mnt->mnt_dir);
break;
}
}
@ -162,10 +167,10 @@ get_mountable_devices (void)
#else
gboolean
char *
is_block_device_mountable (char *devname)
{
return FALSE;
return NULL;
}
static GList *
@ -285,7 +290,7 @@ setup_devices (void)
g_free (l->data);
}
g_free (list);
g_list_free (list);
}
void

Просмотреть файл

@ -13,9 +13,7 @@
void gmount_setup_devices (int cleanup);
#if 0
gboolean is_block_device_mountable (char *devname);
char *is_block_device_mountable (char *devname);
gboolean is_block_device_mounted (char *devname);
#endif
#endif