when calling privatemsg_new in a block, how can I correctly set the internal $destination variable?
Try this code in block, if you don't want to implement any hook in custom module.

$node = menu_get_object();
if ($node-&gt;uid != 0) {
  module_load_include('pages.inc','privatemsg');
  $recipients = $node-&gt;uid;
  print "&lt;div&gt;Contact " . $node-&gt;name ." about this post.&lt;/div&gt;";
  $subject = $node-&gt;title ." question.";
  $form = drupal_get_form('privatemsg_new', $recipients, $subject)
  // Setup destination parameter to be equal to current page.
  $form['#action'] = url('node/'. $node-&gt;uid, array ('query' =&gt; drupal_get_destination()));
  print drupal_render($form);
}