# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1046721019 0 # Node ID bf8b907f8a29a45b37144b723a169e9f333f0795 # Parent 5c5bee286d0e11f8f81847b2c752e20ef3adbb6e Added initial version of updated key_press_event callback. diff -r 5c5bee286d0e -r bf8b907f8a29 dw.h --- 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 -/* 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 #include @@ -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 #include #include +#include #include #include -/* 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; diff -r 5c5bee286d0e -r bf8b907f8a29 dwtest.c --- 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; } diff -r 5c5bee286d0e -r bf8b907f8a29 gtk/dw.c --- 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; diff -r 5c5bee286d0e -r bf8b907f8a29 os2/dw.c --- 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); diff -r 5c5bee286d0e -r bf8b907f8a29 win/dw.c --- 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; }