?? functions.c
字號:
*((Boolean *)calldata) = True;}static voidrestart_cb(Widget w, XtPointer calldata, XtPointer cbs){ MWM_Done(1, g_argv[0]);}static voidrestart(ScreenInfo *scr){ static Widget restart_mb = NULL; Boolean finished = False; Dimension wd, ht; MISC_Ungrab(scr); if (restart_mb == NULL) { Widget tmp; XmString lab; Arg args[4]; XtSetArg(args[0], XmNmwmDecorations, MWM_DECOR_BORDER); XtSetArg(args[1], XmNmwmFunctions, 0); XtSetArg(args[2], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); XtSetArg(args[3], XmNdefaultPosition, False); restart_mb = XmCreateQuestionDialog(toplevel, "restart_question", args, 4); if (!restart_mb) MWM_Done(0, NULL); tmp = XmMessageBoxGetChild(restart_mb, XmDIALOG_HELP_BUTTON); XtUnmanageChild(tmp); tmp = XmMessageBoxGetChild(restart_mb, XmDIALOG_OK_BUTTON); XtAddCallback(tmp, XmNactivateCallback, restart_cb, NULL); tmp = XmMessageBoxGetChild(restart_mb, XmDIALOG_CANCEL_BUTTON); XtAddCallback(tmp, XmNactivateCallback, cancel_cb, (XtPointer)&finished); lab = XmStringCreateSimple("Restart Mwm?"); XtVaSetValues(restart_mb, XmNmessageString, lab, NULL); XmStringFree(lab); XtRealizeWidget(restart_mb); XtVaGetValues(restart_mb, XmNwidth, &wd, XmNheight, &ht, NULL); XtVaSetValues(XtParent(restart_mb), XmNx, (scr->d_width - wd) / 2 - scr->frame_border_width, XmNy, (scr->d_height - ht) / 2 - scr->frame_border_width, NULL); } XtManageChild(restart_mb); scr->restart_win = XtWindow(XtParent(restart_mb)); while (!finished) { XEvent event; if (EVENT_Next(&event)) EVENT_Dispatch(&event); }}static voidquit_cb(Widget w, XtPointer calldata, XtPointer cbs){ MWM_Done(0, NULL);}static voidquit(ScreenInfo *scr){ static Widget quit_mb = NULL; Boolean finished = False; Dimension wd, ht; MISC_Ungrab(scr); if (quit_mb == NULL) { Widget tmp; XmString lab; Arg args[4]; XtSetArg(args[0], XmNmwmDecorations, MWM_DECOR_BORDER); XtSetArg(args[1], XmNmwmFunctions, 0); XtSetArg(args[2], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); XtSetArg(args[3], XmNdefaultPosition, False); quit_mb = XmCreateQuestionDialog(toplevel, "quit_question", args, 4); if (!quit_mb) MWM_Done(0, NULL); tmp = XmMessageBoxGetChild(quit_mb, XmDIALOG_HELP_BUTTON); if (tmp) XtUnmanageChild(tmp); tmp = XmMessageBoxGetChild(quit_mb, XmDIALOG_OK_BUTTON); XtAddCallback(tmp, XmNactivateCallback, quit_cb, NULL); tmp = XmMessageBoxGetChild(quit_mb, XmDIALOG_CANCEL_BUTTON); XtAddCallback(tmp, XmNactivateCallback, cancel_cb, (XtPointer)&finished); lab = XmStringCreateSimple("QUIT Mwm?"); XtVaSetValues(quit_mb, XmNmessageString, lab, NULL); XmStringFree(lab); XtRealizeWidget(quit_mb); XtVaGetValues(quit_mb, XmNwidth, &wd, XmNheight, &ht, NULL); XtVaSetValues(XtParent(quit_mb), XmNx, (scr->d_width - wd) / 2 - scr->frame_border_width, XmNy, (scr->d_height - ht) / 2 - scr->frame_border_width, NULL); } XtManageChild(quit_mb); scr->quit_win = XtWindow(XtParent(quit_mb)); while (!finished) { XEvent event; if (EVENT_Next(&event)) EVENT_Dispatch(&event); }}static voidnoset_cb(Widget w, XtPointer calldata, XtPointer cbs){ *((Boolean *)calldata) = True;}static voidtoggle_behavior(Widget w, XtPointer calldata, XtPointer cbs){ ScreenInfo *scr = (ScreenInfo *)calldata; if (PROP_GetBehavior(scr) & MWM_INFO_STARTUP_STANDARD) PROP_SetBehavior(scr, True); else PROP_SetBehavior(scr, False); XSync(dpy, 0); MWM_Done(1, g_argv[0]);}static voidset_behavior(ScreenInfo *scr){ static Widget toggle_mb = NULL; Boolean finished = False; Dimension wd, ht; MISC_Ungrab(scr); if (toggle_mb == NULL) { Widget tmp; XmString lab; Arg args[4]; XtSetArg(args[0], XmNmwmDecorations, MWM_DECOR_BORDER); XtSetArg(args[1], XmNmwmFunctions, 0); XtSetArg(args[2], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); XtSetArg(args[3], XmNdefaultPosition, False); toggle_mb = XmCreateQuestionDialog(toplevel, "toggle_question", args, 4); if (!toggle_mb) MWM_Done(0, NULL); tmp = XmMessageBoxGetChild(toggle_mb, XmDIALOG_HELP_BUTTON); XtUnmanageChild(tmp); tmp = XmMessageBoxGetChild(toggle_mb, XmDIALOG_OK_BUTTON); XtAddCallback(tmp, XmNactivateCallback, toggle_behavior, scr); tmp = XmMessageBoxGetChild(toggle_mb, XmDIALOG_CANCEL_BUTTON); XtAddCallback(tmp, XmNactivateCallback, noset_cb, (XtPointer)&finished); tmp = XmMessageBoxGetChild(toggle_mb, XmDIALOG_MESSAGE_LABEL); if (PROP_GetBehavior(scr) & MWM_INFO_STARTUP_STANDARD) lab = XmStringCreateSimple("Toggle to Custom Behavior?"); else lab = XmStringCreateSimple("Toggle to Default Behavior?"); XtVaSetValues(toggle_mb, XmNmessageString, lab, NULL); XmStringFree(lab); XtRealizeWidget(toggle_mb); XtVaGetValues(toggle_mb, XmNwidth, &wd, XmNheight, &ht, NULL); XtVaSetValues(XtParent(toggle_mb), XmNx, (scr->d_width - wd) / 2 - scr->frame_border_width, XmNy, (scr->d_height - ht) / 2 - scr->frame_border_width, NULL); } XtManageChild(toggle_mb); scr->toggle_win = XtWindow(XtParent(toggle_mb)); while (!finished) { XEvent event; if (EVENT_Next(&event)) EVENT_Dispatch(&event); }}/* * Change by PRB (pete@tecc.co.uk), 31/10/93. Prepend a hot key * specifier to each item in the list. This means allocating the * memory for each item (& freeing it) rather than just using the window * title directly. */static voidwin_list(ScreenInfo *scr, int val1, int val2){ MenuRoot *mr; MenuItem *mi, *tmp; MwmWindow *t; char *tname; char loc[40], *name = NULL; int dwidth, dheight; char tlabel[50]; int last_desk_done = INT_MIN; int next_desk; char *t_hot; /* Menu label with hotkey added */ char scut = '0'; /* Current short cut key */ sprintf(tlabel, "CurrentDesk: %d", scr->current_desk); mr = MENU_Create(tlabel); MENU_AddItem(scr, mr, tlabel, "Geometry", NULL, F_TITLE, 0, 0, 's', 's'); next_desk = 0; while (next_desk != INT_MAX) { /* Sort window list by desktop number */ if ((val1 < 2) && (val1 > -2)) { next_desk = INT_MAX; for (t = scr->mwm_root.next; t != NULL; t = t->next) { if ((t->Desk > last_desk_done) && (t->Desk < next_desk)) next_desk = t->Desk; } } else if ((val1 < 4) && (val1 > -4)) { if (last_desk_done == INT_MIN) next_desk = scr->current_desk; else next_desk = INT_MAX; } else { if (last_desk_done == INT_MIN) next_desk = val2; else next_desk = INT_MAX; } last_desk_done = next_desk; for (t = scr->mwm_root.next; t != NULL; t = t->next) { if ((t->Desk == next_desk) && (!(t->flags & WINDOWLISTSKIP))) { if (++scut == ('9' + 1)) scut = 'A'; /* Next shortcut key */ if (val1 % 2 != 0) name = t->icon_label; else name = t->name; t_hot = XtMalloc(strlen(name) + 8); sprintf(t_hot, "%c. %s", scut, name); /* Generate label */ tname = XtMalloc(40); tname[0] = 0; if (t->flags & ICONIFIED) strcpy(tname, "("); sprintf(loc, "%d:", t->Desk); strcat(tname, loc); if (t->frame_x >= 0) sprintf(loc, "+%d", t->frame_x); else sprintf(loc, "%d", t->frame_x); strcat(tname, loc); if (t->frame_y >= 0) sprintf(loc, "+%d", t->frame_y); else sprintf(loc, "%d", t->frame_y); strcat(tname, loc); dheight = t->frame_height - t->title_height - 2 * t->boundary_width - 2 * t->matte_width; dwidth = t->frame_width - 2 * t->boundary_width - 2 * t->matte_width; dwidth -= t->hints.base_width; dheight -= t->hints.base_height; dwidth /= t->hints.width_inc; dheight /= t->hints.height_inc; sprintf(loc, "x%d", dwidth); strcat(tname, loc); sprintf(loc, "x%d", dheight); strcat(tname, loc); if (t->flags & ICONIFIED) strcat(tname, ")"); MENU_AddItem(scr, mr, t_hot, tname, NULL, F_RAISE_IT, (long)t, (long)(t->w), 's', 's'); } } } MENU_Realize(scr, mr); MENU_PopupMenu(scr, mr); XDestroyWindow(dpy, mr->w); XDeleteContext(dpy, mr->w, MenuContext); /* need to free the window list ? */ mi = mr->first; while (mi != NULL) { tmp = mi->next; if (mi->func != F_TITLE) { if (mi->item != NULL) XtFree(mi->item); if (mi->item2 != NULL) XtFree(mi->item2); } XtFree((char *)mi); mi = tmp; } XtFree((char *)mr);}/* * Explicit focus : move focus */static voidExplicitMoveFocus(ScreenInfo *scr, MwmWindow *win, XEvent *event){ if (Mwm.keyboard_focus_policy != XmEXPLICIT) { fprintf(stderr, "ExplicitMoveFocus(_,%p,_) pointer mode\n", win); return; } fprintf(stderr, "ExplicitMoveFocus(_, %p, _)\n", win); if (win) { /* FIX ME move code from circulate() in here to make it work */ }}/*********************************************************************** * * Procedure: * (Un)normalize a window. * ***********************************************************************/static voidnormalize(ScreenInfo *scr, MwmWindow *tmp_win, int val1, int val2, int val1_unit, int val2_unit){ /* Deiconify if iconified */ if (tmp_win->flags & ICONIFIED) { if (val1 <= 0) ICON_DeIconify(scr, tmp_win); } else /* DeMaximize if maximized */ if (tmp_win->flags & MAXIMIZED) { /* Taken from maximize() */ tmp_win->flags &= ~MAXIMIZED; DEC_ConfigureDecorations(scr, tmp_win, tmp_win->orig_x, tmp_win->orig_y, tmp_win->orig_wd, tmp_win->orig_ht, True); DEC_DrawDecorations(scr, tmp_win, True, True, True, None); }}/* * execute a mwm built in function */voidFUNC_Execute(ScreenInfo *scr, int func, char *action, Window in_w, MwmWindow *tmp_win, XEvent *eventp, unsigned long context, long val1, long val2, int val1_unit, int val2_unit, MenuRoot * menu){ MwmWindow *t, *temp; int x, y; Window w; int delta_x, delta_y; int warp_x = 0, warp_y = 0; Pixel TextColor, BackColor; Pixmap BackPixmap; static int prev_screen = -1; int scrno; if (debugging) { fprintf(stderr, "FUNC_Execute: func %d %s context %s menu %s (%s)\n", func, _MwmPrintF(func), _MwmPrintC(context), menu ? menu->name : "(none)", action); } /* Defer Execution may wish to alter this value */ w = in_w; switch (func) { case F_NOP: case F_TITLE: break; case F_BEEP: XBell(dpy, scr->screen); break; case F_CHANGE_WINDOWS_DESK: if (tmp_win == NULL) break; DT_WindowChangingDesks(scr, tmp_win, val1); break; case F_CIRCULATE_UP: t = circulate(scr, tmp_win, action, UP); if (t) WIN_ChangeFocus(scr, t, 0); break; case F_CIRCULATE_DOWN: t = circulate(scr, tmp_win, action, DOWN); if (t) WIN_ChangeFocus(scr, t, 0); break; case F_CLOSE: if (tmp_win == NULL) break; if (function_allowed(func, tmp_win) == 0) { XBell(dpy, scr->screen); break; } /* Dont delete the pager - it crashes the program! */ if ((tmp_win->w == scr->pager_win) || (tmp_win == scr->mwm_pager)) break; if (tmp_win->flags & WM_DELS_WINDOW || tmp_win->flags & WM_SAVE_SELF) { if (tmp_win->flags & WM_DELS_WINDOW) PROP_SendClientMessage(tmp_win->w, XA_WM_DELETE_WINDOW, CurrentTime); else if (tmp_win->flags & WM_SAVE_SELF) PROP_SendClientMessage(tmp_win->w, XA_WM_SAVE_YOURSELF, CurrentTime); wait_quit_timeout(scr, tmp_win); break; } if (XGetGeometry(dpy, tmp_win->w, &JunkRoot, &JunkX, &JunkY, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth) == 0) WIN_DestroyWindow(scr, tmp_win); else XKillClient(dpy, tmp_win->w); XSync(dpy, 0); break; case F_DESK: DT_ChangeDesks(scr, val1, val2); break; case F_EXEC: {#ifndef __EMX__ char *shell; if ((shell = getenv(MWM_SHELL_NAME)) == NULL) { if ((shell = getenv(SHELL_NAME)) == NULL) { shell = DEFAULT_SHELL; } }#endif XGrabPointer(dpy, scr->root_win, True, ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, scr->root_win, scr->cursors[WAIT_CURS], CurrentTime); XSync(dpy, 0);#ifndef __EMX__ if (!fork())
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -