static int gtkToggleSetValueAttrib(Ihandle* ih, const char* value) { if (iupStrEqualNoCase(value,"NOTDEF")) gtk_toggle_button_set_inconsistent((GtkToggleButton*)ih->handle, TRUE); else { gtk_toggle_button_set_inconsistent((GtkToggleButton*)ih->handle, FALSE); /* This action causes the toggled signal to be emitted. */ iupAttribSetStr(ih, "_IUPGTK_IGNORE_TOGGLE", "1"); if (iupStrBoolean(value)) gtk_toggle_button_set_active((GtkToggleButton*)ih->handle, TRUE); else gtk_toggle_button_set_active((GtkToggleButton*)ih->handle, FALSE); iupAttribSetStr(ih, "_IUPGTK_IGNORE_TOGGLE", NULL); } return 0; }
static void iMatrixDrawToggle(Ihandle* ih, int x1, int x2, int y1, int y2, int lin, int col, int marked, int active, int toggle_centered) { int togglevalue = 0; /* toggle area */ iupMatrixDrawSetToggleFeedbackArea(toggle_centered, &x1, &y1, &x2, &y2); if (toggle_centered) { char* value = iupMatrixGetValueDisplay(ih, lin, col); togglevalue = iupStrBoolean(value); } else togglevalue = iupAttribGetIntId2(ih, "TOGGLEVALUE", lin, col); /* toggle check */ if (togglevalue) iMatrixDrawFeedbackImage(ih, x1, x2, y1, y2, lin, col, active, marked, iupAttribGet(ih, "TOGGLEMAGEON"), imatrix_toggleon_alpha); else iMatrixDrawFeedbackImage(ih, x1, x2, y1, y2, lin, col, active, marked, iupAttribGet(ih, "TOGGLEIMAGEOFF"), imatrix_toggleoff_alpha); }
static int gtkCanvasSetYAutoHideAttrib(Ihandle* ih, const char *value) { GtkPolicyType hscrollbar_policy; gtk_scrolled_window_get_policy(gtkCanvasGetScrolledWindow(ih), &hscrollbar_policy, NULL); if (ih->data->sb & IUP_SB_VERT) { GtkPolicyType vscrollbar_policy; if (iupStrBoolean(value)) vscrollbar_policy = GTK_POLICY_AUTOMATIC; else vscrollbar_policy = GTK_POLICY_ALWAYS; gtk_scrolled_window_set_policy(gtkCanvasGetScrolledWindow(ih), hscrollbar_policy, vscrollbar_policy); } else gtk_scrolled_window_set_policy(gtkCanvasGetScrolledWindow(ih), hscrollbar_policy, GTK_POLICY_NEVER); return 1; }
static int gtkProgressBarSetDashedAttrib(Ihandle* ih, const char* value) { GtkProgressBar* pbar = (GtkProgressBar*)ih->handle; if (ih->data->marquee) return 0; /* gtk_progress_bar_set_bar_style is deprecated, but we still use it in GTK2 */ if (iupStrBoolean(value)) { ih->data->dashed = 1; gtk_progress_bar_set_bar_style(pbar, GTK_PROGRESS_DISCRETE); } else /* Default */ { ih->data->dashed = 0; gtk_progress_bar_set_bar_style(pbar, GTK_PROGRESS_CONTINUOUS); } return 0; }
static int winDialogSetTrayAttrib(Ihandle *ih, const char *value) { int tray = iupStrBoolean(value); if (iupAttribGet(ih, "_IUPDLG_HASTRAY")) { if (!tray) { winDialogTrayMessage(ih->handle, NIM_DELETE, NULL, NULL); iupAttribSetStr(ih, "_IUPDLG_HASTRAY", NULL); } } else { if (tray) { winDialogTrayMessage(ih->handle, NIM_ADD, NULL, NULL); iupAttribSetStr(ih, "_IUPDLG_HASTRAY", "YES"); } } return 1; }
static int winToggleSetValueAttrib(Ihandle* ih, const char* value) { Ihandle *radio; int check; if (iupStrEqualNoCase(value,"NOTDEF")) check = BST_INDETERMINATE; else if (iupStrBoolean(value)) check = BST_CHECKED; else check = BST_UNCHECKED; /* This is necessary because Windows does not handle the radio state when a toggle is programatically changed. */ radio = iupRadioFindToggleParent(ih); if (radio) { int oldcheck = (int)SendMessage(ih->handle, BM_GETCHECK, 0, 0L); Ihandle* last_tg = (Ihandle*)iupAttribGet(radio, "_IUPWIN_LASTTOGGLE"); if (check) { if (iupObjectCheck(last_tg) && last_tg != ih) SendMessage(last_tg->handle, BM_SETCHECK, BST_UNCHECKED, 0L); iupAttribSetStr(radio, "_IUPWIN_LASTTOGGLE", (char*)ih); } if (last_tg != ih && oldcheck != check) SendMessage(ih->handle, BM_SETCHECK, check, 0L); } else SendMessage(ih->handle, BM_SETCHECK, check, 0L); if (ih->data->type == IUP_TOGGLE_IMAGE && !iupwin_comctl32ver6) winToggleUpdateImage(ih, winToggleIsActive(ih), check); return 0; }
static int motToggleSetValueAttrib(Ihandle* ih, const char* value) { Ihandle *radio; unsigned char check; if (iupStrEqualNoCase(value,"NOTDEF")) check = XmINDETERMINATE; else if (iupStrBoolean(value)) check = XmSET; else check = XmUNSET; /* 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) { Ihandle* last_tg; unsigned char oldcheck; XtVaGetValues(ih->handle, XmNset, &oldcheck, NULL); last_tg = (Ihandle*)iupAttribGetStr(radio, "_IUPMOT_LASTTOGGLE"); if (check) { if (iupObjectCheck(last_tg) && last_tg != ih) XtVaSetValues(last_tg->handle, XmNset, XmUNSET, NULL); iupAttribSetStr(radio, "_IUPMOT_LASTTOGGLE", (char*)ih); } if (last_tg != ih && oldcheck != check) XtVaSetValues(ih->handle, XmNset, check, NULL); } else XtVaSetValues(ih->handle, XmNset, check, NULL); return 0; }
static int iListSetDragDropListAttrib(Ihandle* ih, const char* value) { if (iupStrBoolean(value)) { /* Register callbacks to enable drag and drop between lists */ IupSetCallback(ih, "DRAGBEGIN_CB", (Icallback)iListDragBegin_CB); IupSetCallback(ih, "DRAGDATASIZE_CB", (Icallback)iListDragDataSize_CB); IupSetCallback(ih, "DRAGDATA_CB", (Icallback)iListDragData_CB); IupSetCallback(ih, "DRAGEND_CB", (Icallback)iListDragEnd_CB); IupSetCallback(ih, "DROPDATA_CB", (Icallback)iListDropData_CB); } else { /* Unregister callbacks */ IupSetCallback(ih, "DRAGBEGIN_CB", NULL); IupSetCallback(ih, "DRAGDATASIZE_CB", NULL); IupSetCallback(ih, "DRAGDATA_CB", NULL); IupSetCallback(ih, "DRAGEND_CB", NULL); IupSetCallback(ih, "DROPDATA_CB", NULL); } return 1; }
static int iSplitSetAutoHideAttrib(Ihandle* ih, const char* value) { if (iupStrBoolean(value)) { ih->data->autohide = 1; iSplitAutoHideVal(ih); } else { Ihandle *child1 = ih->firstchild->brother; if (child1) { Ihandle *child2 = child1->brother; iSplitShowHide(child1, 0); if (child2) iSplitShowHide(child2, 0); } ih->data->autohide = 0; } return 0; /* do not store value in hash table */ }
void iupDialogHide(Ihandle* ih) { /* hidden at the system and marked hidden in IUP */ if (!iupdrvDialogIsVisible(ih) && ih->data->show_state == IUP_HIDE) return; /* marked hidden in IUP */ ih->data->show_state = IUP_HIDE; /* if called IupHide for a Popup window */ if (iupAttribGetBoolean(ih, "MODAL")) { iDialogUnSetModal(ih); IupExitLoop(); } ih->data->ignore_resize = 1; /* actually hide the window */ iupdrvDialogSetVisible(ih, 0); ih->data->ignore_resize = 0; /* decrement visible count */ iupDlgListVisibleDec(); if (iupDlgListVisibleCount() <= 0) { /* if this is the last window visible, exit message loop except when LOCKLOOP==YES */ if (!iupStrBoolean(IupGetGlobal("LOCKLOOP"))) IupExitLoop(); } /* flush, then process show_cb and startfocus */ iDialogAfterShow(ih); }
static int gtkFrameMapMethod(Ihandle* ih) { char *value, *title; GtkWidget *fixed; if (!ih->parent) return IUP_ERROR; title = iupAttribGetStr(ih, "TITLE"); ih->handle = gtk_frame_new(NULL); if (!ih->handle) return IUP_ERROR; if (title) iupAttribSetStr(ih, "_IUPFRAME_HAS_TITLE", "1"); else { value = iupAttribGetStr(ih, "SUNKEN"); if (iupStrBoolean(value)) gtk_frame_set_shadow_type((GtkFrame*)ih->handle, GTK_SHADOW_IN); else gtk_frame_set_shadow_type((GtkFrame*)ih->handle, GTK_SHADOW_ETCHED_IN); } /* the container that will receive the child element. */ fixed = gtk_fixed_new(); gtk_container_add((GtkContainer*)ih->handle, fixed); gtk_widget_show(fixed); /* Add to the parent, all GTK controls must call this. */ iupgtkBaseAddToParent(ih); gtk_widget_realize(ih->handle); return IUP_NOERROR; }
static void gtkItemUpdateImage(Ihandle* ih, const char* value, const char* image, const char* impress) { GdkPixbuf* pixbuf; if (!impress || !iupStrBoolean(value)) pixbuf = iupImageGetImage(image, ih, 0); else pixbuf = iupImageGetImage(impress, ih, 0); if (pixbuf) { GtkWidget* image_label = gtk_image_menu_item_get_image((GtkImageMenuItem*)ih->handle); if (!image_label) { image_label = gtk_image_new(); gtk_image_menu_item_set_image((GtkImageMenuItem*)ih->handle, image_label); } if (pixbuf != gtk_image_get_pixbuf((GtkImage*)image_label)) gtk_image_set_from_pixbuf((GtkImage*)image_label, pixbuf); } else gtk_image_menu_item_set_image((GtkImageMenuItem*)ih->handle, NULL); }
static int motListSetShowDropdownAttrib(Ihandle* ih, const char* value) { if (ih->data->is_dropdown) { if (iupStrBoolean(value)) { XButtonEvent ev; memset(&ev, 0, sizeof(XButtonEvent)); ev.type = ButtonPress; ev.display = XtDisplay(ih->handle); ev.send_event = True; ev.root = RootWindow(iupmot_display, iupmot_screen); ev.time = clock()*CLOCKS_PER_SEC; ev.window = XtWindow(ih->handle); ev.state = Button1Mask; ev.button = Button1; ev.same_screen = True; XtCallActionProc(ih->handle, "CBDropDownList", (XEvent*)&ev, 0, 0 ); } else XtCallActionProc(ih->handle, "CBDisarm", 0, 0, 0 ); } return 0; }
static int iBaseSetFloatingAttrib(Ihandle* ih, const char* value) { ih->floating = iupStrBoolean(value); return 0; }
int iupBaseSetVisibleAttrib(Ihandle* ih, const char* value) { iupdrvSetVisible(ih, iupStrBoolean(value)); return 1; /* must be 1 to mark when set at the element */ }
static int motTextSetReadOnlyAttrib(Ihandle* ih, const char* value) { XtVaSetValues(ih->handle, XmNeditable, iupStrBoolean(value)? False: True, NULL); return 0; }
static int gtkToggleMapMethod(Ihandle* ih) { Ihandle* radio = iupRadioFindToggleParent(ih); char *value; int is3state = 0; if (!ih->parent) return IUP_ERROR; if (radio) ih->data->radio = 1; value = iupAttribGet(ih, "IMAGE"); if (value) ih->data->type = IUP_TOGGLE_IMAGE; else ih->data->type = IUP_TOGGLE_TEXT; if (radio) { GtkRadioButton* last_tg = (GtkRadioButton*)iupAttribGet(radio, "_IUPGTK_LASTRADIOBUTTON"); if (last_tg) ih->handle = gtk_radio_button_new_from_widget(last_tg); else ih->handle = gtk_radio_button_new(NULL); iupAttribSetStr(radio, "_IUPGTK_LASTRADIOBUTTON", (char*)ih->handle); } else { if (ih->data->type == IUP_TOGGLE_TEXT) { ih->handle = gtk_check_button_new(); if (iupAttribGetInt(ih, "3STATE")) is3state = 1; } else ih->handle = gtk_toggle_button_new(); } if (!ih->handle) return IUP_ERROR; if (ih->data->type == IUP_TOGGLE_TEXT) { gtk_button_set_image((GtkButton*)ih->handle, gtk_label_new(NULL)); gtk_toggle_button_set_mode((GtkToggleButton*)ih->handle, TRUE); } else { gtk_button_set_image((GtkButton*)ih->handle, gtk_image_new()); gtk_toggle_button_set_mode((GtkToggleButton*)ih->handle, FALSE); } /* add to the parent, all GTK controls must call this. */ iupgtkBaseAddToParent(ih); if (!iupStrBoolean(iupAttribGetStr(ih, "CANFOCUS"))) GTK_WIDGET_FLAGS(ih->handle) &= ~GTK_CAN_FOCUS; g_signal_connect(G_OBJECT(ih->handle), "enter-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "leave-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "focus-in-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "focus-out-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "key-press-event", G_CALLBACK(iupgtkKeyPressEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "show-help", G_CALLBACK(iupgtkShowHelp), ih); g_signal_connect(G_OBJECT(ih->handle), "toggled", G_CALLBACK(gtkToggleToggled), ih); if (ih->data->type == IUP_TOGGLE_IMAGE || is3state) { g_signal_connect(G_OBJECT(ih->handle), "button-press-event", G_CALLBACK(gtkToggleButtonEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "button-release-event",G_CALLBACK(gtkToggleButtonEvent), ih); } if (is3state) { g_signal_connect(G_OBJECT(ih->handle), "key-press-event", G_CALLBACK(gtkToggleKeyEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "key-release-event", G_CALLBACK(gtkToggleKeyEvent), ih); } gtk_widget_realize(ih->handle); return IUP_NOERROR; }
static int iGLProgressBarSetShowTextAttrib(Ihandle* ih, const char* value) { iGLProgressBar* pb = (iGLProgressBar*)iupAttribGet(ih, "_IUP_GLPROGRESSBAR"); pb->show_text = iupStrBoolean(value); return 0; /* do not store value in hash table */ }
static int motFrameMapMethod(Ihandle* ih) { char *title; int num_args = 0; Arg args[20]; Widget child_manager; if (!ih->parent) return IUP_ERROR; title = iupAttribGet(ih, "TITLE"); if (title) iupAttribSetStr(ih, "_IUPFRAME_HAS_TITLE", "1"); else { char* value = iupAttribGetStr(ih, "SUNKEN"); if (iupStrBoolean(value)) iupMOT_SETARG(args, num_args, XmNshadowType, XmSHADOW_IN); else iupMOT_SETARG(args, num_args, XmNshadowType, XmSHADOW_ETCHED_IN); if (iupAttribGet(ih, "BGCOLOR")) iupAttribSetStr(ih, "_IUPFRAME_HAS_BGCOLOR", "1"); } /* Core */ iupMOT_SETARG(args, num_args, XmNmappedWhenManaged, False); /* not visible when managed */ iupMOT_SETARG(args, num_args, XmNx, 0); /* x-position */ iupMOT_SETARG(args, num_args, XmNy, 0); /* y-position */ iupMOT_SETARG(args, num_args, XmNwidth, 10); /* default width to avoid 0 */ iupMOT_SETARG(args, num_args, XmNheight, 10); /* default height to avoid 0 */ /* Manager */ iupMOT_SETARG(args, num_args, XmNshadowThickness, 2); /* Frame */ iupMOT_SETARG(args, num_args, XmNmarginHeight, 0); /* no shadow margins */ iupMOT_SETARG(args, num_args, XmNmarginWidth, 0); /* no shadow margins */ ih->handle = XtCreateManagedWidget( iupDialogGetChildIdStr(ih), /* child identifier */ xmFrameWidgetClass, /* widget class */ iupChildTreeGetNativeParentHandle(ih), /* widget parent */ args, num_args); if (!ih->handle) return IUP_ERROR; ih->serial = iupDialogGetChildId(ih); /* must be after using the string */ if (title) { Widget title_label; num_args = 0; /* Label */ iupMOT_SETARG(args, num_args, XmNlabelType, XmSTRING); iupMOT_SETARG(args, num_args, XmNmarginHeight, 0); /* default padding */ iupMOT_SETARG(args, num_args, XmNmarginWidth, 0); /* Frame Constraint */ iupMOT_SETARG(args, num_args, XmNchildType, XmFRAME_TITLE_CHILD); title_label = XtCreateManagedWidget("title_label", xmLabelWidgetClass, ih->handle, args, num_args); iupmotSetString(title_label, XmNlabelString, title); iupAttribSetStr(ih, "_IUPMOT_FRAMELABEL", (char*)title_label); } child_manager = XtVaCreateManagedWidget( "child_manager", xmBulletinBoardWidgetClass, ih->handle, /* Core */ XmNborderWidth, 0, /* Manager */ XmNshadowThickness, 0, XmNnavigationType, XmTAB_GROUP, /* BulletinBoard */ XmNmarginWidth, 0, XmNmarginHeight, 0, XmNresizePolicy, XmRESIZE_NONE, /* no automatic resize of children */ /* Frame Constraint */ XmNchildType, XmFRAME_WORKAREA_CHILD, NULL); iupAttribSetStr(ih, "_IUPMOT_FRAMECONTAINER", (char*)child_manager); if (iupStrBoolean(IupGetGlobal("INPUTCALLBACKS"))) XtAddEventHandler(child_manager, PointerMotionMask, False, (XtEventHandler)iupmotDummyPointerMotionEvent, NULL); /* initialize the widget */ XtRealizeWidget(ih->handle); return IUP_NOERROR; }
static int winFileDlgPopup(Ihandle *ih, int x, int y) { InativeHandle* parent = iupDialogGetNativeParent(ih); OPENFILENAME openfilename; int result, dialogtype; char *value, *initial_dir=NULL; TCHAR* extfilter = NULL; iupAttribSetInt(ih, "_IUPDLG_X", x); /* used in iupDialogUpdatePosition */ iupAttribSetInt(ih, "_IUPDLG_Y", y); value = iupAttribGetStr(ih, "DIALOGTYPE"); if (iupStrEqualNoCase(value, "SAVE")) dialogtype = IUP_DIALOGSAVE; else if (iupStrEqualNoCase(value, "DIR")) dialogtype = IUP_DIALOGDIR; else dialogtype = IUP_DIALOGOPEN; if (dialogtype == IUP_DIALOGDIR) { winFileDlgGetFolder(ih); return IUP_NOERROR; } /* if NOT set will NOT be Modal */ /* anyway it will be modal only relative to its parent */ if (!parent) parent = GetActiveWindow(); ZeroMemory(&openfilename, sizeof(OPENFILENAME)); openfilename.lStructSize = sizeof(OPENFILENAME); openfilename.hwndOwner = parent; value = iupAttribGet(ih, "EXTFILTER"); if (value) { int index; extfilter = winFileDlgStrReplaceSeparator(iupwinStrToSystem(value)); openfilename.lpstrFilter = extfilter; value = iupAttribGet(ih, "FILTERUSED"); if (iupStrToInt(value, &index)) openfilename.nFilterIndex = index; else openfilename.nFilterIndex = 1; } else { value = iupAttribGet(ih, "FILTER"); if (value) { TCHAR *winfo, *wvalue; int sz1, sz2; char* info = iupAttribGet(ih, "FILTERINFO"); if (!info) info = value; winfo = iupwinStrToSystem(info); wvalue = iupwinStrToSystem(value); /* concat FILTERINFO+FILTER */ sz1 = lstrlen(winfo)+1; /* each part has a terminator */ sz2 = lstrlen(wvalue)+1; extfilter = (TCHAR*)malloc((sz1+sz2+1)*sizeof(TCHAR)); memcpy(extfilter, winfo, sz1*sizeof(TCHAR)); /* copy also the terminator */ memcpy(extfilter+sz1, wvalue, sz2*sizeof(TCHAR)); extfilter[sz1+sz2] = 0; /* additional terminator at the end */ openfilename.lpstrFilter = extfilter; openfilename.nFilterIndex = 1; } } openfilename.lpstrFile = (TCHAR*)malloc((IUP_MAX_FILENAME_SIZE+1)*sizeof(TCHAR)); value = iupAttribGet(ih, "FILE"); if (value) { iupwinStrCopy(openfilename.lpstrFile, value, IUP_MAX_FILENAME_SIZE); winFileDlgStrReplacePathSlash(openfilename.lpstrFile); } else openfilename.lpstrFile[0] = 0; openfilename.nMaxFile = IUP_MAX_FILENAME_SIZE; /* only supports extensions with up to three characters, should NOT include the period */ openfilename.lpstrDefExt = iupwinStrToSystem(iupAttribGet(ih, "EXTDEFAULT")); initial_dir = iupStrDup(iupAttribGet(ih, "DIRECTORY")); openfilename.lpstrInitialDir = iupwinStrToSystemFilename(initial_dir); if (openfilename.lpstrInitialDir) winFileDlgStrReplacePathSlash((TCHAR*)openfilename.lpstrInitialDir); openfilename.lpstrTitle = iupwinStrToSystem(iupAttribGet(ih, "TITLE")); openfilename.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; if (!iupAttribGetBoolean(ih, "NOOVERWRITEPROMPT")) openfilename.Flags |= OFN_OVERWRITEPROMPT; if (iupAttribGetBoolean(ih, "SHOWHIDDEN")) openfilename.Flags |= OFN_FORCESHOWHIDDEN; value = iupAttribGet(ih, "ALLOWNEW"); if (!value) { if (dialogtype == IUP_DIALOGSAVE) value = "YES"; else value = "NO"; } if (iupStrBoolean(value)) openfilename.Flags |= OFN_CREATEPROMPT; else openfilename.Flags |= OFN_FILEMUSTEXIST; if (iupAttribGetBoolean(ih, "NOCHANGEDIR")) openfilename.Flags |= OFN_NOCHANGEDIR; if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) openfilename.Flags |= OFN_ALLOWMULTISELECT; openfilename.lpfnHook = winFileDlgSimpleHook; openfilename.Flags |= OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; openfilename.lCustData = (LPARAM)ih; if (iupAttribGetBoolean(ih, "SHOWPREVIEW") && IupGetCallback(ih, "FILE_CB")) { openfilename.Flags |= OFN_ENABLETEMPLATE; openfilename.hInstance = iupwin_dll_hinstance? iupwin_dll_hinstance: iupwin_hinstance; openfilename.lpTemplateName = TEXT("iupPreviewDlg"); openfilename.lpfnHook = winFileDlgPreviewHook; } if (IupGetCallback(ih, "HELP_CB")) openfilename.Flags |= OFN_SHOWHELP; if (dialogtype == IUP_DIALOGOPEN) result = GetOpenFileName(&openfilename); else result = GetSaveFileName(&openfilename); if (result) { if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) { /* If there is more than one file, replace terminator by the separator */ if (openfilename.lpstrFile[openfilename.nFileOffset-1] == 0 && openfilename.nFileOffset>0) { int i = 0; int count = 0; char* dir = iupwinStrFromSystemFilename(openfilename.lpstrFile); /* already is the directory, but without the last separator */ iupAttribSetStrf(ih, "DIRECTORY", "%s\\", dir); /* add the last separator */ /* first the path */ iupAttribSetStrId(ih, "MULTIVALUE", count, iupAttribGet(ih, "DIRECTORY")); /* here count=0 always */ count++; while (openfilename.lpstrFile[i] != 0 || openfilename.lpstrFile[i + 1] != 0) { if (openfilename.lpstrFile[i] == 0) { iupAttribSetStrId(ih, "MULTIVALUE", count, iupwinStrFromSystemFilename(openfilename.lpstrFile + i + 1)); count++; openfilename.lpstrFile[i] = TEXT('|'); } i++; } iupAttribSetInt(ih, "MULTIVALUECOUNT", count); openfilename.lpstrFile[i] = TEXT('|'); /* one last at the end */ iupAttribSetStr(ih, "VALUE", iupwinStrFromSystemFilename(openfilename.lpstrFile)); /* here file was already modified to match the IUP format */ } else { /* if there is only one file selected the returned value is different and includes just that file */ char* filename = iupwinStrFromSystemFilename(openfilename.lpstrFile); char* dir = iupStrFileGetPath(filename); int dir_len = (int)strlen(dir); iupAttribSetStr(ih, "DIRECTORY", dir); iupAttribSetStrId(ih, "MULTIVALUE", 0, dir); iupAttribSetStrId(ih, "MULTIVALUE", 1, filename + dir_len); iupAttribSetStr(ih, "VALUE", filename); /* here value is not separated by '|' */ iupAttribSetInt(ih, "MULTIVALUECOUNT", 2); free(dir); } iupAttribSet(ih, "STATUS", "0"); iupAttribSet(ih, "FILEEXIST", "YES"); } else { char* filename = iupwinStrFromSystemFilename(openfilename.lpstrFile); char* dir = iupStrFileGetPath(filename); iupAttribSetStr(ih, "DIRECTORY", dir); free(dir); if (winIsFile(openfilename.lpstrFile)) /* check if file exists */ { iupAttribSet(ih, "FILEEXIST", "YES"); iupAttribSet(ih, "STATUS", "0"); } else { iupAttribSet(ih, "FILEEXIST", "NO"); iupAttribSet(ih, "STATUS", "1"); } iupAttribSetStr(ih, "VALUE", filename); } iupAttribSetInt(ih, "FILTERUSED", (int)openfilename.nFilterIndex); } else { iupAttribSet(ih, "FILTERUSED", NULL); iupAttribSet(ih, "VALUE", NULL); iupAttribSet(ih, "DIRECTORY", NULL); iupAttribSet(ih, "FILEEXIST", NULL); iupAttribSet(ih, "STATUS", "-1"); } if (extfilter) free(extfilter); if (initial_dir) free(initial_dir); if (openfilename.lpstrFile) free(openfilename.lpstrFile); return IUP_NOERROR; }
static int gtkDialogSetTrayAttrib(Ihandle *ih, const char *value) { GtkStatusIcon* status_icon = gtkDialogGetStatusIcon(ih); gtk_status_icon_set_visible(status_icon, iupStrBoolean(value)); return 1; }
int iupMatrixSetMarkAttrib(Ihandle* ih, int lin, int col, const char* value) { if (ih->data->mark_mode == IMAT_MARK_NO) return 0; if (lin >= 0 && col >= 0) /* both are specified */ { if (!iupMatrixCheckCellPos(ih, lin, col)) return 0; if (ih->data->mark_mode == IMAT_MARK_CELL) { int mark, ret = 0; if (lin == 0 || col == 0) /* title can NOT have a mark */ return 0; mark = iupStrBoolean(value); if (ih->data->callback_mode) { IFniii markedit_cb = (IFniii)IupGetCallback(ih, "MARKEDIT_CB"); if (markedit_cb && !ih->data->inside_markedit_cb) { ih->data->inside_markedit_cb = 1; markedit_cb(ih, lin, col, mark); ih->data->inside_markedit_cb = 0; } else { if (mark) { iupAttribSetId2(ih, "MARK", lin, col, "1"); ret = 1; } else iupAttribSetId2(ih, "MARK", lin, col, NULL); } } else { if (mark) ih->data->cells[lin][col].flags |= IMAT_IS_MARKED; else ih->data->cells[lin][col].flags &= ~IMAT_IS_MARKED; } if (ih->handle) { /* This assumes that the matrix has been draw completely previously */ iupMatrixPrepareDrawData(ih); iupMatrixDrawCells(ih, lin, col, lin, col); } return ret; } else { int mark = iupStrBoolean(value); if (ih->data->mark_mode & IMAT_MARK_LIN && lin>0) { if (mark) ih->data->lines.dt[lin].flags |= IMAT_IS_MARKED; else ih->data->lines.dt[lin].flags &= ~IMAT_IS_MARKED; } if (ih->data->mark_mode & IMAT_MARK_COL && col>0) { if (mark) ih->data->columns.dt[col].flags |= IMAT_IS_MARKED; else ih->data->columns.dt[col].flags &= ~IMAT_IS_MARKED; } if (ih->handle) { /* This assumes that the matrix has been drawn completely previously */ iupMatrixPrepareDrawData(ih); iupMatrixDrawCells(ih, lin, col, lin, col); } } } return 0; }
static int winDialogSetBringFrontAttrib(Ihandle *ih, const char *value) { if (iupStrBoolean(value)) SetForegroundWindow(ih->handle); return 0; }
int iupBaseSetVisibleAttrib(Ihandle* ih, const char* value) { iupdrvSetVisible(ih, iupStrBoolean(value)); return 0; }
static int winDialogSetFullScreenAttrib(Ihandle* ih, const char* value) { if (iupStrBoolean(value)) { if (!iupAttribGet(ih, "_IUPWIN_FS_STYLE")) { int width, height; LONG off_style, new_style; BOOL visible = ShowWindow (ih->handle, SW_HIDE); /* remove the decorations */ off_style = WS_BORDER | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU; new_style = GetWindowLong(ih->handle, GWL_STYLE); iupAttribSetStr(ih, "_IUPWIN_FS_STYLE", (char*)new_style); new_style &= (~off_style); SetWindowLong(ih->handle, GWL_STYLE, new_style); /* save the previous decoration attributes */ iupAttribStoreStr(ih, "_IUPWIN_FS_MAXBOX", iupAttribGet(ih, "MAXBOX")); iupAttribStoreStr(ih, "_IUPWIN_FS_MINBOX", iupAttribGet(ih, "MINBOX")); iupAttribStoreStr(ih, "_IUPWIN_FS_MENUBOX",iupAttribGet(ih, "MENUBOX")); iupAttribStoreStr(ih, "_IUPWIN_FS_RESIZE", iupAttribGet(ih, "RESIZE")); iupAttribStoreStr(ih, "_IUPWIN_FS_BORDER", iupAttribGet(ih, "BORDER")); iupAttribStoreStr(ih, "_IUPWIN_FS_TITLE", IupGetAttribute(ih, "TITLE")); /* must use IupGetAttribute to check from the native implementation */ /* save the previous position and size */ iupAttribStoreStr(ih, "_IUPWIN_FS_X", IupGetAttribute(ih, "X")); /* must use IupGetAttribute to check from the native implementation */ iupAttribStoreStr(ih, "_IUPWIN_FS_Y", IupGetAttribute(ih, "Y")); iupAttribStoreStr(ih, "_IUPWIN_FS_SIZE", IupGetAttribute(ih, "RASTERSIZE")); /* remove the decorations attributes */ iupAttribSetStr(ih, "MAXBOX", "NO"); iupAttribSetStr(ih, "MINBOX", "NO"); iupAttribSetStr(ih, "MENUBOX", "NO"); IupSetAttribute(ih, "TITLE", NULL); iupAttribSetStr(ih, "RESIZE", "NO"); iupAttribSetStr(ih, "BORDER", "NO"); /* full screen size */ iupdrvGetFullSize(&width, &height); SetWindowPos(ih->handle, HWND_TOP, 0, 0, width, height, SWP_FRAMECHANGED); /* layout will be updated in WM_SIZE */ if (visible) ShowWindow(ih->handle, SW_SHOW); } } else { LONG style = (LONG)iupAttribGet(ih, "_IUPWIN_FS_STYLE"); if (style) { BOOL visible = ShowWindow(ih->handle, SW_HIDE); /* restore the decorations attributes */ iupAttribStoreStr(ih, "MAXBOX", iupAttribGet(ih, "_IUPWIN_FS_MAXBOX")); iupAttribStoreStr(ih, "MINBOX", iupAttribGet(ih, "_IUPWIN_FS_MINBOX")); iupAttribStoreStr(ih, "MENUBOX",iupAttribGet(ih, "_IUPWIN_FS_MENUBOX")); IupSetAttribute(ih, "TITLE", iupAttribGet(ih, "_IUPWIN_FS_TITLE")); /* TITLE is not stored in the HashTable */ iupAttribStoreStr(ih, "RESIZE", iupAttribGet(ih, "_IUPWIN_FS_RESIZE")); iupAttribStoreStr(ih, "BORDER", iupAttribGet(ih, "_IUPWIN_FS_BORDER")); /* restore the decorations */ SetWindowLong(ih->handle, GWL_STYLE, style); /* restore position and size */ SetWindowPos(ih->handle, HWND_TOP, iupAttribGetInt(ih, "_IUPWIN_FS_X"), iupAttribGetInt(ih, "_IUPWIN_FS_Y"), IupGetInt(ih, "_IUPWIN_FS_SIZE"), IupGetInt2(ih, "_IUPWIN_FS_SIZE"), 0); /* layout will be updated in WM_SIZE */ if (visible) ShowWindow(ih->handle, SW_SHOW); /* remove auxiliar attributes */ iupAttribSetStr(ih, "_IUPWIN_FS_MAXBOX", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_MINBOX", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_MENUBOX",NULL); iupAttribSetStr(ih, "_IUPWIN_FS_TITLE", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_RESIZE", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_BORDER", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_X", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_Y", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_SIZE", NULL); iupAttribSetStr(ih, "_IUPWIN_FS_STYLE", NULL); } } return 1; }
static int motDialogSetFullScreenAttrib(Ihandle* ih, const char* value) { if (iupStrBoolean(value)) { if (!iupAttribGet(ih, "_IUPMOT_FS_STYLE")) { int visible = iupdrvDialogIsVisible(ih); if (visible) iupAttribSetStr(ih, "_IUPMOT_FS_STYLE", "VISIBLE"); else iupAttribSetStr(ih, "_IUPMOT_FS_STYLE", "HIDDEN"); /* save the previous decoration attributes */ /* during fullscreen these attributes can be consulted by the application */ iupAttribStoreStr(ih, "_IUPMOT_FS_MAXBOX", iupAttribGet(ih, "MAXBOX")); iupAttribStoreStr(ih, "_IUPMOT_FS_MINBOX", iupAttribGet(ih, "MINBOX")); iupAttribStoreStr(ih, "_IUPMOT_FS_MENUBOX",iupAttribGet(ih, "MENUBOX")); iupAttribStoreStr(ih, "_IUPMOT_FS_RESIZE", iupAttribGet(ih, "RESIZE")); iupAttribStoreStr(ih, "_IUPMOT_FS_BORDER", iupAttribGet(ih, "BORDER")); iupAttribStoreStr(ih, "_IUPMOT_FS_TITLE", IupGetAttribute(ih, "TITLE")); /* must use IupGetAttribute to check from the native implementation */ /* remove the decorations attributes */ iupAttribSetStr(ih, "MAXBOX", "NO"); iupAttribSetStr(ih, "MINBOX", "NO"); iupAttribSetStr(ih, "MENUBOX", "NO"); IupSetAttribute(ih, "TITLE", NULL); iupAttribSetStr(ih, "TITLE", NULL); /* remove from the hash table if we are during IupMap */ iupAttribSetStr(ih, "RESIZE", "NO"); iupAttribSetStr(ih, "BORDER", "NO"); /* use WM fullscreen support */ if (!motDialogSetFullScreen(ih, 1)) { /* or configure fullscreen manually */ int decor; int width, height; /* hide before changing decorations */ if (visible) { iupAttribSetStr(ih, "_IUPMOT_SHOW_STATE", NULL); /* To avoid a SHOW_CB notification */ XtUnmapWidget(ih->handle); } /* save the previous position and size */ iupAttribStoreStr(ih, "_IUPMOT_FS_X", IupGetAttribute(ih, "X")); /* must use IupGetAttribute to check from the native implementation */ iupAttribStoreStr(ih, "_IUPMOT_FS_Y", IupGetAttribute(ih, "Y")); iupAttribStoreStr(ih, "_IUPMOT_FS_SIZE", IupGetAttribute(ih, "RASTERSIZE")); /* save the previous decoration */ XtVaGetValues(ih->handle, XmNmwmDecorations, &decor, NULL); iupAttribSetStr(ih, "_IUPMOT_FS_DECOR", (char*)decor); /* remove the decorations */ XtVaSetValues(ih->handle, XmNmwmDecorations, (XtArgVal)0, NULL); motDialogSetWindowManagerStyle(ih); /* get full screen size */ iupdrvGetFullSize(&width, &height); /* set position and size */ XtVaSetValues(ih->handle, XmNwidth, (XtArgVal)width, XmNheight, (XtArgVal)height, XmNx, (XtArgVal)0, XmNy, (XtArgVal)0, NULL); /* layout will be updated in motDialogConfigureNotify */ if (visible) XtMapWidget(ih->handle); } } } else { char* fs_style = iupAttribGet(ih, "_IUPMOT_FS_STYLE"); if (fs_style) { /* can only switch back from full screen if window was visible */ /* when fullscreen was set */ if (iupStrEqualNoCase(fs_style, "VISIBLE")) { iupAttribSetStr(ih, "_IUPMOT_FS_STYLE", NULL); /* restore the decorations attributes */ iupAttribStoreStr(ih, "MAXBOX", iupAttribGet(ih, "_IUPMOT_FS_MAXBOX")); iupAttribStoreStr(ih, "MINBOX", iupAttribGet(ih, "_IUPMOT_FS_MINBOX")); iupAttribStoreStr(ih, "MENUBOX",iupAttribGet(ih, "_IUPMOT_FS_MENUBOX")); IupSetAttribute(ih, "TITLE", iupAttribGet(ih, "_IUPMOT_FS_TITLE")); /* TITLE is not stored in the HashTable */ iupAttribStoreStr(ih, "RESIZE", iupAttribGet(ih, "_IUPMOT_FS_RESIZE")); iupAttribStoreStr(ih, "BORDER", iupAttribGet(ih, "_IUPMOT_FS_BORDER")); if (!motDialogSetFullScreen(ih, 0)) { int border, caption, menu, x, y; int visible = iupdrvDialogIsVisible(ih); if (visible) XtUnmapWidget(ih->handle); /* restore the decorations */ XtVaSetValues(ih->handle, XmNmwmDecorations, (XtArgVal)(int)iupAttribGet(ih, "_IUPMOT_FS_DECOR"), NULL); motDialogSetWindowManagerStyle(ih); /* the dialog decoration will not be considered yet in the next XtVaSetValues */ /* so compensate the decoration when restoring the position and size */ iupdrvDialogGetDecoration(ih, &border, &caption, &menu); x = iupAttribGetInt(ih, "_IUPMOT_FS_X") - (border); y = iupAttribGetInt(ih, "_IUPMOT_FS_Y") - (border+caption+menu); /* restore position and size */ XtVaSetValues(ih->handle, XmNx, (XtArgVal)x, XmNy, (XtArgVal)y, XmNwidth, (XtArgVal)(IupGetInt(ih, "_IUPMOT_FS_SIZE") - (2*border)), XmNheight, (XtArgVal)(IupGetInt2(ih, "_IUPMOT_FS_SIZE") - (2*border+caption)), NULL); /* layout will be updated in motDialogConfigureNotify */ if (visible) XtMapWidget(ih->handle); /* remove auxiliar attributes */ iupAttribSetStr(ih, "_IUPMOT_FS_X", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_Y", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_SIZE", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_DECOR", NULL); } /* remove auxiliar attributes */ iupAttribSetStr(ih, "_IUPMOT_FS_MAXBOX", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_MINBOX", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_MENUBOX",NULL); iupAttribSetStr(ih, "_IUPMOT_FS_RESIZE", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_BORDER", NULL); iupAttribSetStr(ih, "_IUPMOT_FS_TITLE", NULL); } } } return 1; }
static int gtkDialogMapMethod(Ihandle* ih) { int decorations = 0; int functions = 0; InativeHandle* parent; GtkWidget* fixed; int has_titlebar = 0; #ifdef HILDON if (iupAttribGetBoolean(ih, "HILDONWINDOW")) { HildonProgram *program = HILDON_PROGRAM(hildon_program_get_instance()); ih->handle = hildon_window_new(); if (ih->handle) hildon_program_add_window(program, HILDON_WINDOW(ih->handle)); } else { iupAttribSetStr(ih, "DIALOGHINT", "YES"); /* otherwise not displayed correctly */ ih->handle = gtk_window_new(GTK_WINDOW_TOPLEVEL); } #else ih->handle = gtk_window_new(GTK_WINDOW_TOPLEVEL); #endif if (!ih->handle) return IUP_ERROR; parent = iupDialogGetNativeParent(ih); if (parent) { gtk_window_set_transient_for((GtkWindow*)ih->handle, (GtkWindow*)parent); /* manually remove child windows when parent is destroyed */ g_signal_connect(G_OBJECT(parent), "destroy", G_CALLBACK(gtkDialogChildDestroyEvent), ih); } g_signal_connect(G_OBJECT(ih->handle), "focus-in-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "focus-out-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "enter-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "leave-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "show-help", G_CALLBACK(iupgtkShowHelp), ih); /* The iupgtkKeyPressEvent of the control with the focus will propagate the key up to the dialog. */ /* Inside iupgtkKeyPressEvent we test this to avoid duplicate calls. */ g_signal_connect(G_OBJECT(ih->handle), "key-press-event", G_CALLBACK(iupgtkKeyPressEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "configure-event", G_CALLBACK(gtkDialogConfigureEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "window-state-event", G_CALLBACK(gtkDialogWindowStateEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "delete-event", G_CALLBACK(iupgtkDialogDeleteEvent), ih); gtk_window_set_default_size((GtkWindow*)ih->handle, 100, 100); /* set this to avoid size calculation problems */ if (iupAttribGetBoolean(ih, "DIALOGHINT")) gtk_window_set_type_hint(GTK_WINDOW(ih->handle), GDK_WINDOW_TYPE_HINT_DIALOG); /* the container that will receive the child element. */ fixed = gtk_fixed_new(); gtk_container_add((GtkContainer*)ih->handle, fixed); gtk_widget_show(fixed); /* initialize the widget */ gtk_widget_realize(ih->handle); if (iupAttribGet(ih, "TITLE")) has_titlebar = 1; if (iupAttribGetBoolean(ih, "RESIZE")) { functions |= GDK_FUNC_RESIZE; decorations |= GDK_DECOR_RESIZEH; decorations |= GDK_DECOR_BORDER; /* has_border */ } else iupAttribSetStr(ih, "MAXBOX", "NO"); if (iupAttribGetBoolean(ih, "MENUBOX")) { functions |= GDK_FUNC_CLOSE; decorations |= GDK_DECOR_MENU; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "MAXBOX")) { functions |= GDK_FUNC_MAXIMIZE; decorations |= GDK_DECOR_MAXIMIZE; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "MINBOX")) { functions |= GDK_FUNC_MINIMIZE; decorations |= GDK_DECOR_MINIMIZE; has_titlebar = 1; } if (has_titlebar) { functions |= GDK_FUNC_MOVE; decorations |= GDK_DECOR_TITLE; gtk_window_set_title((GtkWindow*)ih->handle, ""); } if (iupAttribGetBoolean(ih, "BORDER") || has_titlebar) decorations |= GDK_DECOR_BORDER; /* has_border */ if (decorations == 0) gtk_window_set_decorated((GtkWindow*)ih->handle, FALSE); else { GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) { gdk_window_set_decorations(window, (GdkWMDecoration)decorations); gdk_window_set_functions(window, (GdkWMFunction)functions); } } /* configure for DRAG&DROP */ if (IupGetCallback(ih, "DROPFILES_CB")) iupAttribSetStr(ih, "DROPFILESTARGET", "YES"); { /* Reset the DLGBGCOLOR global attribute if it is the first time a dialog is created. The value returned by gtk_style_new is not accurate. */ GtkStyle* style = gtk_widget_get_style(ih->handle); if (style && IupGetGlobal("_IUP_RESET_GLOBALCOLORS")) { iupgtkUpdateGlobalColors(style); IupSetGlobal("_IUP_RESET_GLOBALCOLORS", NULL); } } /* configure the size range */ gtkDialogSetMinMax(ih, 1, 1, 65535, 65535); /* MINSIZE and MAXSIZE default values */ /* Ignore VISIBLE before mapping */ iupAttribSetStr(ih, "VISIBLE", NULL); if (iupStrBoolean(IupGetGlobal("INPUTCALLBACKS"))) gtk_widget_add_events(ih->handle, GDK_POINTER_MOTION_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_MOTION_MASK); return IUP_NOERROR; }
static int iToggleSetFlatAttrib(Ihandle* ih, const char* value) { if (!ih->handle) /* set only before map */ ih->data->flat = iupStrBoolean(value); return 0; }
static int winFileDlgPopup(Ihandle *ih, int x, int y) { InativeHandle* parent = iupDialogGetNativeParent(ih); OPENFILENAME openfilename; int result, dialogtype; char *value; iupAttribSetInt(ih, "_IUPDLG_X", x); /* used in iupDialogUpdatePosition */ iupAttribSetInt(ih, "_IUPDLG_Y", y); value = iupAttribGetStr(ih, "DIALOGTYPE"); if (iupStrEqualNoCase(value, "SAVE")) dialogtype = IUP_DIALOGSAVE; else if (iupStrEqualNoCase(value, "DIR")) dialogtype = IUP_DIALOGDIR; else dialogtype = IUP_DIALOGOPEN; if (dialogtype == IUP_DIALOGDIR) { winFileDlgGetFolder(ih); return IUP_NOERROR; } if (!parent) parent = GetActiveWindow(); /* if NOT set will NOT be Modal */ /* anyway it will be modal only relative to its parent */ ZeroMemory(&openfilename, sizeof(OPENFILENAME)); openfilename.lStructSize = sizeof(OPENFILENAME); openfilename.hwndOwner = parent; value = iupAttribGet(ih, "EXTFILTER"); if (value) { int index; openfilename.lpstrFilter = winFileDlgStrReplaceSeparator(value); value = iupAttribGet(ih, "FILTERUSED"); if (iupStrToInt(value, &index)) openfilename.nFilterIndex = index; else openfilename.nFilterIndex = 1; } else { value = iupAttribGet(ih, "FILTER"); if (value) { int sz1, sz2; char* info = iupAttribGet(ih, "FILTERINFO"); if (!info) info = value; /* concat FILTERINFO+FILTER */ sz1 = strlen(info)+1; sz2 = strlen(value)+1; openfilename.lpstrFilter = (char*)malloc(sz1+sz2+1); memcpy((char*)openfilename.lpstrFilter, info, sz1); memcpy((char*)openfilename.lpstrFilter+sz1, value, sz2); ((char*)openfilename.lpstrFilter)[sz1+sz2] = 0; /* additional 0 at the end */ openfilename.nFilterIndex = 1; } } openfilename.lpstrFile = (char*)malloc(IUP_MAX_FILENAME_SIZE+1); value = iupAttribGet(ih, "FILE"); if (value) { strncpy(openfilename.lpstrFile, value, IUP_MAX_FILENAME_SIZE); winFileDlgStrReplacePathSlash(openfilename.lpstrFile); } else openfilename.lpstrFile[0] = 0; openfilename.nMaxFile = IUP_MAX_FILENAME_SIZE; openfilename.lpstrInitialDir = iupStrDup(iupAttribGet(ih, "DIRECTORY")); if (openfilename.lpstrInitialDir) winFileDlgStrReplacePathSlash((char*)openfilename.lpstrInitialDir); openfilename.lpstrTitle = iupAttribGet(ih, "TITLE"); openfilename.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY; if (!iupAttribGetBoolean(ih, "NOOVERWRITEPROMPT")) openfilename.Flags |= OFN_OVERWRITEPROMPT; if (iupAttribGetBoolean(ih, "SHOWHIDDEN")) openfilename.Flags |= OFN_FORCESHOWHIDDEN; value = iupAttribGet(ih, "ALLOWNEW"); if (!value) { if (dialogtype == IUP_DIALOGSAVE) value = "YES"; else value = "NO"; } if (iupStrBoolean(value)) openfilename.Flags |= OFN_CREATEPROMPT; else openfilename.Flags |= OFN_FILEMUSTEXIST; if (iupAttribGetBoolean(ih, "NOCHANGEDIR")) openfilename.Flags |= OFN_NOCHANGEDIR; if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) openfilename.Flags |= OFN_ALLOWMULTISELECT; openfilename.lpfnHook = winFileDlgSimpleHook; openfilename.Flags |= OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING; openfilename.lCustData = (LPARAM)ih; if (iupAttribGetBoolean(ih, "SHOWPREVIEW") && IupGetCallback(ih, "FILE_CB")) { openfilename.Flags |= OFN_ENABLETEMPLATE; openfilename.hInstance = iupwin_dll_hinstance? iupwin_dll_hinstance: iupwin_hinstance; openfilename.lpTemplateName = "iupPreviewDlg"; openfilename.lpfnHook = winFileDlgPreviewHook; } if (IupGetCallback(ih, "HELP_CB")) openfilename.Flags |= OFN_SHOWHELP; if (dialogtype == IUP_DIALOGOPEN) result = GetOpenFileName(&openfilename); else result = GetSaveFileName(&openfilename); if (result) { if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) { int i = 0; char* dir = iupStrFileGetPath(openfilename.lpstrFile); /* the first part is the directory already */ iupAttribStoreStr(ih, "DIRECTORY", dir); free(dir); /* If there is more than one file, replace terminator by the separator */ if (openfilename.lpstrFile[openfilename.nFileOffset-1] == 0 && openfilename.nFileOffset>0) { while (openfilename.lpstrFile[i] != 0 || openfilename.lpstrFile[i+1] != 0) { if (openfilename.lpstrFile[i]==0) openfilename.lpstrFile[i] = '|'; i++; } openfilename.lpstrFile[i] = '|'; } iupAttribSetStr(ih, "STATUS", "0"); iupAttribSetStr(ih, "FILEEXIST", "YES"); } else { if (iupdrvIsFile(openfilename.lpstrFile)) /* check if file exists */ { char* dir = iupStrFileGetPath(openfilename.lpstrFile); iupAttribStoreStr(ih, "DIRECTORY", dir); free(dir); iupAttribSetStr(ih, "FILEEXIST", "YES"); iupAttribSetStr(ih, "STATUS", "0"); } else { iupAttribSetStr(ih, "FILEEXIST", "NO"); iupAttribSetStr(ih, "STATUS", "1"); } } iupAttribStoreStr(ih, "VALUE", openfilename.lpstrFile); iupAttribSetInt(ih, "FILTERUSED", (int)openfilename.nFilterIndex); } else { iupAttribSetStr(ih, "FILTERUSED", NULL); iupAttribSetStr(ih, "VALUE", NULL); iupAttribSetStr(ih, "FILEEXIST", NULL); iupAttribSetStr(ih, "STATUS", "-1"); } if (openfilename.lpstrFilter) free((char*)openfilename.lpstrFilter); if (openfilename.lpstrInitialDir) free((char*)openfilename.lpstrInitialDir); if (openfilename.lpstrFile) free(openfilename.lpstrFile); return IUP_NOERROR; }
int iupdrvSetGlobal(const char* name, const char* value) { if (iupStrEqual(name, "INPUTCALLBACKS")) { if (iupStrBoolean(value)) { if (!win_OldGetMessageHook) win_OldGetMessageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)winHookGetMessageProc, NULL, GetCurrentThreadId()); } else { if (win_OldGetMessageHook) { UnhookWindowsHookEx(win_OldGetMessageHook); win_OldGetMessageHook = NULL; } } return 1; } if (iupStrEqual(name, "UTF8MODE")) { iupwinStrSetUTF8Mode(iupStrBoolean(value)); return 0; } if (iupStrEqual(name, "UTF8MODE_FILE")) { iupwinStrSetUTF8ModeFile(iupStrBoolean(value)); return 0; } if (iupStrEqual(name, "DLL_HINSTANCE")) { iupwin_dll_hinstance = (HINSTANCE)value; return 0; } if (iupStrEqual(name, "SINGLEINSTANCE")) { if (winGlobalSetMutex(value)) { winGlobalFindFirstInstance(value); return 0; /* don't save the attribute, mutex already exist */ } else return 1; /* save the attribute, this is the first instance */ } if (iupStrEqual(name, "CLIENTAREAANIMATION")) { BOOL flag = iupStrBoolean(value); SystemParametersInfoA(SPI_SETCLIENTAREAANIMATION, 0, (void*)flag, 0); return 1; } if (iupStrEqual(name, "HOTTRACKING")) { BOOL flag = iupStrBoolean(value); SystemParametersInfoA(SPI_SETHOTTRACKING, 0, (void*)flag, 0); return 1; } return 1; }