232
267
static void GUIDNDDataDestroyCB(gpointer data);
269
/* Button Callbacks */
234
270
static void GUIButtonDataDestroyCB(gpointer data);
272
/* Banner Callbacks */
236
273
static gint GUIBannerEventCB(
237
274
GtkWidget *widget, GdkEvent *event, gpointer data
239
276
static void GUIBannerDataDestroyCB(gpointer data);
278
/* GtkCombo Callbacks */
241
279
static void GUIComboActivateCB(GtkWidget *widget, gpointer data);
242
280
static void GUIComboChangedCB(GtkWidget *widget, gpointer data);
243
281
static void GUIComboDataDestroyCB(gpointer data);
283
/* GtkMenuItem Callbacks */
245
284
static void GUIMenuItemActivateCB(gpointer data);
246
285
static void GUIMenuItemActivateDataDestroyCB(gpointer data);
247
286
static void GUIMenuItemDataDestroyCB(gpointer data);
288
/* GtkEditable Popup Menu Callbacks */
289
static void GUIEditablePopupMenuDataDestroyCB(gpointer data);
290
static void GUIEditablePopupMenuUndoCB(GtkWidget *widget, gpointer data);
291
static void GUIEditablePopupMenuCutCB(GtkWidget *widget, gpointer data);
292
static void GUIEditablePopupMenuCopyCB(GtkWidget *widget, gpointer data);
293
static void GUIEditablePopupMenuPasteCB(GtkWidget *widget, gpointer data);
294
static void GUIEditablePopupMenuDeleteCB(GtkWidget *widget, gpointer data);
295
static void GUIEditablePopupMenuSelectAllCB(GtkWidget *widget, gpointer data);
296
static void GUIEditablePopupMenuUnselectAllCB(GtkWidget *widget, gpointer data);
297
static gint GUIEditablePopupMenuEditableEventCB(
298
GtkWidget *widget, GdkEvent *event, gpointer data
301
/* Pull Out Callbacks */
249
302
static void GUIPullOutDataDestroyCB(gpointer data);
250
303
static void GUIPullOutDrawHandleDrawCB(
251
304
GtkWidget *widget, GdkRectangle *area, gpointer data
1802
* Editable popup menu data destroy callback.
1804
static void GUIEditablePopupMenuDataDestroyCB(gpointer data)
1806
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1812
GTK_WIDGET_DESTROY(d->menu);
1813
g_free(d->undo_buf);
1814
g_free(d->redo_buf);
1822
* Editable popup menu undo/redo callback.
1824
static void GUIEditablePopupMenuUndoCB(GtkWidget *widget, gpointer data)
1826
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1830
if(d->freeze_count > 0)
1833
if(!(d->flags & GUI_EDITABLE_POPUP_MENU_UNDO) ||
1834
(d->flags & GUI_EDITABLE_POPUP_MENU_READ_ONLY)
1840
if(d->editable != NULL)
1842
GtkEditable *editable = GTK_EDITABLE(d->editable);
1845
if(d->redo_buf != NULL)
1849
g_free(d->undo_buf);
1850
d->undo_buf = gtk_editable_get_chars(editable, 0, -1);
1851
d->undo_last_pos = gtk_editable_get_position(editable);
1853
gtk_editable_delete_text(editable, 0, -1);
1854
gtk_editable_insert_text(editable, d->redo_buf, STRLEN(d->redo_buf), &position);
1855
gtk_editable_set_position(editable, d->redo_last_pos);
1857
g_free(d->redo_buf);
1859
d->redo_last_pos = 0;
1862
else if(d->undo_buf != NULL)
1866
g_free(d->redo_buf);
1867
d->redo_buf = gtk_editable_get_chars(editable, 0, -1);
1868
d->redo_last_pos = gtk_editable_get_position(editable);
1870
gtk_editable_delete_text(editable, 0, -1);
1871
gtk_editable_insert_text(editable, d->undo_buf, STRLEN(d->undo_buf), &position);
1872
gtk_editable_set_position(editable, d->undo_last_pos);
1874
g_free(d->undo_buf);
1876
d->undo_last_pos = 0;
1880
g_free(d->redo_buf);
1881
d->redo_buf = gtk_editable_get_chars(editable, 0, -1);
1882
d->redo_last_pos = gtk_editable_get_position(editable);
1884
gtk_editable_delete_text(editable, 0, -1);
1887
GUIEditablePopupMenuUpdate(d);
1894
* Editable popup menu cut callback.
1896
static void GUIEditablePopupMenuCutCB(GtkWidget *widget, gpointer data)
1898
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1902
if(d->freeze_count > 0)
1905
if(d->flags & GUI_EDITABLE_POPUP_MENU_READ_ONLY)
1910
GUIEditablePopupMenuRecordUndo(d);
1911
gtk_editable_cut_clipboard(GTK_EDITABLE(d->editable));
1912
GUIEditablePopupMenuUpdate(d);
1918
* Editable popup menu copy callback.
1920
static void GUIEditablePopupMenuCopyCB(GtkWidget *widget, gpointer data)
1922
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1926
if(d->freeze_count > 0)
1931
gtk_editable_copy_clipboard(GTK_EDITABLE(d->editable));
1932
GUIEditablePopupMenuUpdate(d);
1938
* Editable popup menu paste callback.
1940
static void GUIEditablePopupMenuPasteCB(GtkWidget *widget, gpointer data)
1942
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1946
if(d->freeze_count > 0)
1949
if(d->flags & GUI_EDITABLE_POPUP_MENU_READ_ONLY)
1954
GUIEditablePopupMenuRecordUndo(d);
1955
gtk_editable_paste_clipboard(GTK_EDITABLE(d->editable));
1956
GUIEditablePopupMenuUpdate(d);
1962
* Editable popup menu delete callback.
1964
static void GUIEditablePopupMenuDeleteCB(GtkWidget *widget, gpointer data)
1966
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1970
if(d->freeze_count > 0)
1973
if(d->flags & GUI_EDITABLE_POPUP_MENU_READ_ONLY)
1978
GUIEditablePopupMenuRecordUndo(d);
1979
gtk_editable_delete_selection(GTK_EDITABLE(d->editable));
1980
GUIEditablePopupMenuUpdate(d);
1986
* Editable popup menu select all callback.
1988
static void GUIEditablePopupMenuSelectAllCB(GtkWidget *widget, gpointer data)
1990
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
1994
if(d->freeze_count > 0)
1999
gtk_editable_select_region(GTK_EDITABLE(d->editable), 0, 0);
2001
while(gtk_events_pending() > 0)
2002
gtk_main_iteration();
2004
gtk_editable_select_region(GTK_EDITABLE(d->editable), 0, -1);
2005
GUIEditablePopupMenuUpdate(d);
2011
* Editable popup menu unselect all callback.
2013
static void GUIEditablePopupMenuUnselectAllCB(GtkWidget *widget, gpointer data)
2015
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
2019
if(d->freeze_count > 0)
2024
gtk_editable_select_region(GTK_EDITABLE(d->editable), 0, 0);
2025
GUIEditablePopupMenuUpdate(d);
2031
* Editable popup menu GtkEditable event signal callback.
2033
static gint GUIEditablePopupMenuEditableEventCB(
2034
GtkWidget *widget, GdkEvent *event, gpointer data
2037
gint status = FALSE;
2039
GdkEventButton *button;
2040
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(data);
2041
if((widget == NULL) || (event == NULL) || (d == NULL))
2044
if(d->freeze_count > 0)
2047
/* If the event is from a GtkSpinButton then make sure that
2048
* the event's GdkWindow is the GtkSpinButton GtkEntry's
2049
* text area GdkWindow, this is needed to make sure that the
2050
* event did not occure on any of the GtkSpinButton's buttons
2052
if(GTK_IS_SPIN_BUTTON(widget))
2054
GdkEventAny *any = (GdkEventAny *)event;
2055
GtkEntry *entry = GTK_ENTRY(widget);
2056
if(entry->text_area != any->window)
2062
switch((gint)event->type)
2065
key = (GdkEventKey *)event;
2066
if(d->flags & GUI_EDITABLE_POPUP_MENU_UNDO)
2068
const guint keyval = key->keyval;
2069
if(isprint(keyval) || (keyval == GDK_BackSpace) ||
2070
(keyval == GDK_Delete) || (keyval == GDK_Return) ||
2071
(keyval == GDK_KP_Enter) || (keyval == GDK_ISO_Enter)
2074
GUIEditablePopupMenuRecordUndo(d);
2075
GUIEditablePopupMenuUpdate(d);
2080
case GDK_BUTTON_PRESS:
2081
button = (GdkEventButton *)event;
2082
switch(button->button)
2087
/* Update the menu items */
2088
GUIEditablePopupMenuUpdate(d);
2090
/* Map the popup menu */
2093
NULL, NULL, NULL, d,
2094
button->button, button->time
2097
/* Need to mark the GtkText button as 0 or else it
2100
if(GTK_IS_TEXT(widget))
2102
GtkText *text = GTK_TEXT(widget);
2104
gtk_grab_remove(widget);
2105
gtk_signal_emit_stop_by_name(
2106
GTK_OBJECT(widget), "button_press_event"
2109
else if(GTK_IS_ENTRY(widget))
2111
GtkEntry *entry = GTK_ENTRY(widget);
2113
gtk_grab_remove(widget);
2114
gtk_signal_emit_stop_by_name(
2115
GTK_OBJECT(widget), "button_press_event"
2122
if(GTK_IS_SPIN_BUTTON(widget))
2124
GtkEntry *entry = GTK_ENTRY(widget);
2125
GtkSpinButton *spin = GTK_SPIN_BUTTON(widget);
2126
GtkAdjustment *adj = gtk_spin_button_get_adjustment(spin);
2127
gtk_spin_button_spin(
2129
GTK_SPIN_STEP_FORWARD,
2133
gtk_grab_remove(widget);
2134
gtk_signal_emit_stop_by_name(
2135
GTK_OBJECT(widget), "button_press_event"
2141
if(GTK_IS_SPIN_BUTTON(widget))
2143
GtkEntry *entry = GTK_ENTRY(widget);
2144
GtkSpinButton *spin = GTK_SPIN_BUTTON(widget);
2145
GtkAdjustment *adj = gtk_spin_button_get_adjustment(spin);
2146
gtk_spin_button_spin(
2148
GTK_SPIN_STEP_BACKWARD,
2152
gtk_grab_remove(widget);
2153
gtk_signal_emit_stop_by_name(
2154
GTK_OBJECT(widget), "button_press_event"
2162
case GDK_BUTTON_RELEASE:
2163
button = (GdkEventButton *)event;
2164
switch(button->button)
2169
/* Need to mark the GtkText button as 0 or else it
2172
if(GTK_IS_TEXT(widget))
2174
GtkText *text = GTK_TEXT(widget);
2176
gtk_grab_remove(widget);
2177
gtk_signal_emit_stop_by_name(
2178
GTK_OBJECT(widget), "button_release_event"
2181
else if(GTK_IS_ENTRY(widget))
2183
GtkEntry *entry = GTK_ENTRY(widget);
2185
gtk_grab_remove(widget);
2186
gtk_signal_emit_stop_by_name(
2187
GTK_OBJECT(widget), "button_release_event"
2194
if(GTK_IS_SPIN_BUTTON(widget))
2196
GtkEntry *entry = GTK_ENTRY(widget);
2198
gtk_grab_remove(widget);
2199
gtk_signal_emit_stop_by_name(
2200
GTK_OBJECT(widget), "button_release_event"
2206
if(GTK_IS_SPIN_BUTTON(widget))
2208
GtkEntry *entry = GTK_ENTRY(widget);
2210
gtk_grab_remove(widget);
2211
gtk_signal_emit_stop_by_name(
2212
GTK_OBJECT(widget), "button_release_event"
1739
2228
* Pullout data destroy callback.
7303
* Editable popup menu record undo.
7305
static void GUIEditablePopupMenuRecordUndo(GUIEditablePopupMenuData *d)
7307
GtkEditable *editable = GTK_EDITABLE(d->editable);
7309
g_free(d->undo_buf);
7310
d->undo_buf = gtk_editable_get_chars(editable, 0, -1);
7311
d->undo_last_pos = gtk_editable_get_position(editable);
7313
g_free(d->redo_buf);
7315
d->redo_last_pos = 0;
7319
* Editable popup menu update.
7321
static void GUIEditablePopupMenuUpdate(GUIEditablePopupMenuData *d)
7323
GtkEditable *editable = GTK_EDITABLE(d->editable);
7324
const gboolean has_selection = editable->has_selection;
7329
if(d->flags & GUI_EDITABLE_POPUP_MENU_UNDO)
7331
b = ((d->undo_buf != NULL) || (d->redo_buf != NULL)) ?
7333
GTK_WIDGET_SET_SENSITIVE(d->undo_mi, b);
7334
GUIMenuItemSetLabel(
7336
(d->redo_buf != NULL) ? "Redo" : "Undo"
7338
gtk_widget_show(d->undo_mi);
7339
gtk_widget_show(d->undo_msep);
7343
gtk_widget_hide(d->undo_mi);
7344
gtk_widget_hide(d->undo_msep);
7347
if(d->flags & GUI_EDITABLE_POPUP_MENU_READ_ONLY)
7349
gtk_widget_hide(d->cut_mi);
7350
gtk_widget_show(d->copy_mi);
7351
gtk_widget_hide(d->paste_mi);
7352
gtk_widget_hide(d->delete_mi);
7353
gtk_widget_show(d->select_msep);
7354
gtk_widget_show(d->select_all_mi);
7355
gtk_widget_show(d->unselect_all_mi);
7359
gtk_widget_show(d->cut_mi);
7360
gtk_widget_show(d->copy_mi);
7361
gtk_widget_show(d->paste_mi);
7362
gtk_widget_show(d->delete_mi);
7363
gtk_widget_show(d->select_msep);
7364
gtk_widget_show(d->select_all_mi);
7365
gtk_widget_show(d->unselect_all_mi);
7368
GTK_WIDGET_SET_SENSITIVE(d->cut_mi, has_selection);
7369
GTK_WIDGET_SET_SENSITIVE(d->copy_mi, has_selection);
7370
GTK_WIDGET_SET_SENSITIVE(d->paste_mi, TRUE);
7371
GTK_WIDGET_SET_SENSITIVE(d->delete_mi, has_selection);
7372
GTK_WIDGET_SET_SENSITIVE(d->select_all_mi, TRUE);
7373
GTK_WIDGET_SET_SENSITIVE(d->unselect_all_mi, TRUE);
7379
* Gets the popup menu from the GtkEditable.
7381
GtkWidget *GUIEditableGetPopupMenu(GtkWidget *w)
7383
GUIEditablePopupMenuData *d = GUI_EDITABLE_POPUP_MENU_DATA(
7384
GTK_OBJECT_GET_DATA(w, GUI_EDITABLE_POPUP_MENU_DATA_KEY)
7393
* Endows the GtkEditable with a popup menu for editing.
7395
* The w specifies the GtkEditable.
7397
* The flags specifies the popup menu options.
7399
void GUIEditableEndowPopupMenu(
7400
GtkWidget *w, const gui_editable_popup_menu_flags flags
7405
guint accel_key, accel_mods;
7406
gpointer menu_item_data;
7407
GtkAccelGroup *accelgrp;
7408
GtkWidget *menu, *menu_item;
7409
GUIEditablePopupMenuData *d;
7410
void (*func_cb)(GtkWidget *w, gpointer);
7415
if(!GTK_IS_EDITABLE(w))
7419
d = GUI_EDITABLE_POPUP_MENU_DATA(
7420
GTK_OBJECT_GET_DATA(w, GUI_EDITABLE_POPUP_MENU_DATA_KEY)
7425
/* Allocate the editable popup menu data */
7426
d = GUI_EDITABLE_POPUP_MENU_DATA(g_malloc0(
7427
sizeof(GUIEditablePopupMenuData)
7433
d->freeze_count = 0;
7440
gtk_object_set_data_full(
7441
GTK_OBJECT(w), GUI_EDITABLE_POPUP_MENU_DATA_KEY,
7442
d, GUIEditablePopupMenuDataDestroyCB
7445
/* Right-click popup menu */
7446
d->menu = menu = GUIMenuCreate();
7453
#define DO_ADD_MENU_ITEM_LABEL { \
7454
menu_item = GUIMenuItemCreate( \
7455
menu, GUI_MENU_ITEM_TYPE_LABEL, accelgrp, \
7456
icon, label, accel_key, accel_mods, NULL, \
7457
menu_item_data, func_cb \
7460
#define DO_ADD_MENU_ITEM_CHECK { \
7461
menu_item = GUIMenuItemCreate( \
7462
menu, GUI_MENU_ITEM_TYPE_CHECK, accelgrp, \
7463
icon, label, accel_key, accel_mods, NULL, \
7464
menu_item_data, func_cb \
7467
#define DO_ADD_MENU_SEP { \
7468
menu_item = GUIMenuItemCreate( \
7469
menu, GUI_MENU_ITEM_TYPE_SEPARATOR, NULL, \
7470
NULL, NULL, 0, 0, NULL, \
7477
func_cb = GUIEditablePopupMenuUndoCB;
7478
DO_ADD_MENU_ITEM_LABEL
7479
d->undo_mi = menu_item;
7482
d->undo_msep = menu_item;
7484
icon = (guint8 **)icon_cut_20x20_xpm;
7486
#if defined(PROG_LANGUAGE_SPANISH)
7488
#elif defined(PROG_LANGUAGE_FRENCH)
7490
#elif defined(PROG_LANGUAGE_GERMAN)
7492
#elif defined(PROG_LANGUAGE_ITALIAN)
7494
#elif defined(PROG_LANGUAGE_DUTCH)
7496
#elif defined(PROG_LANGUAGE_PORTUGUESE)
7498
#elif defined(PROG_LANGUAGE_NORWEGIAN)
7504
func_cb = GUIEditablePopupMenuCutCB;
7505
DO_ADD_MENU_ITEM_LABEL
7506
d->cut_mi = menu_item;
7508
icon = (guint8 **)icon_copy_20x20_xpm;
7510
#if defined(PROG_LANGUAGE_SPANISH)
7512
#elif defined(PROG_LANGUAGE_FRENCH)
7514
#elif defined(PROG_LANGUAGE_GERMAN)
7516
#elif defined(PROG_LANGUAGE_ITALIAN)
7518
#elif defined(PROG_LANGUAGE_DUTCH)
7520
#elif defined(PROG_LANGUAGE_PORTUGUESE)
7522
#elif defined(PROG_LANGUAGE_NORWEGIAN)
7528
func_cb = GUIEditablePopupMenuCopyCB;
7529
DO_ADD_MENU_ITEM_LABEL
7530
d->copy_mi = menu_item;
7532
icon = (guint8 **)icon_paste_20x20_xpm;
7534
#if defined(PROG_LANGUAGE_SPANISH)
7536
#elif defined(PROG_LANGUAGE_FRENCH)
7538
#elif defined(PROG_LANGUAGE_GERMAN)
7540
#elif defined(PROG_LANGUAGE_ITALIAN)
7542
#elif defined(PROG_LANGUAGE_DUTCH)
7544
#elif defined(PROG_LANGUAGE_PORTUGUESE)
7546
#elif defined(PROG_LANGUAGE_NORWEGIAN)
7552
func_cb = GUIEditablePopupMenuPasteCB;
7553
DO_ADD_MENU_ITEM_LABEL
7554
d->paste_mi = menu_item;
7556
icon = (guint8 **)icon_cancel_20x20_xpm;
7558
#if defined(PROG_LANGUAGE_SPANISH)
7560
#elif defined(PROG_LANGUAGE_FRENCH)
7562
#elif defined(PROG_LANGUAGE_GERMAN)
7564
#elif defined(PROG_LANGUAGE_ITALIAN)
7566
#elif defined(PROG_LANGUAGE_DUTCH)
7568
#elif defined(PROG_LANGUAGE_PORTUGUESE)
7570
#elif defined(PROG_LANGUAGE_NORWEGIAN)
7576
func_cb = GUIEditablePopupMenuDeleteCB;
7577
DO_ADD_MENU_ITEM_LABEL
7578
d->delete_mi = menu_item;
7581
d->select_msep = menu_item;
7584
label = "Select All";
7585
func_cb = GUIEditablePopupMenuSelectAllCB;
7586
DO_ADD_MENU_ITEM_LABEL
7587
d->select_all_mi = menu_item;
7590
label = "Unselect All";
7591
func_cb = GUIEditablePopupMenuUnselectAllCB;
7592
DO_ADD_MENU_ITEM_LABEL
7593
d->unselect_all_mi = menu_item;
7595
#undef DO_ADD_MENU_ITEM_LABEL
7596
#undef DO_ADD_MENU_ITEM_CHECK
7597
#undef DO_ADD_MENU_SEP
7599
/* Attach signals to trigger the mapping of the popup menu
7600
* and to monitor change
7603
GTK_OBJECT(w), "key_press_event",
7604
GTK_SIGNAL_FUNC(GUIEditablePopupMenuEditableEventCB), d
7607
GTK_OBJECT(w), "key_release_event",
7608
GTK_SIGNAL_FUNC(GUIEditablePopupMenuEditableEventCB), d
7611
GTK_OBJECT(w), "button_press_event",
7612
GTK_SIGNAL_FUNC(GUIEditablePopupMenuEditableEventCB), d
7615
GTK_OBJECT(w), "button_release_event",
7616
GTK_SIGNAL_FUNC(GUIEditablePopupMenuEditableEventCB), d
7619
GUIEditablePopupMenuUpdate(d);
6814
7626
* Creates a pull out widget horizontally, returning the hbox which
6815
7627
* the calling function can pack child widgets into.