]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkclipboard.c
Some more documentation fixes
[~andy/gtk] / gtk / gtkclipboard.c
index e918495ffc7a52e7a2dba1ad2f06e6b6f5eda537..e0b736f9c112f036fdf23aa328ef1a2c10075ea4 100644 (file)
@@ -13,9 +13,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  *
  * Global clipboard abstraction. 
  */
 #include "x11/gdkx.h"
 #endif
 
+#ifdef GDK_WINDOWING_BROADWAY
+#include "broadway/gdkbroadway.h"
+#endif
+
 #ifdef GDK_WINDOWING_WIN32
 #include "win32/gdkwin32.h"
 #endif
 
+
+/**
+ * SECTION:gtkclipboard
+ * @Short_description: Storing data on clipboards
+ * @Title: Clipboards
+ * @See_also: #GtkSelection
+ *
+ * The #GtkClipboard object represents a clipboard of data shared
+ * between different processes or between different widgets in
+ * the same process. Each clipboard is identified by a name encoded as a
+ * #GdkAtom. (Conversion to and from strings can be done with
+ * gdk_atom_intern() and gdk_atom_name().) The default clipboard
+ * corresponds to the "CLIPBOARD" atom; another commonly used clipboard
+ * is the "PRIMARY" clipboard, which, in X, traditionally contains
+ * the currently selected text.
+ *
+ * To support having a number of different formats on the clipboard
+ * at the same time, the clipboard mechanism allows providing
+ * callbacks instead of the actual data.  When you set the contents
+ * of the clipboard, you can either supply the data directly (via
+ * functions like gtk_clipboard_set_text()), or you can supply a
+ * callback to be called at a later time when the data is needed (via
+ * gtk_clipboard_set_with_data() or gtk_clipboard_set_with_owner().)
+ * Providing a callback also avoids having to make copies of the data
+ * when it is not needed.
+ *
+ * gtk_clipboard_set_with_data() and gtk_clipboard_set_with_owner()
+ * are quite similar; the choice between the two depends mostly on
+ * which is more convenient in a particular situation.
+ * The former is most useful when you want to have a blob of data
+ * with callbacks to convert it into the various data types that you
+ * advertise. When the @clear_func you provided is called, you
+ * simply free the data blob. The latter is more useful when the
+ * contents of clipboard reflect the internal state of a #GObject
+ * (As an example, for the PRIMARY clipboard, when an entry widget
+ * provides the clipboard's contents the contents are simply the
+ * text within the selected region.) If the contents change, the
+ * entry widget can call gtk_clipboard_set_with_owner() to update
+ * the timestamp for clipboard ownership, without having to worry
+ * about @clear_func being called.
+ *
+ * Requesting the data from the clipboard is essentially
+ * asynchronous. If the contents of the clipboard are provided within
+ * the same process, then a direct function call will be made to
+ * retrieve the data, but if they are provided by another process,
+ * then the data needs to be retrieved from the other process, which
+ * may take some time. To avoid blocking the user interface, the call
+ * to request the selection, gtk_clipboard_request_contents() takes a
+ * callback that will be called when the contents are received (or
+ * when the request fails.) If you don't want to deal with providing
+ * a separate callback, you can also use gtk_clipboard_wait_for_contents().
+ * What this does is run the GLib main loop recursively waiting for
+ * the contents. This can simplify the code flow, but you still have
+ * to be aware that other callbacks in your program can be called
+ * while this recursive mainloop is running.
+ *
+ * Along with the functions to get the clipboard contents as an
+ * arbitrary data chunk, there are also functions to retrieve
+ * it as text, gtk_clipboard_request_text() and
+ * gtk_clipboard_wait_for_text(). These functions take care of
+ * determining which formats are advertised by the clipboard
+ * provider, asking for the clipboard in the best available format
+ * and converting the results into the UTF-8 encoding. (The standard
+ * form for representing strings in GTK+.)
+ */
+
+
 enum {
   OWNER_CHANGE,
   LAST_SIGNAL
@@ -176,14 +245,14 @@ gtk_clipboard_class_init (GtkClipboardClass *class)
   /**
    * GtkClipboard::owner-change:
    * @clipboard: the #GtkClipboard on which the signal is emitted
-   * @event: (type Gdk.EventOwnerChange): the @GdkEventOwnerChange event 
+   * @event: (type Gdk.EventOwnerChange): the @GdkEventOwnerChange event
    *
    * The ::owner-change signal is emitted when GTK+ receives an
-   * event that indicates that the ownership of the selection 
+   * event that indicates that the ownership of the selection
    * associated with @clipboard has changed.
    *
    * Since: 2.6
-   */ 
+   */
   clipboard_signals[OWNER_CHANGE] =
     g_signal_new (I_("owner-change"),
                  G_TYPE_FROM_CLASS (gobject_class),
@@ -233,7 +302,7 @@ gtk_clipboard_finalize (GObject *object)
 
   if (clipboard->notify_signal_id != 0)
     g_signal_handler_disconnect (clipboard_widget, clipboard->notify_signal_id);
-  
+
   g_free (clipboard->storable_targets);
   g_free (clipboard->cached_targets);
 
@@ -257,9 +326,8 @@ clipboard_display_closed (GdkDisplay   *display,
 /**
  * gtk_clipboard_get_for_display:
  * @display: the display for which the clipboard is to be retrieved or created
- * @selection: a #GdkAtom which identifies the clipboard
- *             to use.
- * 
+ * @selection: a #GdkAtom which identifies the clipboard to use.
+ *
  * Returns the clipboard object for the given selection.
  * Cut/copy/paste menu items and keyboard shortcuts should use
  * the default clipboard, returned by passing %GDK_SELECTION_CLIPBOARD for @selection.
@@ -285,13 +353,11 @@ clipboard_display_closed (GdkDisplay   *display,
  * underscore-prefixed), and namespace it as well. For example,
  * if your application called "Foo" has a special-purpose
  * clipboard, you might call it "_FOO_SPECIAL_CLIPBOARD".
- * 
+ *
  * Return value: (transfer none): the appropriate clipboard object. If no
- *             clipboard already exists, a new one will
- *             be created. Once a clipboard object has
- *             been created, it is persistent and, since
- *             it is owned by GTK+, must not be freed or
- *             unrefd.
+ *   clipboard already exists, a new one will be created. Once a clipboard
+ *   object has been created, it is persistent and, since it is owned by
+ *   GTK+, must not be freed or unrefd.
  *
  * Since: 2.2
  **/
@@ -412,14 +478,35 @@ clipboard_get_timestamp (GtkClipboard *clipboard)
 {
   GtkWidget *clipboard_widget = get_clipboard_widget (clipboard->display);
   guint32 timestamp = gtk_get_current_event_time ();
+  GdkWindow *window;
 
   if (timestamp == GDK_CURRENT_TIME)
     {
+      window = gtk_widget_get_window (clipboard_widget);
 #ifdef GDK_WINDOWING_X11
-      timestamp = gdk_x11_get_server_time (gtk_widget_get_window (clipboard_widget));
-#elif defined GDK_WINDOWING_WIN32
-      timestamp = GetMessageTime ();
+      if (GDK_IS_X11_WINDOW (window))
+       {
+         timestamp = gdk_x11_get_server_time (gtk_widget_get_window (clipboard_widget));
+       }
+      else
+#endif
+#if defined GDK_WINDOWING_WIN32
+      if (GDK_IS_WIN32_WINDOW (window))
+       {
+         timestamp = GetMessageTime ();
+       }
+      else
+#endif
+#if defined GDK_WINDOWING_BROADWAY
+      if (GDK_IS_BROADWAY_WINDOW (window))
+       {
+         timestamp = gdk_broadway_get_last_seen_time (window);
+       }
+      else
 #endif
+       {
+         /* No implementation */
+       }
     }
   else
     {
@@ -1323,9 +1410,9 @@ gtk_clipboard_wait_for_contents (GtkClipboard *clipboard,
 
   if (g_main_loop_is_running (results.loop))
     {
-      GDK_THREADS_LEAVE ();
+      gdk_threads_leave ();
       g_main_loop_run (results.loop);
-      GDK_THREADS_ENTER ();
+      gdk_threads_enter ();
     }
 
   g_main_loop_unref (results.loop);
@@ -1376,9 +1463,9 @@ gtk_clipboard_wait_for_text (GtkClipboard *clipboard)
 
   if (g_main_loop_is_running (results.loop))
     {
-      GDK_THREADS_LEAVE ();
+      gdk_threads_leave ();
       g_main_loop_run (results.loop);
-      GDK_THREADS_ENTER ();
+      gdk_threads_enter ();
     }
 
   g_main_loop_unref (results.loop);
@@ -1444,9 +1531,9 @@ gtk_clipboard_wait_for_rich_text (GtkClipboard  *clipboard,
 
   if (g_main_loop_is_running (results.loop))
     {
-      GDK_THREADS_LEAVE ();
+      gdk_threads_leave ();
       g_main_loop_run (results.loop);
-      GDK_THREADS_ENTER ();
+      gdk_threads_enter ();
     }
 
   g_main_loop_unref (results.loop);
@@ -1504,9 +1591,9 @@ gtk_clipboard_wait_for_image (GtkClipboard *clipboard)
 
   if (g_main_loop_is_running (results.loop))
     {
-      GDK_THREADS_LEAVE ();
+      gdk_threads_leave ();
       g_main_loop_run (results.loop);
-      GDK_THREADS_ENTER ();
+      gdk_threads_enter ();
     }
 
   g_main_loop_unref (results.loop);
@@ -1559,9 +1646,9 @@ gtk_clipboard_wait_for_uris (GtkClipboard *clipboard)
 
   if (g_main_loop_is_running (results.loop))
     {
-      GDK_THREADS_LEAVE ();
+      gdk_threads_leave ();
       g_main_loop_run (results.loop);
-      GDK_THREADS_ENTER ();
+      gdk_threads_enter ();
     }
 
   g_main_loop_unref (results.loop);
@@ -1729,7 +1816,7 @@ gtk_clipboard_wait_is_uris_available (GtkClipboard *clipboard)
 }
 
 /**
- * gtk_clipboard_wait_for_targets
+ * gtk_clipboard_wait_for_targets:
  * @clipboard: a #GtkClipboard
  * @targets: (out) (array length=n_targets) (transfer container): location
  *           to store an array of targets. The result stored here must
@@ -1737,9 +1824,9 @@ gtk_clipboard_wait_is_uris_available (GtkClipboard *clipboard)
  * @n_targets: location to store number of items in @targets.
  *
  * Returns a list of targets that are present on the clipboard, or %NULL
- * if there aren't any targets available. The returned list must be 
+ * if there aren't any targets available. The returned list must be
  * freed with g_free().
- * This function waits for the data to be received using the main 
+ * This function waits for the data to be received using the main
  * loop, so events, timeouts, etc, may be dispatched during the wait.
  *
  * Return value: %TRUE if any targets are present on the clipboard,
@@ -1928,7 +2015,7 @@ gtk_clipboard_store_timeout (GtkClipboard *clipboard)
 {
   g_main_loop_quit (clipboard->store_loop);
   
-  return FALSE;
+  return G_SOURCE_REMOVE;
 }
 
 /**
@@ -2045,9 +2132,9 @@ gtk_clipboard_store (GtkClipboard *clipboard)
 
   if (g_main_loop_is_running (clipboard->store_loop))
     {
-      GDK_THREADS_LEAVE ();
+      gdk_threads_leave ();
       g_main_loop_run (clipboard->store_loop);
-      GDK_THREADS_ENTER ();
+      gdk_threads_enter ();
     }
   
   g_main_loop_unref (clipboard->store_loop);