Blame gtk/gtkwin32embed.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * gtkwin32embed.c: Utilities for Win32 embedding
Packit Service fb6fa5
 * Copyright (C) 2005, Novell, Inc.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/* By Tor Lillqvist <tml@novell.com> 2005 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "win32/gdkwin32.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkwin32embed.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
static guint message_type[GTK_WIN32_EMBED_LAST];
Packit Service fb6fa5
Packit Service fb6fa5
static GSList *current_messages;
Packit Service fb6fa5
Packit Service fb6fa5
guint
Packit Service fb6fa5
_gtk_win32_embed_message_type (GtkWin32EmbedMessageType type)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (type < 0 || type >= GTK_WIN32_EMBED_LAST)
Packit Service fb6fa5
    return 0;
Packit Service fb6fa5
Packit Service fb6fa5
  if (message_type[type] == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      char name[100];
Packit Service fb6fa5
      sprintf (name, "gtk-win32-embed:%d", type);
Packit Service fb6fa5
      message_type[type] = RegisterWindowMessage (name);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return message_type[type];
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_win32_embed_push_message (MSG *msg)
Packit Service fb6fa5
{
Packit Service fb6fa5
  MSG *message = g_new (MSG, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  *message = *msg;
Packit Service fb6fa5
Packit Service fb6fa5
  current_messages = g_slist_prepend (current_messages, message);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_win32_embed_pop_message (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  MSG *message = current_messages->data;
Packit Service fb6fa5
Packit Service fb6fa5
  current_messages = g_slist_delete_link (current_messages, current_messages);
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (message);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_win32_embed_send (GdkWindow               *recipient,
Packit Service fb6fa5
		       GtkWin32EmbedMessageType message,
Packit Service fb6fa5
		       WPARAM		        wparam,
Packit Service fb6fa5
		       LPARAM			lparam)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PostMessage (GDK_WINDOW_HWND (recipient),
Packit Service fb6fa5
	       _gtk_win32_embed_message_type (message),
Packit Service fb6fa5
	       wparam, lparam);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_win32_embed_send_focus_message (GdkWindow               *recipient,
Packit Service fb6fa5
				     GtkWin32EmbedMessageType message,
Packit Service fb6fa5
				     WPARAM		      wparam)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int lparam = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!recipient)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_WINDOW (recipient));
Packit Service fb6fa5
  g_return_if_fail (message == GTK_WIN32_EMBED_FOCUS_IN ||
Packit Service fb6fa5
		    message == GTK_WIN32_EMBED_FOCUS_NEXT ||
Packit Service fb6fa5
		    message == GTK_WIN32_EMBED_FOCUS_PREV);
Packit Service fb6fa5
		    
Packit Service fb6fa5
  if (current_messages)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      MSG *msg = current_messages->data;
Packit Service fb6fa5
      if (msg->message == _gtk_win32_embed_message_type (GTK_WIN32_EMBED_FOCUS_IN) ||
Packit Service fb6fa5
	  msg->message == _gtk_win32_embed_message_type (GTK_WIN32_EMBED_FOCUS_NEXT) ||
Packit Service fb6fa5
	  msg->message == _gtk_win32_embed_message_type (GTK_WIN32_EMBED_FOCUS_PREV))
Packit Service fb6fa5
	lparam = (msg->lParam & GTK_WIN32_EMBED_FOCUS_WRAPAROUND);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_win32_embed_send (recipient, message, wparam, lparam);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_win32_embed_set_focus_wrapped (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  MSG *msg;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (current_messages != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  msg = current_messages->data;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (msg->message == _gtk_win32_embed_message_type (GTK_WIN32_EMBED_FOCUS_PREV) ||
Packit Service fb6fa5
		    msg->message == _gtk_win32_embed_message_type (GTK_WIN32_EMBED_FOCUS_NEXT));
Packit Service fb6fa5
  
Packit Service fb6fa5
  msg->lParam |= GTK_WIN32_EMBED_FOCUS_WRAPAROUND;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gtk_win32_embed_get_focus_wrapped (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  MSG *msg;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (current_messages != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  msg = current_messages->data;
Packit Service fb6fa5
Packit Service fb6fa5
  return (msg->lParam & GTK_WIN32_EMBED_FOCUS_WRAPAROUND) != 0;
Packit Service fb6fa5
}