diff options
author | Attilio Fiandrotti <attilio.fiandrotti@gmail.com> | 2007-12-11 20:20:29 +0000 |
---|---|---|
committer | Attilio Fiandrotti <attilio@src.gnome.org> | 2007-12-11 20:20:29 +0000 |
commit | c907a975564c0160be686c6cfa47cd9d4dd1dd9d (patch) | |
tree | 0c02118e2428fbcf3dd0442da3c8ed8c2faa0055 /gdk | |
parent | 15d6ae400318127b9b142ad7de5af10706661965 (diff) | |
download | gtk+-c907a975564c0160be686c6cfa47cd9d4dd1dd9d.tar.gz |
Applied a patch by Claudio Ciccani which adds testing functions to the
2007-12-11 Attilio Fiandrotti <attilio.fiandrotti@gmail.com>
* gdk/directfb/gdktestutils-directfb.c:
* gdk/directfb/Makefile.am: Applied a patch by Claudio Ciccani
which adds testing functions to the DirectFB backend.
svn path=/trunk/; revision=19163
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/directfb/Makefile.am | 3 | ||||
-rw-r--r-- | gdk/directfb/gdktestutils-directfb.c | 259 |
2 files changed, 261 insertions, 1 deletions
diff --git a/gdk/directfb/Makefile.am b/gdk/directfb/Makefile.am index 9a01aaa0d7..6e5f272968 100644 --- a/gdk/directfb/Makefile.am +++ b/gdk/directfb/Makefile.am @@ -41,7 +41,8 @@ libgdk_directfb_la_SOURCES = \ gdkproperty-directfb.c \ gdkscreen-directfb.c \ gdkselection-directfb.c \ - gdkspawn-directfb.c \ + gdkspawn-directfb.c \ + gdktestutils-directfb.c \ gdkvisual-directfb.c \ gdkdirectfb.h \ gdkwindow-directfb.c \ diff --git a/gdk/directfb/gdktestutils-directfb.c b/gdk/directfb/gdktestutils-directfb.c new file mode 100644 index 0000000000..55f09c98b0 --- /dev/null +++ b/gdk/directfb/gdktestutils-directfb.c @@ -0,0 +1,259 @@ +/* Gtk+ testing utilities + * Copyright (C) 2007 Imendio AB + * Authors: Tim Janik + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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. + */ + +/* + * GTK+ DirectFB backend + * Copyright (C) 2001-2002 convergence integrated media GmbH + * Copyright (C) 2002-2004 convergence GmbH + * Written by Denis Oliver Kropp <dok@convergence.de> and + * Sven Neumann <sven@convergence.de> + */ +#include "config.h" + +#include <unistd.h> + +#include "gdk.h" +#include "gdkdirectfb.h" +#include "gdkprivate-directfb.h" + +#include <gdk/gdktestutils.h> +#include <gdk/gdkkeysyms.h> +#include "gdkalias.h" + + +static DFBInputDeviceKeySymbol +_gdk_keyval_to_directfb (guint keyval) +{ + switch (keyval) { + case 0 ... 127: + return DFB_KEY( UNICODE, keyval ); + case GDK_F1 ... GDK_F12: + return keyval - GDK_F1 + DIKS_F1; + case GDK_BackSpace: + return DIKS_BACKSPACE; + case GDK_Tab: + return DIKS_TAB; + case GDK_Return: + return DIKS_RETURN; + case GDK_Escape: + return DIKS_ESCAPE; + case GDK_Delete: + return DIKS_DELETE; + case GDK_Left: + return DIKS_CURSOR_LEFT; + case GDK_Up: + return DIKS_CURSOR_UP; + case GDK_Right: + return DIKS_CURSOR_RIGHT; + case GDK_Down: + return DIKS_CURSOR_DOWN; + case GDK_Insert: + return DIKS_INSERT; + case GDK_Home: + return DIKS_HOME; + case GDK_End: + return DIKS_END; + case GDK_Page_Up: + return DIKS_PAGE_UP; + case GDK_Page_Down: + return DIKS_PAGE_DOWN; + case GDK_Print: + return DIKS_PRINT; + case GDK_Pause: + return DIKS_PAUSE; + case GDK_Clear: + return DIKS_CLEAR; + case GDK_Cancel: + return DIKS_CANCEL; + /* TODO: handle them all */ + defualt: + break; + } + + return DIKS_NULL; +} + +static DFBInputDeviceModifierMask +_gdk_modifiers_to_directfb (GdkModifierType modifiers) +{ + DFBInputDeviceModifierMask dfb_modifiers = 0; + + if (modifiers & GDK_MOD1_MASK) + dfb_modifiers |= DIMM_ALT; + if (modifiers & GDK_MOD2_MASK) + dfb_modifiers |= DIMM_ALTGR; + if (modifiers & GDK_CONTROL_MASK) + dfb_modifiers |= DIMM_CONTROL; + if (modifiers & GDK_SHIFT_MASK) + dfb_modifiers |= DIMM_SHIFT; + + return dfb_modifiers; +} + +/** + * gdk_test_render_sync + * @window: a mapped GdkWindow + * + * This function retrives a pixel from @window to force the windowing + * system to carry out any pending rendering commands. + * This function is intended to be used to syncronize with rendering + * pipelines, to benchmark windowing system rendering operations. + **/ +void +gdk_test_render_sync (GdkWindow *window) +{ + _gdk_display->directfb->WaitIdle (_gdk_display->directfb); +} + +/** + * gdk_test_simulate_key + * @window: Gdk window to simulate a key event for. + * @x: x coordinate within @window for the key event. + * @y: y coordinate within @window for the key event. + * @keyval: A Gdk keyboard value. + * @modifiers: Keyboard modifiers the event is setup with. + * @key_pressrelease: either %GDK_KEY_PRESS or %GDK_KEY_RELEASE + * + * This function is intended to be used in Gtk+ test programs. + * If (@x,@y) are > (-1,-1), it will warp the mouse pointer to + * the given (@x,@y) corrdinates within @window and simulate a + * key press or release event. + * When the mouse pointer is warped to the target location, use + * of this function outside of test programs that run in their + * own virtual windowing system (e.g. Xvfb) is not recommended. + * If (@x,@y) are passed as (-1,-1), the mouse pointer will not + * be warped and @window origin will be used as mouse pointer + * location for the event. + * Also, gtk_test_simulate_key() is a fairly low level function, + * for most testing purposes, gtk_test_widget_send_key() is the + * right function to call which will generate a key press event + * followed by its accompanying key release event. + * + * Returns: wether all actions neccessary for a key event simulation were carried out successfully. + **/ +gboolean +gdk_test_simulate_key (GdkWindow *window, + gint x, + gint y, + guint keyval, + GdkModifierType modifiers, + GdkEventType key_pressrelease) +{ + GdkWindowObject *private; + GdkWindowImplDirectFB *impl; + DFBWindowEvent evt; + + g_return_val_if_fail (GDK_IS_WINDOW(window), FALSE); + g_return_val_if_fail (key_pressrelease == GDK_KEY_PRESS || key_pressrelease == GDK_KEY_RELEASE, FALSE); + + private = GDK_WINDOW_OBJECT (window); + impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); + + if (x >= 0 && y >= 0) { + int win_x, win_y; + impl->window->GetPosition (impl->window, &win_x, &win_y); + if (_gdk_display->layer->WarpCursor (_gdk_display->layer, win_x+x, win_y+y)) + return FALSE; + } + + evt.clazz = DFEC_WINDOW; + evt.type = (key_pressrelease == GDK_KEY_PRESS) ? DWET_KEYDOWN : DWET_KEYUP; + evt.flags = DWEF_NONE; + evt.window_id = impl->dfb_id; + evt.x = MAX(x, 0); + evt.y = MAX(y, 0); + _gdk_display->layer->GetCursorPosition (_gdk_display->layer, &evt.cx, &evt.cy); + evt.key_code = -1; + evt.key_symbol = _gdk_keyval_to_directfb (keyval); + evt.modifiers = _gdk_modifiers_to_directfb (modifiers); + evt.locks = (modifiers & GDK_LOCK_MASK) ? DILS_CAPS : 0; + gettimeofday (&evt.timestamp, NULL); + + _gdk_display->buffer->PostEvent (_gdk_display->buffer, DFB_EVENT(&evt)); + + return TRUE; +} + +/** + * gdk_test_simulate_button + * @window: Gdk window to simulate a button event for. + * @x: x coordinate within @window for the button event. + * @y: y coordinate within @window for the button event. + * @button: Number of the pointer button for the event, usually 1, 2 or 3. + * @modifiers: Keyboard modifiers the event is setup with. + * @button_pressrelease: either %GDK_BUTTON_PRESS or %GDK_BUTTON_RELEASE + * + * This function is intended to be used in Gtk+ test programs. + * It will warp the mouse pointer to the given (@x,@y) corrdinates + * within @window and simulate a button press or release event. + * Because the mouse pointer needs to be warped to the target + * location, use of this function outside of test programs that + * run in their own virtual windowing system (e.g. Xvfb) is not + * recommended. + * Also, gtk_test_simulate_button() is a fairly low level function, + * for most testing purposes, gtk_test_widget_click() is the right + * function to call which will generate a button press event followed + * by its accompanying button release event. + * + * Returns: wether all actions neccessary for a button event simulation were carried out successfully. + **/ +gboolean +gdk_test_simulate_button (GdkWindow *window, + gint x, + gint y, + guint button, /*1..3*/ + GdkModifierType modifiers, + GdkEventType button_pressrelease) +{ + GdkWindowObject *private; + GdkWindowImplDirectFB *impl; + DFBWindowEvent evt; + + g_return_val_if_fail (GDK_IS_WINDOW(window), FALSE); + g_return_val_if_fail (button_pressrelease == GDK_BUTTON_PRESS || button_pressrelease == GDK_BUTTON_RELEASE, FALSE); + + private = GDK_WINDOW_OBJECT (window); + impl = GDK_WINDOW_IMPL_DIRECTFB (private->impl); + + if (x >= 0 && y >= 0) { + int win_x, win_y; + impl->window->GetPosition (impl->window, &win_x, &win_y); + if (_gdk_display->layer->WarpCursor (_gdk_display->layer, win_x+x, win_y+y)) + return FALSE; + } + + evt.clazz = DFEC_WINDOW; + evt.type = (button_pressrelease == GDK_BUTTON_PRESS) ? DWET_BUTTONDOWN : DWET_BUTTONUP; + evt.flags = DWEF_NONE; + evt.window_id = impl->dfb_id; + evt.x = MAX(x, 0); + evt.y = MAX(y, 0); + _gdk_display->layer->GetCursorPosition (_gdk_display->layer, &evt.cx, &evt.cy); + evt.modifiers = _gdk_modifiers_to_directfb (modifiers); + evt.locks = (modifiers & GDK_LOCK_MASK) ? DILS_CAPS : 0; + gettimeofday (&evt.timestamp, NULL); + + _gdk_display->buffer->PostEvent (_gdk_display->buffer, DFB_EVENT(&evt)); + + return TRUE; +} + +#define __GDK_TEST_UTILS_X11_C__ +#include "gdkaliasdef.c" |