void os2FrameWindow::SetWindowListVisibility(bool aState) { HSWITCH hswitch = WinQuerySwitchHandle(mFrameWnd, 0); if (hswitch) { SWCNTRL swctl; WinQuerySwitchEntry(hswitch, &swctl); swctl.uchVisibility = aState ? SWL_VISIBLE : SWL_INVISIBLE; swctl.fbJump = aState ? SWL_JUMPABLE : SWL_NOTJUMPABLE; WinChangeSwitchEntry(hswitch, &swctl); } }
void OS2Factory::removeFromTaskBar() { WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, SWP_HIDE ); HSWITCH hswitch = WinQuerySwitchHandle( m_hParentWindow, 0 ); SWCNTRL swctl; WinQuerySwitchEntry( hswitch, &swctl ); swctl.uchVisibility = SWL_INVISIBLE; WinChangeSwitchEntry( hswitch, &swctl ); WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, SWP_ACTIVATE | SWP_SHOW ); }
void set_window_name (char *format, ...) { va_list args; char buffer[8192]; /* set up new title */ va_start (args, format); vsnprintf1 (buffer, sizeof(buffer), format, args); va_end (args); buffer[MAXNAMEL] = '\0'; // change title create_pm (); WinSetWindowText (hwnd0, buffer); strncpy (swdata.szSwtitle, buffer, MAXNAMEL); swdata.szSwtitle[MAXNAMEL] = '\0'; WinChangeSwitchEntry (hsw, &swdata); destroy_pm (); }
/*----------------------------------------------- Helper function to keep the title bar and the switch entry up to date. -----------------------------------------------*/ VOID SetSwitchEntry(HWND hwnd, PSZ szTitleBar, PSZ szFract) { PID pid; static SWCNTRL swcntrl; static HSWITCH hswitch = NULL; HWND hwndFrame; hwndFrame = WinQueryWindow (hwnd, QW_PARENT, FALSE); if (hswitch == (HSWITCH) NULL) { /* if first time */ /* get our process ID for the Switch structure */ WinQueryWindowProcess(hwndFrame, &pid, NULL); /* add/change switch list entry */ swcntrl.hwnd = hwndFrame; swcntrl.hwndIcon = (HWND) NULL; swcntrl.hprog = (HPROGRAM) NULL; swcntrl.idProcess = pid; swcntrl.idSession = 0; swcntrl.uchVisibility = SWL_VISIBLE; swcntrl.fbJump = SWL_JUMPABLE; _fstrcpy( swcntrl.szSwtitle, szTitleBar); strcat( swcntrl.szSwtitle, " - "); _fstrcat( swcntrl.szSwtitle, szFract); swcntrl.fReserved = '\0'; hswitch = WinAddSwitchEntry( &swcntrl ); } else { /* do an update */ _fstrcpy( swcntrl.szSwtitle, szTitleBar); strcat( swcntrl.szSwtitle, " - "); _fstrcat( swcntrl.szSwtitle, szFract); WinChangeSwitchEntry( hswitch, &swcntrl); } /* now put it in the titlebar also */ WinSetWindowText(hwndFrame, swcntrl.szSwtitle); }
int spawnve(int mode, const char *name, char * const argv[], char * const envp[]) { int i, j, l, n, prefix_len = 0; char *ext, *tmp, *arg1, *execname, *p_arg, *p_env, *prefix = NULL; char runtype, freeexec = 0, hswValid = 0, quoteargs = 1; ULONG appflags; const char * const *p; unsigned int runflags = 0; int retcode = -1; char errbuf[MAXNAMLEN + 1], queue[MAXNAMLEN + 1]; SWCNTRL swc; HSWITCH vioHSW; errno = ENOENT; /* EMX crashes on very long filenames... */ if (strlen (name) > MAXNAMLEN - 4) { errno = ENAMETOOLONG; return -1; } /* Find extension ordinal in exec_ext array */ ext = _getext2(name); for (i = 0; i < EXEC_EXT_COUNT; i++) { if (strcmp(ext, exec_ext[i]) == 0) goto found; } if (access(name, F_OK) == 0) errno = ENOEXEC; return -1; found: { PTIB tb; PPIB pb; /* Determine our session type */ if ((DosGetInfoBlocks(&tb, &pb) == NO_ERROR) && (vioHSW = WinQuerySwitchHandle(NULLHANDLE, pb->pib_ulpid)) && (WinQuerySwitchEntry(vioHSW, &swc) == NO_ERROR)) hswValid = 1; } switch (mode & 0xFF) { case P_WAIT: runflags |= spawn_WAIT; break; case P_PM: runflags |= spawn_SESSION | spawn_TYPE_PM; break; case P_OVERLAY: runflags |= spawn_WAIT | spawn_OVERLAY; break; case P_DETACH: runflags |= spawn_DETACH; break; } if (((runtype = exec_run[i]) == 0) && (DosQueryAppType((PSZ)name, &appflags) == NO_ERROR) && ((runflags & spawn_DETACH) == 0) && (hswValid)) { /* Compare to application type */ switch (appflags & 7) { case FAPPTYP_NOTSPEC: /* Methinks its a DOS proggy */ { if (appflags & FAPPTYP_DOS) if (swc.bProgType == PROG_FULLSCREEN) runflags |= (spawn_SESSION | spawn_TYPE_VDM); else runflags |= (spawn_SESSION | spawn_TYPE_WINDOWEDVDM); else runflags |= (spawn_SESSION | spawn_TYPE_DEFAULT); break; } case FAPPTYP_NOTWINDOWCOMPAT: { if (swc.bProgType != PROG_FULLSCREEN) runflags |= (spawn_SESSION | spawn_TYPE_FULLSCREEN); break; } case FAPPTYP_WINDOWCOMPAT: { /* That'll do it */ break; } case FAPPTYP_WINDOWAPI: { runflags |= (spawn_SESSION | spawn_TYPE_PM); break; } default: { runtype = 1; /* Let $COMSPEC decide what to do */ break; } } } fallback: switch (runtype) { case 0: directrun: if ((runflags & spawn_SESSION) && (((runflags & spawn_TYPE) == spawn_TYPE_VDM) || ((runflags & spawn_TYPE) == spawn_TYPE_WINDOWEDVDM))) { /* DOS command interpreter does not understand '/'s */ execname = savestring((char *)name); freeexec = 1; for (tmp = execname; *tmp; tmp++) if (*tmp == '/') *tmp = '\\'; } else execname = (char *)name; break; case 1: execname = get_string_value ("COMSPEC"); if (!execname) { internal_error("COMSPEC variable not defined"); errno = EACCES; return -1; } prefix_len = strlen(execname) + 1; prefix = alloca(prefix_len + 2 + 1 + strlen(name) + 1); strcpy(prefix, execname); emx_deunixify(prefix); strcpy((char *)&prefix[prefix_len - 1], " /c "); prefix_len += 2 + 1; strcpy((char *)&prefix[prefix_len], name); prefix_len += strlen(name) + 1; break; case 2: default: { /* We must define HAVE_HASH_BANG_EXEC since we`re processing #! here */ FILE *f; char line[MAXNAMLEN + 3]; line[0] = 0; if (!(f = fopen(name, "rt"))) { errno = ENOENT; return -1; }; fgets((char *)&line, sizeof(line), f); fclose(f); if (line[0] != '#') /* Try to run as regular executable */ goto directrun; if (line[1] != '!') { /* Run script using current shell */ strcpy((char *)&line, "#! "); strcat((char *)&line, shell_name); } n = strlen(line); while ((n > 0) && ((line[n - 1] < ' ') || (whitespace(line[n])))) n--; for (i = 2; whitespace(line[i]) && i < n; i++) ; for (j = i; (!whitespace(line[j])) && j < n; j++) ; l = i; j++; tmp = xmalloc(j - i); _strncpy(tmp, (char *)&line[i], j - i); execname = find_user_command(tmp); free(tmp); freeexec = 1; prefix_len = n - l + 1 + 1 + strlen(name); prefix = alloca(prefix_len + 1); _strncpy(prefix, (char *)&line[l], n - l + 1); strcat(prefix, " "); strcat(prefix, name); break; } } if ((execname == NULL) || (access(execname, F_OK) != 0)) { if (execname == NULL) { errno = ENOEXEC; return -1; } execname = savestring(execname); freeexec = 1; if ((ext_file_status(&execname) & FS_EXISTS) == 0) { free(execname); errno = ENOENT; return -1; } } { char *qlist = get_string_value ("BASH_NOQUOTEARGS"); char *tmp, *name = _getname (execname); int namelen; tmp = _getext (name); namelen = (tmp ? (int) (tmp - name) : strlen (name)); while (qlist) { tmp = strchr (qlist, ';'); if (!(j = tmp ? (int) (tmp - qlist) : strlen (qlist))) break; if ((namelen == j) && (memicmp (qlist, name, namelen) == 0)) { quoteargs = 0; break; } qlist += j; while (qlist[0] == ';') qlist++; } } /* Prepare command-line string */ j = prefix_len + 2; for (i = 0; i <= 1; i++) { for (p = (const char **)argv; *p != NULL; ++p) { if (p != (const char **)argv) if (i == 0) // Add a space before args starting from 1 j++; else strcat(p_arg, " "); else if (prefix_len) continue; // Prefix already contains argv[0] // If argv[i] contains a space or tab, we should put it in quotes if (strchr(*p, ' ') || strchr(*p, '\t')) if (i == 0) j += 1 + (quoteargs ? q_strlen(*p) : strlen(*p)) + 1; else { strcat(p_arg, "\""); if (quoteargs) q_strcat (p_arg, *p); else strcat (p_arg, *p); strcat(p_arg, "\""); } else // If we`re running a EMX program, we should backquote all '"'s in argv[i] if (i == 0) j += (quoteargs ? q_strlen(*p) : strlen(*p)); else if (quoteargs) q_strcat(p_arg, *p); else strcat(p_arg, *p); } if (i == 0) { p_arg = alloca(j); if (prefix_len) { memcpy(p_arg, prefix, prefix_len); p_arg[prefix_len] = ' '; p_arg[prefix_len + 1] = 0; } else *p_arg = 0; } } p_arg[strlen(p_arg) + 1] = 0; #if 0 printf("quoteargs = %d\n", quoteargs); printf("exec{%s}\n", execname); printf("args{%s}\n", p_arg); #endif for (arg1 = p_arg; !whitespace(*arg1) && *arg1; arg1++) ; *arg1++ = 0; /* Prepare environment */ j = 1; for (p = (const char * const *)envp; *p != NULL; ++p) j += strlen (*p) + 1; p_env = tmp = alloca(j); for (p = (const char * const *)envp; *p != NULL; ++p) { i = strlen (*p); memcpy(tmp, *p, i+1); tmp += i+1; } *tmp = 0; if (runflags & spawn_SESSION) /* Use DosStartSession */ { HQUEUE hq; /* Termination queue management */ sprintf((char *)&queue, "\\QUEUES\\bash%d", getpid()); if (DosCreateQueue(&hq, QUE_FIFO | QUE_CONVERT_ADDRESS, (PSZ)queue) == NO_ERROR) { STARTDATA sd; ULONG sid,pid; APIRET r; memset(&sd, 0, sizeof(sd)); sd.Length = sizeof(sd); sd.Related = (runflags & spawn_WAIT ? SSF_RELATED_CHILD : SSF_RELATED_INDEPENDENT); sd.FgBg = SSF_FGBG_FORE; sd.PgmName = execname; sd.PgmInputs = arg1; sd.TermQ = (PBYTE)&queue; sd.Environment = p_env; sd.InheritOpt = SSF_INHERTOPT_PARENT; sd.SessionType = (runflags & spawn_TYPE) >> 16; sd.ObjectBuffer = (PSZ)&errbuf; sd.ObjectBuffLen = sizeof(errbuf); #if 0 sd.PgmControl = SSF_CONTROL_NOAUTOCLOSE; #endif r = DosStartSession(&sd, &sid, &pid); if (r == NO_ERROR || r == ERROR_SMG_START_IN_BACKGROUND) { if (runflags & spawn_WAIT) { REQUESTDATA rd; ULONG Length; PUSHORT Info = NULL; BYTE Priority; ULONG oldVis, oldJump; SWP oldpos; if (hswValid) { /* Exclude session from task list */ oldVis = swc.uchVisibility; swc.uchVisibility = SWL_INVISIBLE; oldJump = swc.fbJump; swc.fbJump = SWL_NOTJUMPABLE; WinChangeSwitchEntry(vioHSW, &swc); /* Minimize session */ WinQueryWindowPos(swc.hwnd, &oldpos); if ((oldpos.fl & SWP_MINIMIZE) == 0) WinPostMsg(swc.hwnd, WM_SYSCOMMAND, (MPARAM)SC_MINIMIZE, MPFROM2SHORT(CMDSRC_MENU, FALSE)); } DosReadQueue(hq, &rd, &Length, (PPVOID)&Info, 0, DCWW_WAIT, &Priority, 0); if (hswValid) { /* Restore jumpable & visible status */ swc.uchVisibility = oldVis; swc.fbJump = oldJump; WinChangeSwitchEntry(vioHSW, &swc); /* Restore session */ if ((oldpos.fl & SWP_MINIMIZE) == 0) { WinPostMsg(swc.hwnd, WM_SYSCOMMAND, (MPARAM)SC_RESTORE, MPFROM2SHORT(CMDSRC_MENU, FALSE)); WinSetWindowPos(swc.hwnd, oldpos.hwndInsertBehind, oldpos.x, oldpos.y, oldpos.cx, oldpos.cy, oldpos.fl); } } retcode = Info[1]; } else retcode = pid; } else internal_error("Execution failed because of module \"%s\"", (char *)&errbuf); DosCloseQueue(hq); } else
// Поток приложения вызывает WindowProc всякий раз, когда для окна есть сообщение. // Window - окно, Message - сообщение, *_parameter - данные, которые передаются вместе с сообщением. MRESULT EXPENTRY Installer_ClientWindowProc( HWND Window, ULONG Message, MPARAM First_parameter, MPARAM Second_parameter ) { switch( Message ) { // Выполняем действия при создании окна. case WM_CREATE: { WinPostMsg( Window, MY_CREATE, 0, 0 ); } return 0; case MY_CREATE: { // Задаем заголовок окна приложения. if( Installer.Code_page == RUSSIAN ) strcpy( Installer.Frame_window_title, StrConst_RU_Title ); else strcpy( Installer.Frame_window_title, StrConst_EN_Title ); WinSetWindowText( Installer.Frame_window, Installer.Frame_window_title ); // Устанавливаем картинку в левом верхнем углу окна. WinSendMsg( Installer.Frame_window, WM_SETICON, (MPARAM) WinLoadPointer( HWND_DESKTOP, NULLHANDLE, 1 ), 0 ); // Задаем расположение окна. { INT X_Screen = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ); INT Y_Screen = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ); INT Window_width = X_Screen / 3; if( X_Screen < 1024 ) Window_width *= 1.25; INT Window_height = Y_Screen / 3; if( X_Screen < 1024 ) Window_height *= 1.25; INT Window_position_X = ( X_Screen - Window_width ) / 2; INT Window_position_Y = ( Y_Screen - Window_height ) / 2 + ( Y_Screen - Window_height ) / 4 / 2; WinSetWindowPos( Installer.Frame_window, HWND_TOP, Window_position_X, Window_position_Y, Window_width, Window_height, SWP_ZORDER | SWP_MOVE | SWP_SIZE | SWP_NOADJUST ); WinSetActiveWindow( HWND_DESKTOP, Installer.Frame_window ); } // Добавляем его в список окон. { SWCNTRL Task; HSWITCH Switch_handle = NULLHANDLE; bzero( &Task, sizeof( SWCNTRL ) ); Task.hwnd = Installer.Frame_window; Task.hwndIcon = (HPOINTER) WinSendMsg( Installer.Frame_window, WM_QUERYICON, 0, 0 ); WinQueryWindowProcess( Installer.Frame_window, &Task.idProcess, NULL ); strcpy( Task.szSwtitle, Installer.Frame_window_title ); Task.uchVisibility = SWL_VISIBLE; Task.fbJump = SWL_JUMPABLE; Switch_handle = WinCreateSwitchEntry( Installer.Application, &Task ); WinChangeSwitchEntry( Switch_handle, &Task ); } // Создаем поля ввода в окне рабочей области. ClientWindow_CreatePage( Installer.Client_window ); } return 0; // Передвигаем поля ввода. case MY_APPLY_LAYOUT: { LitApplyLayout( &Client_Window.Layout ); } return 0; // Включаем и отключаем поля ввода. case MY_ENABLE_BUTTONS: { ULONG Action = (ULONG) First_parameter; WinEnableWindow( WinWindowFromID( WinWindowFromID( Window, Client_Window.Settings.Buttons_brick_ID ), Client_Window.Settings.Install_button_ID ), Action ); WinEnableWindow( WinWindowFromID( WinWindowFromID( Window, Client_Window.Settings.Buttons_brick_ID ), Client_Window.Settings.Remove_button_ID ), Action ); WinEnableWindow( WinWindowFromID( WinWindowFromID( Window, Client_Window.Settings.Buttons_brick_ID ), Client_Window.Settings.Cancel_button_ID ), Action ); if( !Action ) WinSendMsg( WinWindowFromID( Installer.Frame_window, FID_SYSMENU ), MM_SETITEMATTR, MPFROM2SHORT( SC_CLOSE, INCLUDE_SUBMENUS ), MPFROM2SHORT( MIA_DISABLED, MIA_DISABLED ) ); else WinSendMsg( WinWindowFromID( Installer.Frame_window, FID_SYSMENU ), MM_SETITEMATTR, MPFROM2SHORT( SC_CLOSE, INCLUDE_SUBMENUS ), MPFROM2SHORT( MIA_DISABLED, 0 ) ); } return 0; // Обрабатываем нажатия на кнопки. case WM_COMMAND: { ULONG WM_Control_Button_ID = SHORT1FROMMP( First_parameter ); if( WM_Control_Button_ID == Client_Window.Settings.Install_button_ID ) { StartInstallerThread( NIA_INSTALL ); } if( WM_Control_Button_ID == Client_Window.Settings.Remove_button_ID ) { StartInstallerThread( NIA_REMOVE ); } if( WM_Control_Button_ID == Client_Window.Settings.Cancel_button_ID ) { WinPostMsg( Installer.Frame_window, WM_SYSCOMMAND, (MPARAM) SC_CLOSE, 0 ); } } return 0; // Закрашиваем пространство окна. case WM_PAINT: { RECT Rectangle = {0}; HPS Presentation_space = WinBeginPaint( Window, 0, &Rectangle ); if( Presentation_space ) { LONG Color_table[ 256 ]; bzero( Color_table, sizeof( Color_table ) ); GpiQueryLogColorTable( Presentation_space, 0, 0, 256, Color_table ); LONG Color_index = ( 256 - 1 ); WinQueryPresParam( Window, PP_BACKGROUNDCOLOR, 0, NULL, sizeof( Color_table[ Color_index ] ), &Color_table[ Color_index ], QPF_NOINHERIT ); GpiCreateLogColorTable( Presentation_space, 0, LCOLF_CONSECRGB, 0, 256, Color_table ); WinFillRect( Presentation_space, &Rectangle, Color_index ); WinEndPaint( Presentation_space ); } } return 0; // Сообщаем окну рамки, что содержимое окна рабочей области закрашивать не следует. case WM_ERASEBACKGROUND: return (MPARAM) 0; // Выполняем действия при нажатии на кнопку закрытия окна. case WM_CLOSE: { // Убираем окно приложения из списка окон. WinRemoveSwitchEntry( WinQuerySwitchHandle( Installer.Frame_window, 0 ) ); // Передаем сообщение обработчику. WinDefWindowProc( Window, Message, First_parameter, Second_parameter ); } return 0; } // Возврат. return WinDefWindowProc( Window, Message, First_parameter, Second_parameter ); }