changeset 267:bf8b907f8a29

Added initial version of updated key_press_event callback.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 03 Mar 2003 19:50:19 +0000
parents 5c5bee286d0e
children 07bff0e012d3
files dw.h dwtest.c gtk/dw.c os2/dw.c win/dw.c
diffstat 5 files changed, 173 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/dw.h	Fri Feb 28 01:32:32 2003 +0000
+++ b/dw.h	Mon Mar 03 19:50:19 2003 +0000
@@ -54,6 +54,7 @@
 	char              *varname;
 } UserData;
 
+/* OS/2 Specific section */
 #if defined(__OS2__) || defined(__EMX__)
 #define INCL_DOS
 #define INCL_WIN
@@ -61,7 +62,6 @@
 
 #include <os2.h>
 
-/* Lets make some platform independent defines :) */
 #define DW_DT_LEFT               DT_LEFT
 #define DW_DT_QUERYEXTENT        DT_QUERYEXTENT
 #define DW_DT_UNDERSCORE         DT_UNDERSCORE
@@ -163,6 +163,7 @@
 extern HMQ dwhmq;
 #endif
 
+/* Windows specific section */
 #if defined(__WIN32__) || defined(WINNT)
 #include <windows.h>
 #include <commctrl.h>
@@ -185,7 +186,6 @@
 #define API _cdecl
 #endif
 
-/* Lets make some platform independent defines :) */
 #define DW_DT_LEFT               SS_LEFT
 #define DW_DT_QUERYEXTENT        0
 #define DW_DT_UNDERSCORE         0
@@ -255,6 +255,11 @@
 #define DW_POINTER_ARROW         32512
 #define DW_POINTER_CLOCK         32514
 
+/* Key Modifiers */
+#define KC_CTRL                  (1)
+#define KC_SHIFT                 (1 << 1)
+#define KC_ALT                   (1 << 2)
+
 #define STATICCLASSNAME "STATIC"
 #define COMBOBOXCLASSNAME "COMBOBOX"
 #define LISTBOXCLASSNAME "LISTBOX"
@@ -376,14 +381,14 @@
 void dw_box_pack_start_stub(HWND box, HWND item, int width, int height, int hsize, int vsize, int pad);
 void dw_box_pack_end_stub(HWND box, HWND item, int width, int height, int hsize, int vsize, int pad);
 #else
-/* GTK */
+/* GTK Specific section */
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 #include <gdk/gdkprivate.h>
+#include <gdk/gdkkeysyms.h>
 #include <pthread.h>
 #include <dlfcn.h>
 
-/* Lets make some platform independent defines :) */
 #define DW_DT_LEFT               1
 #define DW_DT_UNDERSCORE         (1 << 1)
 #define DW_DT_STRIKEOUT          (1 << 2)
@@ -457,6 +462,91 @@
 
 #define HWND_DESKTOP             ((HWND)0)
 
+/* Virtual Key Codes */
+#define VK_LBUTTON           GDK_Pointer_Button1
+#define VK_RBUTTON           GDK_Pointer_Button3
+#define VK_CANCEL            GDK_Cancel
+#define VK_MBUTTON           GDK_Pointer_Button2
+#define VK_BACK              GDK_Backspace
+#define VK_TAB               GDK_Tab
+#define VK_CLEAR             GDK_Clear
+#define VK_RETURN            GDK_Return
+#define VK_MENU              GDK_Menu
+#define VK_PAUSE             GDK_Pause
+#define VK_CAPITAL           GDK_Caps_Lock
+#define VK_ESCAPE            GDK_Escape
+#define VK_SPACE             GDK_space
+#define VK_PRIOR             GDK_Page_Up
+#define VK_NEXT              GDK_Page_Down
+#define VK_END               GDK_End
+#define VK_HOME              GDK_Home
+#define VK_LEFT              GDK_Left
+#define VK_UP                GDK_Up
+#define VK_RIGHT             GDK_Right
+#define VK_DOWN              GDK_Down
+#define VK_SELECT            GDK_Select
+#define VK_PRINT             GDK_Sys_Req
+#define VK_EXECUTE           GDK_Execute
+#define VK_SNAPSHOT          GDK_Print
+#define VK_INSERT            GDK_Insert
+#define VK_DELETE            GDK_Delete
+#define VK_HELP              GDK_Help
+#define VK_LWIN              GDK_Super_L
+#define VK_RWIN              GDK_Super_R
+#define VK_NUMPAD0           GDK_KP_0
+#define VK_NUMPAD1           GDK_KP_1
+#define VK_NUMPAD2           GDK_KP_2
+#define VK_NUMPAD3           GDK_KP_3
+#define VK_NUMPAD4           GDK_KP_4
+#define VK_NUMPAD5           GDK_KP_5
+#define VK_NUMPAD6           GDK_KP_6
+#define VK_NUMPAD7           GDK_KP_7
+#define VK_NUMPAD8           GDK_KP_8
+#define VK_NUMPAD9           GDK_KP_9
+#define VK_MULTIPLY          GDK_KP_Multiply
+#define VK_ADD               GDK_KP_Add
+#define VK_SEPARATOR         GDK_KP_Separator
+#define VK_SUBTRACT          GDK_KP_Subtract
+#define VK_DECIMAL           GDK_KP_Decimal
+#define VK_DIVIDE            GDK_KP_Divide
+#define VK_F1                GDK_F1
+#define VK_F2                GDK_F2
+#define VK_F3                GDK_F3
+#define VK_F4                GDK_F4
+#define VK_F5                GDK_F5
+#define VK_F6                GDK_F6
+#define VK_F7                GDK_F7
+#define VK_F8                GDK_F8
+#define VK_F9                GDK_F9
+#define VK_F10               GDK_F10
+#define VK_F11               GDK_F11
+#define VK_F12               GDK_F12
+#define VK_F13               GDK_F13
+#define VK_F14               GDK_F14
+#define VK_F15               GDK_F15
+#define VK_F16               GDK_F16
+#define VK_F17               GDK_F17
+#define VK_F18               GDK_F18
+#define VK_F19               GDK_F19
+#define VK_F20               GDK_F20
+#define VK_F21               GDK_F21
+#define VK_F22               GDK_F22
+#define VK_F23               GDK_F23
+#define VK_F24               GDK_F24
+#define VK_NUMLOCK           GDK_Num_Lock
+#define VK_SCROLL            GDK_Scroll_Lock
+#define VK_LSHIFT            GDK_Shift_L
+#define VK_RSHIFT            GDK_Shift_R
+#define VK_LCONTROL          GDK_Control_L
+#define VK_RCONTROL          GDK_Control_R
+#define VK_LMENU             GDK_Menu
+#define VK_RMENU             GDK_Menu
+
+/* Key Modifiers */
+#define KC_CTRL              GDK_CONTROL_MASK
+#define KC_SHIFT             GDK_SHIFT_MASK
+#define KC_ALT               GDK_MOD1_MASK
+
 typedef GtkWidget *HWND;
 #ifndef _ENVRNMNT_H
 typedef unsigned long ULONG;
--- a/dwtest.c	Fri Feb 28 01:32:32 2003 +0000
+++ b/dwtest.c	Mon Mar 03 19:50:19 2003 +0000
@@ -133,9 +133,9 @@
 	return TRUE;
 }
 
-int DWSIGNAL keypress_callback(HWND window, char *text, void *data)
+int DWSIGNAL keypress_callback(HWND window, char ch, int vk, int state, void *data)
 {
-	fprintf(stderr,"got keypress\n");
+	fprintf(stderr,"got keypress %c %d %d\n", ch, vk, state);
 	return 0;
 }
 
--- a/gtk/dw.c	Fri Feb 28 01:32:32 2003 +0000
+++ b/gtk/dw.c	Mon Mar 03 19:50:19 2003 +0000
@@ -282,9 +282,10 @@
 
 	if(work)
 	{
-		int (*keypressfunc)(HWND, int, void *) = work->func;
-
-		retval = keypressfunc(widget, *event->string, work->data);
+		int (*keypressfunc)(HWND, char, int, int, void *) = work->func;
+
+		retval = keypressfunc(widget, *event->string, event->keyval,
+							  event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK), work->data);
 	}
 	return retval;
 }
@@ -2643,6 +2644,35 @@
  */
 HWND API dw_window_from_id(HWND handle, int id)
 {
+	GList *orig = NULL, *list = NULL;
+	int _locked_by_me = FALSE;
+
+	DW_MUTEX_LOCK;
+	if(handle && GTK_IS_CONTAINER(handle))
+	{
+#if GTK_MAJOR_VERSION > 1
+		orig = list = gtk_container_get_children(GTK_CONTAINER(handle));
+#else
+		orig = list = gtk_container_children(GTK_CONTAINER(handle));
+#endif
+	}
+	while(list)
+	{
+		if(GTK_IS_WIDGET(list->data))
+		{
+			if(id == (int)gtk_object_get_data(GTK_OBJECT(list->data), "id"))
+			{
+				HWND ret = (HWND)list->data;
+				g_list_free(orig);
+				DW_MUTEX_UNLOCK;
+				return ret;
+			}
+		}
+		list = list->next;
+	}
+	if(orig)
+		g_list_free(orig);
+	DW_MUTEX_UNLOCK;
     return 0L;
 }
 
@@ -4871,9 +4901,11 @@
 	gtk_widget_set_events(tmp, GDK_EXPOSURE_MASK
 						  | GDK_LEAVE_NOTIFY_MASK
 						  | GDK_BUTTON_PRESS_MASK
+						  | GDK_KEY_PRESS_MASK
 						  | GDK_POINTER_MOTION_MASK
 						  | GDK_POINTER_MOTION_HINT_MASK);
 	gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id);
+	GTK_WIDGET_SET_FLAGS(tmp, GTK_CAN_FOCUS);
 	gtk_widget_show(tmp);
 	DW_MUTEX_UNLOCK;
 	return tmp;
--- a/os2/dw.c	Fri Feb 28 01:32:32 2003 +0000
+++ b/os2/dw.c	Mon Mar 03 19:50:19 2003 +0000
@@ -2062,11 +2062,33 @@
 				break;
 			case WM_CHAR:
 				{
-					int (* API keypressfunc)(HWND, int, void *) = (int (* API)(HWND, int, void *))tmp->signalfunction;
-
-					if(hWnd == tmp->window)
+					int (* API keypressfunc)(HWND, char, int, int, void *) = (int (* API)(HWND, char, int, int, void *))tmp->signalfunction;
+
+					if(hWnd == tmp->window && !(SHORT1FROMMP(mp1) & KC_KEYUP))
 					{
-						result = keypressfunc(tmp->window, SHORT1FROMMP(mp2), tmp->data);
+						int vk;
+						char ch;
+
+						if(SHORT1FROMMP(mp1) & KC_CHAR)
+							ch = (char)SHORT1FROMMP(mp2);
+						else
+							ch = (char)SHORT2FROMMP(mp2);
+						if(SHORT1FROMMP(mp1) & KC_VIRTUALKEY)
+							vk = SHORT2FROMMP(mp2);
+						else
+							vk = SHORT1FROMMP(mp2);
+
+						/* This is a hack to fix shift presses showing
+						 * up as tabs!
+						 */
+						if(ch == '\t' && !(SHORT1FROMMP(mp1) & KC_CHAR))
+						{
+							ch = 0;
+							vk = VK_SHIFT;
+						}
+
+						result = keypressfunc(tmp->window, ch, vk,
+											  SHORT1FROMMP(mp1) & (KC_ALT | KC_SHIFT | KC_CTRL), tmp->data);
 						tmp = NULL;
 					}
 				}
@@ -3043,7 +3065,9 @@
 	case WM_BUTTON1DOWN:
 	case WM_BUTTON2DOWN:
 	case WM_BUTTON3DOWN:
-		if(res)
+		if(res == -1)
+			WinSetFocus(HWND_DESKTOP, hwnd);
+		else if(res)
 			return (MPARAM)TRUE;
 	}
 	return WinDefWindowProc(hwnd, msg, mp1, mp2);
--- a/win/dw.c	Fri Feb 28 01:32:32 2003 +0000
+++ b/win/dw.c	Mon Mar 03 19:50:19 2003 +0000
@@ -1377,11 +1377,20 @@
 					break;
 				case WM_CHAR:
 					{
-						int (*keypressfunc)(HWND, int, void *) = tmp->signalfunction;
+						int (*keypressfunc)(HWND, char, int, int, void *) = tmp->signalfunction;
 
 						if(hWnd == tmp->window)
 						{
-							result = keypressfunc(tmp->window, LOWORD(mp2), tmp->data);
+							int special = 0;
+
+							if(GetAsyncKeyState(VK_SHIFT) & 0x8000)
+								special |= KC_SHIFT;
+							if(GetAsyncKeyState(VK_CONTROL) & 0x8000)
+								special |= KC_CTRL;
+                            if(mp2 & (1 << 29))
+								special |= KC_ALT;
+
+							result = keypressfunc(tmp->window, (char)mp1, mp1, special, tmp->data);
 							tmp = NULL;
 						}
 					}
@@ -1874,7 +1883,7 @@
 	case WM_LBUTTONDOWN:
 	case WM_MBUTTONDOWN:
 	case WM_RBUTTONDOWN:
-		SetActiveWindow(hWnd);
+		SetFocus(hWnd);
 		_wndproc(hWnd, msg, mp1, mp2);
 		break;
 	case WM_LBUTTONUP:
@@ -1884,6 +1893,7 @@
 	case WM_PAINT:
 	case WM_SIZE:
 	case WM_COMMAND:
+	case WM_CHAR:
 		_wndproc(hWnd, msg, mp1, mp2);
 		break;
 	}