[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master af729b1dfd: Make quitting actually work in Haiku file dialogs
From: |
Po Lu |
Subject: |
master af729b1dfd: Make quitting actually work in Haiku file dialogs |
Date: |
Sat, 1 Jan 2022 19:48:43 -0500 (EST) |
branch: master
commit af729b1dfd235de400f6a0998a968222417596bf
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Make quitting actually work in Haiku file dialogs
* src/haiku_support.h: (be_popup_file_dialog)
* src/haiku_support.cc (be_popup_file_dialog): New parameter
`maybe_quit_function'.
* src/haikufns.c (Fhaiku_read_file_name): Pass `maybe_quit' as
the maybe_quit_function.
---
src/haiku_support.cc | 14 +++++++++++---
src/haiku_support.h | 3 ++-
src/haikufns.c | 2 +-
3 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 211d37b8e1..8bd7c04ee8 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -2624,7 +2624,8 @@ char *
be_popup_file_dialog (int open_p, const char *default_dir, int must_match_p,
int dir_only_p,
void *window, const char *save_text, const char *prompt,
void (*block_input_function) (void),
- void (*unblock_input_function) (void))
+ void (*unblock_input_function) (void),
+ void (*maybe_quit_function) (void))
{
ptrdiff_t idx = c_specpdl_idx_from_cxx ();
/* setjmp/longjmp is UB with automatic objects. */
@@ -2635,7 +2636,6 @@ be_popup_file_dialog (int open_p, const char
*default_dir, int must_match_p, int
BMessage *msg = new BMessage ('FPSE');
BFilePanel *panel = new BFilePanel (open_p ? B_OPEN_PANEL : B_SAVE_PANEL,
NULL, NULL, mode);
- unblock_input_function ();
struct popup_file_dialog_data dat;
dat.entry = path;
@@ -2660,6 +2660,7 @@ be_popup_file_dialog (int open_p, const char
*default_dir, int must_match_p, int
panel->Show ();
panel->Window ()->Show ();
+ unblock_input_function ();
void *buf = alloca (200);
while (1)
@@ -2669,19 +2670,26 @@ be_popup_file_dialog (int open_p, const char
*default_dir, int must_match_p, int
if (!haiku_read_with_timeout (&type, buf, 200, 100000))
{
+ block_input_function ();
if (type != FILE_PANEL_EVENT)
haiku_write (type, buf);
else if (!ptr)
ptr = (char *) ((struct haiku_file_panel_event *) buf)->ptr;
+ unblock_input_function ();
+
+ maybe_quit_function ();
}
ssize_t b_s;
+ block_input_function ();
haiku_read_size (&b_s);
- if (!b_s || b_s == -1 || ptr || panel->Window ()->IsHidden ())
+ if (!b_s || ptr || panel->Window ()->IsHidden ())
{
c_unbind_to_nil_from_cxx (idx);
+ unblock_input_function ();
return ptr;
}
+ unblock_input_function ();
}
}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 0377376a02..dd5e168d14 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -740,7 +740,8 @@ extern "C"
int dir_only_p, void *window, const char *save_text,
const char *prompt,
void (*block_input_function) (void),
- void (*unblock_input_function) (void));
+ void (*unblock_input_function) (void),
+ void (*maybe_quit_function) (void));
extern void
record_c_unwind_protect_from_cxx (void (*) (void *), void *);
diff --git a/src/haikufns.c b/src/haikufns.c
index bf0bf8e525..743ecf1aef 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -2236,7 +2236,7 @@ Optional arg SAVE_TEXT, if non-nil, specifies some text
to show in the entry fie
FRAME_HAIKU_WINDOW (f),
!NILP (save_text) ? SSDATA (ENCODE_UTF_8
(save_text)) : NULL,
SSDATA (ENCODE_UTF_8 (prompt)),
- block_input, unblock_input);
+ block_input, unblock_input, maybe_quit);
unbind_to (idx, Qnil);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master af729b1dfd: Make quitting actually work in Haiku file dialogs,
Po Lu <=