[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/pgtk 1d549fa 015/100: Add support for make-frame-(in)visible
From: |
Yuuki Harano |
Subject: |
feature/pgtk 1d549fa 015/100: Add support for make-frame-(in)visible |
Date: |
Tue, 24 Nov 2020 08:02:27 -0500 (EST) |
branch: feature/pgtk
commit 1d549fa0690d174446ff139bece6db5decd25eba
Author: Yuuki Harano <masm+github@masm11.me>
Commit: Jeff Walsh <fejfighter@gmail.com>
Add support for make-frame-(in)visible
* ../src/pgtkterm.c (pgtk_make_frame_visible_wait_for_map_event_cb)
(pgtk_make_frame_visible_wait_for_map_event_timeout)
(x_make_frame_visible, x_new_font)
(pgtk_make_frame_visible_invisible, pgtk_make_frame_visible)
(pgtk_redisplay_interface, pgtk_create_terminal, map_event)
(syms_of_pgtkterm):
make-frame-visible/invisible 実装。
---
src/pgtkterm.c | 105 ++++++++++++++++++++++++---------------------------------
1 file changed, 44 insertions(+), 61 deletions(-)
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index e081d8c..3e3c73c 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -462,14 +462,25 @@ pgtk_iconify_frame (struct frame *f)
SET_FRAME_ICONIFIED (f, true);
SET_FRAME_VISIBLE (f, 0);
-#if 0
- XFlush (FRAME_X_DISPLAY (f));
-#else
- gdk_flush();
-#endif
unblock_input ();
}
+static gboolean
+pgtk_make_frame_visible_wait_for_map_event_cb (GtkWidget *widget, GdkEventAny
*event, gpointer user_data)
+{
+ int *foundptr = user_data;
+ *foundptr = 1;
+ return FALSE;
+}
+
+static gboolean
+pgtk_make_frame_visible_wait_for_map_event_timeout (gpointer user_data)
+{
+ int *timedoutptr = user_data;
+ *timedoutptr = 1;
+ return FALSE;
+}
+
void
pgtk_make_frame_visible (struct frame *f)
/* --------------------------------------------------------------------------
@@ -478,54 +489,26 @@ pgtk_make_frame_visible (struct frame *f)
{
PGTK_TRACE("pgtk_make_frame_visible");
- GtkWidget *win = FRAME_OUTPUT_DATA(f)->widget;
+ GtkWidget *win = FRAME_GTK_OUTER_WIDGET (f);
- gtk_widget_show(win);
-
-#if 0
- NSTRACE ("x_make_frame_visible");
- /* XXX: at some points in past this was not needed, as the only place that
- called this (frame.c:Fraise_frame ()) also called raise_lower;
- if this ends up the case again, comment this out again. */
- if (!FRAME_VISIBLE_P (f))
+ if (! FRAME_VISIBLE_P (f))
{
- EmacsView *view = (EmacsView *)FRAME_NS_VIEW (f);
- NSWindow *window = [view window];
-
- SET_FRAME_VISIBLE (f, 1);
- ns_raise_frame (f, ! FRAME_NO_FOCUS_ON_MAP (f));
+ gtk_widget_show(win);
+ gtk_window_deiconify(GTK_WINDOW(win));
- /* Making a new frame from a fullscreen frame will make the new frame
- fullscreen also. So skip handleFS as this will print an error. */
- if ([view fsIsNative] && f->want_fullscreen == FULLSCREEN_BOTH
- && [view isFullscreen])
- return;
-
- if (f->want_fullscreen != FULLSCREEN_NONE)
- {
- block_input ();
- [view handleFS];
- unblock_input ();
- }
-
- /* Making a frame invisible seems to break the parent->child
- relationship, so reinstate it. */
- if ([window parentWindow] == nil && FRAME_PARENT_FRAME (f) != NULL)
- {
- NSWindow *parent = [FRAME_NS_VIEW (FRAME_PARENT_FRAME (f)) window];
-
- block_input ();
- [parent addChildWindow: window
- ordered: NSWindowAbove];
- unblock_input ();
-
- /* If the parent frame moved while the child frame was
- invisible, the child frame's position won't have been
- updated. Make sure it's in the right place now. */
- x_set_offset(f, f->left_pos, f->top_pos, 0);
- }
+ if (FLOATP (Vpgtk_wait_for_event_timeout)) {
+ guint msec = (guint) (XFLOAT_DATA (Vpgtk_wait_for_event_timeout) *
1000);
+ int found = 0;
+ int timed_out = 0;
+ gulong id = g_signal_connect(win, "map-event",
G_CALLBACK(pgtk_make_frame_visible_wait_for_map_event_cb), &found);
+ guint src = g_timeout_add(msec,
pgtk_make_frame_visible_wait_for_map_event_timeout, &timed_out);
+ while (!found && !timed_out)
+ gtk_main_iteration();
+ g_signal_handler_disconnect (win, id);
+ if (!timed_out)
+ g_source_remove(src);
+ }
}
-#endif
}
@@ -541,15 +524,17 @@ pgtk_make_frame_invisible (struct frame *f)
gtk_widget_hide(win);
-#if 0
- NSView *view;
- NSTRACE ("x_make_frame_invisible");
- check_window_system (f);
- view = FRAME_NS_VIEW (f);
- [[view window] orderOut: NSApp];
SET_FRAME_VISIBLE (f, 0);
- SET_FRAME_ICONIFIED (f, 0);
-#endif
+ SET_FRAME_ICONIFIED (f, false);
+}
+
+static void
+pgtk_make_frame_visible_invisible (struct frame *f, bool visible)
+{
+ if (visible)
+ pgtk_make_frame_visible (f);
+ else
+ pgtk_make_frame_invisible (f);
}
static Lisp_Object
@@ -3296,9 +3281,6 @@ pgtk_hide_hourglass(struct frame *f)
static void
pgtk_flush_display (struct frame *f)
{
- block_input ();
- gdk_flush();
- unblock_input ();
}
extern frame_parm_handler pgtk_frame_parm_handlers[];
@@ -4348,6 +4330,7 @@ pgtk_create_terminal (struct pgtk_display_info *dpyinfo)
terminal->mouse_position_hook = pgtk_mouse_position;
// terminal->frame_rehighlight_hook = pgtk_frame_rehighlight;
// terminal->frame_raise_lower_hook = pgtk_frame_raise_lower;
+ terminal->frame_visible_invisible_hook = pgtk_make_frame_visible_invisible;
terminal->fullscreen_hook = pgtk_fullscreen_hook;
terminal->menu_show_hook = pgtk_menu_show;
terminal->activate_menubar_hook = pgtk_activate_menubar;
@@ -5014,7 +4997,7 @@ static gboolean map_event(GtkWidget *widget, GdkEvent
*event, gpointer *user_dat
if (inev.ie.kind != NO_EVENT)
evq_enqueue(&inev);
- return TRUE;
+ return FALSE;
}
static gboolean window_state_event(GtkWidget *widget, GdkEvent *event,
gpointer *user_data)
- feature/pgtk da3c351 019/100: border_color/pixel width, (continued)
- feature/pgtk da3c351 019/100: border_color/pixel width, Yuuki Harano, 2020/11/24
- feature/pgtk 014d56f 052/100: * src/pgtkterm.c: Remove incorrect mark_object call., Yuuki Harano, 2020/11/24
- feature/pgtk bc35a1e 032/100: Make multipdisplay work by limiting selection while enabed, Yuuki Harano, 2020/11/24
- feature/pgtk d68633b 056/100: * src/pgtkterm.c (pgtk_defined_color): support gtk special colors, Yuuki Harano, 2020/11/24
- feature/pgtk 6957f94 024/100: Add PGTK support for fullscreen, Yuuki Harano, 2020/11/24
- feature/pgtk ae3bb14 029/100: implement restacking and cleanup frame z order, Yuuki Harano, 2020/11/24
- feature/pgtk 49645df 047/100: minimize gtkutil.c differences., Yuuki Harano, 2020/11/24
- feature/pgtk d2a29e8 040/100: emacsclient should use both of DISPLAY and WAYLAND_DISPLAY., Yuuki Harano, 2020/11/24
- feature/pgtk be47e34 077/100: Re-port image drawing code from X, Yuuki Harano, 2020/11/24
- feature/pgtk 0b69b73 085/100: Fix crash when child frame updates toolbar, Yuuki Harano, 2020/11/24
- feature/pgtk 1d549fa 015/100: Add support for make-frame-(in)visible,
Yuuki Harano <=
- feature/pgtk 19da22e 018/100: Add support for handing the internal border, Yuuki Harano, 2020/11/24
- feature/pgtk e021e23 043/100: End Resize flickering by copying surface rather than just clearing, Yuuki Harano, 2020/11/24
- feature/pgtk fd61a86 030/100: improve some efficiency - simplify draws, Yuuki Harano, 2020/11/24
- feature/pgtk 330a346 012/100: Migrate to Emacs_GC, Yuuki Harano, 2020/11/24
- feature/pgtk b1cc62c 037/100: Add support for Jpeglib, Yuuki Harano, 2020/11/24
- feature/pgtk fe2297c 055/100: * pgtkmenu.c (set_frame_menubar): fix empty menu., Yuuki Harano, 2020/11/24
- feature/pgtk a167e23 057/100: * src/pgtkmenu.c (set_frame_menubar): Suppress gcc warning, Yuuki Harano, 2020/11/24
- feature/pgtk 5a72a07 053/100: * pgtk-win.el: fix compile-time warnings., Yuuki Harano, 2020/11/24
- feature/pgtk bb6862d 089/100: Fix crash on drag and drop, Yuuki Harano, 2020/11/24
- feature/pgtk e405404 095/100: Fix startup failure on svg-unsupported environments, Yuuki Harano, 2020/11/24