/* pmbitchx.c Written by: Brian Smith (NuKe) and rosmo for BitchX */ #include /* These headers from the Warp 4 toolkit */ #include #include #include #include /* We now require dynamic windows */ #include #include "window.h" #include "gui.h" #include "server.h" #include "hook.h" #include "list.h" #include "commands.h" #include "hash2.h" #include "status.h" /* Window data, located at QWP_USER */ typedef struct { HVPS hvps; Screen *screen; } MYWINDATA, *PMYWINDATA; int VIO_staticx=200; int VIO_staticy=100; int VIO_font_width=6; int VIO_font_height=10; int cxvs, cxsb, cysb, cytb; /* These are for $lastclickline() function */ char *lastclicklinedata = NULL; int lastclickcol, lastclickrow; /* These are for the context menu */ HWND contextmenu; int contextx, contexty; HAB mainhab = 0; HMQ mainhmq = 0; HAB hab = 0; /* handle to the anchor block */ HMQ hmq = 0; /* handle to the message queue */ HWND hwndClient = 0; /* handle to the client */ HWND hwndFrame = 0; /* handle to the frame window */ HWND hwndMenu = 0; /* handle to the menu */ HWND hwndLeft = 0, hwndRight = 0; /* For nicklist */ HWND hwndscroll = 0, hwndnickscroll = 0; /* scrollerbars */ HWND MDIClient = 0, MDIFrame = 0; /* MDI handles */ QMSG qmsg = { 0 }; /* message-queue structure */ HDC hdc = 0; /* handle to the device context */ HVPS hvps = 0, mainHvps = 0, /* handle to the AVIO presentation space */ hvpsnick = 0; static HEV sem = 0; VIOMODEINFO viomode; FILE *debug; static unsigned char output_buf[256]; int output_tail = 0; LONG menuY; clock_t flush_counter; int pmthread = -1; HMTX mutex = 0; ULONG cx, cy; int just_resized = 0, dont_resize = 0, no_resize; Screen *focus_screen, *just_resized_screen; extern MenuStruct *morigin; /* Used by window_menu_stub() */ ULONG menuroot=4000; ULONG tmpmenuid=3000; Screen *cursor_screen = NULL; /* Used by popupmsg */ extern char *msgtext; /* Used by the scrollers */ int newscrollerpos=0, lastscrollerpos=0, lastscrollerwindow=-1, lastpos=0; /* Used by file dialog to make it non blocking */ char *codeptr, *paramptr; /* Used by properties notebook */ static HWND hwndPage1; static HWND hwndPage2; static HWND hwndPage3; static HWND hwndPage4; static HWND hwndPage5; int p1e, p2e, p3e, p4e, inproperties=0; ChannelList *chan = NULL; Window *nb_window=NULL; FONTMETRICS fm; int in_fontdialog=0; IrcVariable *return_irc_var(int nummer); IrcVariable *return_fset_var(int nummer); CSetArray *return_cset_var(int nummer); WSetArray *return_wset_var(int nummer); int fontstart=0; HMODULE hmod; ULONG EXPENTRY (*DLL_mciPlayFile)(HWND, PSZ, ULONG, PSZ, HWND) = NULL; ULONG EXPENTRY (*DLL_mciGetErrorString)(ULONG, PSZ, USHORT) = NULL; ULONG EXPENTRY (*DLL_mciSendString)(PSZ, PSZ,USHORT, HWND, USHORT) = NULL; #include "input.h" #define WIDTH 10 /* needed for rclick */ #include "keys.h" unsigned long menucmd; int guiipc[2]; int new_menuref(MenuRef **root, int refnum, HWND menuhandle, int menuid) { MenuRef *new = new_malloc(sizeof(MenuRef)); if(new) { new->refnum = refnum; new->menuhandle = menuhandle; new->menuid = menuid; new->next = NULL; if (!*root) *root = new; else { MenuRef *prev = NULL, *tmp = *root; while(tmp) { prev = tmp; tmp = tmp->next; } if(prev) prev->next = new; else *root = new; } return TRUE; } else return FALSE; } int remove_menuref(MenuRef **root, int refnum) { MenuRef *prev = NULL, *tmp = *root; while(tmp) { if(tmp->refnum == refnum) { if(!prev) { new_free(&tmp); *root = NULL; return 0; } else { prev->next = tmp->next; new_free(&tmp); return 0; } } tmp = tmp->next; } return 0; } MenuRef *find_menuref(MenuRef *root, int refnum) { MenuRef *tmp = root; while(tmp) { if(tmp->refnum == refnum) return tmp; tmp = tmp->next; } return NULL; } void gui_settitle(char *titletext, Screen *os2win) { WinSetWindowText(os2win->hwndFrame, titletext); } void aflush() { HMTX h = mutex; /* flush */ if (output_tail > 0) { DosOpenMutexSem(NULL, &h); DosRequestMutexSem(h, SEM_INDEFINITE_WAIT); VioWrtTTY((PCH)output_buf, output_tail, (output_screen ? output_screen->hvps : hvps)); output_tail = 0; DosReleaseMutexSem(h); DosCloseMutexSem(h); } } void sendevent(unsigned int event, unsigned int window) { unsigned int evbuf[2]; if(guiipc[1]) { evbuf[0] = event; evbuf[1] = window; write(guiipc[1], (void *)evbuf, sizeof(unsigned int)*2); } return; } void flush_thread(void *param) { clock_t foo; while (1 & 1) { foo = clock(); if ((foo - flush_counter) > 10) { if (output_tail > 0) { aflush(); } } DosSleep(100L); } } void cursor_off(HVPS this_hvps) { VIOCURSORINFO bleah; VioGetCurType(&bleah, this_hvps); bleah.attr = -1; VioSetCurType(&bleah, this_hvps); } void cursor_thread(void) { VIOCURSORINFO bleah; HVPS hvps;; while(1 & 1) { DosSleep(500L); if(cursor_screen && (hvps = cursor_screen->hvps)) { VioGetCurType(&bleah, hvps); bleah.attr = 0; VioSetCurType(&bleah, hvps); } DosSleep(500L); if(cursor_screen && (hvps = cursor_screen->hvps)) { VioGetCurType(&bleah, hvps); bleah.attr = -1; VioSetCurType(&bleah, hvps); } } } void aputc(int c) { HMTX h; DosOpenMutexSem(NULL, &h); DosRequestMutexSem(h, SEM_INDEFINITE_WAIT); /* buffer */ if (output_tail < 256) { output_buf[output_tail] = (unsigned char) c; output_tail++; flush_counter = clock(); } /* flush */ if (output_tail == 256 || c == '\n' || c == '\r') { VioWrtTTY((PCH)output_buf, output_tail, (output_screen ? output_screen->hvps : hvps)); output_tail = 0; } DosReleaseMutexSem(h); DosCloseMutexSem(h); } int gui_read(Screen *screen, char *buffer, int maxbufsize) { int i; if (strlen(screen->aviokbdbuffer)> maxbufsize) { for(i=0;i<=strlen(screen->aviokbdbuffer);i++) { if (iaviokbdbuffer[i]; } else if(i==maxbufsize) { buffer[i]=0; screen->aviokbdbuffer[0]=screen->aviokbdbuffer[i]; } else { screen->aviokbdbuffer[i-maxbufsize]=screen->aviokbdbuffer[i]; } } } else { strcpy(buffer,screen->aviokbdbuffer); screen->aviokbdbuffer[0]='\0'; } return strlen(buffer); } void aprintf(char *format, ...) { va_list args; char putbuf[AVIO_BUFFER+1], bluf[AVIO_BUFFER]; USHORT i, o; va_start(args, format); vsprintf(putbuf, format, args); va_end(args); i = o = 0; while (putbuf[i] != '\n' && putbuf[i] != 0) { i++; if (putbuf[i] == '\n' || putbuf[i] == 0) { strcpy(bluf, ""); strncat(bluf, &putbuf[o], i - o); if (putbuf[i] != 0) strcat(bluf, "\r\n"); VioWrtTTY((PCH)bluf, strlen(bluf), (output_screen ? output_screen->hvps : hvps)); i++; o = i; } } } MRESULT EXPENTRY FontDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { ULONG Remfonts = 0, Fonts = 0, i, i2; static PFONTMETRICS fonts; char buf[256]; ULONG maxX, maxY, len; SWP menupos; unsigned char *scr; char fontsize[10]; static Screen *changescreen, *savedscreen = NULL; switch (msg) { case WM_DESTROY: free(fonts); break; case WM_INITDLG: savedscreen = current_window ? current_window->screen : main_screen; VioQueryFonts(&Remfonts, NULL, 0, &Fonts, "System VIO", VQF_PUBLIC, hvps); fonts = malloc(sizeof(FONTMETRICS) * Remfonts); Fonts = Remfonts; VioQueryFonts(&Remfonts, fonts, sizeof(FONTMETRICS), &Fonts, "System VIO", VQF_PUBLIC, hvps); for (i = 0; i < Fonts; i++) { if(fonts[i].lAveCharWidth != 5) { sprintf(buf, "%s %ux%u", fonts[i].szFacename, (unsigned int)fonts[i].lMaxBaselineExt, (unsigned int)fonts[i].lAveCharWidth); WinSendMsg(WinWindowFromID(hwnd, 101), LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP(buf)); } else fontstart=i; } fontstart++; break; case WM_COMMAND: switch (COMMANDMSG(&msg)->cmd) { case DID_CANCEL: WinDismissDlg(hwnd, 0); break; case DID_OK: i = (ULONG)WinSendMsg(WinWindowFromID(hwnd, LB_FONTLIST), LM_QUERYSELECTION, MPFROMSHORT(LIT_CURSOR), 0); if(i == LIT_NONE) { WinDismissDlg(hwnd, 0); return (MRESULT)0; } i+=fontstart; i2 = (ULONG)WinSendMsg(WinWindowFromID(hwnd, CB_DEFAULT), BM_QUERYCHECK, 0, 0); if(i2) { sprintf(fontsize, "%dx%d", (int)fonts[i].lAveCharWidth, (int)fonts[i].lMaxBaselineExt); set_string_var(DEFAULT_FONT_VAR, fontsize); } i2 = (ULONG)WinSendMsg(WinWindowFromID(hwnd, CB_CHANGEFORALL), BM_QUERYCHECK, 0, 0); if(i2) changescreen = screen_list; else changescreen = savedscreen; while(changescreen) { if(changescreen->alive) { len = (changescreen->co + 1) * changescreen->li * 2; scr = malloc(len); VioReadCellStr(scr, (PUSHORT)&len, 0, 0, changescreen->hvps); changescreen->VIO_font_width = fonts[i].lAveCharWidth; changescreen->VIO_font_height = fonts[i].lMaxBaselineExt; co = changescreen->co; li = changescreen->li; cx = (co - 1) * changescreen->VIO_font_width; cy = li * changescreen->VIO_font_height; maxX = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN); maxY = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN); /* No point in making bigger windows than the screen */ if (cx > maxX) changescreen->co = (maxX / changescreen->VIO_font_width) -1; if (cy > maxY) changescreen->li = (maxY / changescreen->VIO_font_height) -1; /* Recalculate in case we modified the values */ cx = (co - 1) * changescreen->VIO_font_width; cy = li * changescreen->VIO_font_height; if(changescreen->nicklist) cx += (changescreen->VIO_font_width * changescreen->nicklist) + cxvs; if(changescreen->hwndMenu==(HWND)NULL) WinSetWindowPos(changescreen->hwndFrame, HWND_TOP, 0, 0, cx + (cxsb*2) + cxvs, cy + (cysb*2)+cytb, SWP_SIZE); else { WinQueryWindowPos(changescreen->hwndMenu, &menupos); WinSetWindowPos(changescreen->hwndFrame, HWND_TOP, 0, 0, cx + (cxsb*2) + cxvs, cy + (cxsb*2)+cytb + menupos.cy, SWP_SIZE); } VioSetDeviceCellSize(changescreen->VIO_font_height, changescreen->VIO_font_width, changescreen->hvps); VioSetDeviceCellSize(changescreen->VIO_font_height, changescreen->VIO_font_width, changescreen->hvpsnick); VioWrtCellStr(scr, len, 0, 0, changescreen->hvps); free(scr); } if(i2) changescreen = changescreen->next; else changescreen = NULL; } WinDismissDlg(hwnd, 0); break; default: break; } return((MRESULT)0); break; } return (WinDefDlgProc(hwnd, msg, mp1, mp2)); } void font_dialog_stub(Screen *screen) { HAB hnbab; HMQ hnbmq; hnbab = WinInitialize(0); hnbmq = WinCreateMsgQueue(hnbab, 0); WinDlgBox(HWND_DESKTOP, screen->hwndFrame, FontDlgProc, NULLHANDLE, FONTDIALOG, NULL); in_fontdialog=0; WinDestroyMsgQueue(hnbmq); WinTerminate(hnbab); } void gui_font_dialog(Screen *screen) { if(in_fontdialog) return; in_fontdialog=1; _beginthread((void *)font_dialog_stub, NULL, 0xFFFF, (void *)screen); } void set_right_window(HWND hwnd) { Screen *this_screen = NULL; static Screen *last_screen = NULL; this_screen = (Screen *)WinQueryWindowPtr(WinQueryWindow(hwnd, QW_PARENT), 0); if (!this_screen) this_screen = (Screen *)WinQueryWindowPtr(hwnd, 0); if (!this_screen) this_screen = output_screen; if (this_screen != last_screen) make_window_current(this_screen->current_window); last_screen = this_screen; } int mesg(char *format, ...) { va_list args; char outbuf[256]; va_start(args, format); vsprintf(outbuf, format, args); va_end(args); WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, outbuf, "PMBitchX", 0, MB_OK | MB_INFORMATION | MB_MOVEABLE); return strlen(outbuf); } /* Routines dealing with menus */ HWND newsubmenu(MenuStruct *menutoadd, HWND location, int pulldown) { HWND tmphandle; MenuList *tmp; MENUITEM miSubMenu; HWND hwndSubmenu; ULONG itemmask, flag = 0L, id = 0L; if(menutoadd->sharedhandle && WinIsWindow(hab, menutoadd->sharedhandle)) return menutoadd->sharedhandle; if(pulldown) { flag = MS_ACTIONBAR; id = FID_MENU; } tmphandle=WinCreateWindow(location, WC_MENU, NULL, flag, 0,0,0,0, location, HWND_TOP, id, NULL, NULL); /* Go through all menuitems adding items and submenus (and subitems) as neccessary */ tmp = menutoadd->menuorigin; while(tmp!=NULL) { itemmask=0; hwndSubmenu=(HWND)NULLHANDLE; if(tmp->menutype & GUISUBMENU) { if(tmp->menutype & GUISHARED) { MenuStruct *tmpmenu = findmenu(tmp->submenu); if(!tmpmenu->sharedhandle || !WinIsWindow(hab, tmpmenu->sharedhandle)) { hwndSubmenu=tmpmenu->sharedhandle=(HWND)newsubmenu(tmpmenu, HWND_OBJECT, FALSE); /* By mikh's recommendation :) */ WinSetWindowULong(hwndSubmenu, QWL_STYLE, WinQueryWindowULong(hwndSubmenu, QWL_STYLE) & ~MS_ACTIONBAR); } else hwndSubmenu=(HWND)tmpmenu->sharedhandle; } else hwndSubmenu=(HWND)newsubmenu((MenuStruct *)findmenu(tmp->submenu), tmphandle, FALSE); } miSubMenu.iPosition=MIT_END; miSubMenu.afStyle=MIS_TEXT; if(tmp->menutype & GUISEPARATOR) miSubMenu.afStyle = MIS_SEPARATOR; if(tmp->menutype & GUIBRKMENUITEM) miSubMenu.afStyle |= MIS_BREAKSEPARATOR; if(tmp->menutype & GUIBRKSUBMENU) miSubMenu.afStyle |= MIS_BREAKSEPARATOR; if(tmp->menutype & GUIIAMENUITEM) itemmask |= MIA_DISABLED; if(tmp->menutype & GUICHECKEDMENUITEM) itemmask |= MIA_CHECKED; if(tmp->menutype & GUINDMENUITEM) itemmask |= MIA_NODISMISS; miSubMenu.afAttribute=0; miSubMenu.id=tmp->menuid; miSubMenu.hwndSubMenu=hwndSubmenu; miSubMenu.hItem=NULLHANDLE; WinSendMsg((HWND)tmphandle, MM_INSERTITEM, MPFROMP(&miSubMenu), MPFROMP(tmp->name)); if(tmp->refnum > 0) new_menuref(&menutoadd->root, tmp->refnum, tmphandle, tmp->menuid); /* Set other options */ if(itemmask != 0) WinSendMsg((HWND)tmphandle, MM_SETITEMATTR, MPFROM2SHORT(tmp->menuid, TRUE), MPFROM2SHORT(itemmask, itemmask)); if(tmp->menutype & GUIDEFMENUITEM) { WinSetWindowBits((HWND)tmphandle, QWL_STYLE, MS_CONDITIONALCASCADE,MS_CONDITIONALCASCADE ); /* Set cascade menu default */ WinSendMsg((HWND)tmphandle, MM_SETDEFAULTITEMID, MPFROMSHORT(tmp->menuid), NULL ); } tmp=tmp->next; } return tmphandle; } /* This is so I can create a menu easily from elsewhere in the code */ HWND menucreatestub(char *addthismenu, HWND location, int pulldown) { MenuStruct *menutoadd; if((menutoadd = (MenuStruct *)findmenu(addthismenu))==NULL) { say("Menu not found."); return 0; } if(!menutoadd->menuorigin) { say("Cannot create blank menu."); return 0; } if(menutoadd->sharedhandle && WinIsWindow(hab, menutoadd->sharedhandle)) return menutoadd->sharedhandle; else return newsubmenu(menutoadd, location, pulldown); } void detach_shared(Screen *this_screen) { int itemid = (int)WinSendMsg(this_screen->hwndMenu, MM_ITEMIDFROMPOSITION, (MPARAM)0, (MPARAM)NULL); /* Set any owners of shared menus to HWND_OBJECT so the won't get destroyed - thanks mikh */ if(this_screen->menu && WinIsWindow(hab, this_screen->hwndMenu)) { MenuStruct *tmpmenu = findmenu(this_screen->menu); if(tmpmenu) { MenuList *current = tmpmenu->menuorigin; if(tmpmenu->sharedhandle && WinIsWindow(hab, tmpmenu->sharedhandle)) WinSetOwner(tmpmenu->sharedhandle, HWND_OBJECT); else { while(current) { MenuStruct *submenu; if((current->menutype & GUISHARED) && (submenu = findmenu(current->submenu))) { if(submenu->sharedhandle && WinIsWindow(hab, submenu->sharedhandle)) WinSetOwner(submenu->sharedhandle, HWND_OBJECT); } current = current->next; } } } } while(itemid != -1) { /* This may cause memory leaks... unless they are all shared (menu.bx is) */ WinSendMsg(this_screen->hwndMenu, MM_REMOVEITEM, MPFROM2SHORT(itemid, FALSE), NULL); itemid = (int)WinSendMsg(this_screen->hwndMenu, MM_ITEMIDFROMPOSITION, (MPARAM)0, (MPARAM)NULL); } } void window_menu_stub(Screen *menuscreen, char *addthismenu) { int menustate=0, newmenustate=0; tmpmenuid=3000; if(!menuscreen) return; if(menuscreen->hwndMenu && WinIsWindow(hab, menuscreen->hwndMenu)) { menustate=1; detach_shared(menuscreen); WinDestroyWindow(menuscreen->hwndMenu); menuscreen->hwndMenu = NULLHANDLE; new_free(&menuscreen->menu); } /* Create toplevel menu */ aflush(); if(addthismenu && strcmp(addthismenu, "-delete")!=0) { if((menuscreen->hwndMenu=(HWND)menucreatestub(addthismenu, menuscreen->hwndFrame, TRUE))!=(HWND)NULL) newmenustate=1; } else menuscreen->hwndMenu=(HWND)NULL; if(newmenustate==1) menuscreen->menu=m_strdup(addthismenu); else menuscreen->menu=NULL; /* Tell the Window to resize because of menu */ WinSendMsg(menuscreen->hwndFrame, WM_UPDATEFRAME, 0, 0); if(menustate != newmenustate) WinSendMsg(menuscreen->hwndFrame, WM_USER, 0, 0); new_free(&addthismenu); } void pm_seticon(Screen *screen) { static HPOINTER icon = 0; if(!screen) return; /* For some reason the icon gets unset when spawning */ if(!icon) icon = WinLoadPointer(HWND_DESKTOP,NULLHANDLE,IDM_MAINMENU); WinSendMsg(screen->hwndFrame, WM_SETICON, (MPARAM)icon, 0); } void pm_mdi_on(void) { Screen *tmp = screen_list; HSWITCH hswitch; SWCNTRL swcntrl; SWP swpw, swpf; PID pid; ULONG width, height, x, y; WinSetParent(MDIFrame, HWND_DESKTOP, TRUE); WinQueryWindowProcess(MDIFrame, &pid, NULL); /* initialize switch structure */ swcntrl.hwnd = MDIFrame; swcntrl.hwndIcon = NULLHANDLE; swcntrl.hprog = NULLHANDLE; swcntrl.idProcess = pid; swcntrl.idSession = 0; swcntrl.uchVisibility = SWL_VISIBLE; swcntrl.fbJump = SWL_JUMPABLE; strcpy(swcntrl.szSwtitle,irc_version); hswitch = WinCreateSwitchEntry(mainhab, &swcntrl); width = (ULONG)((((float)WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN)))*0.75); height = (ULONG)((((float)WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN)))*0.75); x = (ULONG)((WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN)-width)/2); y = (ULONG)((WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN)-height)/2); WinSetWindowPos(MDIFrame, 0, x, y, width, height, SWP_MOVE | SWP_SIZE | SWP_SHOW); WinShowWindow(MDIFrame, TRUE); WinQueryWindowPos(MDIClient, &swpf); WinSetWindowULong(MDIFrame, QWP_USER, swpf.cy); while(tmp) { if(tmp->alive) { WinQueryWindowPos(tmp->hwndFrame, &swpw); hswitch = WinQuerySwitchHandle(tmp->hwndFrame, 0); if(hswitch) { WinQuerySwitchEntry(hswitch, &swcntrl); swcntrl.uchVisibility = SWL_INVISIBLE; WinChangeSwitchEntry(hswitch, &swcntrl); } WinSetParent(tmp->hwndFrame, MDIClient, TRUE); WinSetWindowPos(tmp->hwndFrame, NULLHANDLE, swpw.x, swpw.y - (WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN) - swpf.cy), 0, 0, SWP_MOVE); } tmp = tmp->next; } } void pm_mdi_off(void) { Screen *tmp = screen_list; HSWITCH hswitch; SWCNTRL swcntrl; SWP swpw, swpf; WinQueryWindowPos(MDIClient, &swpf); hswitch = WinQuerySwitchHandle(MDIFrame, 0); if(hswitch) WinRemoveSwitchEntry(hswitch); while(tmp) { if(tmp->alive) { WinQueryWindowPos(tmp->hwndFrame, &swpw); WinSetParent(tmp->hwndFrame, HWND_DESKTOP, TRUE); WinSetWindowPos(tmp->hwndFrame, NULLHANDLE, swpw.x, swpw.y + (WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN) - swpf.cy), 0, 0, SWP_MOVE); hswitch = WinQuerySwitchHandle(tmp->hwndFrame, 0); if(hswitch) { WinQuerySwitchEntry(hswitch, &swcntrl); swcntrl.uchVisibility = SWL_VISIBLE; WinChangeSwitchEntry(hswitch, &swcntrl); } } tmp = tmp->next; } WinShowWindow(MDIFrame, FALSE); WinSetParent(MDIFrame, HWND_OBJECT, TRUE); } int test_callback(HWND window, void *data) { dw_window_destroy((HWND)data); return -1; } void pm_aboutbox(char *about_text) { HWND mainwindow, text, stext, logo, okbutton, buttonbox, lbbox; ULONG flStyle = FCF_SYSMENU | FCF_TITLEBAR | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_DLGBORDER | FCF_SIZEBORDER | FCF_MINMAX; mainwindow = dw_window_new(HWND_DESKTOP, "About PMBitchX", flStyle); dw_window_set_icon(mainwindow, IDM_MAINMENU); lbbox = dw_box_new(BOXVERT, 10); dw_box_pack_start(mainwindow, lbbox, 0, 0, TRUE, TRUE, 0); stext = dw_text_new("PMBitchX (c) 2002 Colten Edwards, Brian Smith", 0); dw_window_set_style(stext, DT_VCENTER, DT_VCENTER); dw_window_set_style(stext, DT_CENTER, DT_CENTER); dw_box_pack_start(lbbox, stext, 130, 20, TRUE, FALSE, 10); buttonbox = dw_box_new(BOXHORZ, 0); dw_box_pack_start(lbbox, buttonbox, 0, 0, TRUE, FALSE, 0); dw_window_set_color(buttonbox, CLR_PALEGRAY, CLR_PALEGRAY); logo = dw_bitmap_new(0); dw_window_set_bitmap(logo, IDM_LOGO); dw_box_pack_start(buttonbox, 0, 52, 52, TRUE, FALSE, 5); dw_box_pack_start(buttonbox, logo, 52, 52, FALSE, FALSE, 5); dw_box_pack_start(buttonbox, 0, 52, 52, TRUE, FALSE, 5); text = dw_text_new(about_text, 0); dw_window_set_style(text, DT_CENTER, DT_CENTER); dw_window_set_style(text, DT_WORDBREAK, DT_WORDBREAK); dw_box_pack_start(lbbox, text, 130, 120, TRUE, TRUE, 10); buttonbox = dw_box_new(BOXHORZ, 0); dw_box_pack_start(lbbox, buttonbox, 0, 0, TRUE, FALSE, 0); okbutton = dw_button_new("Ok", 1001L); dw_box_pack_start(buttonbox, 0, 50, 30, TRUE, FALSE, 5); dw_box_pack_start(buttonbox, okbutton, 50, 30, FALSE, FALSE, 5); dw_box_pack_start(buttonbox, 0, 50, 30, TRUE, FALSE, 5); dw_window_set_usize(mainwindow, 435, 340); dw_window_show(mainwindow); dw_signal_connect(okbutton, "clicked", DW_SIGNAL_FUNC(test_callback), (void *)mainwindow); dw_signal_connect(mainwindow, "delete_event", DW_SIGNAL_FUNC(test_callback), (void *)mainwindow); } void pm_resize(Screen *this_screen) { if(this_screen->co < 20) this_screen->old_co=this_screen->co=20; if(this_screen->li < 10) this_screen->old_li=this_screen->li=10; if(this_screen->co > 199) this_screen->old_co=this_screen->co=199; if(this_screen->li > 99) this_screen->old_li=this_screen->li=99; cx = this_screen->co * this_screen->VIO_font_width; cy = this_screen->li * this_screen->VIO_font_height; co = this_screen->co; li = this_screen->li; /* Recalculate some stuff that was done in input.c previously */ this_screen->input_line = this_screen->li-1; this_screen->input_zone_len = this_screen->co - (WIDTH * 2); if (this_screen->input_zone_len < 10) this_screen->input_zone_len = 10; /* Take that! */ this_screen->input_start_zone = WIDTH; this_screen->input_end_zone = this_screen->co - WIDTH; } void drawnicklist(Screen *this_screen) { NickList *n, *list = NULL; ChannelList *cptr; char minibuffer[NICKNAME_LEN+1], spaces[100]; int nickcount=0, k; if(!this_screen) return; memset(spaces, ' ', 100); if(this_screen->current_window && this_screen->current_window->current_channel) { cptr = lookup_channel(this_screen->current_window->current_channel, this_screen->current_window->server, 0); list = sorted_nicklist(cptr, get_int_var(NICKLIST_SORT_VAR)); if(this_screen->spos<0) this_screen->spos=0; for(n = list; n; n = n->next) { if(nickcount >= this_screen->spos && nickcount < this_screen->spos + this_screen->li) { minibuffer[0]=' '; minibuffer[1]='\0'; if(nick_isvoice(n)) strcpy(minibuffer, "+"); if(nick_isop(n)) strcpy(minibuffer, "@"); if(nick_isircop(n)) { if(minibuffer[0] == ' ') strcpy(minibuffer, "*"); else strcat(minibuffer, "*"); } strcat(minibuffer, n->nick); for(k=strlen(minibuffer);k<(this_screen->nicklist+1);k++) minibuffer[k]=' '; minibuffer[k]='\0'; VioSetCurPos(nickcount-this_screen->spos, 0, this_screen->hvpsnick); if(this_screen->mpos == nickcount) VioWrtTTY("\e[0;1;37;44m", 12, this_screen->hvpsnick); VioWrtTTY(minibuffer, strlen(minibuffer), this_screen->hvpsnick); VioWrtTTY("\e[0m", 4, this_screen->hvpsnick); } nickcount++; } } if(nickcount < this_screen->li) { for(k=nickcount;kli;k++) { VioSetCurPos(k, 0, this_screen->hvpsnick); VioWrtTTY(spaces, NICKNAME_LEN, this_screen->hvpsnick); } } else if (this_screen->spos > nickcount-this_screen->li) { this_screen->spos=nickcount-this_screen->li; drawnicklist(this_screen); } WinSendMsg(this_screen->hwndnickscroll, SBM_SETSCROLLBAR, (MPARAM)this_screen->spos, MPFROM2SHORT(0, nickcount - this_screen->li)); WinSendMsg(this_screen->hwndnickscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(this_screen->li, nickcount), (MPARAM)NULL); if(list) clear_sorted_nicklist(&list); } void pm_focus(char key) { int count = 1, page = (int)(key - '0'); Screen *tmp = screen_list; if(key == '0') page = 10; while(tmp) { if(count == page) WinSetFocus(HWND_DESKTOP, tmp->hwndClient); count++; tmp = tmp->next; } } MRESULT EXPENTRY FrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { PMYWINDATA wd; HPS hps; Screen *this_screen = NULL; wd = (PMYWINDATA)WinQueryWindowPtr(hwnd, QWP_USER); if(wd) this_screen = wd->screen; switch (msg) { case WM_BUTTON1MOTIONSTART: case WM_BUTTON2MOTIONSTART: case WM_BUTTON1UP: case WM_BUTTON2UP: case WM_BUTTON1DOWN: case WM_BUTTON2DOWN: case WM_SETFOCUS: case WM_COMMAND: case WM_CONTEXTMENU: case WM_CHAR: { if(this_screen) return GenericWndProc(this_screen->hwndClient, msg, mp1, mp2); else return NULL; } break; case WM_PAINT: hps = WinBeginPaint(hwnd, hvps, NULL); if (this_screen) { VioShowPS(this_screen->li+1, this_screen->co+1, 0, this_screen->hvps); if(this_screen->nicklist) VioShowPS(this_screen->li+1, this_screen->nicklist + 1, 0, this_screen->hvpsnick); } WinEndPaint(hps); return (WinDefAVioWindowProc(hwnd, msg, (ULONG)mp1, (ULONG)mp2)); } return (MRESULT)WinDefWindowProc(hwnd, msg, mp1, mp2); } MRESULT EXPENTRY GenericWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) { HPS hps; int tmp, statusstart; SHORT x, y, i; SWP swp, menupos; static HVPS hvps; Screen *this_screen = NULL; PMYWINDATA wd; static int sx, sy, tx, ty; static unsigned char *mark = NULL; ULONG len; POINTL ptl; static PVOID shared; TRACKINFO ti; APIRET rc; char *selectionbuffer; VIOCURSORINFO bleah; wd = (PMYWINDATA)WinQueryWindowPtr(hwnd, QWP_USER); if (!wd) wd = (PMYWINDATA)WinQueryWindowPtr(WinWindowFromID(hwnd, FID_CLIENT), QWP_USER); if (wd) { hvps = wd->hvps; this_screen = wd->screen; if (!this_screen) { wd->screen = main_screen; this_screen = wd->screen; } } switch (msg) { /* rosmo's awesome copy functions */ case WM_BUTTON1MOTIONSTART: if(this_screen) { WinQueryPointerPos(HWND_DESKTOP, &ptl); WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1); WinQueryWindowPos(hwnd, &swp); ti.rclTrack.xLeft = ti.rclTrack.xRight = (int)(((int)(ptl.x/this_screen->VIO_font_width))*this_screen->VIO_font_width)+1; ti.rclTrack.yBottom = ti.rclTrack.yTop = (int)(((int)(ptl.y/this_screen->VIO_font_height)+1)*this_screen->VIO_font_height)+1; ti.rclTrack.xLeft--; ti.rclTrack.yBottom--; WinQueryWindowRect(this_screen->hwndLeft, &ti.rclBoundary); ti.cxBorder = ti.cyBorder = 1; ti.cxGrid = this_screen->VIO_font_width; ti.cyGrid = this_screen->VIO_font_height; ti.cxKeyboard = 0; ti.cyKeyboard = 0; ti.ptlMinTrackSize.x = 0; ti.ptlMinTrackSize.y = 0; ti.ptlMaxTrackSize.x = swp.cx + this_screen->VIO_font_width; ti.ptlMaxTrackSize.y = swp.cy + this_screen->VIO_font_height; ti.fs = TF_BOTTOM | TF_RIGHT; /* Allocate a buffer to store the entire screen so it won't change during selection - NuKe */ selectionbuffer = new_malloc((this_screen->li * this_screen->co) + 1); for(i=0;ili;i++) VioReadCharStr(&selectionbuffer[i*this_screen->co], (PUSHORT)&this_screen->co, i, 0, hvps); if (WinTrackRect(hwnd, NULLHANDLE, &ti)) { sx = (int)(ti.rclTrack.xLeft/this_screen->VIO_font_width); ty = this_screen->li - (int)(ti.rclTrack.yBottom/this_screen->VIO_font_height); tx = (int)(ti.rclTrack.xRight/this_screen->VIO_font_width); sy = this_screen->li - (int)(ti.rclTrack.yTop/this_screen->VIO_font_height); mark = new_malloc((ty - sy) * (tx - sx + 2) + 1); i = 0; for (y = sy; y < ty; y++) { len = tx - sx; memcpy(&mark[i], &selectionbuffer[(y * this_screen->co) + sx], len); i += len - 1; /* get rid of trailing white space */ while(mark[i] == ' ' && i > 0) i--; mark[i + 1] = '\r'; mark[i + 2] = '\n'; i += 2; } mark[i] = '\0'; /* Ok, we got the stuff - now place it in the clipboard */ WinOpenClipbrd(hab); /* Open clipboard */ WinEmptyClipbrd(hab); /* Empty clipboard */ /* Ok, clipboard wants giveable unnamed shared memory */ shared = NULL; rc = DosAllocSharedMem(&shared, NULL, i, OBJ_GIVEABLE | PAG_COMMIT | PAG_READ | PAG_WRITE); if (rc == 0) { memcpy(shared, mark, i); WinSetClipbrdData(hab, (ULONG)shared, CF_TEXT, CFI_POINTER); } WinCloseClipbrd(hab); /* Close clipboard */ new_free(&selectionbuffer); new_free(&mark); } } break; case WM_SETFOCUS: if (SHORT1FROMMP(mp2)==TRUE) { /* If we have a shared menu attached to the window make it owned by the * current window so it opens properly */ cursor_screen = this_screen; if(this_screen && this_screen->current_window) { if(this_screen->menu) { MenuStruct *tmpmenu = findmenu(this_screen->menu); if(tmpmenu) { MenuList *current = tmpmenu->menuorigin; if(tmpmenu->sharedhandle && WinIsWindow(hab, tmpmenu->sharedhandle)) WinSetOwner(tmpmenu->sharedhandle, this_screen->hwndClient); else { while(current) { HWND hwndmenu; MenuStruct *submenu; if((current->menutype & GUISHARED) && (submenu = findmenu(current->submenu))) { if(submenu->sharedhandle && WinIsWindow(hab, submenu->sharedhandle) && (hwndmenu = WinWindowFromID(this_screen->hwndFrame, FID_MENU))) WinSetOwner(submenu->sharedhandle, hwndmenu); } current = current->next; } } } } WinSetCp(hmq, this_screen->codepage); WinSetCp(mainhmq, this_screen->codepage); /* Tell the main thread to set this window as current */ sendevent(EVFOCUS, this_screen->current_window->refnum); } } else { cursor_screen = NULL; if(this_screen) { VioGetCurType(&bleah, this_screen->hvps); bleah.attr = -1; VioSetCurType(&bleah, this_screen->hvps); } } break; case WM_COMMAND: menucmd=COMMANDMSG(&msg)->cmd; sendevent(EVMENU, this_screen->current_window->refnum); return((MRESULT)0); break; case WM_CLOSE: #ifdef WINDOW_CREATE kill_screen(this_screen); #else irc_exit(1, NULL, "%s rocks your world!", VERSION); #endif break; case WM_PAINT: hps = WinBeginPaint(hwnd, hvps, NULL); if (this_screen) { VioShowPS(this_screen->li+1, this_screen->co+1, 0, this_screen->hvps); if(this_screen->nicklist) VioShowPS(this_screen->li+1, this_screen->nicklist + 1, 0, this_screen->hvpsnick); } WinEndPaint(hps); return (WinDefAVioWindowProc(hwnd, msg, (ULONG)mp1, (ULONG)mp2)); case WM_CHAR: if((SHORT1FROMMP(mp1) & KC_KEYUP)) break; if(strlen(this_screen->aviokbdbuffer)==254) { DosBeep(1000, 200); } else { if(SHORT1FROMMP(mp2) != 0) { tmp=strlen(this_screen->aviokbdbuffer); if (CHAR1FROMMP(mp2) == 224) { this_screen->aviokbdbuffer[tmp]='\e'; this_screen->aviokbdbuffer[tmp+1]=CHAR2FROMMP(mp2); this_screen->aviokbdbuffer[tmp+2]=0; } else { /* Fake a SIGINT on CTRL-C */ #if 0 if((SHORT1FROMMP(mp1) & KC_CTRL) && SHORT1FROMMP(mp2) == 99) raise(SIGINT); #endif if((SHORT1FROMMP(mp1) & KC_ALT) && SHORT1FROMMP(mp2) >= '0' && SHORT1FROMMP(mp2) <= '9') pm_focus((char)SHORT1FROMMP(mp2)); else if ((SHORT1FROMMP(mp1) & KC_CTRL) && (SHORT1FROMMP(mp2) > 96) && (SHORT1FROMMP(mp2) < 122)) this_screen->aviokbdbuffer[tmp]=SHORT1FROMMP(mp2)-96; else this_screen->aviokbdbuffer[tmp]=SHORT1FROMMP(mp2); this_screen->aviokbdbuffer[tmp+1]=0; } } } /* Force select() to exit */ sendevent(EVNONE, 0); break; case WM_BUTTON1UP: case WM_BUTTON2UP: case WM_BUTTON3UP: case WM_BUTTON1DBLCLK: case WM_BUTTON2DBLCLK: case WM_BUTTON3DBLCLK: { /* Save the server, and restore it when we are done. */ int save_server = from_server; WinQueryPointerPos(HWND_DESKTOP, &ptl); WinMapWindowPoints(HWND_DESKTOP, this_screen->hwndClient, &ptl, 1); contextx=ptl.x;contexty=ptl.y; lastclickrow=this_screen->li - ((int)(ptl.y/this_screen->VIO_font_height)) - 1; lastclickcol=((int)(ptl.x/this_screen->VIO_font_width)); last_input_screen=output_screen=this_screen; make_window_current(this_screen->current_window); from_server = current_window->server; if(this_screen->nicklist && lastclickcol > this_screen->co) { USHORT len = this_screen->nicklist + 1; lastclickcol = 0; if(lastclicklinedata != NULL) { VioReadCharStr((PCH)lastclicklinedata,(PUSHORT)&len,lastclickrow,0,this_screen->hvpsnick); lastclicklinedata[len] = 0; } if(lastclicklinedata[0] == ' ') memmove(lastclicklinedata, &lastclicklinedata[1], strlen(lastclicklinedata)); this_screen->mpos = lastclickrow + this_screen->spos; drawnicklist(this_screen); switch(msg) { case WM_BUTTON1UP: wm_process(NICKLISTLCLICK); break; case WM_BUTTON2UP: wm_process(NICKLISTRCLICK); break; case WM_BUTTON3UP: wm_process(NICKLISTMCLICK); break; case WM_BUTTON1DBLCLK: wm_process(NICKLISTLDBLCLICK); break; case WM_BUTTON2DBLCLK: wm_process(NICKLISTRDBLCLICK); break; case WM_BUTTON3DBLCLK: wm_process(NICKLISTMDBLCLICK); break; } from_server = save_server; return NULL; } if(lastclicklinedata != NULL) VioReadCharStr((PCH)lastclicklinedata,(PUSHORT)&this_screen->co,lastclickrow,0,this_screen->hvps); statusstart=this_screen->li - 2; /* I was hoping there was an easier way but....I gave up */ if(this_screen->window_list_end->status_lines == 0 && this_screen->window_list_end->double_status == 1 && this_screen->window_list_end->status_split == 1) statusstart=statusstart-1; if(this_screen->window_list_end->status_lines == 1 && this_screen->window_list_end->double_status == 0 && this_screen->window_list_end->status_split == 0) statusstart=statusstart-1; if(this_screen->window_list_end->status_lines == 1 && this_screen->window_list_end->double_status == 1 && this_screen->window_list_end->status_split == 1) statusstart=statusstart-1; if(this_screen->window_list_end->status_lines == 1 && this_screen->window_list_end->double_status == 1 && this_screen->window_list_end->status_split == 0) statusstart=statusstart-2; if(lastclickrow <= (current_window->screen->li - 2) && lastclickrow >= statusstart) { switch(msg) { case WM_BUTTON1UP: wm_process(STATUSLCLICK); break; case WM_BUTTON2UP: wm_process(STATUSRCLICK); break; case WM_BUTTON3UP: wm_process(STATUSMCLICK); break; case WM_BUTTON1DBLCLK: wm_process(STATUSLDBLCLICK); break; case WM_BUTTON2DBLCLK: wm_process(STATUSRDBLCLICK); break; case WM_BUTTON3DBLCLK: wm_process(STATUSMDBLCLICK); break; } } else { switch(msg) { case WM_BUTTON1UP: wm_process(LCLICK); break; case WM_BUTTON2UP: wm_process(RCLICK); break; case WM_BUTTON3UP: wm_process(MCLICK); break; case WM_BUTTON1DBLCLK: wm_process(LDBLCLICK); break; case WM_BUTTON2DBLCLK: wm_process(RDBLCLICK); break; case WM_BUTTON3DBLCLK: wm_process(MDBLCLICK); break; } } from_server = save_server; } break; case WM_VSCROLL: if(SHORT1FROMMP(mp1) == 1000) { /* Channel is being scrolled */ switch(SHORT2FROMMP(mp2)) { case SB_LINEUP: sendevent(EVSUP, this_screen->current_window->refnum); break; case SB_LINEDOWN: sendevent(EVSDOWN, this_screen->current_window->refnum); break; case SB_PAGEUP: sendevent(EVSUPPG, this_screen->current_window->refnum); break; case SB_PAGEDOWN: sendevent(EVSDOWNPG, this_screen->current_window->refnum); break; case SB_SLIDERTRACK: newscrollerpos=SHORT1FROMMP(mp2); if(newscrollerpos<0) newscrollerpos=0; if(newscrollerpos>get_int_var(SCROLLBACK_VAR)) newscrollerpos=get_int_var(SCROLLBACK_VAR); sendevent(EVSTRACK, this_screen->current_window->refnum); break; } } else if(SHORT1FROMMP(mp1) == 1001) { /* Nicklist is scrolling */ switch(SHORT2FROMMP(mp2)) { case SB_LINEUP: this_screen->spos--; break; case SB_LINEDOWN: this_screen->spos++; break; case SB_PAGEUP: this_screen->spos -= this_screen->li; break; case SB_PAGEDOWN: this_screen->spos += this_screen->li; break; case SB_SLIDERPOSITION: case SB_SLIDERTRACK: this_screen->spos=SHORT1FROMMP(mp2); break; } drawnicklist(this_screen); } break; case WM_USER: dont_resize=1; if(this_screen->hwndMenu==(HWND)NULL) { WinSetWindowPos(this_screen->hwndFrame, HWND_TOP, 0, 0, (this_screen->VIO_font_width * this_screen->nicklist) + cx + (cxsb*2) + (cxvs+(this_screen->nicklist ? cxvs : 0)), cy + (cysb*2) + cytb + 1, SWP_SIZE); } else { WinQueryWindowPos(this_screen->hwndMenu, &menupos); if(menupos.cy<3) WinSetWindowPos(this_screen->hwndFrame, HWND_TOP, 0, 0, (this_screen->VIO_font_width * this_screen->nicklist) + cx + (cxvs+(this_screen->nicklist ? cxvs : 0)) + (cxsb*2), cy + (cysb*2)+cytb + WinQuerySysValue(HWND_DESKTOP, SV_CYMENU), SWP_SIZE); else WinSetWindowPos(this_screen->hwndFrame, HWND_TOP, 0, 0, (this_screen->VIO_font_width * this_screen->nicklist) + cx + (cxvs+(this_screen->nicklist ? cxvs : 0)) + (cxsb*2), cy + (cysb*2)+cytb + menupos.cy, SWP_SIZE); } drawnicklist(this_screen); sendevent(EVREFRESH, this_screen->current_window->refnum); break; case WM_USER+2: pm_new_window((Screen *)mp1, (Window *)mp2); break; case WM_USER+3: if(mp1) pm_mdi_on(); else pm_mdi_off(); break; case WM_USER+4: gui_kill_window((Screen *)mp1); break; case WM_USER+5: pm_aboutbox((char *)mp1); break; case WM_USER+6: dont_resize=1; window_menu_stub((Screen *)mp1, (char *)mp2); break; case 0x041e: if(just_resized == 1 && this_screen == just_resized_screen) { WinPostMsg(hwnd, WM_USER, 0, 0); just_resized=0; } break; case 0x041f: if(just_resized == 1 && this_screen == just_resized_screen) { WinPostMsg(hwnd, WM_USER, 0, 0); just_resized=0; } break; case WM_MINMAXFRAME: { PSWP pSwp = PVOIDFROMMP(mp1); if(pSwp->fl & SWP_MAXIMIZE) { dont_resize=1; WinPostMsg(hwnd, WM_USER, 0, 0); } } break; case WM_SIZE: if (!this_screen) return((MRESULT)0); x=SHORT1FROMMP(mp2); y=SHORT2FROMMP(mp2); if(x && y) { int nx, ny, ncx, ncy; HDC hdc; this_screen->old_co = this_screen->co=((int)((x-(cxvs+(this_screen->nicklist ? cxvs : 0)))/this_screen->VIO_font_width)) - this_screen->nicklist; this_screen->old_li = this_screen->li=((int)(y/this_screen->VIO_font_height)); nx = 0; ny = 0; ncx = (x-(cxvs+(this_screen->nicklist ? cxvs : 0))) - (this_screen->nicklist * this_screen->VIO_font_width); ncy = y; VioAssociate((HDC)NULL, this_screen->hvps); WinSetWindowPos(this_screen->hwndLeft, NULLHANDLE, nx, ny-((this_screen->VIO_font_height*VIO_staticy)-ncy), ncx, ncy+abs((this_screen->VIO_font_height*VIO_staticy)-ncy), SWP_MOVE | SWP_SIZE); hdc = WinOpenWindowDC(this_screen->hwndLeft); VioAssociate(hdc, this_screen->hvps); nx += ncx; ncx = cxvs; WinSetWindowPos(this_screen->hwndscroll, NULLHANDLE, nx, ny, ncx, ncy, SWP_MOVE | SWP_SIZE); if(this_screen->nicklist) { nx += ncx; ncx = this_screen->nicklist * this_screen->VIO_font_width; VioAssociate((HDC)NULL, this_screen->hvpsnick); WinSetWindowPos(this_screen->hwndRight, NULLHANDLE, nx, ny-((this_screen->VIO_font_height*VIO_staticy)-ncy), ncx, ncy+abs((this_screen->VIO_font_height*VIO_staticy)-ncy), SWP_MOVE | SWP_SIZE); hdc = WinOpenWindowDC(this_screen->hwndRight); VioAssociate(hdc, this_screen->hvpsnick); nx += ncx; ncx = cxvs; WinSetWindowPos(this_screen->hwndnickscroll, NULLHANDLE, nx, ny, ncx, ncy, SWP_MOVE | SWP_SIZE); } pm_resize(this_screen); recalculate_windows(this_screen); make_window_current(this_screen->current_window); if(dont_resize == 1) dont_resize = 0; else { just_resized_screen=this_screen; just_resized=1; } } WinDefAVioWindowProc(hwnd, msg, (ULONG)mp1, (ULONG)mp2); break; } return WinDefWindowProc(hwnd, msg, mp1, mp2); } MRESULT EXPENTRY MDIWndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 ) { switch( msg ) { case WM_PAINT: { HPS hps; RECTL rc; hps = WinBeginPaint( hwnd, 0L, &rc ); WinFillRect(hps, &rc, CLR_DARKGRAY); WinEndPaint( hps ); break; } case WM_SIZE: { Screen *tmp = screen_list; ULONG oldheight = WinQueryWindowULong(MDIFrame, QWP_USER); if(!SHORT1FROMMP(mp2) && !SHORT2FROMMP(mp2)) return NULL; if(oldheight && (oldheight-SHORT2FROMMP(mp2))) { while(tmp) { if(tmp->alive) { SWP swp; WinQueryWindowPos(tmp->hwndFrame, &swp); WinSetWindowPos(tmp->hwndFrame,0, swp.x, swp.y - (oldheight-SHORT2FROMMP(mp2)), 0, 0, SWP_MOVE); } tmp = tmp->next; } } WinSetWindowULong(MDIFrame, QWP_USER, SHORT2FROMMP(mp2)); } break; case WM_CLOSE: irc_exit(1, NULL, "%s exiting", VERSION); break; default: return WinDefWindowProc( hwnd, msg, mp1, mp2 ); } return (MRESULT)FALSE; } void avio_exit(void) { VioAssociate((HDC)NULL, (output_screen ? output_screen->hvps : hvps)); VioDestroyPS((output_screen ? output_screen->hvps : hvps)); WinDestroyWindow(hwndFrame); WinDestroyMsgQueue(hmq); WinTerminate(hab); DosExit(EXIT_PROCESS, 0); } void avio_init() { HEV mySem = sem; PMYWINDATA mywindata; ULONG flStyle = FCF_MINMAX | FCF_SYSMENU | FCF_TITLEBAR | FCF_SIZEBORDER | FCF_SHELLPOSITION | FCF_TASKLIST | FCF_ICON; pmthread = *_threadid; DosOpenEventSem(NULL, (PHEV)&mySem); hab = WinInitialize(0); hmq = WinCreateMsgQueue(hab, 0); cxvs = WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL); cxsb = WinQuerySysValue(HWND_DESKTOP, SV_CXSIZEBORDER); cysb = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER); cytb = WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR); if (!WinRegisterClass(hab, "AVIO", GenericWndProc, CS_SIZEREDRAW, 32)) DosExit(EXIT_PROCESS, 1); WinRegisterClass(hab, "BXMDI", MDIWndProc, CS_SIZEREDRAW | CS_CLIPCHILDREN, 0); MDIFrame = WinCreateStdWindow(HWND_DESKTOP, WS_CLIPCHILDREN, &flStyle, "BXMDI", irc_version, WS_CLIPCHILDREN, NULLHANDLE, IDM_MAINMENU, &MDIClient); hwndFrame = WinCreateStdWindow(HWND_DESKTOP, 0, &flStyle, "AVIO", irc_version, 0L, NULLHANDLE, IDM_MAINMENU, &hwndClient); hwndLeft = WinCreateWindow(hwndClient, WC_FRAME, NULL, WS_VISIBLE, 0,0,2000,1000, hwndClient, HWND_TOP, 0L, NULL, NULL); hwndRight = WinCreateWindow(hwndClient, WC_FRAME, NULL, WS_VISIBLE, 0,0,2000,1000, hwndClient, HWND_TOP, 0L, NULL, NULL); hwndscroll = WinCreateWindow(hwndClient, WC_SCROLLBAR, NULL, WS_VISIBLE | SBS_VERT, 0,0,100,100, hwndClient, HWND_TOP, 1000L, NULL, NULL); hwndnickscroll = WinCreateWindow(hwndClient, WC_SCROLLBAR, NULL, WS_VISIBLE | SBS_VERT, 0,0,100,100, hwndClient, HWND_TOP, 1001L, NULL, NULL); hwndMenu=(HWND)NULL; current_term->TI_cols = co = 81; current_term->TI_lines = li = 25; cx = (co+14) * VIO_font_width; cy = li * VIO_font_height; WinSetParent(MDIFrame, HWND_OBJECT, FALSE); /* Setup main window */ hdc = WinOpenWindowDC(hwndLeft); VioCreatePS(&hvps, VIO_staticy, VIO_staticx, 0, 1, 0); VioAssociate(hdc, hvps); /* Setup nicklist */ hdc = WinOpenWindowDC(hwndRight); VioCreatePS(&hvpsnick, VIO_staticy, VIO_staticx, 0, 1, 0); VioAssociate(hdc, hvpsnick); cursor_off(hvpsnick); VIO_font_width=6;VIO_font_height=10; /* Set font size */ VioSetDeviceCellSize(VIO_font_height, VIO_font_width, hvps); VioSetDeviceCellSize(VIO_font_height, VIO_font_width, hvpsnick); DosPostEventSem(mySem); DosCloseEventSem(mySem); WinSendMsg(hwndscroll, SBM_SETSCROLLBAR, (MPARAM)get_int_var(SCROLLBACK_VAR), MPFROM2SHORT(0, get_int_var(SCROLLBACK_VAR))); DosCreateMutexSem(NULL, &mutex, 0, FALSE); lastclicklinedata = new_malloc(500); mywindata = new_malloc(sizeof(MYWINDATA)); memset(mywindata, '\0', sizeof(MYWINDATA)); mywindata->hvps = hvps; mywindata->screen = NULL; WinSetWindowPtr(hwndClient, QWP_USER, mywindata); WinSetWindowPtr(hwndLeft, QWP_USER, mywindata); WinSetWindowPtr(hwndRight, QWP_USER, mywindata); WinSubclassWindow(hwndLeft, FrameWndProc); WinSubclassWindow(hwndRight, FrameWndProc); WinSendMsg(hwndnickscroll, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, li)); WinSendMsg(hwndnickscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(li, 0), (MPARAM)NULL); setmode(guiipc[0], O_BINARY); setmode(guiipc[1], O_BINARY); while (WinGetMsg(hab, &qmsg, (HWND)NULL, 0, 0)) WinDispatchMsg(hab, &qmsg); } void load_default_font(Screen *font_screen) { char *fontsize, *height, *width; int t, cy, cx; SWP menupos; if((fontsize=get_string_var(DEFAULT_FONT_VAR))!=NULL) { width=new_malloc(10); strcpy(width, fontsize); t=0; while(width[t]!='x' && t<9) t++; height=&width[t+1]; width[t]=0; VIO_font_width=atoi(width); VIO_font_height=atoi(height); new_free(&width); if (VIO_font_width < 6 || VIO_font_height < 8) { VIO_font_width=6;VIO_font_height=10; } } else { VIO_font_width=6;VIO_font_height=10; } font_screen->VIO_font_width=VIO_font_width; font_screen->VIO_font_height=VIO_font_height; if(VIO_font_width != 6 || VIO_font_height != 10) { cx = (font_screen->co - 1) * font_screen->VIO_font_width; cy = font_screen->li * font_screen->VIO_font_height; cx += font_screen->VIO_font_width * font_screen->nicklist; if(font_screen->nicklist) cx += cxvs; VioSetDeviceCellSize(font_screen->VIO_font_height, font_screen->VIO_font_width, font_screen->hvps); /* Set the font size */ VioSetDeviceCellSize(font_screen->VIO_font_height, font_screen->VIO_font_width, font_screen->hvpsnick); if(font_screen->hwndMenu==(HWND)NULL) WinSetWindowPos(font_screen->hwndFrame, HWND_TOP, 0, 0, cx+(cxsb*2)+1, cy+(cysb+cytb), SWP_SIZE); else { WinQueryWindowPos(font_screen->hwndMenu, &menupos); WinSetWindowPos(font_screen->hwndFrame, HWND_TOP, 0, 0, cx+(cxsb*2)+cxvs, cy+(cysb*2)+cytb+menupos.cy, SWP_SIZE); } } } /* Individual Page Procs */ MRESULT EXPENTRY NotebookPage1DlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { char szBuffer[1024]; int i; char *ptr; switch (msg) { /* Perform dialog initialization */ case WM_INITDLG: WinSetDlgItemText(hWnd, EF_ENTRY1, ""); p1e=LIT_NONE; break; /* Process control selections */ case WM_CONTROL: switch(SHORT1FROMMP(mp1)) { case SETS1: if(p1e!=LIT_NONE) { switch(return_irc_var(p1e)->type) { case BOOL_TYPE_VAR: i = (ULONG)WinSendMsg(WinWindowFromID(hWnd, CB_ONOFF1), BM_QUERYCHECK, 0, 0); set_int_var(p1e, i); break; case CHAR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY1, 1024L, szBuffer); set_string_var(p1e, szBuffer); break; case STR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY1, 1024L, szBuffer); set_string_var(p1e, szBuffer); break; case INT_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY1, 1024L, szBuffer); set_int_var(p1e, my_atol((char *)&szBuffer)); break; } } p1e = (ULONG)WinSendMsg(WinWindowFromID(hWnd, SETS1), LM_QUERYSELECTION, MPFROMSHORT(LIT_CURSOR), 0); if(p1e!=LIT_NONE) { switch(return_irc_var(p1e)->type) { case BOOL_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF1), TRUE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY1), FALSE); i = get_int_var(p1e); WinSendMsg(WinWindowFromID(hWnd, CB_ONOFF1),BM_SETCHECK,MPFROMSHORT(i),0); WinSetDlgItemText(hWnd, EF_ENTRY1, ""); break; case INT_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF1), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY1), TRUE); sprintf(szBuffer, "%d", get_int_var(p1e)); WinSetDlgItemText(hWnd, EF_ENTRY1, szBuffer); break; case STR_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF1), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY1), TRUE); ptr=get_string_var(p1e); if(ptr && *ptr) strcpy(szBuffer, ptr); else strcpy(szBuffer, empty_string); WinSetDlgItemText(hWnd, EF_ENTRY1, szBuffer); break; case CHAR_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF1), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY1), TRUE); ptr = get_string_var(p1e); if(ptr && *ptr) strcpy(szBuffer, ptr); else strcpy(szBuffer, empty_string); WinSetDlgItemText(hWnd, EF_ENTRY1, szBuffer); break; } } break; } break; /* Process push button selections */ case WM_COMMAND: switch ( SHORT1FROMMP(mp1) ) { case DID_OK: if(p1e!=LIT_NONE) { switch(return_irc_var(p1e)->type) { case BOOL_TYPE_VAR: i = (ULONG)WinSendMsg(WinWindowFromID(hWnd, CB_ONOFF1),BM_QUERYCHECK,0,0); set_int_var(p1e, i); break; case CHAR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY1, 1024L, szBuffer); set_string_var(p1e, szBuffer); break; case STR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY1, 1024L, szBuffer); set_string_var(p1e, szBuffer); break; case INT_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY1, 1024L, szBuffer); set_int_var(p1e, my_atol((char *)&szBuffer)); break; } } break; } break; /* Close requested, exit dialogue */ case WM_CLOSE: WinDismissDlg(hWnd, FALSE); break; /* Pass through unhandled messages */ default: return(WinDefDlgProc(hWnd, msg, mp1, mp2)); } return(0L); } MRESULT EXPENTRY NotebookPage2DlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { char szBuffer[1024]; int i; char *ptr; switch (msg) { /* Perform dialog initialization */ case WM_INITDLG : WinSetDlgItemText(hWnd, EF_ENTRY2, ""); if(nb_window && nb_window->current_channel) chan = (ChannelList *) find_in_list((List **)get_server_channels(from_server), nb_window->current_channel, 0); else chan = NULL; p2e=LIT_NONE; break; /* Process control selections */ case WM_CONTROL: switch(SHORT1FROMMP(mp1)) { case SETS2: if(p2e!=LIT_NONE && chan) { switch(return_cset_var(p2e)->type) { case BOOL_TYPE_VAR: i = (ULONG)WinSendMsg(WinWindowFromID(hWnd, CB_ONOFF2), BM_QUERYCHECK, 0, 0); set_cset_int_var(chan->csets, p2e, i); break; case CHAR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY2, 1024L, szBuffer); set_cset_str_var(chan->csets, p2e, szBuffer); break; case STR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY2, 1024L, szBuffer); set_cset_str_var(chan->csets, p2e, szBuffer); break; case INT_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY2, 1024L, szBuffer); set_cset_int_var(chan->csets, p2e, my_atol((char *)&szBuffer)); break; } } p2e = (ULONG)WinSendMsg(WinWindowFromID(hWnd, SETS2), LM_QUERYSELECTION, MPFROMSHORT(LIT_CURSOR), 0); if(p2e!=LIT_NONE && chan) { switch(return_cset_var(p2e)->type) { case BOOL_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF2), TRUE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY2), FALSE); i = get_cset_int_var(chan->csets, p2e); WinSendMsg(WinWindowFromID(hWnd, CB_ONOFF2), BM_SETCHECK, MPFROMSHORT(i), 0); WinSetDlgItemText(hWnd, EF_ENTRY2, empty_string); break; case INT_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF2), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY2), TRUE); sprintf(szBuffer, "%d", get_cset_int_var(chan->csets, p2e)); WinSetDlgItemText(hWnd, EF_ENTRY2, szBuffer); break; case STR_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF2), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY2), TRUE); ptr=get_cset_str_var(chan->csets, p2e); if(ptr && *ptr) strcpy(szBuffer, ptr); else strcpy(szBuffer, empty_string); WinSetDlgItemText(hWnd, EF_ENTRY2, szBuffer); break; case CHAR_TYPE_VAR: WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF2), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY2), TRUE); ptr = get_cset_str_var(chan->csets, p2e); if(ptr && *ptr) strcpy(szBuffer, ptr); else strcpy(szBuffer, empty_string); WinSetDlgItemText(hWnd, EF_ENTRY2, szBuffer); break; } } break; } break; /* Process push button selections */ case WM_COMMAND: switch (SHORT1FROMMP(mp1)) { case DID_OK : if(p2e!=LIT_NONE && chan) { switch(return_cset_var(p2e)->type) { case BOOL_TYPE_VAR: i = (ULONG)WinSendMsg(WinWindowFromID(hWnd, CB_ONOFF2), BM_QUERYCHECK, 0, 0); set_cset_int_var(chan->csets, p2e, i); break; case CHAR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY2, 1024L, szBuffer); set_cset_str_var(chan->csets, p2e, szBuffer); break; case STR_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY2, 1024L, szBuffer); set_cset_str_var(chan->csets, p2e, szBuffer); break; case INT_TYPE_VAR: WinQueryDlgItemText(hWnd, EF_ENTRY2, 1024L, szBuffer); set_cset_int_var(chan->csets, p2e, my_atol((char *)&szBuffer)); break; } } break; } break; /* Close requested, exit dialogue */ case WM_CLOSE: WinDismissDlg(hWnd, FALSE); break; /* Pass through unhandled messages */ default: return(WinDefDlgProc(hWnd, msg, mp1, mp2)); } return(0L); } MRESULT EXPENTRY NotebookPage3DlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { char szBuffer[1024]; /* String Buffer */ char *ptr; switch ( msg ) { /* Perform dialog initialization */ case WM_INITDLG : WinSetDlgItemText(hWnd, EF_ENTRY3, empty_string); p3e=LIT_NONE; break; /* Process control selections */ case WM_CONTROL: switch(SHORT1FROMMP(mp1)) { case SETS3: if(p3e!=LIT_NONE) { WinQueryDlgItemText(hWnd, EF_ENTRY3, 1024L, szBuffer); fset_string_var(p3e, szBuffer); } p3e = (ULONG)WinSendMsg(WinWindowFromID(hWnd, SETS3), LM_QUERYSELECTION, MPFROMSHORT(LIT_CURSOR), 0); if(p3e!=LIT_NONE) { WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF3), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY3), TRUE); ptr=fget_string_var(p3e); if(ptr && *ptr) strcpy(szBuffer, ptr); else strcpy(szBuffer, empty_string); WinSetDlgItemText(hWnd, EF_ENTRY3, szBuffer); } break; } break; /* Process push button selections */ case WM_COMMAND: switch ( SHORT1FROMMP(mp1) ) { case DID_OK : if(p3e!=LIT_NONE) { WinQueryDlgItemText(hWnd, EF_ENTRY3, 1024L, szBuffer); fset_string_var(p3e, szBuffer); } break; } break; /* Close requested, exit dialogue */ case WM_CLOSE: WinDismissDlg(hWnd, FALSE); break; /* Pass through unhandled messages */ default: return(WinDefDlgProc(hWnd, msg, mp1, mp2)); } return(0L); } MRESULT EXPENTRY NotebookPage4DlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { char szBuffer[1024]; /* String Buffer */ char *ptr; switch (msg) { /* Perform dialog initialization */ case WM_INITDLG : WinSetDlgItemText(hWnd, EF_ENTRY4, empty_string); p4e=LIT_NONE; break; /* Process control selections */ case WM_CONTROL : switch(SHORT1FROMMP(mp1)) { case SETS4: if(p4e!=LIT_NONE && nb_window) { WinQueryDlgItemText(hWnd, EF_ENTRY4, 1024L, szBuffer); set_wset_string_var(nb_window->wset, p4e, szBuffer); } p4e = (ULONG)WinSendMsg(WinWindowFromID(hWnd, SETS4), LM_QUERYSELECTION, MPFROMSHORT(LIT_CURSOR), 0); if(p4e!=LIT_NONE && nb_window) { WinEnableWindow(WinWindowFromID(hWnd, CB_ONOFF4), FALSE); WinEnableWindow(WinWindowFromID(hWnd, EF_ENTRY4), TRUE); ptr=get_wset_string_var(nb_window->wset, p4e); if(ptr && *ptr) strcpy(szBuffer, ptr); else strcpy(szBuffer, empty_string); WinSetDlgItemText(hWnd, EF_ENTRY4, szBuffer); } break; } break; /* Process push button selections */ case WM_COMMAND : switch ( SHORT1FROMMP(mp1) ) { case DID_OK : if(p4e!=LIT_NONE && nb_window) { WinQueryDlgItemText(hWnd, EF_ENTRY4, 1024L, szBuffer); set_wset_string_var(nb_window->wset, p4e, szBuffer); } break; } break; /* Close requested, exit dialogue */ case WM_CLOSE : WinDismissDlg(hWnd, FALSE); break; /* Pass through unhandled messages */ default : return(WinDefDlgProc(hWnd, msg, mp1, mp2)); } return(0L); } MRESULT EXPENTRY NotebookPage5DlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { switch (msg) { case WM_CHAR : break; /* Perform dialog initialization */ case WM_INITDLG : break; /* Process control selections */ case WM_CONTROL : switch ( SHORT2FROMMP(mp1) ) { } break; /* Process push button selections */ case WM_COMMAND : switch ( SHORT1FROMMP(mp1) ) { case DID_OK : break; } break; /* Close requested, exit dialogue */ case WM_CLOSE : WinDismissDlg(hWnd, FALSE); break; /* Pass through unhandled messages */ default : return(WinDefDlgProc(hWnd, msg, mp1, mp2)); } return(0L); } MRESULT EXPENTRY NotebookDlgProc(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2) { HPS hPS; /* Temporary Presentation Space */ HWND hwndNBK; /* Notebook Window Handle */ PVOID ppb; /* Dialogue Template Pointer */ RECTL rcl; /* Rectangle Holder */ ULONG ulPageID; /* Inserted Page ID */ int t; char szBuffer[200]; switch ( msg ) { /* Perform dialog initialization */ case WM_INITDLG: inproperties=1; nb_window=current_window; GpiQueryFontMetrics(hPS = WinGetPS(hWnd), sizeof(FONTMETRICS), &fm); if(nb_window->current_channel) sprintf(szBuffer, "PMBitchX Properties for %s", nb_window->current_channel); else strcpy(szBuffer, "PMBitchX Properties"); hwndNBK = WinWindowFromID(hWnd, ID_PROP); WinSetWindowText(WinWindowFromID(hWnd, FID_TITLEBAR), szBuffer); /* Page 1 - Sets */ ulPageID = (ULONG)WinSendMsg(hwndNBK, BKM_INSERTPAGE, 0L, MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR), BKA_LAST)); WinSendMsg(hwndNBK, BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageID), MPFROMP("Page 1 of 5")); WinSendMsg(hwndNBK, BKM_SETTABTEXT, MPFROMLONG(ulPageID), MPFROMP("~Sets")); DosGetResource((HMODULE)NULL, RT_DIALOG, NBKP_SETS1, (PPVOID)&ppb); hwndPage1 = WinCreateDlg(HWND_DESKTOP, (HWND)NULL, (PFNWP)NotebookPage1DlgProc, (PDLGTEMPLATE)ppb, NULL); DosFreeResource((PVOID)ppb); WinSendMsg(hwndNBK, BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageID), MPFROMHWND(hwndPage1)); /* Page 2 - Csets */ ulPageID = (ULONG)WinSendMsg(hwndNBK, BKM_INSERTPAGE, 0L, MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR), BKA_LAST)); WinSendMsg(hwndNBK, BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageID), MPFROMP("Page 2 of 5")); WinSendMsg(hwndNBK, BKM_SETTABTEXT, MPFROMLONG(ulPageID), MPFROMP("~Csets")); DosGetResource((HMODULE)NULL, RT_DIALOG, NBKP_SETS2, (PPVOID)&ppb); hwndPage2 = WinCreateDlg(HWND_DESKTOP, (HWND)NULL, (PFNWP)NotebookPage2DlgProc, (PDLGTEMPLATE)ppb, NULL); DosFreeResource((PVOID)ppb); WinSendMsg(hwndNBK, BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageID), MPFROMHWND(hwndPage2)); /* Page 3 - Fsets */ ulPageID = (ULONG)WinSendMsg(hwndNBK, BKM_INSERTPAGE, 0L, MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR), BKA_LAST)); WinSendMsg(hwndNBK, BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageID), MPFROMP("Page 3 of 5")); WinSendMsg(hwndNBK, BKM_SETTABTEXT, MPFROMLONG(ulPageID), MPFROMP("~Fsets")); DosGetResource((HMODULE)NULL, RT_DIALOG, NBKP_SETS3, (PPVOID)&ppb); hwndPage3 = WinCreateDlg(HWND_DESKTOP, (HWND)NULL, (PFNWP)NotebookPage3DlgProc, (PDLGTEMPLATE)ppb, NULL); DosFreeResource((PVOID)ppb); WinSendMsg(hwndNBK, BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageID), MPFROMHWND(hwndPage3)); /* Page 4 - Wsets */ ulPageID = (ULONG)WinSendMsg(hwndNBK, BKM_INSERTPAGE, 0L, MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR), BKA_LAST)); WinSendMsg(hwndNBK, BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageID), MPFROMP("Page 4 of 5")); WinSendMsg(hwndNBK, BKM_SETTABTEXT, MPFROMLONG(ulPageID), MPFROMP("~Wsets")); DosGetResource((HMODULE)NULL, RT_DIALOG, NBKP_SETS4, (PPVOID)&ppb); hwndPage4 = WinCreateDlg(HWND_DESKTOP, (HWND)NULL, (PFNWP)NotebookPage4DlgProc, (PDLGTEMPLATE)ppb, NULL); DosFreeResource((PVOID)ppb); WinSendMsg(hwndNBK, BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageID), MPFROMHWND(hwndPage4)); /* Page 5 - OS/2 Settings */ ulPageID = (ULONG)WinSendMsg(hwndNBK, BKM_INSERTPAGE, 0L, MPFROM2SHORT((BKA_STATUSTEXTON | BKA_AUTOPAGESIZE | BKA_MAJOR), BKA_LAST)); WinSendMsg(hwndNBK, BKM_SETSTATUSLINETEXT, MPFROMLONG(ulPageID), MPFROMP("Page 5 of 5")); WinSendMsg(hwndNBK, BKM_SETTABTEXT, MPFROMLONG(ulPageID), MPFROMP("~OS/2 Settings")); DosGetResource((HMODULE)NULL, RT_DIALOG, NBKP_OSSETTINGS, (PPVOID)&ppb); hwndPage5 = WinCreateDlg(HWND_DESKTOP, (HWND)NULL, (PFNWP)NotebookPage4DlgProc, (PDLGTEMPLATE)ppb, NULL); DosFreeResource((PVOID)ppb); WinSendMsg(hwndNBK, BKM_SETPAGEWINDOWHWND, MPFROMLONG(ulPageID), MPFROMHWND(hwndPage5)); rcl.xLeft = rcl.yBottom = 0L; rcl.xRight = rcl.yTop = 400L; WinDrawText(hPS = WinGetPS(hWnd), -1, " Second Page ", &rcl, CLR_BLACK, CLR_BLACK, DT_LEFT | DT_BOTTOM | DT_QUERYEXTENT); WinReleasePS(hPS); WinSendMsg(hwndNBK, BKM_SETDIMENSIONS, MPFROM2SHORT((SHORT)(rcl.xRight - rcl.xLeft), (SHORT)(fm.lMaxBaselineExt * 2)), MPFROMSHORT(BKA_MAJORTAB)); /* Set the dimension of the notebook buttons */ WinSendMsg(hwndNBK, BKM_SETDIMENSIONS, MPFROM2SHORT(21, 21), MPFROMLONG(BKA_PAGEBUTTON)); /* Set the background colours to that of the dialog */ WinSendMsg(hwndNBK, BKM_SETNOTEBOOKCOLORS, MPFROMLONG(SYSCLR_DIALOGBACKGROUND), MPFROMLONG(BKA_BACKGROUNDPAGECOLORINDEX)); WinSendMsg(hwndNBK, BKM_SETNOTEBOOKCOLORS, MPFROMLONG(SYSCLR_DIALOGBACKGROUND), MPFROMLONG(BKA_BACKGROUNDMAJORCOLORINDEX)); for(t=0; tname)); } for(t=0; tname)); } for(t=0; tname)); } for(t=0; tname)); } break; case WM_COMMAND : switch (SHORT1FROMMP(mp1)) { case DID_OK : WinSendMsg(hwndPage1, WM_COMMAND, MPFROMLONG(DID_OK), MPFROMLONG(CMDSRC_OTHER)); WinSendMsg(hwndPage2, WM_COMMAND, MPFROMLONG(DID_OK), MPFROMLONG(CMDSRC_OTHER)); WinSendMsg(hwndPage3, WM_COMMAND, MPFROMLONG(DID_OK), MPFROMLONG(CMDSRC_OTHER)); WinSendMsg(hwndPage4, WM_COMMAND, MPFROMLONG(DID_OK), MPFROMLONG(CMDSRC_OTHER)); inproperties=0; WinDismissDlg(hWnd, TRUE); break; } break; /* Close requested, exit dialogue */ case WM_CLOSE : inproperties=0; WinDismissDlg(hWnd, FALSE); break; /* Pass through unhandled messages */ default : return(WinDefDlgProc(hWnd, msg, mp1, mp2)); } return(0L); } void properties_notebook(void) { HAB hnbab; HMQ hnbmq; hnbab = WinInitialize(0); hnbmq = WinCreateMsgQueue(hnbab, 0); if(inproperties==0) WinDlgBox(HWND_DESKTOP, HWND_DESKTOP, NotebookDlgProc, NULLHANDLE, PROPNBK, NULL); WinDestroyMsgQueue(hnbmq); WinTerminate(hnbab); } void msgbox(void) { HAB hmbab; HMQ hmbmq; hmbab = WinInitialize(0); hmbmq = WinCreateMsgQueue(hmbab, 0); WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, msgtext, "PMBitchX", 0, MB_OK | MB_INFORMATION | MB_MOVEABLE); new_free(&msgtext); WinDestroyMsgQueue(hmbmq); WinTerminate(hmbab); } void pm_clrscr(Screen *tmp) { VioScrollUp(0, 0, -1, -1, -1, (PBYTE)&default_pair, tmp->hvps); } void gui_font_set(char *fontsize, Screen *screen) { char *height, *width; int t; width=new_malloc(10); strcpy(width, fontsize); t=0; while(width[t]!='x' && t<9) t++; height=&width[t+1]; width[t]=0; VIO_font_width=atoi(width); VIO_font_height=atoi(height); new_free(&width); if (VIO_font_width < 6 || VIO_font_height < 8) { VIO_font_width=6;VIO_font_height=10; } if(VioSetDeviceCellSize(VIO_font_height, VIO_font_width, screen->hvps)!=NO_ERROR) { VIO_font_width = screen->VIO_font_width; VIO_font_height = screen->VIO_font_height; } else { VioSetDeviceCellSize(VIO_font_height, VIO_font_width, screen->hvpsnick); screen->VIO_font_width = VIO_font_width; screen->VIO_font_height = VIO_font_height; } } void gui_font_init(void) { char *fontsize; int cy, cx, containerh, codepage = 0; VIO_font_width=6;VIO_font_height=10; main_screen->VIO_font_width=VIO_font_width; main_screen->VIO_font_height=VIO_font_height; if((fontsize=get_string_var(DEFAULT_FONT_VAR))!=NULL) gui_font_set(fontsize, main_screen); main_screen->nicklist = get_int_var(NICKLIST_VAR); main_screen->co = 84; main_screen->li = 25; cx = (main_screen->co - 1) * main_screen->VIO_font_width; cy = main_screen->li * main_screen->VIO_font_height; cx += main_screen->VIO_font_width * main_screen->nicklist; if(main_screen->nicklist) cx += cxvs; WinSetWindowPos(main_screen->hwndFrame, HWND_TOP, 0, 0, 0 ,0, SWP_HIDE); if(get_int_var(MDI_VAR)) { SWP swp; WinQueryWindowPos(MDIClient, &swp); containerh = swp.cy; WinSetParent(main_screen->hwndFrame, MDIClient, FALSE); } else { containerh = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN); WinSetParent(main_screen->hwndFrame, HWND_DESKTOP, FALSE); } if(main_screen->hwndMenu==(HWND)NULL) WinSetWindowPos(main_screen->hwndFrame, HWND_TOP, 32 * main_screen->screennum, containerh - ((32 * main_screen->screennum) + cy + (cysb*2)+cytb), cx+cxsb, cy+(cysb*2)+WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR), SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER); else WinSetWindowPos(main_screen->hwndFrame, HWND_TOP, 32 * main_screen->screennum, containerh - ((32 * main_screen->screennum) + cy + (cysb*2)+cytb), cx+cxsb, cy+(cysb*2)+WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR) + WinQuerySysValue(HWND_DESKTOP, SV_CYMENU) + 1, SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER); if((codepage = get_int_var(DEFAULT_CODEPAGE_VAR))) { VioSetCp(0, codepage, main_screen->hvps); VioSetCp(0, codepage, main_screen->hvpsnick); WinSetCp(hmq, codepage); WinSetCp(mainhmq, codepage); } DosSleep(1000); /*if(!get_int_var(SCROLLERBARS_VAR)) WinSetParent();*/ } /* This section is for portability considerations */ void gui_init(void) { LONG add = 100; ULONG new; /* Create an unnamed semaphore */ DosCreateEventSem(NULL, (PHEV)&sem, DC_SEM_SHARED, FALSE); li = 25; co = 80; #ifdef SOUND if(DosLoadModule(NULL, 0, "MCIAPI", &hmod) == NO_ERROR) { if(DosQueryProcAddr(hmod, 0, "mciPlayFile", (PFN *)&DLL_mciPlayFile) != NO_ERROR) DLL_mciPlayFile = NULL; if(DosQueryProcAddr(hmod, 0, "mciSendString", (PFN *)&DLL_mciSendString) != NO_ERROR) DLL_mciSendString = NULL; if(DosQueryProcAddr(hmod, 0, "mciGetErrorString", (PFN *)&DLL_mciGetErrorString) != NO_ERROR) DLL_mciGetErrorString = NULL; } #endif DosSetRelMaxFH(&add, &new); _beginthread((void *)avio_init, NULL, (4*0xFFFF), main_screen ); _beginthread((void *)flush_thread, NULL, 0xFFFF, &hvps); _beginthread((void *)cursor_thread, NULL, 0xFFFF, NULL); DosWaitEventSem(sem, SEM_INDEFINITE_WAIT); DosCloseEventSem(sem); default_pair[0] = ' '; default_pair[1] = 7; } void gui_clreol(void) { USHORT row, col; char tmpbuf[201]; aflush(); if(!output_screen) return; VioGetCurPos((PUSHORT)&row, (PUSHORT)&col, output_screen->hvps); if((output_screen->co - col + 1) > 0) { memset(tmpbuf, ' ', 200); tmpbuf[201] = 0; VioWrtTTY((PCH)tmpbuf, (output_screen->co - col) + 1, output_screen->hvps); VioSetCurPos((USHORT)row, (USHORT)col, output_screen->hvps); } } void gui_gotoxy(int col, int row) { aflush(); VioSetCurPos((USHORT)row, (USHORT)col, output_screen ? output_screen->hvps : hvps); } void gui_clrscr(void) { Screen *tmp; aflush(); for (tmp = screen_list; tmp; tmp = tmp->next) if(tmp->alive) pm_clrscr(tmp); } void gui_left(int num) { unsigned int row,col; aflush(); VioGetCurPos((PUSHORT)&row, (PUSHORT)&col, output_screen ? output_screen->hvps : hvps); if(col>num) col=col-num; else col=0; VioSetCurPos((USHORT)row, (USHORT)col, output_screen ? output_screen->hvps : hvps); } void gui_right(int num) { unsigned int row,col; aflush(); VioGetCurPos((PUSHORT)&row, (PUSHORT)&col, output_screen->hvps); if(output_screen->co > num) col=col+num; else col=output_screen->co; VioSetCurPos((USHORT)row, (USHORT)col, output_screen->hvps); } void gui_scroll(int top, int bot, int n) { aflush(); if (n > 0) VioScrollUp(top, 0, bot, output_screen->co, n, (PBYTE)&pair, output_screen->hvps); else if (n < 0) { n = -n; VioScrollDn(top, 0, bot, output_screen->co, n, (PBYTE)&pair, output_screen->hvps); } return; } void gui_flush(void) { aflush(); } void gui_puts(unsigned char *buffer) { int i; for (i = 0; i < strlen(buffer); i++) aputc(buffer[i]); aputc('\n'); aputc('\r'); } void gui_new_window(Screen *new, Window *win) { WinSendMsg(main_screen->hwndClient, WM_USER+2, MPFROMP(new), MPFROMP(win)); } void pm_new_window(Screen *new, Window *win) { int cx, cy; HDC hdc; ULONG flStyle = FCF_MINMAX | FCF_SYSMENU | FCF_TITLEBAR | FCF_SIZEBORDER | FCF_ICON; PMYWINDATA windata; MenuStruct *menutoadd; char *defmenu, *fontsize, *width, *height; int t, containerh, codepage = 0; windata = new_malloc(sizeof(MYWINDATA)); memset(windata, '\0', sizeof(MYWINDATA)); if(!get_int_var(MDI_VAR)) flStyle |= FCF_TASKLIST; new->hwndFrame = WinCreateStdWindow(HWND_DESKTOP, 0, &flStyle, "AVIO", irc_version, 0L, NULLHANDLE, IDM_MAINMENU, &new->hwndClient); WinSetWindowPtr(new->hwndClient, QWP_USER, NULL); new->hwndLeft = WinCreateWindow(new->hwndClient, WC_FRAME, NULL, WS_VISIBLE, 0,0,2000,1000, new->hwndClient, HWND_TOP, 0L, NULL, NULL); new->hwndRight = WinCreateWindow(new->hwndClient, WC_FRAME, NULL, WS_VISIBLE, 0,0,2000,1000, new->hwndClient, HWND_TOP, 0L, NULL, NULL); new->hwndscroll = WinCreateWindow(new->hwndClient, WC_SCROLLBAR, NULL, WS_VISIBLE | SBS_VERT, 0,0,100,100, new->hwndClient, HWND_TOP, 1000L, NULL, NULL); new->hwndnickscroll = WinCreateWindow(new->hwndClient, WC_SCROLLBAR, NULL, WS_VISIBLE | SBS_VERT, 0,0,100,100, new->hwndClient, HWND_TOP, 1001L, NULL, NULL); if (main_screen) { new->co = main_screen->co; new->li = main_screen->li; } else { new->co = 81; new->li = 25; } if (main_screen) { new->VIO_font_width = main_screen->VIO_font_width; new->VIO_font_height = main_screen->VIO_font_height; } else { new->VIO_font_width = VIO_font_width; new->VIO_font_height = VIO_font_height; } /* Get the default font and set the new window with it */ if((fontsize=get_string_var(DEFAULT_FONT_VAR))!=NULL) { width=new_malloc(10); strcpy(width, fontsize); t=0; while(width[t]!='x' && t<9) t++; height=&width[t+1]; width[t]=0; VIO_font_width=atoi(width); VIO_font_height=atoi(height); new_free(&width); if (VIO_font_width < 6 || VIO_font_height < 8) { VIO_font_width=6;VIO_font_height=10; } } else { VIO_font_width=6;VIO_font_height=10; } new->VIO_font_width = VIO_font_width; new->VIO_font_height = VIO_font_height; /* Get the default menu and add it to the new window */ defmenu=get_string_var(DEFAULT_MENU_VAR); if(defmenu && *defmenu) { if((menutoadd = (MenuStruct *)findmenu(defmenu))==NULL) say("Menu not found."); else if(menutoadd->menuorigin==NULL) say("Cannot create blank menu."); else { new->hwndMenu=newsubmenu((MenuStruct *)menutoadd, new->hwndFrame, TRUE); new->menu=m_strdup(defmenu); } } else new->hwndMenu=(HWND)NULL; cx = new->co * new->VIO_font_width; cy = new->li * new->VIO_font_height; new->nicklist = get_int_var(NICKLIST_VAR); cx += new->nicklist * new->VIO_font_width; if(new->nicklist) cx += cxvs; hdc = WinOpenWindowDC(new->hwndLeft); /* VIO_staticx and VIO_staticy */ VioCreatePS(&new->hvps, VIO_staticy, VIO_staticx, 0, 1, 0); VioAssociate(hdc, new->hvps); hdc = WinOpenWindowDC(new->hwndRight); VioCreatePS(&new->hvpsnick, VIO_staticy, VIO_staticx, 0, 1, 0); VioAssociate(hdc, new->hvpsnick); cursor_off(new->hvpsnick); VioSetDeviceCellSize(new->VIO_font_height, new->VIO_font_width, new->hvps); VioSetDeviceCellSize(new->VIO_font_height, new->VIO_font_width, new->hvpsnick); windata->hvps = new->hvps; windata->screen = new; WinSendMsg(new->hwndscroll, SBM_SETSCROLLBAR, (MPARAM)get_int_var(SCROLLBACK_VAR), MPFROM2SHORT(0, get_int_var(SCROLLBACK_VAR))); WinSetWindowPtr(new->hwndClient, QWP_USER, windata); WinSetWindowPtr(new->hwndLeft, QWP_USER, windata); WinSetWindowPtr(new->hwndRight, QWP_USER, windata); WinSubclassWindow(new->hwndLeft, FrameWndProc); WinSubclassWindow(new->hwndRight, FrameWndProc); WinSetWindowPos(new->hwndFrame, HWND_TOP, 0, 0, 0 ,0, SWP_HIDE); WinSendMsg(new->hwndnickscroll, SBM_SETSCROLLBAR, (MPARAM)0, MPFROM2SHORT(0, new->li)); WinSendMsg(new->hwndnickscroll, SBM_SETTHUMBSIZE, MPFROM2SHORT(new->li, 0), (MPARAM)NULL); if(get_int_var(MDI_VAR)) { SWP swp; WinQueryWindowPos(MDIClient, &swp); containerh = swp.cy; WinSetParent(new->hwndFrame, MDIClient, FALSE); } else { containerh = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN); WinSetParent(new->hwndFrame, HWND_DESKTOP, FALSE); } if(new->hwndMenu==(HWND)NULL) WinSetWindowPos(new->hwndFrame, HWND_TOP, 32 * new->screennum, containerh - ((32 * new->screennum) + cy + (cysb*2)+ cytb), cx+(cxsb*2) + cxvs, cy + (cysb*2)+ WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR), SWP_SIZE | SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE); else WinSetWindowPos(new->hwndFrame, HWND_TOP, 32 * new->screennum, containerh - ((32 * new->screennum) + cy + (cysb*2)+ cytb), cx+(cxsb*2) + cxvs, cy + (cysb*2)+ WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR) + /*menupos.cy*/ WinQuerySysValue(HWND_DESKTOP, SV_CYMENU) + 1, SWP_SIZE | SWP_ZORDER | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE); if((codepage = get_int_var(DEFAULT_CODEPAGE_VAR))) { VioSetCp(0, codepage, new->hvps); VioSetCp(0, codepage, new->hvpsnick); WinSetCp(hmq, codepage); WinSetCp(mainhmq, codepage); } } void gui_kill_window(Screen *killscreen) { PMYWINDATA wd = (PMYWINDATA)WinQueryWindowPtr(killscreen->hwndClient, QWP_USER); if(pmthread == *_threadid) { if(killscreen->hwndMenu && WinIsWindow(hab, killscreen->hwndMenu)) detach_shared(killscreen); VioAssociate((HDC)NULL, killscreen->hvps); VioDestroyPS(killscreen->hvps); killscreen->hvps = 0; VioAssociate((HDC)NULL, killscreen->hvpsnick); VioDestroyPS(killscreen->hvpsnick); killscreen->hvpsnick = 0; WinDestroyWindow(killscreen->hwndFrame); } else { WinSendMsg(killscreen->hwndFrame, WM_USER+4, (MPARAM)killscreen, NULL); return; } if(wd) new_free(&wd); } void gui_msgbox(void) { _beginthread((void *)msgbox, NULL, 0xFFFF, NULL); } void gui_popupmenu(char *menuname) { if (contextmenu && WinIsWindow(hab, contextmenu)) WinDestroyWindow(contextmenu); contextmenu=(HWND)menucreatestub(menuname, last_input_screen->hwndFrame, FALSE); WinPopupMenu(last_input_screen->hwndFrame, last_input_screen->hwndFrame, contextmenu, contextx, contexty, 0, PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_VCONSTRAIN | PU_HCONSTRAIN); } /* These are support routines for gui_file_dialog() */ MRESULT EXPENTRY FileFilterProc(HWND hwnd, ULONG message, MPARAM mp1, MPARAM mp2 ) { return WinDefFileDlgProc( hwnd, message, mp1, mp2 ) ; } /* Ripped from functions.c because I couldn't get it to link from there */ BUILT_IN_FUNCTION(fencode) { char *result; int i = 0; result = (char *)new_malloc(strlen((char *)input) * 2 + 1); while (*input) { result[i++] = (*input >> 4) + 0x41; result[i++] = (*input & 0x0f) + 0x41; input++; } result[i] = '\0'; return result; /* DONT USE RETURN_STR HERE! */ } void pm_file_dialog(char *data[7]) { /* 0 type 1 path 2 title 3 ok 4 apply 5 szButton 6 code */ HAB hfdab; HMQ hfdmq; FILEDLG fild; char *okbut, *title, *tmp, *tmp2; int z; HWND hwndFile; hfdab = WinInitialize(0); hfdmq = WinCreateMsgQueue(hfdab, 0); convert_dos(data[1]); okbut = m_strdup(data[5]); title = m_strdup(data[2]); fild.cbSize = sizeof(FILEDLG); fild.fl = /*FDS_HELPBUTTON |*/ FDS_CENTER | FDS_OPEN_DIALOG; fild.pszTitle = title; fild.pszOKButton = okbut; fild.ulUser = 0L; fild.pfnDlgProc = (PFNWP)FileFilterProc; fild.lReturn = 0L; fild.lSRC = 0L; fild.hMod = 0; fild.x = 0; fild.y = 0; fild.pszIType = (PSZ)NULL; fild.papszITypeList = (PAPSZ)NULL; fild.pszIDrive = (PSZ)NULL; fild.papszIDriveList= (PAPSZ)NULL; fild.sEAType = (SHORT)0; fild.papszFQFilename= (PAPSZ)NULL; fild.ulFQFCount = 0L; strcpy(fild.szFullFile, data[1]); tmp = m_strdup(data[6]); for(z=0;z<7;z++) { if(data[z]) new_free(&data[z]); } hwndFile = WinFileDlg(HWND_DESKTOP, HWND_DESKTOP, &fild); if(hwndFile) { switch(fild.lReturn) { case DID_OK: paramptr = m_strdup("OK "); convert_unix(fild.szFullFile); tmp2 = fencode(NULL, fild.szFullFile); malloc_strcat(¶mptr, tmp2); new_free(&tmp2); break; case DID_CANCEL: paramptr = m_strdup("CANCEL"); break; default: paramptr = m_strdup(empty_string); break; } new_free(&title); new_free(&okbut); codeptr = tmp; sendevent(EVFILE, current_window->refnum); } WinDestroyMsgQueue(hfdmq); WinTerminate(hfdab); } void gui_file_dialog(char *type, char *path, char *title, char *ok, char *apply, char *code, char *szButton) { char *data[7]; if(!type) data[0] = m_strdup(empty_string); else data[0] = m_strdup(type); if(!path) data[1] = m_strdup(empty_string); else data[1] = m_strdup(path); if(!title) data[2] = m_strdup(empty_string); else data[2] = m_strdup(title); if(!ok) data[3] = m_strdup(empty_string); else data[3] = m_strdup(ok); if(!apply) data[4] = m_strdup(empty_string); else data[4] = m_strdup(apply); if(!szButton) data[5] = m_strdup(empty_string); else data[5] = m_strdup(szButton); if(!code) data[6] = m_strdup(empty_string); else data[6] = m_strdup(code); _beginthread((void *)pm_file_dialog, NULL, 0xFFFF, data); } void gui_properties_notebook(void) { _beginthread((void *)properties_notebook, NULL, 0xFFFF, NULL); } #define current_screen last_input_screen #define INPUT_BUFFER current_screen->input_buffer #define ADD_TO_INPUT(x) strmcat(INPUT_BUFFER, (x), INPUT_BUFFER_SIZE); void gui_paste(char *args) { ULONG fmtInfo; APIRET rc; PSZ pszClipText; char *oclip, *clip, *bit; int line = 0, i = 0; char *channel = NULL; int topic = 0; int smartpaste = 0; char smart[512]; int smartsize = 80; int input_line = 0; from_server = current_window->server; /* Parse arguments */ if (!args || !*args) channel = get_current_channel_by_refnum(0); else { char *t; while (args && *args) { t = next_arg(args, &args); if (*t == '-') { if (!my_strnicmp(t, "-topic", strlen(t))) { topic = 1; } else if (!my_strnicmp(t, "-smart", strlen(t))) { /* Smartpaste */ smartpaste = 1; } else if (!my_strnicmp(t, "-input", strlen(t))) { /* Smartpaste */ input_line = 1; } } else channel = t; } } if (!channel) channel = get_current_channel_by_refnum(0); WinOpenClipbrd(hab); rc = WinQueryClipbrdFmtInfo(hab, CF_TEXT, &fmtInfo); if (rc) /* Text data in clipboard */ { pszClipText = (PSZ)WinQueryClipbrdData(hab, CF_TEXT); /* Query data handle */ oclip = clip = malloc(strlen(pszClipText) + 1); line = 0; while ((*clip++ = *pszClipText++)); /* Copy to own memory */ if (!smartpaste) { /* Ordinary paste */ clip = oclip; bit = strtok(clip, "\n\r"); while (bit) { if (input_line) { ADD_TO_INPUT(bit); update_input(UPDATE_FROM_CURSOR); } else if (!topic) { if(current_window->query_nick) { if (do_hook(PASTE_LIST, "%s %s", current_window->query_nick, bit)) send_text(current_window->query_nick, bit, NULL, 1, 0); } else { if (do_hook(PASTE_LIST, "%s %s", channel, bit)) send_text(channel, bit, NULL, 1, 0); } } else { send_to_server("TOPIC %s :%s", channel, bit); break; } line++; bit = strtok(NULL, "\n\r"); if (input_line && bit) send_line(0, NULL); } } else { /* Rosmo's Incredibly Dull SmartPaste: Fits as much as possible into a 80-nick_length buffer, stripping spaces from beginning and end and then pasting */ if (!topic) smartsize = 512; else smartsize = 128; /* 'tis correct? */ clip = oclip; while (*clip && *clip == ' ') clip++; /* Strip spaces from the start */ *smart = '\0'; while (*clip) { if (input_line && *smart) send_line(0, NULL); *smart = '\0'; i = 0; while (*clip && i < smartsize) { if (*clip != '\n') { if (*clip != '\r') strncat(smart, clip, 1); } else { strcat(smart, " "); clip++; i++; while (*clip && *clip == ' ') clip++; /* Strip spaces */ clip--; } clip++; i++; } if (strcmp(smart, "") != 0) /* If our smart buffer has stuff, send it! */ { if (input_line) { ADD_TO_INPUT(smart); update_input(UPDATE_FROM_CURSOR); } else if (!topic) { if(current_window->query_nick) { if (do_hook(PASTE_LIST, "%s %s", current_window->query_nick, smart)) send_text(current_window->query_nick, smart, NULL, 1, 0); } else { if (do_hook(PASTE_LIST, "%s %s", channel, smart)) send_text(channel, smart, NULL, 1, 0); } } else { send_to_server("TOPIC %s :%s", channel, smart); break; } } } } free(oclip); /* Free */ } WinCloseClipbrd(hab); } void gui_setfocus(Screen *screen) { WinSetFocus(HWND_DESKTOP, screen->hwndClient); } void gui_scrollerchanged(Screen *screen, int position) { WinSendMsg(screen->hwndscroll, SBM_SETSCROLLBAR, (MPARAM)position, MPFROM2SHORT(0, get_int_var(SCROLLBACK_VAR))); } void gui_query_window_info(Screen *screen, char *fontinfo, int *x, int *y, int *cx, int *cy) { SWP wpos; if(screen) { WinQueryWindowPos(screen->hwndFrame, &wpos); *x = wpos.x; *y = wpos.y; *cx = wpos.cx; *cy = wpos.cy; } else { *x=*y=*cx=*cy=0; } sprintf(fontinfo, "%dx%d", screen ? screen->VIO_font_width : 0, screen ? screen->VIO_font_height : 0); } void play_sound(char *filename) { #ifdef SOUND struct stat tmpstat; HAB soundhab = 0; HMQ soundhmq = 0; soundhab = WinInitialize(0); soundhmq = WinCreateMsgQueue(soundhab, 0); convert_dos(filename); if((stat(filename,&tmpstat))==0) DLL_mciPlayFile((HWND)NULL, filename, 0, 0, 0); free(filename); WinDestroyMsgQueue(soundhmq); WinTerminate(soundhab); #endif } void gui_play_sound(char *filename) { #ifdef SOUND char *freeme = strdup(filename); if(!DLL_mciPlayFile) return; _beginthread((void *)play_sound, NULL, 0xFFFF, (char *)freeme); #endif } int gui_send_mci_string(char *mcistring, char *retstring) { #ifdef SOUND if(DLL_mciSendString) return DLL_mciSendString((PSZ)mcistring, (PSZ)retstring, 500, 0, 0); else #endif return 0; } void gui_get_sound_error(int errnum, char *errstring) { #ifdef SOUND if(DLL_mciGetErrorString) DLL_mciGetErrorString(errnum, (PSZ)errstring, 500); #endif } void gui_menu(Screen *screen, char *addmenu) { /* Finish creating the menu in the Window thread */ WinSendMsg(screen->hwndClient, WM_USER+6, (MPARAM)screen, (MPARAM)addmenu); } int gui_isset(Screen *screen, fd_set *rd, int what) { if (screen->aviokbdbuffer[0] != 0) return TRUE; else return FALSE; } int gui_putc(int c) { aputc(c); return 1; } void gui_exit(void) { #ifdef SOUND DosFreeModule(hmod); #endif avio_exit(); } void gui_screen(Screen *new) { new->hvps = hvps; new->hvpsnick = hvpsnick; new->VIO_font_width = VIO_font_width; new->VIO_font_height = VIO_font_height; new->hwndFrame = hwndFrame; new->hwndClient = hwndClient; new->hwndLeft = hwndLeft; new->hwndRight = hwndRight; new->hwndscroll = hwndscroll; new->hwndnickscroll = hwndnickscroll; new->menu=(HWND)NULL; new->old_li=new->li; new->old_co=new->co; new->nicklist = get_int_var(NICKLIST_VAR); main_screen = new; } void gui_resize(Screen *new) { pm_resize(new); } int gui_screen_width(void) { return WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN); } int gui_screen_height(void) { return WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN); } void gui_setwindowpos(Screen *screen, int x, int y, int cx, int cy, int top, int bottom, int min, int max, int restore, int activate, int size, int position) { ULONG flags = 0; HWND pos = HWND_BOTTOM; if(top || bottom) flags |= SWP_ZORDER; if(top) pos = HWND_TOP; if(min) flags |= SWP_MINIMIZE; if(max) flags |= SWP_MAXIMIZE; if(restore) flags |= SWP_RESTORE; if(activate) flags |= SWP_ACTIVATE; if(size) flags |= SWP_SIZE; if(position) flags |= SWP_MOVE; WinSetWindowPos(screen->hwndFrame, pos, x, y, cx, cy, flags); } void BX_gui_mutex_lock(void) { } void BX_gui_mutex_unlock(void) { } int gui_setmenuitem(char *menuname, int refnum, char *what, char *param) { MenuRef *tmp = NULL; MenuStruct *thismenu = findmenu(menuname); if(thismenu) tmp = find_menuref(thismenu->root, refnum); if(!tmp) return FALSE; if(my_stricmp(what, "check")==0) { if(my_atol(param)) WinSendMsg(tmp->menuhandle, MM_SETITEMATTR, MPFROM2SHORT(tmp->menuid, TRUE), MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED)); else WinSendMsg(tmp->menuhandle, MM_SETITEMATTR, MPFROM2SHORT(tmp->menuid, TRUE), MPFROM2SHORT(MIA_CHECKED, 0)); } else if(my_stricmp(what, "text")==0) { WinSendMsg(tmp->menuhandle, MM_SETITEMTEXT, MPFROMSHORT(tmp->menuid), MPFROMP(param)); } else return FALSE; return TRUE; } void gui_remove_menurefs(char *menu) { MenuStruct *cleanmenu = findmenu(menu); if(cleanmenu) { MenuList *tmplist = cleanmenu->menuorigin; while(tmplist) { if(tmplist->refnum > 0) remove_menuref(&cleanmenu->root, tmplist->refnum); if(tmplist->menutype == GUISUBMENU || tmplist->menutype == GUIBRKSUBMENU) gui_remove_menurefs(tmplist->submenu); tmplist = tmplist->next; } } } void gui_mdi(Window *window, char *text, int value) { WinSendMsg(main_screen->hwndClient, WM_USER+3, (MPARAM)value, 0); } void gui_update_nicklist(char *channel) { if(channel) { Window *this_window; ChannelList *cptr = lookup_channel(channel, from_server, 0); if(cptr) { this_window = get_window_by_refnum(cptr->refnum); if(this_window && this_window->screen) drawnicklist(this_window->screen); } } else { Screen *tmp = screen_list; while(tmp) { if(tmp->alive) drawnicklist(tmp); tmp = tmp->next; } } } void gui_nicklist_width(int width, Screen *this_screen) { SWP swp; int ocx = this_screen->VIO_font_width * this_screen->nicklist; int ncx = this_screen->VIO_font_width * width; if(ocx) ocx += cxvs; if(width) ncx += cxvs; if(this_screen->nicklist && !width) { WinSetParent(this_screen->hwndRight, HWND_OBJECT, FALSE); WinSetParent(this_screen->hwndnickscroll, HWND_OBJECT, FALSE); } if(!this_screen->nicklist && width) { WinSetParent(this_screen->hwndRight, this_screen->hwndClient, FALSE); WinSetParent(this_screen->hwndnickscroll, this_screen->hwndClient, FALSE); } this_screen->nicklist = width; WinQueryWindowPos(this_screen->hwndFrame, &swp); WinSetWindowPos(this_screen->hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx + (ncx - ocx), swp.cy, SWP_SIZE); } void gui_startup(int argc, char *argv[]) { mainhab = WinInitialize(0); mainhmq = WinCreateMsgQueue(mainhab, 0); pipe(guiipc); new_open(guiipc[0]); dw_init(FALSE, argc, argv); } void gui_about_box(char *about_text) { WinSendMsg(main_screen->hwndFrame, WM_USER+5, MPFROMP(about_text), NULL); } void gui_activity(int color) { HWND hwnd; ULONG ulColor; if(target_window && target_window->screen) hwnd = target_window->screen->hwndFrame; else return; switch(color) { case COLOR_ACTIVE: ulColor = CLR_RED; break; case COLOR_HIGHLIGHT: ulColor = CLR_BLUE; break; default: ulColor = CLR_PALEGRAY; break; } #if 0 WinSetPresParam(hwnd, PP_FOREGROUNDCOLORINDEX, sizeof(ulColor), &ulColor); #endif } void gui_setfileinfo(char *filename, char *nick, int server) { const unsigned fea2listsize = 6000; char *pData, buffer[200], *s, *t, *fullname, *tmp = NULL; EAOP2 eaop2; PFEA2 pFEA2; extern char *time_format; APIRET rc; malloc_sprintf(&tmp, "%s/%s", get_string_var(DCC_DLDIR_VAR), filename); fullname = expand_twiddle(tmp); convert_dos(fullname); new_free(&tmp); s = get_server_network(server); time_format = "%c"; update_clock(RESET_TIME); t = update_clock(GET_TIME); sprintf(buffer, "%s@%s %s", nick, s ? s : "IRC", t ? t : "clock problem"); time_format = NULL; update_clock(RESET_TIME); eaop2.fpGEA2List = 0; eaop2.fpFEA2List = (PFEA2LIST)malloc(fea2listsize); pFEA2 = &eaop2.fpFEA2List->list[0]; pFEA2->fEA = 0; /* .COMMENTS is 9 characters long */ pFEA2->cbName = 9; /* space for the type and length field. */ pFEA2->cbValue = strlen(buffer)+2*sizeof(USHORT); strcpy(pFEA2->szName, ".COMMENTS"); pData = pFEA2->szName+pFEA2->cbName+1; /* data begins at first byte after the name */ *(USHORT*)pData = EAT_ASCII; /* type */ *((USHORT*)pData+1) = strlen(buffer); /* length */ strcpy(pData+2*sizeof(USHORT), buffer);/* content */ pFEA2->oNextEntryOffset = 0; eaop2.fpFEA2List->cbList = ((PCHAR)pData+2*sizeof(USHORT)+ pFEA2->cbValue)-((PCHAR)eaop2.fpFEA2List); rc = DosSetPathInfo(fullname, FIL_QUERYEASIZE, &eaop2, sizeof(eaop2), 0); free((void *)eaop2.fpFEA2List); } void gui_setfd(fd_set *rd) { /* Set the GUI IPC pipe readable for select() */ FD_SET(guiipc[0], rd); }