Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
810f2256
Commit
810f2256
authored
Nov 16, 2003
by
Jan Djärv
Browse files
Implement multiple display handling for GTK.
parent
0bdd0f79
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
411 additions
and
160 deletions
+411
-160
src/ChangeLog
src/ChangeLog
+52
-0
src/gtkutil.c
src/gtkutil.c
+199
-45
src/gtkutil.h
src/gtkutil.h
+7
-2
src/xdisp.c
src/xdisp.c
+2
-2
src/xfns.c
src/xfns.c
+19
-19
src/xmenu.c
src/xmenu.c
+4
-3
src/xterm.c
src/xterm.c
+123
-89
src/xterm.h
src/xterm.h
+5
-0
No files found.
src/ChangeLog
View file @
810f2256
2003-11-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* xfns.c (x_window_to_frame, x_any_window_to_frame)
(x_non_menubar_window_to_frame, x_menubar_window_to_frame)
(x_top_window_to_frame): Add Display* argument to xg_win_to_widget.
(x_create_bitmap_mask, xg_set_icon, create_frame_xic)
(xic_set_statusarea, x_window, gif_load): Formatting adjustments.
* xterm.h (struct x_display_info): New field xg_cursor for GTK.
* xterm.c: Add Display * to x_window_to_scroll_bar declaration.
(XTmouse_position, handle_one_xevent): Pass Display* to
x_window_to_scroll_bar.
(x_window_to_scroll_bar): Take a Display* argument.
Check that display for frame is equal to Display* argument.
(event_handler_gdk): current_dpyinfo removed. Get dpyinfo from
x_display_info_for_display instead. Use Display in xev instead
of GDK_DISPLAY.
(x_dispatch_event): Call x_display_info_for_display.
(XTread_socket): Move GTK part out of loop. current_dpyinfo removed.
(x_connection_closed): Call xg_display_close for GTK.
(x_term_init): Call xg_display_open for additional displays.
Initiate dpyinfo->xg_cursor with call to xg_create_default_cursor
for GTK.
* xmenu.c (single_menu_item, mouse_position_for_popup)
(x_activate_menubar): Formatting adjustments.
* xdisp.c (update_tool_bar, redisplay_tool_bar): Formatting
adjustments.
* gtkutil.c (xg_get_gdk_display, xg_set_screen, xg_display_open)
(xg_display_close, xg_create_default_cursor)
(xg_get_gdk_pixmap_and_mask): New functions for multiple display
handling.
(xg_left_ptr_cursor): Removed.
(xg_set_cursor): cursor changed to GdkCursor*. Do not create
cursor here.
(xg_win_to_widget): Take Display* argument, call
gdk_xid_table_lookup_for_display.
(xg_create_frame_widgets, xg_get_file_name, create_menus)
(xg_create_widget, xg_modify_menubar_widgets): Call xg_set_screen.
(xg_create_widget, xg_create_scroll_bar): Use xg_cursor
in FRAME_X_DISPLAY_INFO.
(xg_get_scroll_id_for_window): Take Display* argument.
(update_frame_tool_bar): Call xg_get_gdk_pixmap_and_mask.
(xg_initialize): xg_left_ptr_cursor removed.
* gtkutil.h: xg_get_scroll_id_for_window, xg_win_to_widget takes
Display* argument also. Declare xg_display_open,
xg_display_close, xg_create_default_cursor.
2003-11-14 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
2003-11-14 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* xterm.c (x_detect_focus_change): Do not change focus frame for
* xterm.c (x_detect_focus_change): Do not change focus frame for
...
...
src/gtkutil.c
View file @
810f2256
...
@@ -36,9 +36,128 @@ Boston, MA 02111-1307, USA. */
...
@@ -36,9 +36,128 @@ Boston, MA 02111-1307, USA. */
#include "coding.h"
#include "coding.h"
#include <gdk/gdkkeysyms.h>
#include <gdk/gdkkeysyms.h>
#define FRAME_TOTAL_PIXEL_HEIGHT(f) \
#define FRAME_TOTAL_PIXEL_HEIGHT(f) \
(FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
(FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
/***********************************************************************
Display handling functions
***********************************************************************/
#ifdef HAVE_GTK_MULTIDISPLAY
/* Return the GdkDisplay that corresponds to the X display DPY. */
static
GdkDisplay
*
xg_get_gdk_display
(
dpy
)
Display
*
dpy
;
{
return
gdk_x11_lookup_xdisplay
(
dpy
);
}
/* When the GTK widget W is to be created on a display for F that
is not the default display, set the display for W.
W can be a GtkMenu or a GtkWindow widget. */
static
void
xg_set_screen
(
w
,
f
)
GtkWidget
*
w
;
FRAME_PTR
f
;
{
if
(
FRAME_X_DISPLAY
(
f
)
!=
GDK_DISPLAY
())
{
GdkDisplay
*
gdpy
=
gdk_x11_lookup_xdisplay
(
FRAME_X_DISPLAY
(
f
));
GdkScreen
*
gscreen
=
gdk_display_get_default_screen
(
gdpy
);
if
(
GTK_IS_MENU
(
w
))
gtk_menu_set_screen
(
GTK_MENU
(
w
),
gscreen
);
else
gtk_window_set_screen
(
GTK_WINDOW
(
w
),
gscreen
);
}
}
#else
/* not HAVE_GTK_MULTIDISPLAY */
/* Make some defines so we can use the GTK 2.2 functions when
compiling with GTK 2.0. */
#define xg_set_screen(w, f)
#define gdk_xid_table_lookup_for_display(dpy, w) gdk_xid_table_lookup (w)
#define gdk_pixmap_foreign_new_for_display(dpy, p) gdk_pixmap_foreign_new (p)
#define gdk_cursor_new_for_display(dpy, c) gdk_cursor_new (c)
#define gdk_x11_lookup_xdisplay(dpy) 0
#define GdkDisplay void
#endif
/* not HAVE_GTK_MULTIDISPLAY */
/* Open a display named by DISPLAY_NAME. The display is returned in *DPY.
*DPY is set to NULL if the display can't be opened.
Returns non-zero if display could be opened, zero if display could not
be opened, and less than zero if the GTK version doesn't support
multipe displays. */
int
xg_display_open
(
display_name
,
dpy
)
char
*
display_name
;
Display
**
dpy
;
{
#ifdef HAVE_GTK_MULTIDISPLAY
GdkDisplay
*
gdpy
;
gdpy
=
gdk_display_open
(
display_name
);
*
dpy
=
gdpy
?
GDK_DISPLAY_XDISPLAY
(
gdpy
)
:
NULL
;
return
gdpy
!=
NULL
;
#else
/* not HAVE_GTK_MULTIDISPLAY */
return
-
1
;
#endif
/* not HAVE_GTK_MULTIDISPLAY */
}
void
xg_display_close
(
Display
*
dpy
)
{
#ifdef HAVE_GTK_MULTIDISPLAY
GdkDisplay
*
gdpy
=
gdk_x11_lookup_xdisplay
(
dpy
);
/* GTK 2.2 has a bug that makes gdk_display_close crash (bug
http://bugzilla.gnome.org/show_bug.cgi?id=85715). This way
we can continue running, but there will be memory leaks. */
#if GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION < 4
/* If this is the default display, we must change it before calling
dispose, otherwise it will crash. */
if
(
gdk_display_get_default
()
==
gdpy
)
{
struct
x_display_info
*
dpyinfo
;
Display
*
new_dpy
=
0
;
GdkDisplay
*
gdpy_new
;
/* Find another display. */
for
(
dpyinfo
=
x_display_list
;
dpyinfo
;
dpyinfo
=
dpyinfo
->
next
)
if
(
dpyinfo
->
display
!=
dpy
)
{
new_dpy
=
dpyinfo
->
display
;
break
;
}
if
(
!
new_dpy
)
return
;
/* Emacs will exit anyway. */
gdpy_new
=
gdk_x11_lookup_xdisplay
(
new_dpy
);
gdk_display_manager_set_default_display
(
gdk_display_manager_get
(),
gdpy_new
);
}
g_object_run_dispose
(
G_OBJECT
(
gdpy
));
#else
/* I hope this will be fixed in GTK 2.4. It is what bug 85715 says. */
gdk_display_close
(
gdpy
);
#endif
#endif
/* HAVE_GTK_MULTIDISPLAY */
}
/***********************************************************************
/***********************************************************************
...
@@ -48,10 +167,6 @@ Boston, MA 02111-1307, USA. */
...
@@ -48,10 +167,6 @@ Boston, MA 02111-1307, USA. */
NULL if no timer is started. */
NULL if no timer is started. */
static
struct
atimer
*
xg_timer
;
static
struct
atimer
*
xg_timer
;
/* The cursor used for scroll bars and popup menus.
We only have one cursor for all scroll bars and all popup menus. */
static
GdkCursor
*
xg_left_ptr_cursor
;
/* The next two variables and functions are taken from lwlib. */
/* The next two variables and functions are taken from lwlib. */
static
widget_value
*
widget_value_free_list
;
static
widget_value
*
widget_value_free_list
;
...
@@ -103,24 +218,48 @@ free_widget_value (wv)
...
@@ -103,24 +218,48 @@ free_widget_value (wv)
}
}
}
}
/* Set *CURSOR on W and all widgets W contain. We must do like this
for scroll bars and menu because they create widgets internally,
and it is those widgets that are visible.
If *CURSOR is NULL, create a GDK_LEFT_PTR cursor and set *CURSOR to
/* Create and return the cursor to be used for popup menus and
the created cursor. */
scroll bars on display DPY. */
void
GdkCursor
*
xg_create_default_cursor
(
dpy
)
Display
*
dpy
;
{
GdkDisplay
*
gdpy
=
gdk_x11_lookup_xdisplay
(
dpy
);
return
gdk_cursor_new_for_display
(
gdpy
,
GDK_LEFT_PTR
);
}
/* For the image defined in IMG, make and return a GdkPixmap for
the pixmap in *GPIX, and a GdkBitmap for the mask in *GMASK.
If IMG has no mask, *GMASK is set to NULL.
The image is defined on the display where frame F is. */
static
void
xg_get_gdk_pixmap_and_mask
(
f
,
img
,
gpix
,
gmask
)
FRAME_PTR
f
;
struct
image
*
img
;
GdkPixmap
**
gpix
;
GdkBitmap
**
gmask
;
{
GdkDisplay
*
gdpy
=
gdk_x11_lookup_xdisplay
(
FRAME_X_DISPLAY
(
f
));
*
gpix
=
gdk_pixmap_foreign_new_for_display
(
gdpy
,
img
->
pixmap
);
*
gmask
=
img
->
mask
?
(
GdkBitmap
*
)
gdk_pixmap_foreign_new_for_display
(
gdpy
,
img
->
mask
)
:
0
;
}
/* Set CURSOR on W and all widgets W contain. We must do like this
for scroll bars and menu because they create widgets internally,
and it is those widgets that are visible. */
static
void
xg_set_cursor
(
w
,
cursor
)
xg_set_cursor
(
w
,
cursor
)
GtkWidget
*
w
;
GtkWidget
*
w
;
GdkCursor
*
*
cursor
;
GdkCursor
*
cursor
;
{
{
GList
*
children
=
gdk_window_peek_children
(
w
->
window
);
GList
*
children
=
gdk_window_peek_children
(
w
->
window
);
/* Create the cursor unless already created. */
gdk_window_set_cursor
(
w
->
window
,
cursor
);
if
(
!
*
cursor
)
*
cursor
=
gdk_cursor_new
(
GDK_LEFT_PTR
);
gdk_window_set_cursor
(
w
->
window
,
*
cursor
);
/* The scroll bar widget has more than one GDK window (had to look at
/* The scroll bar widget has more than one GDK window (had to look at
the source to figure this out), and there is no way to set cursor
the source to figure this out), and there is no way to set cursor
...
@@ -128,7 +267,7 @@ xg_set_cursor (w, cursor)
...
@@ -128,7 +267,7 @@ xg_set_cursor (w, cursor)
Ditto for menus. */
Ditto for menus. */
for
(
;
children
;
children
=
g_list_next
(
children
))
for
(
;
children
;
children
=
g_list_next
(
children
))
gdk_window_set_cursor
(
GDK_WINDOW
(
children
->
data
),
*
cursor
);
gdk_window_set_cursor
(
GDK_WINDOW
(
children
->
data
),
cursor
);
}
}
/* Timer function called when a timeout occurs for xg_timer.
/* Timer function called when a timeout occurs for xg_timer.
...
@@ -381,20 +520,23 @@ xg_frame_set_char_size (f, cols, rows)
...
@@ -381,20 +520,23 @@ xg_frame_set_char_size (f, cols, rows)
cancel_mouse_face
(
f
);
cancel_mouse_face
(
f
);
}
}
/* Convert an X Window WSESC to its corresponding GtkWidget.
/* Convert an X Window WSESC
on display DPY
to its corresponding GtkWidget.
Must be done like this, because GtkWidget:s can have "hidden"
Must be done like this, because GtkWidget:s can have "hidden"
X Window that aren't accessible.
X Window that aren't accessible.
Return 0 if no widget match WDESC. */
Return 0 if no widget match WDESC. */
GtkWidget
*
GtkWidget
*
xg_win_to_widget
(
wdesc
)
xg_win_to_widget
(
dpy
,
wdesc
)
Display
*
dpy
;
Window
wdesc
;
Window
wdesc
;
{
{
gpointer
gdkwin
;
gpointer
gdkwin
;
GtkWidget
*
gwdesc
=
0
;
GtkWidget
*
gwdesc
=
0
;
BLOCK_INPUT
;
BLOCK_INPUT
;
gdkwin
=
gdk_xid_table_lookup
(
wdesc
);
gdkwin
=
gdk_xid_table_lookup_for_display
(
gdk_x11_lookup_xdisplay
(
dpy
),
wdesc
);
if
(
gdkwin
)
if
(
gdkwin
)
{
{
GdkEvent
event
;
GdkEvent
event
;
...
@@ -429,9 +571,9 @@ xg_pix_to_gcolor (w, pixel, c)
...
@@ -429,9 +571,9 @@ xg_pix_to_gcolor (w, pixel, c)
Return TRUE to tell GTK that this expose event has been fully handeled
Return TRUE to tell GTK that this expose event has been fully handeled
and that GTK shall do nothing more with it. */
and that GTK shall do nothing more with it. */
static
gboolean
static
gboolean
xg_fixed_handle_expose
(
GtkWidget
*
widget
,
xg_fixed_handle_expose
(
GtkWidget
*
widget
,
GdkEventExpose
*
event
,
GdkEventExpose
*
event
,
gpointer
user_data
)
gpointer
user_data
)
{
{
GList
*
iter
;
GList
*
iter
;
...
@@ -483,6 +625,8 @@ xg_create_frame_widgets (f)
...
@@ -483,6 +625,8 @@ xg_create_frame_widgets (f)
BLOCK_INPUT
;
BLOCK_INPUT
;
wtop
=
gtk_window_new
(
GTK_WINDOW_TOPLEVEL
);
wtop
=
gtk_window_new
(
GTK_WINDOW_TOPLEVEL
);
xg_set_screen
(
wtop
,
f
);
wvbox
=
gtk_vbox_new
(
FALSE
,
0
);
wvbox
=
gtk_vbox_new
(
FALSE
,
0
);
wfixed
=
gtk_fixed_new
();
/* Must have this to place scroll bars */
wfixed
=
gtk_fixed_new
();
/* Must have this to place scroll bars */
...
@@ -512,7 +656,8 @@ xg_create_frame_widgets (f)
...
@@ -512,7 +656,8 @@ xg_create_frame_widgets (f)
gtk_fixed_set_has_window
(
GTK_FIXED
(
wfixed
),
TRUE
);
gtk_fixed_set_has_window
(
GTK_FIXED
(
wfixed
),
TRUE
);
gtk_widget_set_size_request
(
wfixed
,
FRAME_PIXEL_WIDTH
(
f
),
FRAME_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_container_add
(
GTK_CONTAINER
(
wtop
),
wvbox
);
gtk_box_pack_end
(
GTK_BOX
(
wvbox
),
wfixed
,
TRUE
,
TRUE
,
0
);
gtk_box_pack_end
(
GTK_BOX
(
wvbox
),
wfixed
,
TRUE
,
TRUE
,
0
);
...
@@ -963,6 +1108,8 @@ xg_get_file_name (f, prompt, default_filename, mustmatch_p)
...
@@ -963,6 +1108,8 @@ xg_get_file_name (f, prompt, default_filename, mustmatch_p)
filewin
=
gtk_file_selection_new
(
prompt
);
filewin
=
gtk_file_selection_new
(
prompt
);
filesel
=
GTK_FILE_SELECTION
(
filewin
);
filesel
=
GTK_FILE_SELECTION
(
filewin
);
xg_set_screen
(
filewin
,
f
);
gtk_widget_set_name
(
filewin
,
"emacs-filedialog"
);
gtk_widget_set_name
(
filewin
,
"emacs-filedialog"
);
gtk_window_set_transient_for
(
GTK_WINDOW
(
filewin
),
gtk_window_set_transient_for
(
GTK_WINDOW
(
filewin
),
...
@@ -1500,7 +1647,11 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
...
@@ -1500,7 +1647,11 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
if
(
!
topmenu
)
if
(
!
topmenu
)
{
{
if
(
!
menu_bar_p
)
wmenu
=
gtk_menu_new
();
if
(
!
menu_bar_p
)
{
wmenu
=
gtk_menu_new
();
xg_set_screen
(
wmenu
,
f
);
}
else
wmenu
=
gtk_menu_bar_new
();
else
wmenu
=
gtk_menu_bar_new
();
/* Put cl_data on the top menu for easier access. */
/* Put cl_data on the top menu for easier access. */
...
@@ -1618,12 +1769,11 @@ xg_create_widget (type, name, f, val,
...
@@ -1618,12 +1769,11 @@ xg_create_widget (type, name, f, val,
if
(
strcmp
(
type
,
"dialog"
)
==
0
)
if
(
strcmp
(
type
,
"dialog"
)
==
0
)
{
{
w
=
create_dialog
(
val
,
select_cb
,
deactivate_cb
);
w
=
create_dialog
(
val
,
select_cb
,
deactivate_cb
);
xg_set_screen
(
w
,
f
);
gtk_window_set_transient_for
(
GTK_WINDOW
(
w
),
gtk_window_set_transient_for
(
GTK_WINDOW
(
w
),
GTK_WINDOW
(
FRAME_GTK_OUTER_WIDGET
(
f
)));
GTK_WINDOW
(
FRAME_GTK_OUTER_WIDGET
(
f
)));
gtk_window_set_destroy_with_parent
(
GTK_WINDOW
(
w
),
TRUE
);
gtk_window_set_destroy_with_parent
(
GTK_WINDOW
(
w
),
TRUE
);
gtk_widget_set_name
(
w
,
"emacs-dialog"
);
if
(
w
)
gtk_widget_set_name
(
w
,
"emacs-dialog"
);
}
}
else
if
(
menu_bar_p
||
pop_up_p
)
else
if
(
menu_bar_p
||
pop_up_p
)
{
{
...
@@ -1645,7 +1795,7 @@ xg_create_widget (type, name, f, val,
...
@@ -1645,7 +1795,7 @@ xg_create_widget (type, name, f, val,
{
{
/* Must realize so the GdkWindow inside the widget is created. */
/* Must realize so the GdkWindow inside the widget is created. */
gtk_widget_realize
(
w
);
gtk_widget_realize
(
w
);
xg_set_cursor
(
w
,
&
xg_left_ptr
_cursor
);
xg_set_cursor
(
w
,
FRAME_X_DISPLAY_INFO
(
f
)
->
xg
_cursor
);
}
}
}
}
else
else
...
@@ -2261,7 +2411,10 @@ xg_modify_menubar_widgets (menubar, f, val, deep_p,
...
@@ -2261,7 +2411,10 @@ xg_modify_menubar_widgets (menubar, f, val, deep_p,
a new menu bar item, it has no sub menu yet. So we set the
a new menu bar item, it has no sub menu yet. So we set the
newly created sub menu under witem. */
newly created sub menu under witem. */
if
(
newsub
!=
sub
)
if
(
newsub
!=
sub
)
gtk_menu_item_set_submenu
(
witem
,
newsub
);
{
xg_set_screen
(
newsub
,
f
);
gtk_menu_item_set_submenu
(
witem
,
newsub
);
}
}
}
}
}
...
@@ -2417,16 +2570,17 @@ xg_get_widget_from_map (idx)
...
@@ -2417,16 +2570,17 @@ xg_get_widget_from_map (idx)
return
0
;
return
0
;
}
}
/* Return the scrollbar id for X Window WID.
/* Return the scrollbar id for X Window WID
on display DPY
.
Return -1 if WID not in id_to_widget. */
Return -1 if WID not in id_to_widget. */
int
int
xg_get_scroll_id_for_window
(
wid
)
xg_get_scroll_id_for_window
(
dpy
,
wid
)
Display
*
dpy
;
Window
wid
;
Window
wid
;
{
{
int
idx
;
int
idx
;
GtkWidget
*
w
;
GtkWidget
*
w
;
w
=
xg_win_to_widget
(
wid
);
w
=
xg_win_to_widget
(
dpy
,
wid
);
if
(
w
)
if
(
w
)
{
{
...
@@ -2533,7 +2687,7 @@ xg_create_scroll_bar (f, bar, scroll_callback, scroll_bar_name)
...
@@ -2533,7 +2687,7 @@ xg_create_scroll_bar (f, bar, scroll_callback, scroll_bar_name)
wscroll
,
-
1
,
-
1
);
wscroll
,
-
1
,
-
1
);
/* Set the cursor to an arrow. */
/* Set the cursor to an arrow. */
xg_set_cursor
(
wscroll
,
&
xg_left_ptr
_cursor
);
xg_set_cursor
(
wscroll
,
FRAME_X_DISPLAY_INFO
(
f
)
->
xg
_cursor
);
SET_SCROLL_BAR_X_WINDOW
(
bar
,
scroll_id
);
SET_SCROLL_BAR_X_WINDOW
(
bar
,
scroll_id
);
}
}
...
@@ -2952,8 +3106,8 @@ xg_tool_bar_item_expose_callback (w, event, client_data)
...
@@ -2952,8 +3106,8 @@ xg_tool_bar_item_expose_callback (w, event, client_data)
event
->
area
.
x
-=
width
>
event
->
area
.
width
?
width
-
event
->
area
.
width
:
0
;
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
.
y
-=
height
>
event
->
area
.
height
?
height
-
event
->
area
.
height
:
0
;
event
->
area
.
x
=
max
(
0
,
event
->
area
.
x
);
event
->
area
.
x
=
max
(
0
,
event
->
area
.
x
);
event
->
area
.
y
=
max
(
0
,
event
->
area
.
y
);
event
->
area
.
y
=
max
(
0
,
event
->
area
.
y
);
event
->
area
.
width
=
max
(
width
,
event
->
area
.
width
);
event
->
area
.
width
=
max
(
width
,
event
->
area
.
width
);
event
->
area
.
height
=
max
(
height
,
event
->
area
.
height
);
event
->
area
.
height
=
max
(
height
,
event
->
area
.
height
);
...
@@ -2975,7 +3129,7 @@ xg_tool_bar_expose_callback (w, event, client_data)
...
@@ -2975,7 +3129,7 @@ xg_tool_bar_expose_callback (w, event, client_data)
GdkEventExpose
*
event
;
GdkEventExpose
*
event
;
gpointer
client_data
;
gpointer
client_data
;
{
{
update_frame_tool_bar
((
FRAME_PTR
)
client_data
);
update_frame_tool_bar
((
FRAME_PTR
)
client_data
);
return
FALSE
;
return
FALSE
;
}
}
...
@@ -3108,11 +3262,12 @@ update_frame_tool_bar (f)
...
@@ -3108,11 +3262,12 @@ update_frame_tool_bar (f)
if
(
!
wicon
)
if
(
!
wicon
)
{
{
GdkPixmap
*
gpix
=
gdk_pixmap_foreign_new
(
img
->
pixmap
)
;
GdkPixmap
*
gpix
;
GdkBitmap
*
gmask
=
img
->
mask
?
GdkBitmap
*
gmask
;
(
GdkBitmap
*
)
gdk_pixmap_foreign_new
(
img
->
mask
)
:
0
;
GtkWidget
*
w
;
GtkWidget
*
w
=
gtk_image_new_from_pixmap
(
gpix
,
gmask
);
xg_get_gdk_pixmap_and_mask
(
f
,
img
,
&
gpix
,
&
gmask
);
w
=
gtk_image_new_from_pixmap
(
gpix
,
gmask
);
gtk_toolbar_append_item
(
GTK_TOOLBAR
(
x
->
toolbar_widget
),
gtk_toolbar_append_item
(
GTK_TOOLBAR
(
x
->
toolbar_widget
),
0
,
0
,
0
,
0
,
0
,
0
,
w
,
w
,
...
@@ -3170,10 +3325,10 @@ update_frame_tool_bar (f)
...
@@ -3170,10 +3325,10 @@ update_frame_tool_bar (f)
if
(
old_img
!=
img
->
pixmap
)
if
(
old_img
!=
img
->
pixmap
)
{
{
GdkPixmap
*
gpix
=
gdk_pixmap_foreign_new
(
img
->
pixmap
);
GdkPixmap
*
gpix
;
GdkBitmap
*
gmask
=
img
->
mask
?
GdkBitmap
*
gmask
;
(
GdkBitmap
*
)
gdk_pixmap_foreign_new
(
img
->
mask
)
:
0
;
xg_get_gdk_pixmap_and_mask
(
f
,
img
,
&
gpix
,
&
gmask
);
gtk_image_set_from_pixmap
(
wimage
,
gpix
,
gmask
);
gtk_image_set_from_pixmap
(
wimage
,
gpix
,
gmask
);
}
}
...
@@ -3241,7 +3396,6 @@ void
...
@@ -3241,7 +3396,6 @@ void
xg_initialize
()
xg_initialize
()
{
{
xg_ignore_gtk_scrollbar
=
0
;
xg_ignore_gtk_scrollbar
=
0
;
xg_left_ptr_cursor
=
0
;
xg_detached_menus
=
0
;
xg_detached_menus
=
0
;
xg_menu_cb_list
.
prev
=
xg_menu_cb_list
.
next
=
xg_menu_cb_list
.
prev
=
xg_menu_cb_list
.
next
=
xg_menu_item_cb_list
.
prev
=
xg_menu_item_cb_list
.
next
=
0
;
xg_menu_item_cb_list
.
prev
=
xg_menu_item_cb_list
.
next
=
0
;
...
...
src/gtkutil.h
View file @
810f2256
...
@@ -152,7 +152,7 @@ extern int xg_update_frame_menubar P_ ((FRAME_PTR f));
...
@@ -152,7 +152,7 @@ extern int xg_update_frame_menubar P_ ((FRAME_PTR f));
extern
int
xg_have_tear_offs
P_
((
void
));
extern
int
xg_have_tear_offs
P_
((
void
));
extern
int
xg_get_scroll_id_for_window
P_
((
Window
wid
));
extern
int
xg_get_scroll_id_for_window
P_
((
Display
*
dpy
,
Window
wid
));
extern
void
xg_create_scroll_bar
P_
((
FRAME_PTR
f
,
extern
void
xg_create_scroll_bar
P_
((
FRAME_PTR
f
,
struct
scroll_bar
*
bar
,
struct
scroll_bar
*
bar
,
...
@@ -184,7 +184,12 @@ extern void xg_resize_widgets P_ ((FRAME_PTR f,
...
@@ -184,7 +184,12 @@ extern void xg_resize_widgets P_ ((FRAME_PTR f,
int
pixelheight
));
int
pixelheight
));
extern
void
xg_frame_cleared
P_
((
FRAME_PTR
f
));
extern
void
xg_frame_cleared
P_
((
FRAME_PTR
f
));
extern
void
xg_frame_set_char_size
P_
((
FRAME_PTR
f
,
int
cols
,
int
rows
));
extern
void
xg_frame_set_char_size
P_
((
FRAME_PTR
f
,
int
cols
,
int
rows
));
extern
GtkWidget
*
xg_win_to_widget
P_
((
Window
));
extern
GtkWidget
*
xg_win_to_widget
P_
((
Display
*
dpy
,
Window
wdesc
));
extern
int
xg_display_open
P_
((
char
*
display_name
,
Display
**
dpy
));
extern
void
xg_display_close
P_
((
Display
*
dpy
));
extern
GdkCursor
*
xg_create_default_cursor
P_
((
Display
*
dpy
));
extern
int
xg_create_frame_widgets
P_
((
FRAME_PTR
f
));
extern
int
xg_create_frame_widgets
P_
((
FRAME_PTR
f
));
extern
void
x_wm_set_size_hint
P_
((
FRAME_PTR
f
,
extern
void
x_wm_set_size_hint
P_
((
FRAME_PTR
f
,
long
flags
,
long
flags
,
...
...
src/xdisp.c
View file @
810f2256
...
@@ -8142,7 +8142,7 @@ update_tool_bar (f, save_match_data)
...
@@ -8142,7 +8142,7 @@ update_tool_bar (f, save_match_data)
int save_match_data;
int save_match_data;
{
{
#ifdef USE_GTK
#ifdef USE_GTK
int do_update = FRAME_EXTERNAL_TOOL_BAR(f);
int do_update = FRAME_EXTERNAL_TOOL_BAR
(f);
#else
#else
int do_update = WINDOWP (f->tool_bar_window)
int do_update = WINDOWP (f->tool_bar_window)
&& WINDOW_TOTAL_LINES (XWINDOW (f->tool_bar_window)) > 0;
&& WINDOW_TOTAL_LINES (XWINDOW (f->tool_bar_window)) > 0;
...
@@ -8539,7 +8539,7 @@ redisplay_tool_bar (f)
...
@@ -8539,7 +8539,7 @@ redisplay_tool_bar (f)
int change_height_p = 0;
int change_height_p = 0;
#ifdef USE_GTK
#ifdef USE_GTK
if (FRAME_EXTERNAL_TOOL_BAR(f))
if (FRAME_EXTERNAL_TOOL_BAR
(f))
update_frame_tool_bar (f);
update_frame_tool_bar (f);
return 0;
return 0;
#endif
#endif
...
...
src/xfns.c