#include "atimer.h"
#include "gtkutil.h"
#include "termhooks.h"
+#include "keyboard.h"
+#include "charset.h"
+#include "coding.h"
#include <gdk/gdkkeysyms.h>
#define FRAME_TOTAL_PIXEL_HEIGHT(f) \
- (PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
+ (FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
\f
xg_set_geometry (f)
FRAME_PTR f;
{
- if (f->output_data.x->size_hint_flags & USPosition)
+ if (f->size_hint_flags & USPosition)
{
- int left = f->output_data.x->left_pos;
- int xneg = f->output_data.x->size_hint_flags & XNegative;
- int top = f->output_data.x->top_pos;
- int yneg = f->output_data.x->size_hint_flags & YNegative;
+ int left = f->left_pos;
+ int xneg = f->size_hint_flags & XNegative;
+ int top = f->top_pos;
+ int yneg = f->size_hint_flags & YNegative;
char geom_str[32];
if (xneg)
top = -top;
sprintf (geom_str, "=%dx%d%c%d%c%d",
- PIXEL_WIDTH (f),
+ FRAME_PIXEL_WIDTH (f),
FRAME_TOTAL_PIXEL_HEIGHT (f),
(xneg ? '-' : '+'), left,
(yneg ? '-' : '+'), top);
int rows;
{
gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
- PIXEL_WIDTH (f), FRAME_TOTAL_PIXEL_HEIGHT (f));
+ FRAME_PIXEL_WIDTH (f), FRAME_TOTAL_PIXEL_HEIGHT (f));
/* base_height is now changed. */
x_wm_set_size_hint (f, 0, 0);
{
int mbheight = FRAME_MENUBAR_HEIGHT (f);
int tbheight = FRAME_TOOLBAR_HEIGHT (f);
- int rows = PIXEL_TO_CHAR_HEIGHT (f, pixelheight - mbheight - tbheight);
- int columns = PIXEL_TO_CHAR_WIDTH (f, pixelwidth);
+ int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, (pixelheight
+ - mbheight - tbheight));
+ int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, pixelwidth);
if (FRAME_GTK_WIDGET (f)
- && (columns != FRAME_WIDTH (f) || rows != FRAME_HEIGHT (f)
- || pixelwidth != PIXEL_WIDTH (f) || pixelheight != PIXEL_HEIGHT (f)))
+ && (columns != FRAME_COLS (f) || rows != FRAME_LINES (f)
+ || pixelwidth != FRAME_PIXEL_WIDTH (f) || pixelheight != FRAME_PIXEL_HEIGHT (f)))
{
struct x_output *x = f->output_data.x;
GtkAllocation all;
gtk_widget_size_allocate (x->edit_widget, &all);
- xg_frame_cleared (f);
-
change_frame_size (f, rows, columns, 0, 1, 0);
SET_FRAME_GARBAGED (f);
cancel_mouse_face (f);
int cols;
int rows;
{
- int pixelheight = CHAR_TO_PIXEL_HEIGHT (f, rows)
+ int pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, rows)
+ FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f);
- int pixelwidth = CHAR_TO_PIXEL_WIDTH (f, cols);
+ int pixelwidth;
/* Take into account the size of the scroll bar. Always use the
number of columns occupied by the scroll bar here otherwise we
might end up with a frame width that is not a multiple of the
frame's character width which is bad for vertically split
windows. */
- f->output_data.x->vertical_scroll_bar_extra
- = (!FRAME_HAS_VERTICAL_SCROLL_BARS (f)
- ? 0
- : (FRAME_SCROLL_BAR_COLS (f)
- * FONT_WIDTH (f->output_data.x->font)));
+ f->scroll_bar_actual_width
+ = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
compute_fringe_widths (f, 0);
+ /* FRAME_TEXT_COLS_TO_PIXEL_WIDTH uses scroll_bar_actual_width, so call it
+ after calculating that value. */
+ pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols);
+
/* Must resize our top level widget. Font size may have changed,
but not rows/cols. */
gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
pixelwidth, pixelheight);
xg_resize_widgets (f, pixelwidth, pixelheight);
+
+ SET_FRAME_GARBAGED (f);
+ cancel_mouse_face (f);
}
/* Convert an X Window WSESC to its corresponding GtkWidget.
gpointer user_data)
{
GList *iter;
-
+
for (iter = GTK_FIXED (widget)->children; iter; iter = g_list_next (iter))
{
GtkFixedChild *child_data = (GtkFixedChild *) iter->data;
gtk_widget_set_name (wfixed, SDATA (Vx_resource_name));
/* If this frame has a title or name, set it in the title bar. */
- if (! NILP (f->title)) title = SDATA (f->title);
- else if (! NILP (f->name)) title = SDATA (f->name);
+ if (! NILP (f->title)) title = SDATA (ENCODE_UTF_8 (f->title));
+ else if (! NILP (f->name)) title = SDATA (ENCODE_UTF_8 (f->name));
if (title) gtk_window_set_title (GTK_WINDOW (wtop), title);
gtk_fixed_set_has_window (GTK_FIXED (wfixed), TRUE);
- gtk_widget_set_size_request (wfixed,
- PIXEL_WIDTH (f),
- PIXEL_HEIGHT (f));
+ gtk_widget_set_size_request (wfixed, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
gtk_container_add (GTK_CONTAINER (wtop), wvbox);
gtk_box_pack_end (GTK_BOX (wvbox), wfixed, TRUE, TRUE, 0);
gtk_widget_modify_style (wfixed, style);
/* GTK does not set any border, and they look bad with GTK. */
- f->output_data.x->border_width = 0;
- f->output_data.x->internal_border_width = 0;
+ f->border_width = 0;
+ f->internal_border_width = 0;
UNBLOCK_INPUT;
gint hint_flags = 0;
int base_width, base_height;
int min_rows = 0, min_cols = 0;
- int win_gravity = f->output_data.x->win_gravity;
+ int win_gravity = f->win_gravity;
if (flags)
{
f->output_data.x->hint_flags = hint_flags;
}
else
- flags = f->output_data.x->size_hint_flags;
+ flags = f->size_hint_flags;
size_hints = f->output_data.x->size_hints;
hint_flags = f->output_data.x->hint_flags;
hint_flags |= GDK_HINT_RESIZE_INC | GDK_HINT_MIN_SIZE;
- size_hints.width_inc = FONT_WIDTH (f->output_data.x->font);
- size_hints.height_inc = f->output_data.x->line_height;
+ size_hints.width_inc = FRAME_COLUMN_WIDTH (f);
+ size_hints.height_inc = FRAME_LINE_HEIGHT (f);
hint_flags |= GDK_HINT_BASE_SIZE;
- base_width = CHAR_TO_PIXEL_WIDTH (f, 0);
- base_height = CHAR_TO_PIXEL_HEIGHT (f, 0)
+ base_width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0);
+ base_height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 0)
+ FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f);
check_frame_size (f, &min_rows, &min_cols);
else
{
/* This is one button to add to the dialog. */
- w = gtk_button_new_with_mnemonic (utf8_label);
+ w = gtk_button_new_with_label (utf8_label);
if (! item->enabled)
gtk_widget_set_sensitive (w, FALSE);
if (select_cb)
GtkWidget *wbox;
wbox = gtk_hbox_new (FALSE, 0);
- wlbl = gtk_label_new_with_mnemonic (utf8_label);
+ wlbl = gtk_label_new (utf8_label);
wkey = gtk_label_new (utf8_key);
gtk_misc_set_alignment (GTK_MISC (wlbl), 0.0, 0.5);
GtkWidget *w;
GtkWidget *wtoadd = 0;
+ /* It has been observed that some menu items have a NULL name field.
+ This will lead to this function being called with a NULL utf8_label.
+ GTK crashes on that so we set a blank label. Why there is a NULL
+ name remains to be investigated. */
+ if (! utf8_label) utf8_label = " ";
+
if (utf8_key)
wtoadd = make_widget_for_menu_item (utf8_label, utf8_key);
{
*group = NULL;
if (utf8_key) w = gtk_check_menu_item_new ();
- else w = gtk_check_menu_item_new_with_mnemonic (utf8_label);
+ else w = gtk_check_menu_item_new_with_label (utf8_label);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), item->selected);
}
else if (item->button_type == BUTTON_TYPE_RADIO)
{
if (utf8_key) w = gtk_radio_menu_item_new (*group);
- else w = gtk_radio_menu_item_new_with_mnemonic (*group, utf8_label);
+ else w = gtk_radio_menu_item_new_with_label (*group, utf8_label);
*group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (w));
if (item->selected)
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (w), TRUE);
{
*group = NULL;
if (utf8_key) w = gtk_menu_item_new ();
- else w = gtk_menu_item_new_with_mnemonic (utf8_label);
+ else w = gtk_menu_item_new_with_label (utf8_label);
}
if (wtoadd) gtk_container_add (GTK_CONTAINER (w), wtoadd);
return w;
}
-/* Return non-zero if NAME specifies a separator (GTK only has one
+/* Return non-zero if LABEL specifies a separator (GTK only has one
separator type) */
static int
-xg_separator_p (char *name)
-{
- if (! name) return 0;
+xg_separator_p (char *label)
+{
+ if (! label) return 0;
+ else if (strlen (label) > 3
+ && strncmp (label, "--", 2) == 0
+ && label[2] != '-')
+ {
+ static char* separator_names[] = {
+ "space",
+ "no-line",
+ "single-line",
+ "double-line",
+ "single-dashed-line",
+ "double-dashed-line",
+ "shadow-etched-in",
+ "shadow-etched-out",
+ "shadow-etched-in-dash",
+ "shadow-etched-out-dash",
+ "shadow-double-etched-in",
+ "shadow-double-etched-out",
+ "shadow-double-etched-in-dash",
+ "shadow-double-etched-out-dash",
+ 0,
+ };
+
+ int i;
+
+ label += 2;
+ for (i = 0; separator_names[i]; ++i)
+ if (strcmp (label, separator_names[i]) == 0)
+ return 1;
+ }
+ else
+ {
+ /* Old-style separator, maybe. It's a separator if it contains
+ only dashes. */
+ while (*label == '-')
+ ++label;
+ if (*label == 0) return 1;
+ }
- return strcmp (name, "--") == 0
- || strncmp (name, "--:", 3) == 0
- || strcmp (name, "---") == 0;
+ return 0;
}
GtkWidget *xg_did_tearoff;
G_CALLBACK (tearoff_remove), menu);
}
-int xg_debug = 0;
-
/* Create a menu item widget, and connect the callbacks.
ITEM decribes the menu item.
F is the frame the created menu belongs to.
utf8_label = get_utf8_string (item->name);
gtk_menu_set_title (GTK_MENU (wmenu), utf8_label);
- w = gtk_menu_item_new_with_mnemonic (utf8_label);
+ w = gtk_menu_item_new_with_label (utf8_label);
gtk_widget_set_sensitive (w, FALSE);
if (utf8_label && utf8_label != item->name) g_free (utf8_label);
}
GtkLabel *wlabel = GTK_LABEL (gtk_bin_get_child (GTK_BIN (witem)));
char *utf8_label = get_utf8_string (val->name);
- gtk_label_set_text_with_mnemonic (wlabel, utf8_label);
+ gtk_label_set_text (wlabel, utf8_label);
iter = g_list_next (iter);
val = val->next;
gtk_label_set_text (wkey, utf8_key);
if (! old_label || strcmp (utf8_label, old_label) != 0)
- gtk_label_set_text_with_mnemonic (wlbl, utf8_label);
+ gtk_label_set_text (wlbl, utf8_label);
if (utf8_key && utf8_key != val->key) g_free (utf8_key);
if (utf8_label && utf8_label != val->name) g_free (utf8_label);
/* The height has changed, resize outer widget and set columns
rows to what we had before adding the menu bar. */
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
SET_FRAME_GARBAGED (f);
UNBLOCK_INPUT;
/* The height has changed, resize outer widget and set columns
rows to what we had before removing the menu bar. */
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
SET_FRAME_GARBAGED (f);
UNBLOCK_INPUT;
scroll_id = xg_store_widget_in_map (wscroll);
- g_signal_connect (G_OBJECT (vadj),
+ g_signal_connect (G_OBJECT (wscroll),
"value-changed",
scroll_callback,
- (gpointer)bar);
+ (gpointer) bar);
g_signal_connect (G_OBJECT (wscroll),
"destroy",
G_CALLBACK (xg_gtk_scroll_destroy),
- (gpointer)scroll_id);
+ (gpointer) scroll_id);
/* Connect to button press and button release to detect if any scroll bar
has the pointer. */
g_signal_connect (G_OBJECT (wscroll),
"button-press-event",
G_CALLBACK (scroll_bar_button_cb),
- (gpointer)bar);
+ (gpointer) bar);
g_signal_connect (G_OBJECT (wscroll),
"button-release-event",
G_CALLBACK (scroll_bar_button_cb),
- (gpointer)bar);
+ (gpointer) bar);
gtk_fixed_put (GTK_FIXED (f->output_data.x->edit_widget),
wscroll, -1, -1);
if (wscroll)
{
GtkWidget *wfixed = f->output_data.x->edit_widget;
- int gheight = max (height, 1);
int winextra = canon_width > width ? (canon_width - width) / 2 : 0;
- int bottom = top + gheight;
+ int bottom = top + height;
gint slider_width;
int oldtop, oldleft, oldbottom;
if (oldleft != left)
{
- gdk_window_clear_area (wfixed->window, xl, top, wbl, gheight);
- gdk_window_clear_area (wfixed->window, xr, top, wbr, gheight);
+ gdk_window_clear_area (wfixed->window, xl, top, wbl, height);
+ gdk_window_clear_area (wfixed->window, xr, top, wbr, height);
}
if (oldtop > top)
/* Move and resize to new values. */
gtk_fixed_move (GTK_FIXED (wfixed), wscroll, left, top);
- gtk_widget_set_size_request (wscroll, width, gheight);
+ gtk_widget_set_size_request (wscroll, width, height);
+
+ /* Must force out update so changed scroll bars gets redrawn. */
+ gdk_window_process_all_updates ();
SET_FRAME_GARBAGED (f);
cancel_mouse_face (f);
/* We do the same as for MOTIF in xterm.c, assume 30 chars per line
rather than the real portion value. This makes the thumb less likely
to resize and that looks better. */
- portion = XFASTINT (XWINDOW (bar->window)->height) * 30;
+ portion = WINDOW_TOTAL_LINES (XWINDOW (bar->window)) * 30;
/* When the thumb is at the bottom, position == whole.
So we need to increase `whole' to make space for the thumb. */
whole += portion;
value = max (value, XG_SB_MIN);
/* Assume all lines are of equal size. */
- new_step = size / max (1, FRAME_HEIGHT (f));
+ new_step = size / max (1, FRAME_LINES (f));
if ((int) adj->page_size != size
|| (int) adj->step_increment != new_step)
FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (w), XG_FRAME_DATA);
Lisp_Object key, frame;
struct input_event event;
+ EVENT_INIT (event);
if (! f || ! f->n_tool_bar_items || NILP (f->tool_bar_items))
return;
/* The height has changed, resize outer widget and set columns
rows to what we had before detaching the tool bar. */
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
}
}
/* The height has changed, resize outer widget and set columns
rows to what we had before detaching the tool bar. */
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
}
}
GdkEventExpose *event;
gpointer client_data;
{
- event->area.x = event->area.y = 0;
- event->area.width = event->area.height = 1000;
+ gint width, height;
+
+ gdk_drawable_get_size (event->window, &width, &height);
+
+ event->area.x -= width > event->area.width ? width-event->area.width : 0;
+ event->area.y -= height > event->area.height ? height-event->area.height : 0;
+
+ event->area.x = max(0, event->area.x);
+ event->area.y = max(0, event->area.y);
+
+ event->area.width = max (width, event->area.width);
+ event->area.height = max (height, event->area.height);
+
return FALSE;
}
/* The height has changed, resize outer widget and set columns
rows to what we had before adding the tool bar. */
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
SET_FRAME_GARBAGED (f);
}
if (old_req.height != new_req.height)
{
FRAME_TOOLBAR_HEIGHT (f) = new_req.height;
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
}
- /* Must force out update so changed images gets redrawn. */
- gdk_window_process_all_updates ();
-
if (icon_list) g_list_free (icon_list);
UNBLOCK_INPUT;
/* The height has changed, resize outer widget and set columns
rows to what we had before removing the tool bar. */
- xg_resize_outer_widget (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+ xg_resize_outer_widget (f, FRAME_COLS (f), FRAME_LINES (f));
SET_FRAME_GARBAGED (f);
UNBLOCK_INPUT;