Mercurial > hg > xemacs-beta
annotate src/native-gtk-toolbar.c @ 5533:11da5b828d10
shell-command and shell-command-on-region API compliant with FSF 23.3.1
| author | Mats Lidell <mats.lidell@cag.se> |
|---|---|
| date | Sun, 31 Jul 2011 01:29:09 +0200 |
| parents | 308d34e9f07d |
| children |
| rev | line source |
|---|---|
| 462 | 1 /* toolbar implementation -- GTK interface. |
| 2 Copyright (C) 2000 Aaron Lehmann | |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
3 Copyright (C) 2010 Ben Wing. |
| 462 | 4 |
| 5 This file is part of XEmacs. | |
| 6 | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5178
diff
changeset
|
7 XEmacs is free software: you can redistribute it and/or modify it |
| 462 | 8 under the terms of the GNU General Public License as published by the |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5178
diff
changeset
|
9 Free Software Foundation, either version 3 of the License, or (at your |
|
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5178
diff
changeset
|
10 option) any later version. |
| 462 | 11 |
| 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 15 for more details. | |
| 16 | |
| 17 You should have received a copy of the GNU General Public License | |
|
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
5178
diff
changeset
|
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
| 462 | 19 |
| 20 /* Synched up with: Not in FSF. */ | |
| 21 | |
| 22 #include <config.h> | |
| 23 #include "lisp.h" | |
| 24 | |
| 25 #include "console-gtk.h" | |
| 26 #include "glyphs-gtk.h" | |
|
5176
8b2f75cecb89
rename objects* (.c, .h and .el files) to fontcolor*
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
27 #include "fontcolor-gtk.h" |
| 462 | 28 |
| 29 #include "faces.h" | |
| 30 #include "frame.h" | |
| 31 #include "toolbar.h" | |
| 32 #include "window.h" | |
| 33 | |
| 34 static void | |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
35 gtk_clear_toolbar (struct frame *f, enum edge_pos pos); |
| 462 | 36 |
| 37 static void | |
| 2286 | 38 gtk_toolbar_callback (GtkWidget *UNUSED (w), gpointer user_data) |
| 462 | 39 { |
| 40 struct toolbar_button *tb = (struct toolbar_button *) user_data; | |
| 41 | |
| 42 call0 (tb->callback); | |
| 43 } | |
| 44 | |
| 45 | |
| 46 static void | |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
47 gtk_output_toolbar (struct frame *f, enum edge_pos pos) |
| 462 | 48 { |
| 49 GtkWidget *toolbar; | |
| 50 Lisp_Object button, window, glyph, instance; | |
| 51 unsigned int checksum = 0; | |
| 52 struct window *w; | |
| 53 int x, y, bar_width, bar_height, vert; | |
| 54 int cur_x, cur_y; | |
| 55 | |
| 56 window = FRAME_LAST_NONMINIBUF_WINDOW (f); | |
| 57 w = XWINDOW (window); | |
| 58 | |
| 59 get_toolbar_coords (f, pos, &x, &y, &bar_width, &bar_height, &vert, 0); | |
| 60 | |
| 61 /* Get the toolbar and delete the old widgets in it */ | |
| 62 button = FRAME_TOOLBAR_BUTTONS (f, pos); | |
| 63 | |
| 64 /* First loop over all of the buttons to determine how many there | |
| 65 are. This loop will also make sure that all instances are | |
| 66 instantiated so when we actually output them they will come up | |
| 67 immediately. */ | |
| 68 while (!NILP (button)) | |
| 69 { | |
| 70 struct toolbar_button *tb = XTOOLBAR_BUTTON (button); | |
| 71 checksum = HASH4 (checksum, | |
| 72 internal_hash (get_toolbar_button_glyph(w, tb), 0), | |
| 73 internal_hash (tb->callback, 0), | |
| 74 0 /* width */); | |
| 75 button = tb->next; | |
| 76 } | |
| 77 | |
| 78 /* Only do updates if the toolbar has changed, or this is the first | |
| 79 time we have drawn it in this position | |
| 80 */ | |
| 81 if (FRAME_GTK_TOOLBAR_WIDGET (f)[pos] && | |
| 82 FRAME_GTK_TOOLBAR_CHECKSUM (f, pos) == checksum) | |
| 83 { | |
| 84 return; | |
| 85 } | |
| 86 | |
| 87 /* Loop through buttons and add them to our toolbar. | |
| 88 This code ignores the button dimensions as we let GTK handle that :) | |
| 89 Attach the toolbar_button struct to the toolbar button so we know what | |
| 90 function to use as a callback. */ | |
| 91 | |
| 92 { | |
| 93 gtk_clear_toolbar (f, pos); | |
| 94 FRAME_GTK_TOOLBAR_WIDGET (f)[pos] = toolbar = | |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
95 gtk_toolbar_new (((pos == TOP_EDGE) || (pos == BOTTOM_EDGE)) ? |
| 462 | 96 GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL, |
| 97 GTK_TOOLBAR_BOTH); | |
| 98 } | |
| 99 | |
| 100 if (NILP (w->toolbar_buttons_captioned_p)) | |
| 101 gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_ICONS); | |
| 102 else | |
| 103 gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_BOTH); | |
| 104 | |
| 105 FRAME_GTK_TOOLBAR_CHECKSUM(f, pos) = checksum; | |
| 106 button = FRAME_TOOLBAR_BUTTONS (f, pos); | |
| 107 | |
| 108 cur_x = 0; | |
| 109 cur_y = 0; | |
| 110 | |
| 111 while (!NILP (button)) | |
| 112 { | |
| 113 struct toolbar_button *tb = XTOOLBAR_BUTTON (button); | |
| 114 | |
| 115 if (tb->blank) | |
| 116 { | |
| 117 /* It is a blank space... we do not pay attention to the | |
| 118 size, because the GTK toolbar does not allow us to | |
| 119 specify different spacings. *sigh* | |
| 120 */ | |
| 121 gtk_toolbar_append_space (GTK_TOOLBAR (toolbar)); | |
| 122 } | |
| 123 else | |
| 124 { | |
| 125 /* It actually has a glyph associated with it! What WILL | |
| 126 they think of next? | |
| 127 */ | |
| 128 glyph = tb->up_glyph; | |
| 129 | |
| 130 /* #### It is currently possible for users to trash us by directly | |
| 131 changing the toolbar glyphs. Avoid crashing in that case. */ | |
| 132 if (GLYPHP (glyph)) | |
| 793 | 133 instance = glyph_image_instance (glyph, window, |
| 134 ERROR_ME_DEBUG_WARN, 1); | |
| 462 | 135 else |
| 136 instance = Qnil; | |
| 137 | |
| 138 if (IMAGE_INSTANCEP(instance)) | |
| 139 { | |
| 140 GtkWidget *pixmapwid; | |
| 141 GdkPixmap *pixmap; | |
| 142 GdkBitmap *mask; | |
| 143 char *tooltip = NULL; | |
| 144 | |
| 145 if (STRINGP (tb->help_string)) | |
| 146 tooltip = XSTRING_DATA (tb->help_string); | |
| 147 | |
| 148 pixmap = XIMAGE_INSTANCE_GTK_PIXMAP(instance); | |
| 149 mask = XIMAGE_INSTANCE_GTK_MASK(instance); | |
| 150 pixmapwid = gtk_pixmap_new (pixmap, mask); | |
| 151 | |
| 152 gtk_widget_set_usize (pixmapwid, tb->width, tb->height); | |
| 153 | |
| 154 gtk_toolbar_append_item (GTK_TOOLBAR(toolbar), NULL, tooltip, NULL, | |
| 155 pixmapwid, gtk_toolbar_callback, (gpointer) tb); | |
| 156 } | |
| 157 } | |
| 158 cur_x += vert ? 0 : tb->width; | |
| 159 cur_y += vert ? tb->height : 0; | |
| 160 /* Who's idea was it to use a linked list for toolbar buttons? */ | |
| 161 button = tb->next; | |
| 162 } | |
| 163 | |
| 164 SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 1); | |
| 165 | |
| 166 x -= vert ? 3 : 2; | |
| 167 y -= vert ? 2 : 3; | |
| 168 | |
| 169 gtk_fixed_put (GTK_FIXED (FRAME_GTK_TEXT_WIDGET (f)), FRAME_GTK_TOOLBAR_WIDGET (f)[pos],x, y); | |
| 170 gtk_widget_show_all (FRAME_GTK_TOOLBAR_WIDGET (f)[pos]); | |
| 171 } | |
| 172 | |
| 173 static void | |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
174 gtk_clear_toolbar (struct frame *f, enum edge_pos pos) |
| 462 | 175 { |
| 176 FRAME_GTK_TOOLBAR_CHECKSUM (f, pos) = 0; | |
| 177 SET_TOOLBAR_WAS_VISIBLE_FLAG (f, pos, 0); | |
| 178 if (FRAME_GTK_TOOLBAR_WIDGET(f)[pos]) | |
| 179 gtk_widget_destroy (FRAME_GTK_TOOLBAR_WIDGET(f)[pos]); | |
| 180 } | |
| 181 | |
| 182 static void | |
| 183 gtk_output_frame_toolbars (struct frame *f) | |
| 184 { | |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
185 enum edge_pos pos; |
| 462 | 186 |
|
5077
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
187 EDGE_POS_LOOP (pos) |
|
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
188 { |
|
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
189 if (FRAME_REAL_TOOLBAR_VISIBLE (f, pos)) |
|
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
190 gtk_output_toolbar (f, pos); |
|
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
191 else if (f->toolbar_was_visible[pos]) |
|
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
192 gtk_clear_toolbar (f, pos); |
|
d372b17f63ce
clean up toolbar/gutter edge geometry
Ben Wing <ben@xemacs.org>
parents:
2500
diff
changeset
|
193 } |
| 462 | 194 } |
| 195 | |
| 196 static void | |
| 2286 | 197 gtk_initialize_frame_toolbars (struct frame *UNUSED (f)) |
| 462 | 198 { |
| 199 stderr_out ("We should draw toolbars\n"); | |
| 200 } | |
| 201 | |
| 202 | |
| 203 /************************************************************************/ | |
| 204 /* initialization */ | |
| 205 /************************************************************************/ | |
| 206 | |
| 207 void | |
| 208 console_type_create_toolbar_gtk (void) | |
| 209 { | |
| 210 CONSOLE_HAS_METHOD (gtk, output_frame_toolbars); | |
| 211 CONSOLE_HAS_METHOD (gtk, initialize_frame_toolbars); | |
| 212 } |
