From 3c5e1f8ec8d5d52e5bbf185d9618852e7d04e3ca Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 10 May 2022 04:11:32 +0000 Subject: [PATCH] Simplify Haiku selection code * src/haiku_select.cc (get_clipboard_object): New function. (BClipboard_find_data, BClipboard_get_targets, BClipboard_set_data) (BClipboard_find_system_data) (BClipboard_find_primary_selection_data) (BClipboard_find_secondary_selection_data) (BClipboard_set_system_data, BClipboard_set_primary_selection_data) (BClipboard_set_secondary_selection_data, BClipboard_free_data) (BClipboard_system_targets, BClipboard_primary_targets) (BClipboard_secondary_targets): Delete functions. (be_find_clipboard_data_1, be_set_clipboard_data_1) (be_get_clipboard_targets_1, be_find_clipboard_data) (be_set_clipboard_data, be_get_clipboard_targets): New functions. (be_lock_clipboard_message, be_unlock_clipboard): Use `get_clipboard_object' to get clipboard from ID. * src/haikuselect.c (haiku_get_clipboard_name): New function. (Fhaiku_selection_data, Fhaiku_selection_put) (Fhaiku_selection_owner_p): Adjust to use new simplified functions. * src/haikuselect.h: Update prototypes. --- src/haiku_select.cc | 168 +++++++++++++++++--------------------------- src/haikuselect.c | 75 +++++++------------- src/haikuselect.h | 21 ++---- 3 files changed, 92 insertions(+), 172 deletions(-) diff --git a/src/haiku_select.cc b/src/haiku_select.cc index a26a0049cbf..43b71138b33 100644 --- a/src/haiku_select.cc +++ b/src/haiku_select.cc @@ -35,22 +35,45 @@ static int64 count_clipboard = -1; static int64 count_primary = -1; static int64 count_secondary = -1; +static BClipboard * +get_clipboard_object (enum haiku_clipboard clipboard) +{ + switch (clipboard) + { + case CLIPBOARD_PRIMARY: + return primary; + + case CLIPBOARD_SECONDARY: + return secondary; + + case CLIPBOARD_CLIPBOARD: + return system_clipboard; + } + + abort (); +} + static char * -BClipboard_find_data (BClipboard *cb, const char *type, ssize_t *len) +be_find_clipboard_data_1 (BClipboard *cb, const char *type, ssize_t *len) { + BMessage *data; + const char *ptr; + ssize_t nbytes; + void *value; + if (!cb->Lock ()) - return 0; + return NULL; - BMessage *dat = cb->Data (); - if (!dat) + data = cb->Data (); + + if (!data) { cb->Unlock (); - return 0; + return NULL; } - const char *ptr; - ssize_t bt; - dat->FindData (type, B_MIME_TYPE, (const void **) &ptr, &bt); + data->FindData (type, B_MIME_TYPE, (const void **) &ptr, + &nbytes); if (!ptr) { @@ -59,9 +82,9 @@ BClipboard_find_data (BClipboard *cb, const char *type, ssize_t *len) } if (len) - *len = bt; + *len = nbytes; - void *data = malloc (bt); + value = malloc (nbytes); if (!data) { @@ -69,13 +92,14 @@ BClipboard_find_data (BClipboard *cb, const char *type, ssize_t *len) return NULL; } - memcpy (data, ptr, bt); + memcpy (value, ptr, nbytes); cb->Unlock (); - return (char *) data; + + return (char *) value; } static void -BClipboard_get_targets (BClipboard *cb, char **buf, int buf_size) +be_get_clipboard_targets_1 (BClipboard *cb, char **buf, int buf_size) { BMessage *data; char *name; @@ -122,116 +146,60 @@ BClipboard_get_targets (BClipboard *cb, char **buf, int buf_size) } static void -BClipboard_set_data (BClipboard *cb, const char *type, const char *dat, - ssize_t len, bool clear) +be_set_clipboard_data_1 (BClipboard *cb, const char *type, const char *data, + ssize_t len, bool clear) { + BMessage *message_data; + if (!cb->Lock ()) return; if (clear) cb->Clear (); - BMessage *mdat = cb->Data (); - if (!mdat) + message_data = cb->Data (); + + if (!message_data) { cb->Unlock (); return; } - if (dat) + if (data) { - if (mdat->ReplaceData (type, B_MIME_TYPE, dat, len) + if (message_data->ReplaceData (type, B_MIME_TYPE, data, len) == B_NAME_NOT_FOUND) - mdat->AddData (type, B_MIME_TYPE, dat, len); + message_data->AddData (type, B_MIME_TYPE, data, len); } else - mdat->RemoveName (type); + message_data->RemoveName (type); + cb->Commit (); cb->Unlock (); } char * -BClipboard_find_system_data (const char *type, ssize_t *len) -{ - if (!system_clipboard) - return 0; - - return BClipboard_find_data (system_clipboard, type, len); -} - -char * -BClipboard_find_primary_selection_data (const char *type, ssize_t *len) -{ - if (!primary) - return 0; - - return BClipboard_find_data (primary, type, len); -} - -char * -BClipboard_find_secondary_selection_data (const char *type, ssize_t *len) -{ - if (!secondary) - return 0; - - return BClipboard_find_data (secondary, type, len); -} - -void -BClipboard_set_system_data (const char *type, const char *data, - ssize_t len, bool clear) -{ - if (!system_clipboard) - return; - - count_clipboard = system_clipboard->SystemCount (); - BClipboard_set_data (system_clipboard, type, data, len, clear); -} - -void -BClipboard_set_primary_selection_data (const char *type, const char *data, - ssize_t len, bool clear) -{ - if (!primary) - return; - - count_primary = primary->SystemCount (); - BClipboard_set_data (primary, type, data, len, clear); -} - -void -BClipboard_set_secondary_selection_data (const char *type, const char *data, - ssize_t len, bool clear) +be_find_clipboard_data (enum haiku_clipboard id, const char *type, + ssize_t *len) { - if (!secondary) - return; - - count_secondary = secondary->SystemCount (); - BClipboard_set_data (secondary, type, data, len, clear); + return be_find_clipboard_data_1 (get_clipboard_object (id), + type, len); } void -BClipboard_free_data (void *ptr) +be_set_clipboard_data (enum haiku_clipboard id, const char *type, + const char *data, ssize_t len, bool clear) { - std::free (ptr); + be_set_clipboard_data_1 (get_clipboard_object (id), type, + data, len, clear); } void -BClipboard_system_targets (char **buf, int len) +be_get_clipboard_targets (enum haiku_clipboard id, char **targets, + int len) { - BClipboard_get_targets (system_clipboard, buf, len); -} - -void -BClipboard_primary_targets (char **buf, int len) -{ - BClipboard_get_targets (primary, buf, len); -} - -void -BClipboard_secondary_targets (char **buf, int len) -{ - BClipboard_get_targets (secondary, buf, len); + be_get_clipboard_targets_1 (get_clipboard_object (id), targets, + len); } bool @@ -443,12 +411,7 @@ be_lock_clipboard_message (enum haiku_clipboard clipboard, { BClipboard *board; - if (clipboard == CLIPBOARD_PRIMARY) - board = primary; - else if (clipboard == CLIPBOARD_SECONDARY) - board = secondary; - else - board = system_clipboard; + board = get_clipboard_object (clipboard); if (!board->Lock ()) return 1; @@ -465,12 +428,7 @@ be_unlock_clipboard (enum haiku_clipboard clipboard, bool discard) { BClipboard *board; - if (clipboard == CLIPBOARD_PRIMARY) - board = primary; - else if (clipboard == CLIPBOARD_SECONDARY) - board = secondary; - else - board = system_clipboard; + board = get_clipboard_object (clipboard); if (discard) board->Revert (); diff --git a/src/haikuselect.c b/src/haikuselect.c index 8ce71822983..0c808bdb937 100644 --- a/src/haikuselect.c +++ b/src/haikuselect.c @@ -35,6 +35,21 @@ struct frame *haiku_dnd_frame; static void haiku_lisp_to_message (Lisp_Object, void *); +static enum haiku_clipboard +haiku_get_clipboard_name (Lisp_Object clipboard) +{ + if (EQ (clipboard, QPRIMARY)) + return CLIPBOARD_PRIMARY; + + if (EQ (clipboard, QSECONDARY)) + return CLIPBOARD_SECONDARY; + + if (EQ (clipboard, QCLIPBOARD)) + return CLIPBOARD_CLIPBOARD; + + signal_error ("Invalid clipboard", clipboard); +} + DEFUN ("haiku-selection-data", Fhaiku_selection_data, Shaiku_selection_data, 2, 2, 0, doc: /* Retrieve content typed as NAME from the clipboard @@ -53,22 +68,15 @@ message in the format accepted by `haiku-drag-message', which see. */) int rc; CHECK_SYMBOL (clipboard); - - if (!EQ (clipboard, QPRIMARY) && !EQ (clipboard, QSECONDARY) - && !EQ (clipboard, QCLIPBOARD)) - signal_error ("Invalid clipboard", clipboard); + clipboard_name = haiku_get_clipboard_name (clipboard); if (!NILP (name)) { CHECK_STRING (name); block_input (); - if (EQ (clipboard, QPRIMARY)) - dat = BClipboard_find_primary_selection_data (SSDATA (name), &len); - else if (EQ (clipboard, QSECONDARY)) - dat = BClipboard_find_secondary_selection_data (SSDATA (name), &len); - else - dat = BClipboard_find_system_data (SSDATA (name), &len); + dat = be_find_clipboard_data (clipboard_name, + SSDATA (name), &len); unblock_input (); if (!dat) @@ -83,18 +91,11 @@ message in the format accepted by `haiku-drag-message', which see. */) Qforeign_selection, Qt, str); block_input (); - BClipboard_free_data (dat); + free (dat); unblock_input (); } else { - if (EQ (clipboard, QPRIMARY)) - clipboard_name = CLIPBOARD_PRIMARY; - else if (EQ (clipboard, QSECONDARY)) - clipboard_name = CLIPBOARD_SECONDARY; - else - clipboard_name = CLIPBOARD_CLIPBOARD; - block_input (); rc = be_lock_clipboard_message (clipboard_name, &message, false); unblock_input (); @@ -139,17 +140,11 @@ In that case, the arguments after NAME are ignored. */) int rc; void *message; + CHECK_SYMBOL (clipboard); + clipboard_name = haiku_get_clipboard_name (clipboard); + if (CONSP (name) || NILP (name)) { - if (EQ (clipboard, QPRIMARY)) - clipboard_name = CLIPBOARD_PRIMARY; - else if (EQ (clipboard, QSECONDARY)) - clipboard_name = CLIPBOARD_SECONDARY; - else if (EQ (clipboard, QCLIPBOARD)) - clipboard_name = CLIPBOARD_CLIPBOARD; - else - signal_error ("Invalid clipboard", clipboard); - rc = be_lock_clipboard_message (clipboard_name, &message, true); @@ -164,7 +159,6 @@ In that case, the arguments after NAME are ignored. */) return unbind_to (ref, Qnil); } - CHECK_SYMBOL (clipboard); CHECK_STRING (name); if (!NILP (data)) CHECK_STRING (data); @@ -172,20 +166,8 @@ In that case, the arguments after NAME are ignored. */) dat = !NILP (data) ? SSDATA (data) : NULL; len = !NILP (data) ? SBYTES (data) : 0; - if (EQ (clipboard, QPRIMARY)) - BClipboard_set_primary_selection_data (SSDATA (name), dat, len, - !NILP (clear)); - else if (EQ (clipboard, QSECONDARY)) - BClipboard_set_secondary_selection_data (SSDATA (name), dat, len, - !NILP (clear)); - else if (EQ (clipboard, QCLIPBOARD)) - BClipboard_set_system_data (SSDATA (name), dat, len, !NILP (clear)); - else - { - unblock_input (); - signal_error ("Bad clipboard", clipboard); - } - + be_set_clipboard_data (clipboard_name, SSDATA (name), dat, len, + !NILP (clear)); return Qnil; } @@ -193,18 +175,11 @@ DEFUN ("haiku-selection-owner-p", Fhaiku_selection_owner_p, Shaiku_selection_own 0, 1, 0, doc: /* Whether the current Emacs process owns the given SELECTION. The arg should be the name of the selection in question, typically one -of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. For -convenience, the symbol nil is the same as `PRIMARY', and t is the -same as `SECONDARY'. */) +of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. */) (Lisp_Object selection) { bool value; - if (NILP (selection)) - selection = QPRIMARY; - else if (EQ (selection, Qt)) - selection = QSECONDARY; - block_input (); if (EQ (selection, QPRIMARY)) value = BClipboard_owns_primary (); diff --git a/src/haikuselect.h b/src/haikuselect.h index d4f331a9ccb..b63d3c36536 100644 --- a/src/haikuselect.h +++ b/src/haikuselect.h @@ -41,28 +41,15 @@ extern void init_haiku_select (void); #endif /* Whether or not the selection was recently changed. */ -/* Find a string with the MIME type TYPE in the system clipboard. */ -extern char *BClipboard_find_system_data (const char *, ssize_t *); -extern char *BClipboard_find_primary_selection_data (const char *, ssize_t *); -extern char *BClipboard_find_secondary_selection_data (const char *, ssize_t *); - -extern void BClipboard_set_system_data (const char *, const char *, ssize_t, bool); -extern void BClipboard_set_primary_selection_data (const char *, const char *, - ssize_t, bool); -extern void BClipboard_set_secondary_selection_data (const char *, const char *, - ssize_t, bool); - -extern void BClipboard_system_targets (char **, int); -extern void BClipboard_primary_targets (char **, int); -extern void BClipboard_secondary_targets (char **, int); +extern char *be_find_clipboard_data (enum haiku_clipboard, const char *, ssize_t *); +extern void be_set_clipboard_data (enum haiku_clipboard, const char *, const char *, + ssize_t, bool); +extern void be_get_clipboard_targets (enum haiku_clipboard, char **, int); extern bool BClipboard_owns_clipboard (void); extern bool BClipboard_owns_primary (void); extern bool BClipboard_owns_secondary (void); -/* Free the returned data. */ -extern void BClipboard_free_data (void *); - extern int be_enum_message (void *, int32 *, int32, int32 *, const char **); extern int be_get_message_data (void *, const char *, int32, int32, const void **, ssize_t *); -- 2.39.2