void iupListMultipleCallActionCallback(Ihandle* ih, IFnsii cb, IFns multi_cb, int* pos, int sel_count) { int i, count = iupdrvListGetCount(ih); char* old_str = iupAttribGet(ih, "_IUPLIST_OLDVALUE"); int old_count = old_str? strlen(old_str): 0; char* str = iupStrGetMemory(count+1); memset(str, '-', count); str[count]=0; for (i=0; i<sel_count; i++) str[pos[i]] = '+'; if (old_count != count) { old_count = 0; old_str = NULL; } if (multi_cb) { int unchanged = 1; for (i=0; i<count && old_str; i++) { if (str[i] == old_str[i]) str[i] = 'x'; /* mark unchanged values */ else unchanged = 0; } if (old_str && unchanged) return; if (multi_cb(ih, str) == IUP_CLOSE) IupExitLoop(); for (i=0; i<count && old_str; i++) { if (str[i] == 'x') str[i] = old_str[i]; /* restore unchanged values */ } } else { /* must simulate the click on each item */ for (i=0; i<count; i++) { if (i >= old_count) /* new items, if selected then call the callback */ { if (str[i] == '+') iListCallActionCallback(ih, cb, i+1, 1); } else if (str[i] != old_str[i]) { if (str[i] == '+') iListCallActionCallback(ih, cb, i+1, 1); else iListCallActionCallback(ih, cb, i+1, 0); } } } iupAttribStoreStr(ih, "_IUPLIST_OLDVALUE", str); }
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"); iupAttribSet(ih, "_IUPWIN_ENTERWIN", NULL); if (leave_cb) leave_cb(ih); break; } case WM_MOUSEHOVER: { Icallback enter_cb = IupGetCallback(ih, "ENTERWINDOW_CB"); if (enter_cb) enter_cb(ih); break; } case WM_MOUSEMOVE: { if (!iupAttribGet(ih, "_IUPWIN_ENTERWIN")) { /* must be called so WM_MOUSEHOVER and WM_MOUSELEAVE will be called */ iupwinTrackMouseHover(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 void motToggleValueChangedCallback(Widget w, Ihandle* ih, XmToggleButtonCallbackStruct* call_data) { Ihandle *radio; IFni cb; int check = call_data->set; /* Must manually hide the tip if the toggle is pressed. */ iupmotTipLeaveNotify(); /* This is necessary because Motif toggle does not have support for radio. It is implemented using an external RadioBox that we do not use. */ radio = iupRadioFindToggleParent(ih); if (radio) { if (check) { Ihandle* last_tg = (Ihandle*)iupAttribGet(radio, "_IUPMOT_LASTTOGGLE"); if (iupObjectCheck(last_tg) && last_tg != ih) { /* uncheck last toggle */ XtVaSetValues(last_tg->handle, XmNset, XmUNSET, NULL); cb = (IFni) IupGetCallback(last_tg, "ACTION"); if (cb && cb(last_tg, 0) == IUP_CLOSE) IupExitLoop(); iupBaseCallValueChangedCb(last_tg); } iupAttribSetStr(radio, "_IUPMOT_LASTTOGGLE", (char*)ih); if (last_tg != ih) { cb = (IFni)IupGetCallback(ih, "ACTION"); if (cb && cb (ih, 1) == IUP_CLOSE) IupExitLoop(); iupBaseCallValueChangedCb(ih); } } else { /* Force stay checked */ XtVaSetValues(ih->handle, XmNset, XmSET, NULL); } } else { if (check == XmINDETERMINATE) check = -1; cb = (IFni)IupGetCallback(ih, "ACTION"); if (cb) { if (cb(ih, check) == IUP_CLOSE) IupExitLoop(); } iupBaseCallValueChangedCb(ih); } (void)w; }
int iupdrvMenuPopup(Ihandle* ih, int x, int y) { HWND hWndActive = GetActiveWindow(); int tray_menu = 0; int menuId; if (!hWndActive) { /* search for a valid handle */ Ihandle* dlg = iupDlgListFirst(); while (dlg) { if (dlg->handle) { hWndActive = dlg->handle; /* found a valid handle */ /* if not a "TRAY" dialog, keep searching, because TRAY is a special case */ if (iupAttribGetBoolean(dlg, "TRAY")) break; } dlg = iupDlgListNext(); } } /* Necessary to avoid tray dialogs to lock popup menus (they get sticky after the 1st time) */ if (hWndActive) { Ihandle* dlg = iupwinHandleGet(hWndActive); if (iupObjectCheck(dlg) && iupAttribGetBoolean(dlg, "TRAY")) { /* To display a context menu for a notification icon, the current window must be the foreground window. */ SetForegroundWindow(hWndActive); tray_menu = 1; } } /* stop processing here. messages will not go to the message loop */ menuId = TrackPopupMenu((HMENU)ih->handle, TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_RETURNCMD, x, y, 0, hWndActive, NULL); if (tray_menu) { /* You must force a task switch to the application that called TrackPopupMenu at some time in the near future. This is done by posting a benign message to the window. */ PostMessage(hWndActive, WM_NULL, 0, 0); } if (menuId) { Icallback cb; Ihandle* ih_item = iupwinMenuGetItemHandle((HMENU)ih->handle, menuId); if (!ih_item) return IUP_NOERROR; winItemCheckToggle(ih_item); cb = IupGetCallback(ih_item, "ACTION"); if (cb && cb(ih_item) == IUP_CLOSE) IupExitLoop(); } return IUP_NOERROR; }
static void ExitLoop(void) { IupExitLoop(); }
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 (iupObjectCheck(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 (iupObjectCheck(lastfocus)) iupCallGetFocusCb(lastfocus); break; } } }
static int winButtonMsgProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) { if (ih->data->type != IUP_BUTTON_TEXT) { /* redraw IMPRESS image if any */ if ((msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP) && iupAttribGet(ih, "IMPRESS")) iupdrvRedrawNow(ih); } switch (msg) { case WM_XBUTTONDBLCLK: case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { /* Process BUTTON_CB */ iupwinButtonDown(ih, msg, wp, lp); /* Feedback will NOT be done when not receiving the focus or when in double click */ if ((msg==WM_LBUTTONDOWN && !iupAttribGetBoolean(ih, "CANFOCUS")) || msg==WM_LBUTTONDBLCLK) { iupAttribSet(ih, "_IUPWINBUT_SELECTED", "1"); iupdrvRedrawNow(ih); } break; } case WM_XBUTTONUP: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: { /* Process BUTTON_CB */ iupwinButtonUp(ih, msg, wp, lp); if (msg==WM_LBUTTONUP) { if (iupAttribGet(ih, "_IUPWINBUT_SELECTED")) { iupAttribSet(ih, "_IUPWINBUT_SELECTED", NULL); iupdrvRedrawNow(ih); } /* BN_CLICKED will NOT be notified when not receiving the focus */ if (!iupAttribGetBoolean(ih, "CANFOCUS")) { Icallback cb = IupGetCallback(ih, "ACTION"); if (cb && cb(ih) == IUP_CLOSE) IupExitLoop(); } } if (!iupwinIsVistaOrNew() && iupObjectCheck(ih)) { /* TIPs desapear forever after a button click in XP, so we force an update. */ char* tip = iupAttribGet(ih, "TIP"); if (tip) iupdrvBaseSetTipAttrib(ih, tip); } break; } case WM_KEYDOWN: case WM_SYSKEYDOWN: if (wp==VK_RETURN) { /* enter activates the button */ iupdrvActivate(ih); *result = 0; return 1; /* abort default processing, or the default button will be activated, in this case even if there is a default button, this button must be activated instead. */ } break; case WM_MOUSELEAVE: if (!iupwin_comctl32ver6 && iupAttribGetBoolean(ih, "FLAT")) { iupAttribSet(ih, "_IUPWINBUT_ENTERWIN", NULL); iupdrvRedrawNow(ih); } if (iupAttribGet(ih, "_IUPWINBUT_SELECTED")) { iupAttribSet(ih, "_IUPWINBUT_SELECTED", NULL); iupdrvRedrawNow(ih); } break; case WM_MOUSEMOVE: if (!iupwin_comctl32ver6 && iupAttribGetBoolean(ih, "FLAT")) { if (!iupAttribGet(ih, "_IUPWINBUT_ENTERWIN")) { iupAttribSet(ih, "_IUPWINBUT_ENTERWIN", "1"); iupdrvRedrawNow(ih); } } break; case WM_SETFOCUS: if (!iupAttribGetBoolean(ih, "CANFOCUS")) { HWND previous = (HWND)wp; if (previous && previous != ih->handle) { SetFocus(previous); *result = 0; return 1; } } break; } return iupwinBaseMsgProc(ih, msg, wp, lp, result); }
static int winDialogBaseProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) { if (iupwinBaseContainerMsgProc(ih, msg, wp, lp, result)) return 1; iupwinMenuDialogProc(ih, msg, wp, lp); switch (msg) { case WM_GETMINMAXINFO: { if (winDialogCheckMinMaxInfo(ih, (MINMAXINFO*)lp)) { *result = 0; return 1; } break; } case WM_MOVE: { IFnii cb = (IFnii)IupGetCallback(ih, "MOVE_CB"); int x, y; /* ignore LPARAM because they are the clientpos */ iupdrvDialogGetPosition(ih, NULL, &x, &y); if (cb) cb(ih, x, y); break; } case WM_SIZE: { if (ih->data->ignore_resize) break; switch(wp) { case SIZE_MINIMIZED: { if (ih->data->show_state != IUP_MINIMIZE) { IFni show_cb = (IFni)IupGetCallback(ih, "SHOW_CB"); ih->data->show_state = IUP_MINIMIZE; if (show_cb && show_cb(ih, IUP_MINIMIZE) == IUP_CLOSE) IupExitLoop(); } break; } case SIZE_MAXIMIZED: { if (ih->data->show_state != IUP_MAXIMIZE) { IFni show_cb = (IFni)IupGetCallback(ih, "SHOW_CB"); ih->data->show_state = IUP_MAXIMIZE; if (show_cb && show_cb(ih, IUP_MAXIMIZE) == IUP_CLOSE) IupExitLoop(); } winDialogResize(ih, LOWORD(lp), HIWORD(lp)); if (iupAttribGetBoolean(ih, "MDICHILD")) { /* WORKAROUND: when a child MDI dialog is maximized, its title is displayed inside the MDI client area. So we force a MDI client size update */ RECT rect; Ihandle* client = (Ihandle*)iupAttribGet(ih, "MDICLIENT_HANDLE"); GetClientRect(client->handle, &rect); PostMessage(client->handle, WM_SIZE, (WPARAM)SIZE_RESTORED, MAKELPARAM(rect.right-rect.left, rect.bottom-rect.top)); } break; } case SIZE_RESTORED: { if (ih->data->show_state == IUP_MAXIMIZE || ih->data->show_state == IUP_MINIMIZE) { IFni show_cb = (IFni)IupGetCallback(ih, "SHOW_CB"); ih->data->show_state = IUP_RESTORE; if (show_cb && show_cb(ih, IUP_RESTORE) == IUP_CLOSE) IupExitLoop(); } winDialogResize(ih, LOWORD(lp), HIWORD(lp)); break; } } if (iupAttribGetBoolean(ih, "MDIFRAME")) { /* We are going to manually position the MDI client, so abort MDI frame processing. */ *result = 0; return 1; } else break; } case WM_USER+IUPWIN_TRAY_NOTIFICATION: { int dclick = 0; int button = 0; int pressed = 0; switch (lp) { case WM_LBUTTONDOWN: pressed = 1; button = 1; break; case WM_MBUTTONDOWN: pressed = 1; button = 2; break; case WM_RBUTTONDOWN: pressed = 1; button = 3; break; case WM_LBUTTONDBLCLK: dclick = 1; button = 1; break; case WM_MBUTTONDBLCLK: dclick = 1; button = 2; break; case WM_RBUTTONDBLCLK: dclick = 1; button = 3; break; case WM_LBUTTONUP: button = 1; break; case WM_MBUTTONUP: button = 2; break; case WM_RBUTTONUP: button = 3; break; } if (button != 0) { IFniii cb = (IFniii)IupGetCallback(ih, "TRAYCLICK_CB"); if (cb && cb(ih, button, pressed, dclick) == IUP_CLOSE) IupExitLoop(); } break; } case WM_CLOSE: { Icallback cb = IupGetCallback(ih, "CLOSE_CB"); if (cb) { int ret = cb(ih); if (ret == IUP_IGNORE) { *result = 0; return 1; } if (ret == IUP_CLOSE) IupExitLoop(); } /* child mdi is automatically destroyed */ if (iupAttribGetBoolean(ih, "MDICHILD")) IupDestroy(ih); else { if (!winDialogMDICloseChildren(ih)) { *result = 0; return 1; } IupHide(ih); /* IUP default processing */ } *result = 0; return 1; } case WM_COPYDATA: { IFnsi cb = (IFnsi)IupGetCallback(ih, "COPYDATA_CB"); if (cb) { COPYDATASTRUCT* cds = (COPYDATASTRUCT*)lp; char* iup_id = (char*)cds->dwData; /* from SetGlobal("SINGLEINSTANCE") */ if (iup_id && iup_id[0] == 'I' && iup_id[1] == 'U' && iup_id[2] == 'P') { char* data = iupwinStrFromSystem((TCHAR*)cds->lpData); cb(ih, data, (int)strlen(data)+1); } } break; } case WM_ERASEBKGND: { HBITMAP hBitmap = (HBITMAP)iupAttribGet(ih, "_IUPWIN_BACKGROUND_BITMAP"); if (hBitmap) { RECT rect; HDC hdc = (HDC)wp; HBRUSH hBrush = CreatePatternBrush(hBitmap); GetClientRect(ih->handle, &rect); FillRect(hdc, &rect, hBrush); DeleteObject(hBrush); /* return non zero value */ *result = 1; return 1; } else { unsigned char r, g, b; char* color = iupAttribGet(ih, "_IUPWIN_BACKGROUND_COLOR"); if (iupStrToRGB(color, &r, &g, &b)) { RECT rect; HDC hdc = (HDC)wp; SetDCBrushColor(hdc, RGB(r,g,b)); GetClientRect(ih->handle, &rect); FillRect(hdc, &rect, (HBRUSH)GetStockObject(DC_BRUSH)); /* return non zero value */ *result = 1; return 1; } } break; } case WM_DESTROY: { /* Since WM_CLOSE changed the Windows default processing */ /* WM_DESTROY is NOT received by IupDialogs */ /* Except when they are children of other IupDialogs and the parent is destroyed. */ /* So we have to destroy the child dialog. */ /* The application is responsible for destroying the children before this happen. */ IupDestroy(ih); break; } case WM_DPICHANGED: { IupRefresh(ih); break; } } if (msg == (UINT)WM_HELPMSG) { Ihandle* child = NULL; DWORD* struct_ptr = (DWORD*)lp; if (*struct_ptr == sizeof(CHOOSECOLOR)) { CHOOSECOLOR* choosecolor = (CHOOSECOLOR*)lp; child = (Ihandle*)choosecolor->lCustData; } else if (*struct_ptr == sizeof(CHOOSEFONT)) { CHOOSEFONT* choosefont = (CHOOSEFONT*)lp; child = (Ihandle*)choosefont->lCustData; } if (child) { Icallback cb = IupGetCallback(child, "HELP_CB"); if (cb && cb(child) == IUP_CLOSE) EndDialog((HWND)iupAttribGet(child, "HWND"), IDCANCEL); } } return 0; }
static int winDialogBaseProc(Ihandle* ih, UINT msg, WPARAM wp, LPARAM lp, LRESULT *result) { if (iupwinBaseContainerProc(ih, msg, wp, lp, result)) return 1; iupwinMenuDialogProc(ih, msg, wp, lp); switch (msg) { case WM_GETDLGCODE: *result = DLGC_WANTALLKEYS; return 1; case WM_GETMINMAXINFO: { if (winDialogCheckMinMaxInfo(ih, (MINMAXINFO*)lp)) { *result = 0; return 1; } break; } case WM_SIZE: { if (ih->data->ignore_resize) break; switch(wp) { case SIZE_MINIMIZED: { if (ih->data->show_state != IUP_MINIMIZE) { IFni show_cb = (IFni)IupGetCallback(ih, "SHOW_CB"); if (show_cb && show_cb(ih, IUP_MINIMIZE) == IUP_CLOSE) IupExitLoop(); ih->data->show_state = IUP_MINIMIZE; } break; } case SIZE_MAXIMIZED: { if (ih->data->show_state != IUP_MAXIMIZE) { IFni show_cb = (IFni)IupGetCallback(ih, "SHOW_CB"); if (show_cb && show_cb(ih, IUP_MAXIMIZE) == IUP_CLOSE) IupExitLoop(); ih->data->show_state = IUP_MAXIMIZE; } winDialogResize(ih, LOWORD(lp), HIWORD(lp)); break; } case SIZE_RESTORED: { if (ih->data->show_state == IUP_MAXIMIZE || ih->data->show_state == IUP_MINIMIZE) { IFni show_cb = (IFni)IupGetCallback(ih, "SHOW_CB"); if (show_cb && show_cb(ih, IUP_RESTORE) == IUP_CLOSE) IupExitLoop(); ih->data->show_state = IUP_RESTORE; } winDialogResize(ih, LOWORD(lp), HIWORD(lp)); break; } } break; } case WM_USER+IWIN_TRAY_NOTIFICATION: { int dclick = 0; int button = 0; int pressed = 0; switch (lp) { case WM_LBUTTONDOWN: pressed = 1; button = 1; break; case WM_MBUTTONDOWN: pressed = 1; button = 2; break; case WM_RBUTTONDOWN: pressed = 1; button = 3; break; case WM_LBUTTONDBLCLK: dclick = 1; button = 1; break; case WM_MBUTTONDBLCLK: dclick = 1; button = 2; break; case WM_RBUTTONDBLCLK: dclick = 1; button = 3; break; case WM_LBUTTONUP: button = 1; break; case WM_MBUTTONUP: button = 2; break; case WM_RBUTTONUP: button = 3; break; } if (button != 0) { IFniii cb = (IFniii)IupGetCallback(ih, "TRAYCLICK_CB"); if (cb && cb(ih, button, pressed, dclick) == IUP_CLOSE) IupExitLoop(); } break; } case WM_CLOSE: { Icallback cb = IupGetCallback(ih, "CLOSE_CB"); if (cb) { int ret = cb(ih); if (ret == IUP_IGNORE) { *result = 0; return 1; } if (ret == IUP_CLOSE) IupExitLoop(); } /* child mdi is automatically destroyed */ if (iupAttribGetInt(ih, "MDICHILD")) IupDestroy(ih); else { if (!winDialogMDICloseChildren(ih)) { *result = 0; return 1; } IupHide(ih); /* IUP default processing */ } *result = 0; return 1; } 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_ERASEBKGND: { HBITMAP hBitmap = (HBITMAP)iupAttribGet(ih, "_IUPWIN_BACKGROUND_BITMAP"); if (hBitmap) { RECT rect; HDC hdc = (HDC)wp; HBRUSH hBrush = CreatePatternBrush(hBitmap); GetClientRect(ih->handle, &rect); FillRect(hdc, &rect, hBrush); DeleteObject(hBrush); /* return non zero value */ *result = 1; return 1; } else { unsigned char r, g, b; char* color = iupAttribGet(ih, "_IUPWIN_BACKGROUND_COLOR"); if (iupStrToRGB(color, &r, &g, &b)) { RECT rect; HDC hdc = (HDC)wp; SetDCBrushColor(hdc, RGB(r,g,b)); GetClientRect(ih->handle, &rect); FillRect(hdc, &rect, (HBRUSH)GetStockObject(DC_BRUSH)); /* return non zero value */ *result = 1; return 1; } } break; } case WM_DESTROY: { /* Since WM_CLOSE changed the Windows default processing */ /* WM_DESTROY is NOT received by IupDialogs */ /* Except when they are children of other IupDialogs and the parent is destroyed. */ /* So we have to destroy the child dialog. */ /* The application is responsable for destroying the children before this happen. */ IupDestroy(ih); break; } } if (msg == (UINT)WM_HELPMSG) { Ihandle* child = NULL; DWORD* struct_ptr = (DWORD*)lp; if (*struct_ptr == sizeof(CHOOSECOLOR)) { CHOOSECOLOR* choosecolor = (CHOOSECOLOR*)lp; child = (Ihandle*)choosecolor->lCustData; } if (*struct_ptr == sizeof(CHOOSEFONT)) { CHOOSEFONT* choosefont = (CHOOSEFONT*)lp; child = (Ihandle*)choosefont->lCustData; } if (child) { Icallback cb = IupGetCallback(child, "HELP_CB"); if (cb && cb(child) == IUP_CLOSE) EndDialog((HWND)iupAttribGet(child, "HWND"), IDCANCEL); } } return 0; }
static int winToggleWmCommand(Ihandle* ih, WPARAM wp, LPARAM lp) { (void)lp; switch (HIWORD(wp)) { case BN_DOUBLECLICKED: case BN_CLICKED: { Ihandle *radio; IFni cb; int check = SendMessage(ih->handle, BM_GETCHECK, 0, 0L); if (ih->data->type == IUP_TOGGLE_IMAGE && !iupwin_comctl32ver6) { int active = winToggleIsActive(ih); winToggleUpdateImage(ih, active, check); if (!active) return 0; } radio = iupRadioFindToggleParent(ih); if (radio) { /* This is necessary because Windows does not send a message when a toggle is unchecked in a Radio. Also if the toggle is already checked in a radio, a click will call the callback again. */ Ihandle* last_tg = (Ihandle*)iupAttribGet(radio, "_IUPWIN_LASTTOGGLE"); if (iupObjectCheck(last_tg) && last_tg != ih) { /* uncheck last toggle */ SendMessage(last_tg->handle, BM_SETCHECK, BST_UNCHECKED, 0L); cb = (IFni) IupGetCallback(last_tg, "ACTION"); if (cb && cb(last_tg, 0) == IUP_CLOSE) IupExitLoop(); iupBaseCallValueChangedCb(last_tg); } iupAttribSetStr(radio, "_IUPWIN_LASTTOGGLE", (char*)ih); if (last_tg != ih) { /* check new toggle */ SendMessage(ih->handle, BM_SETCHECK, BST_CHECKED, 0L); cb = (IFni)IupGetCallback(ih, "ACTION"); if (cb && cb (ih, 1) == IUP_CLOSE) IupExitLoop(); iupBaseCallValueChangedCb(ih); } } else { if (check == BST_INDETERMINATE) check = -1; cb = (IFni)IupGetCallback(ih, "ACTION"); if (cb && cb (ih, check) == IUP_CLOSE) IupExitLoop(); iupBaseCallValueChangedCb(ih); } } } return 0; /* not used */ }