Changeset 4127

Show
Ignore:
Timestamp:
2006年07月28日 07時58分52秒 (2 years ago)
Author:
fujii
Message:

see ticket:321.

Use GetClipboardSequenceNumber? API for checking whether contents of
clipboard is changed since w32-set-clipboard-data is called if
available.

* mw32clpbd.c (GetClipboardSequenceNumber?_Proc): New type.
(get_clipboard_sequence_number_fn): New variable.
(last_clipboard_sequence_number): New variable.
(Fw32_set_clipboard_data): Store clipboard text only if
GetClipboardSequenceNumber? API is not available. Store clipboard
sequence number instread of clipboard text if
GetClipboardSequenceNumber? API is available.
(Fw32_get_clipboard_data): Return nil if clipboard sequence number
is not changed since w32-set-clipboard-data sets data in
clipboard.
(init_mw32clpbd): New function.

* emacs.c (main): Call init_mw32clpbd.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/ChangeLog.Meadow

    r4123 r4127  
     12006-07-28  Masayuki FUJII  <boochang@m4.kcn.ne.jp> 
     2 
     3        * mw32clpbd.c (GetClipboardSequenceNumber_Proc): New type. 
     4        (get_clipboard_sequence_number_fn): New variable. 
     5        (last_clipboard_sequence_number): New variable. 
     6        (Fw32_set_clipboard_data): Store clipboard text only if 
     7        GetClipboardSequenceNumber API is not available. Store clipboard 
     8        sequence number instread of clipboard text if 
     9        GetClipboardSequenceNumber API is available. 
     10        (Fw32_get_clipboard_data): Return nil if clipboard sequence number 
     11        is not changed since w32-set-clipboard-data sets data in 
     12        clipboard. 
     13        (init_mw32clpbd): New function. 
     14 
     15        * emacs.c (main): Call init_mw32clpbd. 
     16 
    1172006-07-27  MIYOSHI Masanori  <miyoshi@meadowy.org> 
    218 
  • trunk/src/emacs.c

    r4119 r4127  
    17381738  init_mw32reg (); 
    17391739  init_mw32mci (); 
     1740  init_mw32clpbd (); 
    17401741#endif 
    17411742  init_fns (); 
  • trunk/src/mw32clpbd.c

    r4074 r4127  
    5858static size_t clipboard_storage_size = 0; 
    5959 
     60typedef DWORD (WINAPI *GetClipboardSequenceNumber_Proc)(VOID); 
     61GetClipboardSequenceNumber_Proc get_clipboard_sequence_number_fn = NULL; 
     62 
     63static DWORD last_clipboard_sequence_number = 0; 
     64 
     65 
    6066/* From w32select.c(GNU Emacs) */ 
    6167 
     
    109115  lptext[size] = '\0'; 
    110116 
    111   /* Stash away the data we are about to put into the 
    112      clipboard, so we could later check inside 
    113      Fw32_get_clipboard_data whether the clipboard still 
    114      holds our data.  */ 
    115   if (clipboard_storage_size < size) 
    116     { 
    117       clipboard_storage_size = size + 100; 
    118       last_clipboard_text = (char *) xrealloc (last_clipboard_text, 
    119                                                clipboard_storage_size); 
    120     } 
    121   if (last_clipboard_text) 
    122     { 
    123       memcpy (last_clipboard_text, lptext, size); 
    124       last_clipboard_text_size = size; 
     117  if (!get_clipboard_sequence_number_fn) 
     118    { 
     119      /* Stash away the data we are about to put into the 
     120         clipboard, so we could later check inside 
     121         Fw32_get_clipboard_data whether the clipboard still 
     122         holds our data.  */ 
     123      if (clipboard_storage_size < size) 
     124        { 
     125          clipboard_storage_size = size + 100; 
     126          last_clipboard_text = (char *) xrealloc (last_clipboard_text, 
     127                                                   clipboard_storage_size); 
     128        } 
     129      if (last_clipboard_text) 
     130        { 
     131          memcpy (last_clipboard_text, lptext, size); 
     132          last_clipboard_text_size = size; 
     133        } 
    125134    } 
    126135 
     
    136145 
    137146  CloseClipboard (); 
     147 
     148  if (get_clipboard_sequence_number_fn) 
     149    last_clipboard_sequence_number = get_clipboard_sequence_number_fn (); 
    138150 
    139151  if (ok) 
     
    172184 
    173185  BLOCK_INPUT; 
     186 
     187  if (last_clipboard_sequence_number && 
     188      last_clipboard_sequence_number == get_clipboard_sequence_number_fn ()) 
     189    return Qnil; 
    174190 
    175191  if (!OpenClipboard (NULL)) 
     
    240256} 
    241257 
     258void 
     259init_mw32clpbd (void) 
     260{ 
     261  HMODULE user32_lib = GetModuleHandle ("user32.dll"); 
     262 
     263  get_clipboard_sequence_number_fn = (GetClipboardSequenceNumber_Proc) 
     264    GetProcAddress (user32_lib, "GetClipboardSequenceNumber"); 
     265 
     266  /* Test GetClipboardSequenceNumber API. If test fails, make it 
     267     inavailable. */ 
     268  if (!get_clipboard_sequence_number_fn ()) 
     269    get_clipboard_sequence_number_fn = NULL; 
     270} 
     271 
    242272syms_of_mw32clipboard () 
    243273{