1999-04-16 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gscreen.c (panel_tree_check_auto_expand): Enabled auto-collapse functionality again. Made the code a simpler by using gtk_dtree_is_ancestor(). * gtkdtree.c (gtk_dtree_is_ancestor): New function to test whether a node is an ancestor of a child. This does the same as gtk_ctree_is_ancestor(), but much more efficiently. GtkCTree seems to use the pessimal algorithm for this. (gtk_dtree_collapse): Slight optimization: do not re-select if the node is already selected. (gtk_dtree_collapse): Do not freeze/thaw the tree while collapsing/selecting. * gmain.c: Removed crufty old SM code.
Этот коммит содержится в:
родитель
00e136e22d
Коммит
1270687440
@ -1,3 +1,20 @@
|
|||||||
|
1999-04-16 Federico Mena Quintero <federico@nuclecu.unam.mx>
|
||||||
|
|
||||||
|
* gscreen.c (panel_tree_check_auto_expand): Enabled auto-collapse
|
||||||
|
functionality again. Made the code a simpler by using
|
||||||
|
gtk_dtree_is_ancestor().
|
||||||
|
|
||||||
|
* gtkdtree.c (gtk_dtree_is_ancestor): New function to test whether
|
||||||
|
a node is an ancestor of a child. This does the same as
|
||||||
|
gtk_ctree_is_ancestor(), but much more efficiently. GtkCTree
|
||||||
|
seems to use the pessimal algorithm for this.
|
||||||
|
(gtk_dtree_collapse): Slight optimization: do not re-select if the
|
||||||
|
node is already selected.
|
||||||
|
(gtk_dtree_collapse): Do not freeze/thaw the tree while
|
||||||
|
collapsing/selecting.
|
||||||
|
|
||||||
|
* gmain.c: Removed crufty old SM code.
|
||||||
|
|
||||||
1999-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
|
1999-04-15 Federico Mena Quintero <federico@nuclecu.unam.mx>
|
||||||
|
|
||||||
* gscreen.c (panel_setup_drag_scroll): Made it not return
|
* gscreen.c (panel_setup_drag_scroll): Made it not return
|
||||||
|
@ -528,78 +528,7 @@ gmc_do_quit (void)
|
|||||||
quit = 1;
|
quit = 1;
|
||||||
dlg_stop (desktop_dlg);
|
dlg_stop (desktop_dlg);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
static void
|
|
||||||
session_die (void)
|
|
||||||
{
|
|
||||||
gmc_do_quit ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Save the session callback
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
session_save_state (GnomeClient *client, gint phase, GnomeRestartStyle save_style, gint shutdown,
|
|
||||||
GnomeInteractStyle interact_style, gint fast, gpointer client_data)
|
|
||||||
{
|
|
||||||
char *sess_id;
|
|
||||||
char **argv = g_malloc (sizeof (char *) * ((g_list_length (containers) * 3) + 2));
|
|
||||||
GList *l, *free_list = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
sess_id = gnome_client_get_id (client);
|
|
||||||
|
|
||||||
argv [0] = client_data;
|
|
||||||
for (i = 1, l = containers; l; l = l->next){
|
|
||||||
PanelContainer *pc = l->data;
|
|
||||||
char *geom;
|
|
||||||
|
|
||||||
geom = gnome_geometry_string (GTK_WIDGET (pc->panel->widget.wdata)->window);
|
|
||||||
|
|
||||||
argv [i++] = pc->panel->cwd;
|
|
||||||
argv [i++] = "--geometry";
|
|
||||||
argv [i++] = geom;
|
|
||||||
free_list = g_list_append (free_list, geom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If no windows were open */
|
|
||||||
if (i == 1){
|
|
||||||
argv [i++] = "--nowindows";
|
|
||||||
}
|
|
||||||
|
|
||||||
argv [i] = NULL;
|
|
||||||
gnome_client_set_clone_command (client, i, argv);
|
|
||||||
gnome_client_set_restart_command (client, i, argv);
|
|
||||||
gnome_config_sync ();
|
|
||||||
|
|
||||||
for (l = free_list; l; l = l->next)
|
|
||||||
g_free (l->data);
|
|
||||||
g_list_free (free_list);
|
|
||||||
|
|
||||||
g_free (argv);
|
|
||||||
|
|
||||||
if (shutdown){
|
|
||||||
quit = 1;
|
|
||||||
dlg_stop (midnight_dlg);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
session_management_setup (char *name)
|
|
||||||
{
|
|
||||||
session_client = gnome_master_client ();
|
|
||||||
|
|
||||||
if (session_client){
|
|
||||||
gnome_client_set_restart_style (session_client,
|
|
||||||
finish_program ? GNOME_RESTART_NEVER : GNOME_RESTART_IMMEDIATELY);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (session_client), "save_yourself",
|
|
||||||
GTK_SIGNAL_FUNC (session_save_state), name);
|
|
||||||
gtk_signal_connect (GTK_OBJECT (session_client), "die",
|
|
||||||
GTK_SIGNAL_FUNC (session_die), NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Configures the GtkWindow/GnomeDialog from a WPanel.
|
* Configures the GtkWindow/GnomeDialog from a WPanel.
|
||||||
*
|
*
|
||||||
|
@ -1980,8 +1980,6 @@ tree_drag_open_directory (gpointer data)
|
|||||||
WPanel *panel;
|
WPanel *panel;
|
||||||
GtkDTree *dtree;
|
GtkDTree *dtree;
|
||||||
GtkCTreeNode *node;
|
GtkCTreeNode *node;
|
||||||
int row, col;
|
|
||||||
int on_row;
|
|
||||||
|
|
||||||
panel = data;
|
panel = data;
|
||||||
dtree = GTK_DTREE (panel->tree);
|
dtree = GTK_DTREE (panel->tree);
|
||||||
@ -1989,67 +1987,59 @@ tree_drag_open_directory (gpointer data)
|
|||||||
node = gtk_ctree_node_nth (GTK_CTREE (panel->tree), panel->drag_tree_row);
|
node = gtk_ctree_node_nth (GTK_CTREE (panel->tree), panel->drag_tree_row);
|
||||||
g_assert (node != NULL);
|
g_assert (node != NULL);
|
||||||
|
|
||||||
if (!GTK_CTREE_ROW (node)->expanded)
|
if (!GTK_CTREE_ROW (node)->expanded) {
|
||||||
dtree->auto_expanded_nodes = g_list_append (dtree->auto_expanded_nodes, node);
|
dtree->auto_expanded_nodes = g_list_append (dtree->auto_expanded_nodes, node);
|
||||||
|
gtk_ctree_expand (GTK_CTREE (panel->tree), node);
|
||||||
gtk_ctree_expand (GTK_CTREE (panel->tree), node);
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handles automatic collapsing of the tree nodes when doing drag and drop */
|
||||||
static void
|
static void
|
||||||
panel_tree_check_auto_expand (WPanel *panel, GtkCTreeNode *current)
|
panel_tree_check_auto_expand (WPanel *panel, GtkCTreeNode *current)
|
||||||
{
|
{
|
||||||
GtkDTree *dtree = GTK_DTREE (panel->tree);
|
GtkDTree *dtree;
|
||||||
GList *tmp_list = dtree->auto_expanded_nodes;
|
GtkCTree *ctree;
|
||||||
#if 0
|
GtkCList *clist;
|
||||||
GtkCList *clist = GTK_CLIST (dtree);
|
GList *free_list;
|
||||||
|
GList *tmp_list;
|
||||||
gint row, old_y, new_y;
|
gint row, old_y, new_y;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (current) {
|
dtree = GTK_DTREE (panel->tree);
|
||||||
while (tmp_list) {
|
ctree = GTK_CTREE (panel->tree);
|
||||||
GtkCTreeNode *parent_node = tmp_list->data;
|
clist = GTK_CLIST (panel->tree);
|
||||||
GtkCTreeNode *tmp_node = current;
|
tmp_list = dtree->auto_expanded_nodes;
|
||||||
|
|
||||||
while (tmp_node) {
|
if (current)
|
||||||
if (tmp_node == parent_node)
|
for (; tmp_list; tmp_list = tmp_list->next)
|
||||||
break;
|
if (!gtk_dtree_is_ancestor (dtree, tmp_list->data, current))
|
||||||
tmp_node = GTK_CTREE_ROW (tmp_node)->parent;
|
|
||||||
}
|
|
||||||
if (!tmp_node) /* parent not found */
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tmp_list = tmp_list->next;
|
/* Collapse the rows as necessary. If possible, try to do so that the
|
||||||
}
|
* "current" stays the same place on the screen.
|
||||||
}
|
|
||||||
|
|
||||||
/* Collapse the rows as necessary. If possible, try to do
|
|
||||||
* so that the "current" stays the same place on the
|
|
||||||
* screen
|
|
||||||
*/
|
*/
|
||||||
#if 0
|
|
||||||
/* This behaviour is confusing --jrb and quartic (and MS, apparently)*/
|
|
||||||
if (tmp_list) {
|
if (tmp_list) {
|
||||||
if (current) {
|
if (current) {
|
||||||
row = g_list_position (clist->row_list, (GList *)current);
|
row = g_list_position (clist->row_list, (GList *) current);
|
||||||
old_y = row * clist->row_height - clist->vadjustment->value;
|
old_y = row * clist->row_height - clist->vadjustment->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
free_list = tmp_list;
|
free_list = tmp_list;
|
||||||
while (tmp_list) {
|
|
||||||
gtk_ctree_collapse (GTK_CTREE (panel->tree), tmp_list->data);
|
|
||||||
tmp_list = tmp_list->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for (; tmp_list; tmp_list = tmp_list->next)
|
||||||
|
gtk_ctree_collapse (GTK_CTREE (panel->tree), tmp_list->data);
|
||||||
|
|
||||||
|
/* We have to calculate the row position again because rows may
|
||||||
|
* have shifted during the collapse.
|
||||||
|
*/
|
||||||
if (current) {
|
if (current) {
|
||||||
row = g_list_position (clist->row_list, (GList *)current);
|
row = g_list_position (clist->row_list, (GList *) current);
|
||||||
new_y = row * clist->row_height - clist->vadjustment->value;
|
new_y = row * clist->row_height - clist->vadjustment->value;
|
||||||
|
|
||||||
if (new_y != old_y) {
|
if (new_y != old_y)
|
||||||
gtk_adjustment_set_value (clist->vadjustment,
|
gtk_adjustment_set_value (clist->vadjustment,
|
||||||
clist->vadjustment->value + new_y - old_y);
|
clist->vadjustment->value + new_y - old_y);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (free_list->prev)
|
if (free_list->prev)
|
||||||
@ -2060,7 +2050,6 @@ panel_tree_check_auto_expand (WPanel *panel, GtkCTreeNode *current)
|
|||||||
free_list->prev = NULL;
|
free_list->prev = NULL;
|
||||||
g_list_free (free_list);
|
g_list_free (free_list);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2128,6 +2117,7 @@ panel_tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y
|
|||||||
GtkDTree *dtree;
|
GtkDTree *dtree;
|
||||||
WPanel *panel;
|
WPanel *panel;
|
||||||
int on_row, row, col;
|
int on_row, row, col;
|
||||||
|
GtkCTreeNode *node;
|
||||||
GdkDragAction action;
|
GdkDragAction action;
|
||||||
GtkWidget *source_widget;
|
GtkWidget *source_widget;
|
||||||
char *row_path;
|
char *row_path;
|
||||||
@ -2159,15 +2149,14 @@ panel_tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y
|
|||||||
action = 0;
|
action = 0;
|
||||||
|
|
||||||
if (on_row) {
|
if (on_row) {
|
||||||
row_path = gtk_dtree_get_row_path (dtree,
|
node = gtk_ctree_node_nth (GTK_CTREE (dtree), row);
|
||||||
gtk_ctree_node_nth (GTK_CTREE (dtree), row),
|
row_path = gtk_dtree_get_row_path (dtree, node, 0);
|
||||||
0);
|
|
||||||
|
|
||||||
if (row != panel->drag_tree_row) {
|
if (row != panel->drag_tree_row) {
|
||||||
/* Highlight the row by selecting it */
|
/* Highlight the row by selecting it */
|
||||||
#if 0
|
|
||||||
panel_tree_check_auto_expand (GTK_CTREE (widget), row);
|
panel_tree_check_auto_expand (panel, node);
|
||||||
#endif
|
|
||||||
dtree->internal = TRUE;
|
dtree->internal = TRUE;
|
||||||
gtk_clist_select_row (GTK_CLIST (widget), row, 0);
|
gtk_clist_select_row (GTK_CLIST (widget), row, 0);
|
||||||
dtree->internal = FALSE;
|
dtree->internal = FALSE;
|
||||||
@ -2215,8 +2204,10 @@ panel_tree_drag_motion (GtkWidget *widget, GdkDragContext *context, int x, int y
|
|||||||
|
|
||||||
g_free (parent_dir);
|
g_free (parent_dir);
|
||||||
g_free (row_path);
|
g_free (row_path);
|
||||||
} else
|
} else {
|
||||||
panel->drag_tree_row = -1;
|
panel->drag_tree_row = -1;
|
||||||
|
panel_tree_check_auto_expand (panel, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
gdk_drag_status (context, action, time);
|
gdk_drag_status (context, action, time);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -2244,6 +2235,9 @@ panel_tree_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, g
|
|||||||
panel->drag_tree_fe = NULL;
|
panel->drag_tree_fe = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (panel->drag_tree_row != -1)
|
||||||
|
panel_tree_check_auto_expand (panel, NULL);
|
||||||
|
|
||||||
panel->drag_tree_row = -1;
|
panel->drag_tree_row = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,18 +459,14 @@ gtk_dtree_collapse (GtkCTree *ctree, GtkCTreeNode *node)
|
|||||||
if (!sel)
|
if (!sel)
|
||||||
do_select = TRUE;
|
do_select = TRUE;
|
||||||
else {
|
else {
|
||||||
if (gtk_ctree_is_ancestor (ctree, node, sel->data))
|
if (node != sel->data && gtk_dtree_is_ancestor (GTK_DTREE (ctree), node, sel->data))
|
||||||
do_select = TRUE;
|
do_select = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_clist_freeze (GTK_CLIST (ctree));
|
|
||||||
|
|
||||||
(* parent_class->tree_collapse) (ctree, node);
|
(* parent_class->tree_collapse) (ctree, node);
|
||||||
|
|
||||||
if (do_select)
|
if (do_select)
|
||||||
gtk_ctree_select (ctree, node);
|
gtk_ctree_select (ctree, node);
|
||||||
|
|
||||||
gtk_clist_thaw (GTK_CLIST (ctree));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -808,3 +804,30 @@ gtk_dtree_get_type (void)
|
|||||||
|
|
||||||
return dtree_type;
|
return dtree_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gtk_dtree_is_ancestor:
|
||||||
|
* @dtree: A tree
|
||||||
|
* @node: The presumed ancestor node
|
||||||
|
* @child: The presumed child node
|
||||||
|
*
|
||||||
|
* Tests whether a node is an ancestor of a child node. This does this in
|
||||||
|
* O(height of child), instead of O(number of children in node), like GtkCTree
|
||||||
|
* does.
|
||||||
|
*
|
||||||
|
* Return value: TRUE if the node is an ancestor of the child, FALSE otherwise.
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
gtk_dtree_is_ancestor (GtkDTree *dtree, GtkCTreeNode *node, GtkCTreeNode *child)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (dtree != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (GTK_IS_DTREE (dtree), FALSE);
|
||||||
|
g_return_val_if_fail (node != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (child != NULL, FALSE);
|
||||||
|
|
||||||
|
for (; child; child = GTK_CTREE_ROW (child)->parent)
|
||||||
|
if (child == node)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
@ -55,4 +55,6 @@ char *gtk_dtree_get_row_path (GtkDTree *ctree,
|
|||||||
gint column);
|
gint column);
|
||||||
void gtk_dtree_construct (GtkDTree *dtree);
|
void gtk_dtree_construct (GtkDTree *dtree);
|
||||||
|
|
||||||
|
gboolean gtk_dtree_is_ancestor (GtkDTree *dtree, GtkCTreeNode *node, GtkCTreeNode *child);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user