Received: from luna.worldonline.nl (luna.worldonline.nl [195.241.48.131])
by larissa.worldonline.nl (8.8.5/8.8.5) with ESMTP id MAA12414
for <
[email protected]>; Sat, 24 Jul 1999 12:58:27 +0200 (MET DST)
Received: from ulwar.pair.com (ulwar.pair.com [209.68.1.173])
by luna.worldonline.nl (8.8.5/8.8.5) with ESMTP id MAA28772
for <
[email protected]>; Sat, 24 Jul 1999 12:50:40 +0200 (MET DST)
Received: from foobar.math.fu-berlin.de (foobar.math.fu-berlin.de [160.45.45.151]) by ulwar.pair.com (8.9.1/8.6.12) with SMTP id GAA20067 for <
[email protected]>; Sat, 24 Jul 1999 06:50:38 -0400 (EDT)
X-Envelope-To: <
[email protected]>
Received: (qmail 22368 invoked by uid 200); 24 Jul 1999 10:52:24 -0000
Mailing-List: contact
[email protected]; run by ezmlm
Precedence: bulk
Delivered-To: mailing list
[email protected]
Received: (qmail 22360 invoked from network); 24 Jul 1999 10:52:16 -0000
Message-Id: <
[email protected]>
To:
[email protected]
Subject: patch 5.4p.13
From: Bram Moolenaar <
[email protected]>
Date: Sat, 24 Jul 1999 13:02:36 +0200
Sender:
[email protected]
Content-type: text
Status: U
This is the "official" version of the previous copy/paste hang problem fix.
I also included the change to make vim work with GTK 1.0.6.
Patch 5.4p.13
Problem: GTK: pasting selected text sometimes caused a hang.
Hang with GTK 1.0.6.
Solution: In clip_mch_request_selection() there was a gui_mch_update() call
in the wrong place.
Also: Skip getting a normal string selection if the Vim selection
was already obtained successfully.
Added idle_function() back. (Kahn)
Files: src/gui_gtk_x11.c
*** ../vim-5.4p/src/gui_gtk_x11.c Mon Jul 19 11:09:06 1999
--- src/gui_gtk_x11.c Fri Jul 23 12:45:47 1999
***************
*** 582,588 ****
return TRUE;
}
! static int did_receive_selection = FALSE;
/*ARGSUSED*/
static void
--- 582,591 ----
return TRUE;
}
! #define RS_NONE 0 /* selection_received_event() not called yet */
! #define RS_OK 1 /* selection_received_event() called and OK */
! #define RS_FAIL 2 /* selection_received_event() called and failed */
! static int received_selection;
/*ARGSUSED*/
static void
***************
*** 592,600 ****
long_u len;
char_u *p;
- did_receive_selection = TRUE;
-
if ((!data->data) || (data->length <= 0)) {
/* clip_free_selection(); ??? */
if (gtk_main_level() > 0)
gtk_main_quit();
--- 595,602 ----
long_u len;
char_u *p;
if ((!data->data) || (data->length <= 0)) {
+ received_selection = RS_FAIL;
/* clip_free_selection(); ??? */
if (gtk_main_level() > 0)
gtk_main_quit();
***************
*** 611,616 ****
--- 613,619 ----
len--;
}
clip_yank_selection(motion_type, p, (long) len);
+ received_selection = RS_OK;
if (gtk_main_level() > 0)
gtk_main_quit();
}
***************
*** 2047,2052 ****
--- 2056,2072 ----
gdk_gc_destroy(gc);
}
+ #ifndef GTK_HAVE_FEATURES_1_1_0
+ static gint
+ idle_function(GtkWidget * label)
+ {
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
+
+ return FALSE;
+ }
+ #endif
+
/*
* Catch up with any queued X11 events. This may put keyboard input into the
***************
*** 2057,2066 ****
void
gui_mch_update()
{
while (gtk_events_pending() && !vim_is_input_buf_full())
gtk_main_iteration_do(FALSE);
! return;
}
static gint
--- 2077,2098 ----
void
gui_mch_update()
{
+ #ifdef GTK_HAVE_FEATURES_1_1_0
while (gtk_events_pending() && !vim_is_input_buf_full())
gtk_main_iteration_do(FALSE);
+ #else
+ int pending;
+
+ /* Somehow the above loop hangs on GTK 1.0.6. Use the idle_function() to
+ * work around this weird problem. */
+ while (((pending = gtk_events_pending()) > 1) && !vim_is_input_buf_full())
+ gtk_main_iteration();
! if ((pending == 1) && !vim_is_input_buf_full()) {
! gtk_idle_add((GtkFunction)idle_function, gui.mainwin);
! gtk_main_iteration_do(FALSE);
! }
! #endif
}
static gint
***************
*** 2322,2342 ****
clip_mch_request_selection()
{
/* First try to get the content of our own special clipboard. */
(void)gtk_selection_convert(gui.drawarea,
GDK_SELECTION_PRIMARY, clipboard.atom,
GDK_CURRENT_TIME);
! did_receive_selection = FALSE;
! while (!did_receive_selection)
! gtk_main(); /* wait until signal arrives */
! /* Ok now try to get it out of the usual string selection. */
! (void)gtk_selection_convert(gui.drawarea, GDK_SELECTION_PRIMARY,
GDK_TARGET_STRING,
GDK_CURRENT_TIME);
! gui_mch_update();
! did_receive_selection = FALSE;
! while (!did_receive_selection)
! gtk_main(); /* wait until signal arrives */
}
void
--- 2354,2376 ----
clip_mch_request_selection()
{
/* First try to get the content of our own special clipboard. */
+ received_selection = RS_NONE;
(void)gtk_selection_convert(gui.drawarea,
GDK_SELECTION_PRIMARY, clipboard.atom,
GDK_CURRENT_TIME);
! while (received_selection == RS_NONE)
! gtk_main(); /* wait for selection_received_event */
! if (received_selection == RS_FAIL)
! {
! /* Now try to get it out of the usual string selection. */
! received_selection = RS_NONE;
! (void)gtk_selection_convert(gui.drawarea, GDK_SELECTION_PRIMARY,
GDK_TARGET_STRING,
GDK_CURRENT_TIME);
! while (received_selection == RS_NONE)
! gtk_main(); /* wait for selection_received_event */
! }
}
void
--
hundred-and-one symptoms of being an internet addict:
246. You use up your free 100 hours in less than a week.
--/-/---- Bram Moolenaar ----
[email protected] ----
[email protected] ---\-\--
\ \ www.vim.org/iccf www.moolenaar.net www.vim.org / /