/* Run a glib GMainLoop which intercepts key and mouse button events from | the top level loop. When a mouse or key is hit in the Output drawing | area, quit the loop so the top level loop can continue and use the | the mouse pointer coordinates at the time of the mouse button event. */ static gboolean run_get_location_loop (const gchar * message) { GMainLoop *loop; gulong button_handler, key_handler; gint oldObjState, oldLineState, oldBoxState; ghid_status_line_set_text (message); oldObjState = Crosshair.AttachedObject.State; oldLineState = Crosshair.AttachedLine.State; oldBoxState = Crosshair.AttachedBox.State; HideCrosshair (true); Crosshair.AttachedObject.State = STATE_FIRST; Crosshair.AttachedLine.State = STATE_FIRST; Crosshair.AttachedBox.State = STATE_FIRST; ghid_hand_cursor (); RestoreCrosshair (true); /* Stop the top level GMainLoop from getting user input from keyboard | and mouse so we can install our own handlers here. Also set the | control interface insensitive so all the user can do is hit a key | or mouse button in the Output drawing area. */ ghid_interface_input_signals_disconnect (); ghid_interface_set_sensitive (FALSE); got_location = TRUE; /* Will be unset by hitting most keys */ button_handler = g_signal_connect (G_OBJECT (gport->drawing_area), "button_press_event", G_CALLBACK (loop_button_press_cb), &loop); key_handler = g_signal_connect (G_OBJECT (gport->top_window), "key_press_event", G_CALLBACK (loop_key_press_cb), &loop); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_main_loop_unref (loop); g_signal_handler_disconnect (gport->drawing_area, button_handler); g_signal_handler_disconnect (gport->top_window, key_handler); ghid_interface_input_signals_connect (); /* return to normal */ ghid_interface_set_sensitive (TRUE); HideCrosshair (true); Crosshair.AttachedObject.State = oldObjState; Crosshair.AttachedLine.State = oldLineState; Crosshair.AttachedBox.State = oldBoxState; RestoreCrosshair (true); ghid_restore_cursor (); ghid_set_status_line_label (); return got_location; }
/* Run a glib GMainLoop which intercepts key and mouse button events from | the top level loop. When a mouse or key is hit in the Output drawing | area, quit the loop so the top level loop can continue and use the | the mouse pointer coordinates at the time of the mouse button event. */ static gboolean run_get_location_loop (const gchar * message) { GMainLoop *loop; gulong button_handler, key_handler; gint oldObjState, oldLineState, oldBoxState; /* Make the text cue bold so it hides less and looks like command prompt */ GString *bold_message = g_string_new (message); g_string_prepend (bold_message, "<b>"); g_string_append (bold_message, "</b>"); ghid_status_line_set_text (bold_message->str); g_string_free (bold_message, TRUE); oldObjState = Crosshair.AttachedObject.State; oldLineState = Crosshair.AttachedLine.State; oldBoxState = Crosshair.AttachedBox.State; notify_crosshair_change (false); Crosshair.AttachedObject.State = STATE_FIRST; Crosshair.AttachedLine.State = STATE_FIRST; Crosshair.AttachedBox.State = STATE_FIRST; ghid_hand_cursor (); notify_crosshair_change (true); /* Stop the top level GMainLoop from getting user input from keyboard | and mouse so we can install our own handlers here. Also set the | control interface insensitive so all the user can do is hit a key | or mouse button in the Output drawing area. */ ghid_interface_input_signals_disconnect (); ghid_interface_set_sensitive (FALSE); got_location = TRUE; /* Will be unset by hitting most keys */ button_handler = g_signal_connect (G_OBJECT (gport->drawing_area), "button_press_event", G_CALLBACK (loop_button_press_cb), &loop); key_handler = g_signal_connect (G_OBJECT (gport->top_window), "key_press_event", G_CALLBACK (loop_key_press_cb), &loop); loop = g_main_loop_new (NULL, FALSE); GDK_THREADS_LEAVE (); g_main_loop_run (loop); GDK_THREADS_ENTER (); g_main_loop_unref (loop); g_signal_handler_disconnect (gport->drawing_area, button_handler); g_signal_handler_disconnect (gport->top_window, key_handler); ghid_interface_input_signals_connect (); /* return to normal */ ghid_interface_set_sensitive (TRUE); notify_crosshair_change (false); Crosshair.AttachedObject.State = oldObjState; Crosshair.AttachedLine.State = oldLineState; Crosshair.AttachedBox.State = oldBoxState; notify_crosshair_change (true); ghid_restore_cursor (); ghid_set_status_line_label (); return got_location; }