gboolean iupgtkFocusInOutEvent(GtkWidget *widget, GdkEventFocus *evt, Ihandle *ih) { (void)widget; if (evt->in) { /* even when ACTIVE=NO the dialog gets this evt */ if (!iupdrvIsActive(ih)) return TRUE; iupCallGetFocusCb(ih); } else iupCallKillFocusCb(ih); return FALSE; }
void iupwinMenuDialogProc(Ihandle* ih_dialog, UINT msg, WPARAM wp, LPARAM lp) { /* called only from winDialogBaseProc */ switch (msg) { case WM_INITMENUPOPUP: { HMENU hMenu = (HMENU)wp; Ihandle *ih = iupwinMenuGetHandle(hMenu); if (ih) { Icallback cb = (Icallback)IupGetCallback(ih, "OPEN_CB"); if (!cb && ih->parent) cb = (Icallback)IupGetCallback(ih->parent, "OPEN_CB"); /* check also in the Submenu */ if (cb) cb(ih); } break; } case WM_UNINITMENUPOPUP: { HMENU hMenu = (HMENU)wp; Ihandle *ih = iupwinMenuGetHandle(hMenu); if (ih) { Icallback cb = (Icallback)IupGetCallback(ih, "MENUCLOSE_CB"); if (!cb && ih->parent) cb = (Icallback)IupGetCallback(ih->parent, "MENUCLOSE_CB"); /* check also in the Submenu */ if (cb) cb(ih); } break; } case WM_MENUSELECT: { HMENU hMenu = (HMENU)lp; Ihandle *ih; if (!lp) break; if ((HIWORD(wp) & MF_POPUP) || (HIWORD(wp) & MF_SYSMENU)) /* drop-down ih or submenu. */ { UINT menuindex = LOWORD(wp); HMENU hsubmenu = GetSubMenu(hMenu, menuindex); ih = iupwinMenuGetHandle(hsubmenu); /* returns the handle of a IupMenu */ if (ih) ih = ih->parent; /* gets the submenu */ } else /* ih item */ { UINT menuID = LOWORD(wp); ih = iupwinMenuGetItemHandle(hMenu, menuID); } if (ih) { Icallback cb = IupGetCallback(ih, "HIGHLIGHT_CB"); if (cb) cb(ih); } break; } case WM_MENUCOMMAND: { int menuId = GetMenuItemID((HMENU)lp, (int)wp); Icallback cb; Ihandle* ih; if (menuId >= IUP_MDI_FIRSTCHILD) break; ih = iupwinMenuGetItemHandle((HMENU)lp, menuId); if (!ih) break; winItemCheckToggle(ih); cb = IupGetCallback(ih, "ACTION"); if (cb && cb(ih) == IUP_CLOSE) IupExitLoop(); break; } case WM_ENTERMENULOOP: { /* Simulate WM_KILLFOCUS when the menu interaction is started */ Ihandle* lastfocus = (Ihandle*)iupAttribGet(ih_dialog, "_IUPWIN_LASTFOCUS"); if (lastfocus) iupCallKillFocusCb(lastfocus); break; } case WM_EXITMENULOOP: { /* Simulate WM_GETFOCUS when the menu interaction is stopped */ Ihandle* lastfocus = (Ihandle*)iupAttribGet(ih_dialog, "_IUPWIN_LASTFOCUS"); if (lastfocus) iupCallGetFocusCb(lastfocus); break; } } }
int iupwinBaseMsgProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) { switch (msg) { case WM_INPUTLANGCHANGE: iupwinKeyInit(); break; case WM_GETDLGCODE: { *result = DLGC_WANTALLKEYS; return 1; } case WM_NOTIFY: /* usually sent only to parent, */ { /* but TIPs are configured to be handled here */ NMHDR* msg_info = (NMHDR*)lp; if (msg_info->code == TTN_GETDISPINFO) iupwinTipsGetDispInfo(lp); break; } case WM_DROPFILES: iupwinDropFiles((HDROP)wp, ih); break; case WM_LBUTTONDOWN: if(iupAttribGetBoolean(ih, "DRAGSOURCE")) { if (iupwinDragStart(ih)) { *result = 0; return 1; /* abort default processing */ } } break; case WM_HELP: { Ihandle* child; HELPINFO* help_info = (HELPINFO*)lp; if (help_info->iContextType == HELPINFO_MENUITEM) child = iupwinMenuGetItemHandle((HMENU)help_info->hItemHandle, (int)help_info->iCtrlId); else child = iupwinHandleGet((HWND)help_info->hItemHandle); if (child) { Icallback cb = (Icallback) IupGetCallback(child, "HELP_CB"); if (cb) { if (cb(child) == IUP_CLOSE) IupExitLoop(); *result = 0; return 1; /* abort default processing */ } } break; } case WM_MOUSELEAVE: { Icallback leave_cb = IupGetCallback(ih, "LEAVEWINDOW_CB"); if (leave_cb) leave_cb(ih); iupAttribSet(ih, "_IUPWIN_ENTERWIN", NULL); /* enable tracking again */ break; } case WM_MOUSEHOVER: { Icallback enter_cb = IupGetCallback(ih, "ENTERWINDOW_CB"); if (enter_cb) enter_cb(ih); break; } case WM_MOUSEMOVE: { /* set tracking only once, but only until track message is processed. */ if (!iupAttribGet(ih, "_IUPWIN_ENTERWIN")) { /* set tracking only if enter or leave callbacks are defined */ Icallback enter_cb = IupGetCallback(ih, "ENTERWINDOW_CB"); Icallback leave_cb = IupGetCallback(ih, "LEAVEWINDOW_CB"); if (enter_cb || leave_cb) { /* must be called so WM_MOUSEHOVER and WM_MOUSELEAVE will be called */ winTrackMouseHoverLeave(ih); iupAttribSet(ih, "_IUPWIN_ENTERWIN", "1"); } } break; } case WM_KEYDOWN: case WM_SYSKEYDOWN: if (!iupwinKeyEvent(ih, (int)wp, 1)) { *result = 0; return 1; /* abort default processing */ } break; case WM_SYSKEYUP: case WM_KEYUP: { int ret; if (wp == VK_SNAPSHOT) /* called only on key up */ { ret = iupwinKeyEvent(ih, (int)wp, 1); if (ret && iupObjectCheck(ih)) ret = iupwinKeyEvent(ih, (int)wp, 0); } else ret = iupwinKeyEvent(ih, (int)wp, 0); if (!ret) { *result = 0; return 1; /* abort default processing */ } break; } case WM_SETFOCUS: /* TODO: Not setting WS_TABSTOP still allows the control to receive the focus when clicked. But this code does make several controls with CANFOCUS=NO to stop working. So we use it inside some of the controls. */ /* if (!iupAttribGetBoolean(ih, "CANFOCUS")) { HWND previous = (HWND)wp; if (previous && previous != ih->handle) SetFocus(previous); break; } */ iupwinWmSetFocus(ih); break; case WM_KILLFOCUS: iupCallKillFocusCb(ih); break; case WM_SETCURSOR: { if (ih->handle == (HWND)wp && LOWORD(lp)==HTCLIENT) { HCURSOR hCur = (HCURSOR)iupAttribGet(ih, "_IUPWIN_HCURSOR"); if (hCur) { SetCursor(hCur); *result = 1; return 1; } else if (iupAttribGet(ih, "CURSOR")) { SetCursor(NULL); *result = 1; return 1; } } break; } case WM_TOUCH: /* TODO: - considering touch messages are greedy, one window got it all? - how this work? only for the dialog, or also for the children? - should a container forward to its children? */ if (LOWORD(wp)) iupwinTouchProcessInput(ih, (int)LOWORD(wp), (void*)lp); break; case WOM_CLOSE: case WOM_DONE: case WOM_OPEN: { IFni cb = (IFni)IupGetCallback(ih, "WOM_CB"); if (cb) { int v = -2; /* Error */ switch(msg) { case WOM_OPEN: v = 1; break; case WOM_DONE: v = 0; break; case WOM_CLOSE: v = -1; break; } cb(ih, v); } break; } } return 0; }
static int winListWmCommand(Ihandle* ih, WPARAM wp, LPARAM lp) { (void)lp; if (ih->data->is_dropdown || ih->data->has_editbox) { switch (HIWORD(wp)) { case CBN_EDITCHANGE: { iupBaseCallValueChangedCb(ih); break; } case CBN_SETFOCUS: iupwinWmSetFocus(ih); break; case CBN_KILLFOCUS: iupCallKillFocusCb(ih); break; case CBN_CLOSEUP: case CBN_DROPDOWN: { IFni cb = (IFni)IupGetCallback(ih, "DROPDOWN_CB"); if (cb) cb(ih, HIWORD(wp)==CBN_DROPDOWN? 1: 0); break; } case CBN_DBLCLK: { IFnis cb = (IFnis) IupGetCallback(ih, "DBLCLICK_CB"); if (cb) { int pos = SendMessage(ih->handle, CB_GETCURSEL, 0, 0); pos++; /* IUP starts at 1 */ iupListSingleCallDblClickCallback(ih, cb, pos); } break; } case CBN_SELCHANGE: { IFnsii cb = (IFnsii) IupGetCallback(ih, "ACTION"); if (cb) { int pos = SendMessage(ih->handle, CB_GETCURSEL, 0, 0); pos++; /* IUP starts at 1 */ iupListSingleCallActionCallback(ih, cb, pos); } iupBaseCallValueChangedCb(ih); break; } } } else { switch (HIWORD(wp)) { case LBN_DBLCLK: { IFnis cb = (IFnis) IupGetCallback(ih, "DBLCLICK_CB"); if (cb) { int pos = SendMessage(ih->handle, LB_GETCURSEL, 0, 0); pos++; /* IUP starts at 1 */ iupListSingleCallDblClickCallback(ih, cb, pos); } break; } case LBN_SELCHANGE: { if (!ih->data->is_multiple) { IFnsii cb = (IFnsii) IupGetCallback(ih, "ACTION"); if (cb) { int pos = SendMessage(ih->handle, LB_GETCURSEL, 0, 0); pos++; /* IUP starts at 1 */ iupListSingleCallActionCallback(ih, cb, pos); } } else { IFns multi_cb = (IFns)IupGetCallback(ih, "MULTISELECT_CB"); IFnsii cb = (IFnsii) IupGetCallback(ih, "ACTION"); if (multi_cb || cb) { int sel_count = SendMessage(ih->handle, LB_GETSELCOUNT, 0, 0); int* pos = malloc(sizeof(int)*sel_count); SendMessage(ih->handle, LB_GETSELITEMS, sel_count, (LPARAM)pos); iupListMultipleCallActionCallback(ih, cb, multi_cb, pos, sel_count); free(pos); } } iupBaseCallValueChangedCb(ih); break; } } } return 0; /* not used */ }