Tree of tag thunar-4.20.7 (commit df0e054) from https://gitlab.xfce.org/xfce/thunar. Upstream history is not included here to keep the repository small.
238 lines
7.5 KiB
C
238 lines
7.5 KiB
C
/* vi:set et ai sw=2 sts=2 ts=2: */
|
|
/*-
|
|
* Copyright (c) 2005-2006 Benedikt Meurer <benny@xfce.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
* Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "thunar/thunar-navigator.h"
|
|
#include "thunar/thunar-private.h"
|
|
|
|
#include <libxfce4util/libxfce4util.h>
|
|
|
|
|
|
|
|
enum
|
|
{
|
|
CHANGE_DIRECTORY,
|
|
OPEN_NEW_TAB,
|
|
LAST_SIGNAL,
|
|
};
|
|
|
|
|
|
|
|
static void
|
|
thunar_navigator_base_init (gpointer klass);
|
|
static void
|
|
thunar_navigator_class_init (gpointer klass);
|
|
|
|
|
|
|
|
static guint navigator_signals[LAST_SIGNAL];
|
|
|
|
|
|
|
|
GType
|
|
thunar_navigator_get_type (void)
|
|
{
|
|
static gsize type__static = 0;
|
|
GType type;
|
|
|
|
if (g_once_init_enter (&type__static))
|
|
{
|
|
static const GTypeInfo info = {
|
|
sizeof (ThunarNavigatorIface),
|
|
(GBaseInitFunc) thunar_navigator_base_init,
|
|
NULL,
|
|
(GClassInitFunc) (void (*) (void)) thunar_navigator_class_init,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
0,
|
|
NULL,
|
|
};
|
|
|
|
type = g_type_register_static (G_TYPE_INTERFACE, I_ ("ThunarNavigator"), &info, 0);
|
|
g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
|
|
|
|
g_once_init_leave (&type__static, type);
|
|
}
|
|
|
|
return type__static;
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_navigator_base_init (gpointer klass)
|
|
{
|
|
static gboolean initialized = FALSE;
|
|
|
|
if (G_UNLIKELY (!initialized))
|
|
{
|
|
/**
|
|
* ThunarNavigator::change-directory:
|
|
* @navigator : a #ThunarNavigator instance.
|
|
* @directory : a #ThunarFile referring to the new directory.
|
|
*
|
|
* Invoked by implementing classes whenever the user requests
|
|
* to changed the current directory to @directory from within
|
|
* the @navigator instance (e.g. for the location buttons bar,
|
|
* this signal would be invoked whenever the user clicks on
|
|
* a path button).
|
|
*
|
|
* The @navigator must not apply the @directory to the
|
|
* "current-directory" property directly. But
|
|
* instead, it must wait for the surrounding module (usually
|
|
* a #ThunarWindow instance) to explicitly inform the
|
|
* @navigator to change it's current directory using
|
|
* the #thunar_navigator_set_current_directory() method
|
|
* or the "current-directory" property.
|
|
**/
|
|
navigator_signals[CHANGE_DIRECTORY] =
|
|
g_signal_new (I_ ("change-directory"),
|
|
G_TYPE_FROM_INTERFACE (klass),
|
|
G_SIGNAL_RUN_LAST,
|
|
G_STRUCT_OFFSET (ThunarNavigatorIface, change_directory),
|
|
NULL, NULL,
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
G_TYPE_NONE, 1, THUNAR_TYPE_FILE);
|
|
|
|
navigator_signals[OPEN_NEW_TAB] =
|
|
g_signal_new (I_ ("open-new-tab"),
|
|
G_TYPE_FROM_INTERFACE (klass),
|
|
G_SIGNAL_RUN_LAST,
|
|
G_STRUCT_OFFSET (ThunarNavigatorIface, open_new_tab),
|
|
NULL, NULL,
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
G_TYPE_NONE, 1, THUNAR_TYPE_FILE);
|
|
|
|
initialized = TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
thunar_navigator_class_init (gpointer klass)
|
|
{
|
|
/**
|
|
* ThunarNavigator:current-directory:
|
|
*
|
|
* The directory currently displayed by this #ThunarNavigator
|
|
* instance or %NULL if no directory is currently displayed
|
|
* (it's up to the implementing class to define the appearance
|
|
* of a navigator that has no directory associated with it).
|
|
*
|
|
* Whenever a navigator wants the surrounding module (usually
|
|
* a #ThunarWindow) to change to another directory, it should
|
|
* invoke the "change-directory" signal using the
|
|
* #thunar_navigator_change_directory() method. It should
|
|
* not directly change the "current-directory" property,
|
|
* but wait for the surrounding module to change the
|
|
* "current-directory" property afterwards.
|
|
**/
|
|
g_object_interface_install_property (klass,
|
|
g_param_spec_object ("current-directory",
|
|
"current-directory",
|
|
"current-directory",
|
|
THUNAR_TYPE_FILE,
|
|
EXO_PARAM_READWRITE));
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* thunar_navigator_get_current_directory:
|
|
* @navigator : a #ThunarNavigator instance.
|
|
*
|
|
* Returns the directory currently displayed by @navigator
|
|
* or %NULL, if @navigator does not currently display and
|
|
* directory.
|
|
*
|
|
* Return value: the current directory of @navigator or %NULL.
|
|
**/
|
|
ThunarFile *
|
|
thunar_navigator_get_current_directory (ThunarNavigator *navigator)
|
|
{
|
|
_thunar_return_val_if_fail (THUNAR_IS_NAVIGATOR (navigator), NULL);
|
|
return THUNAR_NAVIGATOR_GET_IFACE (navigator)->get_current_directory (navigator);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* thunar_navigator_set_current_directory:
|
|
* @navigator : a #ThunarNavigator instance.
|
|
* @current_directory : the new directory to display or %NULL.
|
|
*
|
|
* Sets a new current directory that should be displayed by
|
|
* the @navigator.
|
|
**/
|
|
void
|
|
thunar_navigator_set_current_directory (ThunarNavigator *navigator,
|
|
ThunarFile *current_directory)
|
|
{
|
|
_thunar_return_if_fail (THUNAR_IS_NAVIGATOR (navigator));
|
|
_thunar_return_if_fail (current_directory == NULL || THUNAR_IS_FILE (current_directory));
|
|
THUNAR_NAVIGATOR_GET_IFACE (navigator)->set_current_directory (navigator, current_directory);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* thunar_navigator_change_directory:
|
|
* @navigator : a #ThunarNavigator instance.
|
|
* @directory : a #ThunarFile referring to a directory.
|
|
*
|
|
* Emits the "change-directory" signal on @navigator with
|
|
* the specified @directory.
|
|
*
|
|
* Derived classes should invoke this method whenever the user
|
|
* selects a new directory from within @navigator. The derived
|
|
* class should not perform any directory changing operations
|
|
* itself, but leave it up to the surrounding module (usually
|
|
* a #ThunarWindow instance) to change the directory.
|
|
*
|
|
* It should never ever be called from outside a #ThunarNavigator
|
|
* implementation, as that may led to unexpected results!
|
|
**/
|
|
void
|
|
thunar_navigator_change_directory (ThunarNavigator *navigator,
|
|
ThunarFile *directory)
|
|
{
|
|
_thunar_return_if_fail (THUNAR_IS_NAVIGATOR (navigator));
|
|
_thunar_return_if_fail (THUNAR_IS_FILE (directory));
|
|
_thunar_return_if_fail (thunar_file_is_directory (directory));
|
|
|
|
g_signal_emit (G_OBJECT (navigator), navigator_signals[CHANGE_DIRECTORY], 0, directory);
|
|
}
|
|
|
|
|
|
|
|
void
|
|
thunar_navigator_open_new_tab (ThunarNavigator *navigator,
|
|
ThunarFile *directory)
|
|
{
|
|
_thunar_return_if_fail (THUNAR_IS_NAVIGATOR (navigator));
|
|
_thunar_return_if_fail (THUNAR_IS_FILE (directory));
|
|
_thunar_return_if_fail (thunar_file_is_directory (directory));
|
|
|
|
g_signal_emit (G_OBJECT (navigator), navigator_signals[OPEN_NEW_TAB], 0, directory);
|
|
}
|