Mercurial > emacs
view lisp/electric.el @ 109581:06384b3caebf
Add ability to put Gtk+ tool bar on the left/right/bottom or top. Default top.
* lisp/menu-bar.el (menu-bar-showhide-tool-bar-menu-customize-enable-left)
(menu-bar-showhide-tool-bar-menu-customize-disable)
(menu-bar-showhide-tool-bar-menu-customize-enable-right)
(menu-bar-showhide-tool-bar-menu-customize-enable-top)
(menu-bar-showhide-tool-bar-menu-customize-enable-bottom): New functions
(menu-bar-showhide-tool-bar-menu): If tool bar is moveable,
make a menu for Options => toolbar that can move it.
* src/frame.c (Qtool_bar_position): New variable.
(make_frame): Set tool_bar_position to Qtop.
(frame_parms): Add tool-bar-position.
(x_report_frame_params): Store tool_bar_position.
(x_set_fringe_width): Reset wm size hint after fringe changes.
* src/frame.h (struct frame): Add tool_bar_position.
(Qbottom): Declare.
* src/gtkutil.c (FRAME_TOTAL_PIXEL_WIDTH): New macro.
(xg_frame_set_char_size): Add FRAME_TOOLBAR_WIDTH to pixelwidth.
(xg_height_or_width_changed): Use FRAME_TOTAL_PIXEL_WIDTH.
(xg_create_frame_widgets): Create a hobox for placing widgets
vertically. Use gtk_box_pack_start.
(xg_height_or_width_changed): Renamed from xg_height_changed.
(x_wm_set_size_hint): Add FRAME_TOOLBAR_WIDTH to base_width.
(xg_update_frame_menubar, free_frame_menubar): Change to
xg_height_or_width_changed.
(xg_tool_bar_detach_callback): Update left/right/top/bottom tool bar
size correctly. Remove hardcoded 4, instead use handlebox size -
toolbar size.
(xg_tool_bar_attach_callback): Update left/right/top/bottom tool bar
size correctly. Use handlebox size + toolbar size as additional
size.
(xg_pack_tool_bar): POS is a new parameter.
Set orientation of tool bar based on pos.
Only make handlebox_widget if NULL.
Check if tool bar goes to vbox or hbox depending on pos.
(xg_update_tool_bar_sizes): New function.
(update_frame_tool_bar): Remove old_req, new_req. Do not get tool bar
height, call xg_update_tool_bar_sizes instead.
(free_frame_tool_bar): Remove from hbox or vbox depending on
toolbar_in_hbox, Set all FRAME_TOOLBAR_*_(WIDTH|HEIGHT) to zero.
(xg_change_toolbar_position): New function.
* src/gtkutil.h (xg_change_toolbar_position): Declare.
* src/window.c (calc_absolute_offset): Check for FRAME_TOOLBAR_TOP_HEIGHT
and FRAME_TOOLBAR_LEFT_WIDTH.
* src/xfns.c (x_set_tool_bar_position): New function.
(xic_set_statusarea): Use FRAME_TOOLBAR_TOP_HEIGHT.
(x_frame_parm_handlers): Add x_set_tool_bar_position.
(syms_of_xfns): if USE_GTK, provide move-toolbar.
* src/xterm.c (x_set_window_size_1): Add FRAME_TOOLBAR_WIDTH to pixelwidth.
* src/xterm.h (struct x_output): Add toolbar_top_height,
toolbar_bottom_height, toolbar_left_width, toolbar_right_width. Remove
toolbar_height.
if USE_GTK: Add hbox_widget and toolbar_in_hbox.
(FRAME_TOOLBAR_TOP_HEIGHT, FRAME_TOOLBAR_BOTTOM_HEIGHT)
(FRAME_TOOLBAR_LEFT_WIDTH, FRAME_TOOLBAR_RIGHT_WIDTH): New macros.
(FRAME_TOOLBAR_HEIGHT): Is now TOP_HEIGHT + BOTTOM_HEIGHT.
author | Jan D. <jan.h.d@swipnet.se> |
---|---|
date | Thu, 29 Jul 2010 18:49:59 +0200 |
parents | 8e422499f0ff |
children | c9b982e5aefd |
line wrap: on
line source
;;; electric.el --- window maker and Command loop for `electric' modes ;; Copyright (C) 1985, 1986, 1995, 2001, 2002, 2003, 2004, ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: K. Shane Hartman ;; Maintainer: FSF ;; Keywords: extensions ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. ;;; Commentary: ; zaaaaaaap ;;; Code: ;; This loop is the guts for non-standard modes which retain control ;; until some event occurs. It is a `do-forever', the only way out is ;; to throw. It assumes that you have set up the keymap, window, and ;; everything else: all it does is read commands and execute them - ;; providing error messages should one occur (if there is no loop ;; function - which see). The required argument is a tag which should ;; expect a value of nil if the user decides to punt. The second ;; argument is the prompt to be used: if nil, use "->", if 'noprompt, ;; don't use a prompt, if a string, use that string as prompt, and if ;; a function of no variable, it will be evaluated in every iteration ;; of the loop and its return value, which can be nil, 'noprompt or a ;; string, will be used as prompt. Given third argument non-nil, it ;; INHIBITS quitting unless the user types C-g at toplevel. This is ;; so user can do things like C-u C-g and not get thrown out. Fourth ;; argument, if non-nil, should be a function of two arguments which ;; is called after every command is executed. The fifth argument, if ;; provided, is the state variable for the function. If the ;; loop-function gets an error, the loop will abort WITHOUT throwing ;; (moral: use unwind-protect around call to this function for any ;; critical stuff). The second argument for the loop function is the ;; conditions for any error that occurred or nil if none. (defun Electric-command-loop (return-tag &optional prompt inhibit-quit loop-function loop-state) (let (cmd (err nil) (prompt-string prompt)) (while t (if (functionp prompt) (setq prompt-string (funcall prompt))) (if (not (stringp prompt-string)) (setq prompt-string (unless (eq prompt-string 'noprompt) "->"))) (setq cmd (read-key-sequence prompt-string)) (setq last-command-event (aref cmd (1- (length cmd))) this-command (key-binding cmd t) cmd this-command) ;; This makes universal-argument-other-key work. (setq universal-argument-num-events 0) (if (or (prog1 quit-flag (setq quit-flag nil)) (eq last-input-event ?\C-g)) (progn (setq unread-command-events nil prefix-arg nil) ;; If it wasn't cancelling a prefix character, then quit. (if (or (= (length (this-command-keys)) 1) (not inhibit-quit)) ; safety (progn (ding) (message "Quit") (throw return-tag nil)) (setq cmd nil)))) (setq current-prefix-arg prefix-arg) (if cmd (condition-case conditions (progn (command-execute cmd) (setq last-command this-command) (if (or (prog1 quit-flag (setq quit-flag nil)) (eq last-input-event ?\C-g)) (progn (setq unread-command-events nil) (if (not inhibit-quit) (progn (ding) (message "Quit") (throw return-tag nil)) (ding))))) (buffer-read-only (if loop-function (setq err conditions) (ding) (message "Buffer is read-only") (sit-for 2))) (beginning-of-buffer (if loop-function (setq err conditions) (ding) (message "Beginning of Buffer") (sit-for 2))) (end-of-buffer (if loop-function (setq err conditions) (ding) (message "End of Buffer") (sit-for 2))) (error (if loop-function (setq err conditions) (ding) (message "Error: %s" (if (eq (car conditions) 'error) (car (cdr conditions)) (prin1-to-string conditions))) (sit-for 2)))) (ding)) (if loop-function (funcall loop-function loop-state err)))) (ding) (throw return-tag nil)) ;; This function is like pop-to-buffer, sort of. ;; The algorithm is ;; If there is a window displaying buffer ;; Select it ;; Else if there is only one window ;; Split it, selecting the window on the bottom with height being ;; the lesser of max-height (if non-nil) and the number of lines in ;; the buffer to be displayed subject to window-min-height constraint. ;; Else ;; Switch to buffer in the current window. ;; ;; Then if max-height is nil, and not all of the lines in the buffer ;; are displayed, grab the whole frame. ;; ;; Returns selected window on buffer positioned at point-min. (defun Electric-pop-up-window (buffer &optional max-height) (let* ((win (or (get-buffer-window buffer) (selected-window))) (buf (get-buffer buffer)) (one-window (one-window-p t)) (pop-up-windows t) (pop-up-frames nil)) (if (not buf) (error "Buffer %s does not exist" buffer) (cond ((and (eq (window-buffer win) buf)) (select-window win)) (one-window (pop-to-buffer buffer) (setq win (selected-window))) (t (switch-to-buffer buf))) ;; Don't shrink the window, but expand it if necessary. (goto-char (point-min)) (unless (= (point-max) (window-end win t)) (fit-window-to-buffer win max-height)) win))) (provide 'electric) ;; arch-tag: dae045eb-dc2d-4fb7-9f27-9cc2ce277be8 ;;; electric.el ends here