Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
ristretto
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
Avinash Sonawane
ristretto
Commits
1ce6812a
Commit
1ce6812a
authored
Apr 15, 2012
by
Stephan Arts
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add the directory-contents asynchronously.
Do not freeze the gui when we are dealing with a lot of files.
parent
6daa6261
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
126 additions
and
21 deletions
+126
-21
src/image_list.c
src/image_list.c
+92
-21
src/main_window.c
src/main_window.c
+34
-0
No files found.
src/image_list.c
View file @
1ce6812a
...
...
@@ -221,6 +221,21 @@ struct _RsttoImageListPriv
gboolean
wrap_images
;
};
typedef
struct
_RsttoFileLoader
RsttoFileLoader
;
struct
_RsttoFileLoader
{
GFile
*
dir
;
RsttoImageList
*
image_list
;
GFileEnumerator
*
file_enum
;
guint
n_files
;
RsttoFile
**
files
;
};
static
gboolean
cb_rstto_read_file
(
gpointer
user_data
);
static
gint
rstto_image_list_signals
[
RSTTO_IMAGE_LIST_SIGNAL_COUNT
];
static
gint
rstto_image_list_iter_signals
[
RSTTO_IMAGE_LIST_ITER_SIGNAL_COUNT
];
...
...
@@ -621,11 +636,7 @@ rstto_image_list_set_directory (
{
/* Declare variables */
GFileEnumerator
*
file_enumerator
=
NULL
;
GFileInfo
*
file_info
;
const
gchar
*
filename
;
const
gchar
*
content_type
;
GFile
*
child_file
;
RsttoFile
*
r_file
;
RsttoFileLoader
*
loader
=
NULL
;
/* Source code block */
rstto_image_list_remove_all
(
image_list
);
...
...
@@ -637,28 +648,88 @@ rstto_image_list_set_directory (
if
(
NULL
!=
file_enumerator
)
{
for
(
file_info
=
g_file_enumerator_next_file
(
file_enumerator
,
NULL
,
NULL
);
NULL
!=
file_info
;
file_info
=
g_file_enumerator_next_file
(
file_enumerator
,
NULL
,
NULL
))
g_object_ref
(
dir
);
loader
=
g_new0
(
RsttoFileLoader
,
1
);
loader
->
dir
=
dir
;
loader
->
file_enum
=
file_enumerator
;
loader
->
image_list
=
image_list
;
g_idle_add
(
(
GSourceFunc
)
cb_rstto_read_file
,
loader
);
}
}
return
TRUE
;
}
static
gboolean
cb_rstto_read_file
(
gpointer
user_data
)
{
RsttoFileLoader
*
loader
=
user_data
;
GFileInfo
*
file_info
;
const
gchar
*
content_type
;
const
gchar
*
filename
;
RsttoFile
**
files
;
GFile
*
child_file
;
guint
i
;
GSList
*
iter
;
/* Check the inputs */
g_return_val_if_fail
(
NULL
!=
loader
,
FALSE
);
g_return_val_if_fail
(
NULL
!=
loader
->
file_enum
,
FALSE
);
file_info
=
g_file_enumerator_next_file
(
loader
->
file_enum
,
NULL
,
NULL
);
if
(
NULL
!=
file_info
)
{
content_type
=
g_file_info_get_content_type
(
file_info
);
if
(
strncmp
(
content_type
,
"image/"
,
6
)
==
0
)
{
filename
=
g_file_info_get_name
(
file_info
);
child_file
=
g_file_get_child
(
loader
->
dir
,
filename
);
files
=
g_new0
(
RsttoFile
*
,
loader
->
n_files
+
1
);
files
[
0
]
=
rstto_file_new
(
child_file
);
for
(
i
=
0
;
i
<
loader
->
n_files
;
++
i
)
{
filename
=
g_file_info_get_name
(
file_info
);
content_type
=
g_file_info_get_content_type
(
file_info
);
child_file
=
g_file_get_child
(
dir
,
filename
);
r_file
=
rstto_file_new
(
child_file
);
if
(
strncmp
(
content_type
,
"image/"
,
6
)
==
0
)
{
rstto_image_list_add_file
(
image_list
,
r_file
,
NULL
);
}
g_object_unref
(
r_file
);
r_file
=
NULL
;
files
[
i
+
1
]
=
loader
->
files
[
i
];
}
if
(
NULL
!=
loader
->
files
)
{
g_free
(
loader
->
files
);
}
g_object_unref
(
file_enumerator
)
;
file_enumerator
=
NULL
;
loader
->
files
=
files
;
loader
->
n_files
++
;
}
}
else
{
for
(
i
=
0
;
i
<
loader
->
n_files
;
++
i
)
{
rstto_image_list_add_file
(
loader
->
image_list
,
loader
->
files
[
i
],
NULL
);
rstto_image_list_monitor_dir
(
image_list
,
dir
);
g_object_unref
(
loader
->
files
[
i
]);
}
rstto_image_list_monitor_dir
(
loader
->
image_list
,
loader
->
dir
);
iter
=
loader
->
image_list
->
priv
->
iterators
;
while
(
iter
)
{
g_signal_emit
(
G_OBJECT
(
iter
->
data
),
rstto_image_list_iter_signals
[
RSTTO_IMAGE_LIST_ITER_SIGNAL_CHANGED
],
0
,
NULL
);
iter
=
g_slist_next
(
iter
);
}
return
FALSE
;
}
return
TRUE
;
}
...
...
src/main_window.c
View file @
1ce6812a
...
...
@@ -2708,14 +2708,31 @@ cb_rstto_main_window_open_image (GtkWidget *widget, RsttoMainWindow *window)
r_file
=
rstto_file_new
(
files
->
data
);
p_file
=
g_file_get_parent
(
files
->
data
);
/* This call adds the contents of the
* directory asynchronously.
*/
rstto_image_list_set_directory
(
window
->
priv
->
image_list
,
p_file
,
NULL
);
/* Make sure the file we are looking
* for is already in the list.
*/
rstto_image_list_add_file
(
window
->
priv
->
image_list
,
r_file
,
NULL
);
/* Point the main iterator to the
* correct file
*/
rstto_image_list_iter_find_file
(
window
->
priv
->
iter
,
r_file
);
/* Cleanup the reference */
g_object_unref
(
r_file
);
}
}
...
...
@@ -2760,14 +2777,31 @@ cb_rstto_main_window_open_recent(GtkRecentChooser *chooser, RsttoMainWindow *win
if
(
NULL
!=
r_file
)
{
p_file
=
g_file_get_parent
(
file
);
/* This call adds the contents of the
* directory asynchronously.
*/
rstto_image_list_set_directory
(
window
->
priv
->
image_list
,
p_file
,
NULL
);
/* Make sure the file we are looking
* for is already in the list.
*/
rstto_image_list_add_file
(
window
->
priv
->
image_list
,
r_file
,
NULL
);
/* Point the main iterator to the
* correct file
*/
rstto_image_list_iter_find_file
(
window
->
priv
->
iter
,
r_file
);
/* Cleanup the reference */
g_object_unref
(
G_OBJECT
(
r_file
));
r_file
=
NULL
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment