static void scroll_line (int dist, int direction) { /* The idea here is to implement a horizontal scroll in one line to implement delete and half of insert. */ SMALL_RECT scroll; COORD dest; CHAR_INFO fill; struct frame * f = PICK_FRAME (); scroll.Top = cursor_coords.Y; scroll.Bottom = cursor_coords.Y; if (direction == LEFT) { scroll.Left = cursor_coords.X + dist; scroll.Right = FRAME_COLS (f) - 1; } else { scroll.Left = cursor_coords.X; scroll.Right = FRAME_COLS (f) - dist - 1; } dest.X = cursor_coords.X; dest.Y = cursor_coords.Y; fill.Char.AsciiChar = 0x20; fill.Attributes = char_attr_normal; ScrollConsoleScreenBuffer (cur_screen, &scroll, NULL, dest, &fill); }
static void set_frame_size (EmacsFrame ew) { /* The widget hierarchy is argv[0] emacsShell pane Frame-NAME ApplicationShell EmacsShell Paned EmacsFrame We accept geometry specs in this order: *Frame-NAME.geometry *EmacsFrame.geometry Emacs.geometry Other possibilities for widget hierarchies might be argv[0] frame pane Frame-NAME ApplicationShell EmacsShell Paned EmacsFrame or argv[0] Frame-NAME pane Frame-NAME ApplicationShell EmacsShell Paned EmacsFrame or argv[0] Frame-NAME pane emacsTextPane ApplicationShell EmacsFrame Paned EmacsTextPane With the current setup, the text-display-area is the part which is an emacs "frame", since that's the only part managed by emacs proper (the menubar and the parent of the menubar and all that sort of thing are managed by lwlib.) The EmacsShell widget is simply a replacement for the Shell widget which is able to deal with using an externally-supplied window instead of always creating its own. It is not actually emacs specific, and should possibly have class "Shell" instead of "EmacsShell" to simplify the resources. */ /* Hairily merged geometry */ struct frame *f = ew->emacs_frame.frame; int w = FRAME_COLS (f); int h = FRAME_LINES (f); Widget wmshell = get_wm_shell ((Widget) ew); Dimension pixel_width, pixel_height; /* Each Emacs shell is now independent and top-level. */ if (! XtIsSubclass (wmshell, shellWidgetClass)) emacs_abort (); char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height); ew->core.width = (frame_resize_pixelwise ? FRAME_PIXEL_WIDTH (f) : pixel_width); ew->core.height = (frame_resize_pixelwise ? FRAME_PIXEL_HEIGHT (f) : pixel_height); frame_size_history_add (f, Qset_frame_size, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), list2 (make_number (ew->core.width), make_number (ew->core.height))); }
/* Clear from cursor to end of screen. */ static void w32con_clear_to_end (void) { struct frame * f = PICK_FRAME (); w32con_clear_end_of_line (FRAME_COLS (f) - 1); w32con_ins_del_lines (cursor_coords.Y, FRAME_LINES (f) - cursor_coords.Y - 1); }
/* Insert n lines at vpos. if n is negative delete -n lines. */ static void w32con_ins_del_lines (int vpos, int n) { int i, nb; SMALL_RECT scroll; COORD dest; CHAR_INFO fill; struct frame * f = PICK_FRAME (); if (n < 0) { scroll.Top = vpos - n; scroll.Bottom = FRAME_LINES (f); dest.Y = vpos; } else { scroll.Top = vpos; scroll.Bottom = FRAME_LINES (f) - n; dest.Y = vpos + n; } scroll.Left = 0; scroll.Right = FRAME_COLS (f); dest.X = 0; fill.Char.AsciiChar = 0x20; fill.Attributes = char_attr_normal; ScrollConsoleScreenBuffer (cur_screen, &scroll, NULL, dest, &fill); /* Here we have to deal with a w32 console flake: If the scroll region looks like abc and we scroll c to a and fill with d we get cbd... if we scroll block c one line at a time to a, we get cdd... Emacs expects cdd consistently... So we have to deal with that here... (this also occurs scrolling the same way in the other direction. */ if (n > 0) { if (scroll.Bottom < dest.Y) { for (i = scroll.Bottom; i < dest.Y; i++) { w32con_move_cursor (i, 0); w32con_clear_end_of_line (FRAME_COLS (f)); } } } else { nb = dest.Y + (scroll.Bottom - scroll.Top) + 1; if (nb < scroll.Top) { for (i = nb; i < scroll.Top; i++) { w32con_move_cursor (i, 0); w32con_clear_end_of_line (FRAME_COLS (f)); } } } cursor_coords.X = 0; cursor_coords.Y = vpos; }
/* Clear from cursor to end of screen. */ static void w32con_clear_to_end (struct frame *f) { w32con_clear_end_of_line (f, FRAME_COLS (f) - 1); w32con_ins_del_lines (f, cursor_coords.Y, FRAME_LINES (f) - cursor_coords.Y - 1); }