Commit graph gtk2-ng/gtk/gtkfilechooserentry.c
Author SHA1 Message Date
42a31c8576 Clean up trailing whitespace 2026-05-03 15:16:52 +02:00
Federico Mena Quintero
8f9487fca7 GtkFileChooserEntry: move the cursor after the user chooses a completion from the list
https://bugzilla.gnome.org/show_bug.cgi?id=756450
2016-03-10 16:02:56 -06:00
Federico Mena Quintero
bab1c39ec2 GtkFileChooserEntry: Oops, free the temporary dir_part 2016-03-10 15:35:34 -06:00
Federico Mena Quintero
92d45e12f8 GtkFileChooserEntry: regenerate the completions if the dir_part changes
Consider this bug:

1. Open a file chooser; switch it to $HOME

2. Start typing "~/Dow" with some file that *does* exist in your $HOME

3. Delete the inline-completion selection (e.g. the "nloads" after "~/Down").

4. While you are at "~/Dow_" hit Tab.  No completion will occur.

This happens because of the following.

Say the GtkFileChooserEntry is in the process of loading $HOME,
because _set_base_folder() was called.  If the entry contains no text,
then the FULL_PATH_COLUMN of the file system model will be set to
unprefixed filenames from $HOME, like

  .ssh/
  Documents/
  Downloads/
  somefile.txt

Later we avoid reloading the folder if g_file_equal(old_folder, new_folder).

However, the FULL_PATH_COLUMN gets populated in completion_store_set()
out of the actual filenames that GIO returned, plus the chooser_entry->dir_part.

If the user starts typing "~/Dow" then dir_part changes to "~/", *but*
the folder won't be reloaded since it is also $HOME.  However, the completion
machinery assumes that FULL_PATH_COLUMN will contain prefixed entries like

  ~/.ssh/
  ~/Documents/
  ~/Downloads/
  ~/somefile.txt

So, we add an invariant that chooser_entry->dir_part and
chooser_entry->current_folder_file must change at the same time, and
must not get out of sync:  If any of them changes, then the
completions are regenerated.
2016-03-10 15:15:39 -06:00
Federico Mena Quintero
a99752239d Ref/sink the GtkFileFilter used for GtkEntryCompletion; it's a GtkObject here 2016-03-10 15:15:39 -06:00
Federico Mena Quintero
55764dddcf Make _gtk_entry_completion_compute_prefix() public-internal 2016-03-10 15:15:38 -06:00
Federico Mena Quintero
c1f8305622 Sync missing comment 2016-03-10 15:15:38 -06:00
Matthias Clasen
05adbbbc01 Remove debug spew 2016-03-10 15:15:38 -06:00
Matthias Clasen
a17e23b8ca file chooser entry: Special-case ., .. and ~
Make sure entering the three special strings ".", ".." or "~" in
the location entry works as expected. They already worked correctly
if you append a '/' to force them to be recognized as the 'folder'
part, but that should not be necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=752707
2016-03-10 15:15:38 -06:00
Matthias Clasen
2f9ea1c444 Formatting fix 2016-03-10 15:15:38 -06:00
Matthias Clasen
b7fa0f2193 Avoid a critical in the file chooser
Hiding the location entry was causing criticals, because
the completion was updated after the widget has already
been disposed.
https://bugzilla.gnome.org/show_bug.cgi?id=720330
2016-03-10 15:15:38 -06:00
Federico Mena Quintero
f27c1f45b7 GtkFileChooserEntry: don't inline-complete if the entry doesn't have the focus
When the file chooser changes directories, it tells the GtkFileChooserEntry to
change its base folder (i.e. the folder from which relative pathnames are resolved).
GtkFileChooserEntry then starts loading a GtkFileSystemModel asynchronously.
In the finished_loading_cb(), however, it would always ask the GtkEntryCompletion
to insert the completion prefix, since that finished_loading_cb() is what is also used
while the user is typing *in the entry*.

But when the entry doesn't have the focus (e.g. the user changed directories by double-clicking
on the file list in the file chooser), there's no reason to insert completions at all.

https://bugzilla.gnome.org/show_bug.cgi?id=672271
Signed-off-by: Federico Mena Quintero <federico@gnome.org>
2016-03-10 15:15:38 -06:00
Timothy Arceri
616172d133 filechooser: Show FUSE mounted locations in shortcuts
Since FUSE locations can be handled safely by applications show these mounted locations regardless of whether gtk_file_chooser_set_local_only()
is set to TRUE

https://bugzilla.gnome.org/show_bug.cgi?id=586367

Conflicts:
	gtk/gtkfilechooser.c
	gtk/gtkfilechooserdefault.c
	gtk/gtkfilesystem.c
	gtk/gtkfilesystem.h
2016-03-10 15:15:38 -06:00
Matthias Clasen
5fe689ace8 filechooser: Fix entry completion
Inserting the selected completion did not actually work. Oops.

https://bugzilla.gnome.org/show_bug.cgi?id=673090
2016-03-10 15:15:38 -06:00
Benjamin Otte
b65de86fe8 filechooserentry: Catch tab key earlier
Instead of in the key_press handler, use a signal handler. The signal
handler runs before the default handler, and before other signal
handlers. In particular it runs before the signal handler installed via
gtk_entry_set_completion() which pops down the entry completion, and we
don't want that to happen.

The code does not change the code of the handler in any significant way,
it just refacotrs it to not call the parent anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=663573

Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:38 -06:00
Benjamin Otte
dd255913f3 filechooserentry: Do inline completion only when opening files
When saving files, using <tab> is required. We don't want the UI
randomly changing filenames from below us.

https://bugzilla.gnome.org/show_bug.cgi?id=663573
2016-03-10 15:15:38 -06:00
Benjamin Otte
fae77435e5 filechooserentry: Remove unused enum 2016-03-10 15:15:38 -06:00
Benjamin Otte
7e65600118 filechooserentry: Allow NULL as base folder again
This was removed previously, but is necessary to support the case where
no base folder is in use, which should cause an error. This can be
experienced in save mode in the recent files list.

https://bugzilla.gnome.org/show_bug.cgi?id=663573
2016-03-10 15:15:38 -06:00
Benjamin Otte
ca22beb670 filechooserentry: Don't show files when selecting directory
We don't want to complete on files when they're not supposed to be
selectable.
2016-03-10 15:15:37 -06:00
Benjamin Otte
4d33adc132 filechooserentry: Remove beep function
There's only 2 places left where we potentially beep. We can call
gtk_widget_error_bell() directly there.
2016-03-10 15:15:37 -06:00
Benjamin Otte
4d59042b68 filechooserentry: Simplify load completion
Most importantly, consistently trigger a beep when we abort a pending
completion.
2016-03-10 15:15:37 -06:00
Benjamin Otte
6a94cedee3 filechooserentry: Use a GtkFileFilter for filtering
That way, we can use the regular filtering features of the
filesystemmodel instead of having our own filtering function that
duplicates much of the matching code.

This also removes the broken-on-windows feature where files strting with
a dot were not autocompleted.

Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:37 -06:00
Benjamin Otte
ea2129fda1 filechooserentry: Remove the file column
It is not needed anymore.
2016-03-10 15:15:37 -06:00
Benjamin Otte
af39ce608b filechooserentry: Simplify code
Use all the clever functions we invented in recent refactorings to
compute the file and dir part and the current folder.

This also fixes the bug where "./" was not taken as the current
directory but interpreted as a file named "./".
2016-03-10 15:15:37 -06:00
Benjamin Otte
c351227a9d filechooserentry: Refactor function
Name the function set_completion_folder() and make it accept NULL, so it
behaves like a regular setter function.
2016-03-10 15:15:37 -06:00
Benjamin Otte
1945577a61 filechooserentry: Set minimum key length to 0
We want the empty chooser to show possible completions, too.
2016-03-10 15:15:37 -06:00
Benjamin Otte
83dd275d21 filechooserentry: Simplify refresh_current_folder_and_file_part()
The function can get the text it's refreshing from itself, as there is
only one possible value. And it doesn't need to return a value anymore.
2016-03-10 15:15:37 -06:00
Benjamin Otte
dbb59f3dc4 filechooserentry: Get rid of unused member variable
in_change isn't set anymore.
2016-03-10 15:15:37 -06:00
Benjamin Otte
33fffa727a filechooserentry: Remove _gtk_file_chooser_entry_set_file_part()
gtk_entry_set_text() is fine.
2016-03-10 15:15:37 -06:00
Benjamin Otte
ef5088f879 filechooserentry: Use completion for completion
Reduce the amount of code even more by using the entry completion to
query the prefix.
2016-03-10 15:15:37 -06:00
Benjamin Otte
87a67aa0e3 filechooserentry: Add gtk_file_chooser_entry_get_completion_text()
This returns the text that should be completed on. As this is somewhat
tricky to compute (and in fact one place did it wrong), let's make it a
function.
2016-03-10 15:15:37 -06:00
Benjamin Otte
8a4dda06fe filechooserentry: Don't update the folder when completing
The folder is always up to date, there's no need to update it. (If the
folder is not up to date, that is a bug and needs to be fixed
elsewhere.)
2016-03-10 15:15:37 -06:00
Benjamin Otte
6ae5aa7429 filechooserentry: Don't override activate
The code is no longer necessary, because the relevant parts for inline
completion are now handled by GtkEntry.
2016-03-10 15:15:37 -06:00
Benjamin Otte
310b484eee filechooserentry: Simplify append_common_prefix()
Now that we don't need to know anymore why insertion failed, we can
simplify the append function quite a lot.

A simple rule now: If we did not insert anything, beep.
2016-03-10 15:15:37 -06:00
Benjamin Otte
75be2cca58 filechooserentry: Remove completion feedback
Too much special code for no gain.

I did a totally unscientific questionnaire on GNOME IRC (assuming
autocompletion is for advanced users) and nobody even knew what this is.
So I suspect it's useless. Also, it's positioned completely wrong anyway
and nobody noticed so far. Last but not least, I'm trying to imitate
bash here and bash doesn't show feedback.

Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:37 -06:00
Benjamin Otte
8a9a377527 filechooserentry: Redo completion popup trigger
Use dispatch_properties_changed() instead of GtkEditable to watch for
changes to the to-be-completed text. This is necessary because various
functions in GtkEntry don't use the interface vfuncs and one only
becomes aware of them via notifications. I'm not sure this is intended
behavior, but it's how it works today.
Also, use the same code for triggering in all situations.

What the code does is this: It looks at the part of the text in front of
the cursor (or selection) and completes for it. Once the directory has
been enumerated, inline completion is activated. Note that popping up of
the completion popup is completely handled by GtkEntry.

Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:37 -06:00
Benjamin Otte
7570e54212 filechooserentry: Get rid of RefreshMode
Instead, pass the text to use to refresh_current_folder_and_file_part().
This also gets rid of the problem introduced earlier that the position
is not properly updated in do_insert_text() and therefor the completion
is wrong.
2016-03-10 15:15:37 -06:00
Benjamin Otte
46adc18c1d filechooserentry: Use inline completion
... from GtkEntryCompletion instead of implementing a poor copy
ourselves. This also makes the file chooser entry behave a lot closer to
normal entries.

Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:36 -06:00
Benjamin Otte
ad88e6d5c6 filechooserentry: Merge function 2016-03-10 15:15:36 -06:00
Benjamin Otte
3bf9b56234 filechooserentry: Set the text column of the entry completion
I want to use it in the next commits, but am doing this in a separate
commit so we can find side effects causing bugs easier when bisecting.
2016-03-10 15:15:36 -06:00
Benjamin Otte
755d8163ea filechooserentry: Simplify match_selected function
Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:36 -06:00
Benjamin Otte
83421a5f8e filechooserentry: Keep an extra column for the full path
This is identical to the display name when not having a path that
changes the folder. Otherwise it will have the full path that was
entered in the entry. Say when from your home dir, you type
"../../usr/li", the full path for "lib" and "lib64" will be
"../../usr/lib" and "../../usr/lib64" respectively. This value isn't
used yet, but will be soon.
2016-03-10 15:15:36 -06:00
Benjamin Otte
a0ee779cc2 filechooserentry: Redo _gtk_file_chooser_entry_get_file_part()
The new version does not need to update any text, it just strips the
last part of the existing entry.
2016-03-10 15:15:36 -06:00
Benjamin Otte
877e238133 filechooserentry: Modify _gtk_file_chooser_entry_get_current_folder()
The new version does not need to muck with the entry, it just extracts
the required information. It returns a reference to the folder though,
as we extract the information now instead of returning something stored.
2016-03-10 15:15:36 -06:00
Benjamin Otte
143306a515 filechooserentry: Split out function
I want to use that function elsewhere, so split it out.
2016-03-10 15:15:36 -06:00
Benjamin Otte
623c3a6aec filechooserentry: Simplify code
Now that the base folder is always != NULL, we can remove the parts of
the code that check for NULL.
2016-03-10 15:15:36 -06:00
Benjamin Otte
39dbcbab97 filechooserentry: Ensure the base folder is always valid
If the base folder is set to NULL, then we just assume the home dir.
FIXME: Should we disallow a NULL folder?
2016-03-10 15:15:36 -06:00
Benjamin Otte
02705bce36 filechooserentry: Don't complain about incomplete hostnames
First of all, those hostnames may very well be complete, second of all,
smb:// is a valid uri to enter.
2016-03-10 15:15:36 -06:00
Benjamin Otte
f0573f8b42 filechooserentry: Start autocomplete immediately
Don't do idle handlers for this.

Conflicts:
	gtk/gtkfilechooserentry.c
2016-03-10 15:15:36 -06:00
Benjamin Otte
a8c766991a filechooserentry: Remove file_system argument
It's not needed anymore.
2016-03-10 15:15:36 -06:00