diff options
Diffstat (limited to 'src/gui_beval.c')
-rw-r--r-- | src/gui_beval.c | 310 |
1 files changed, 154 insertions, 156 deletions
diff --git a/src/gui_beval.c b/src/gui_beval.c index e1b0e4bfd9..daeac8f3b7 100644 --- a/src/gui_beval.c +++ b/src/gui_beval.c @@ -373,40 +373,40 @@ pointer_event(BalloonEval *beval, int x, int y, unsigned state) distance = ABS(x - beval->x) + ABS(y - beval->y); - if (distance > 4) + if (distance <= 4) + return; + + /* + * Moved out of the balloon location: cancel it. + * Remember button state + */ + beval->state = state; + cancelBalloon(beval); + + // Mouse buttons are pressed - no balloon now + if (!(state & ((int)GDK_BUTTON1_MASK | (int)GDK_BUTTON2_MASK + | (int)GDK_BUTTON3_MASK))) { - /* - * Moved out of the balloon location: cancel it. - * Remember button state - */ - beval->state = state; - cancelBalloon(beval); + beval->x = x; + beval->y = y; - // Mouse buttons are pressed - no balloon now - if (!(state & ((int)GDK_BUTTON1_MASK | (int)GDK_BUTTON2_MASK - | (int)GDK_BUTTON3_MASK))) + if (state & (int)GDK_MOD1_MASK) { - beval->x = x; - beval->y = y; - - if (state & (int)GDK_MOD1_MASK) - { - /* - * Alt is pressed -- enter super-evaluate-mode, - * where there is no time delay - */ - if (beval->msgCB != NULL) - { - beval->showState = ShS_PENDING; - (*beval->msgCB)(beval, state); - } - } - else + /* + * Alt is pressed -- enter super-evaluate-mode, + * where there is no time delay + */ + if (beval->msgCB != NULL) { - beval->timerID = g_timeout_add((guint)p_bdlay, - &timeout_cb, beval); + beval->showState = ShS_PENDING; + (*beval->msgCB)(beval, state); } } + else + { + beval->timerID = g_timeout_add((guint)p_bdlay, + &timeout_cb, beval); + } } } @@ -698,17 +698,17 @@ timerRoutine(XtPointer dx, XtIntervalId *id UNUSED) static void requestBalloon(BalloonEval *beval) { - if (beval->showState != ShS_PENDING) + if (beval->showState == ShS_PENDING) + return; + + // Determine the beval to display + if (beval->msgCB != NULL) { - // Determine the beval to display - if (beval->msgCB != NULL) - { - beval->showState = ShS_PENDING; - (*beval->msgCB)(beval, beval->state); - } - else if (beval->msg != NULL) - drawBalloon(beval); + beval->showState = ShS_PENDING; + (*beval->msgCB)(beval, beval->state); } + else if (beval->msg != NULL) + drawBalloon(beval); } #ifdef FEAT_GUI_GTK @@ -900,85 +900,85 @@ set_printable_label_text(GtkLabel *label, char_u *text) static void drawBalloon(BalloonEval *beval) { - if (beval->msg != NULL) - { - GtkRequisition requisition; - int screen_w; - int screen_h; - int screen_x; - int screen_y; - int x; - int y; - int x_offset = EVAL_OFFSET_X; - int y_offset = EVAL_OFFSET_Y; - PangoLayout *layout; + if (beval->msg == NULL) + return; + + GtkRequisition requisition; + int screen_w; + int screen_h; + int screen_x; + int screen_y; + int x; + int y; + int x_offset = EVAL_OFFSET_X; + int y_offset = EVAL_OFFSET_Y; + PangoLayout *layout; # if !GTK_CHECK_VERSION(3,22,2) - GdkScreen *screen; + GdkScreen *screen; - screen = gtk_widget_get_screen(beval->target); - gtk_window_set_screen(GTK_WINDOW(beval->balloonShell), screen); + screen = gtk_widget_get_screen(beval->target); + gtk_window_set_screen(GTK_WINDOW(beval->balloonShell), screen); # endif - gui_gtk_get_screen_geom_of_win(beval->target, 0, 0, - &screen_x, &screen_y, &screen_w, &screen_h); + gui_gtk_get_screen_geom_of_win(beval->target, 0, 0, + &screen_x, &screen_y, &screen_w, &screen_h); # if !GTK_CHECK_VERSION(3,0,0) - gtk_widget_ensure_style(beval->balloonShell); - gtk_widget_ensure_style(beval->balloonLabel); + gtk_widget_ensure_style(beval->balloonShell); + gtk_widget_ensure_style(beval->balloonLabel); # endif - set_printable_label_text(GTK_LABEL(beval->balloonLabel), beval->msg); - /* - * Dirty trick: Enable wrapping mode on the label's layout behind its - * back. This way GtkLabel won't try to constrain the wrap width to a - * builtin maximum value of about 65 Latin characters. - */ - layout = gtk_label_get_layout(GTK_LABEL(beval->balloonLabel)); + set_printable_label_text(GTK_LABEL(beval->balloonLabel), beval->msg); + /* + * Dirty trick: Enable wrapping mode on the label's layout behind its + * back. This way GtkLabel won't try to constrain the wrap width to a + * builtin maximum value of about 65 Latin characters. + */ + layout = gtk_label_get_layout(GTK_LABEL(beval->balloonLabel)); # ifdef PANGO_WRAP_WORD_CHAR - pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); + pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); # else - pango_layout_set_wrap(layout, PANGO_WRAP_WORD); + pango_layout_set_wrap(layout, PANGO_WRAP_WORD); # endif - pango_layout_set_width(layout, - // try to come up with some reasonable width - PANGO_SCALE * CLAMP(gui.num_cols * gui.char_width, - screen_w / 2, - MAX(20, screen_w - 20))); + pango_layout_set_width(layout, + // try to come up with some reasonable width + PANGO_SCALE * CLAMP(gui.num_cols * gui.char_width, + screen_w / 2, + MAX(20, screen_w - 20))); - // Calculate the balloon's width and height. + // Calculate the balloon's width and height. # if GTK_CHECK_VERSION(3,0,0) - gtk_widget_get_preferred_size(beval->balloonShell, &requisition, NULL); + gtk_widget_get_preferred_size(beval->balloonShell, &requisition, NULL); # else - gtk_widget_size_request(beval->balloonShell, &requisition); + gtk_widget_size_request(beval->balloonShell, &requisition); # endif - // Compute position of the balloon area - gdk_window_get_origin(gtk_widget_get_window(beval->target), &x, &y); - x += beval->x; - y += beval->y; + // Compute position of the balloon area + gdk_window_get_origin(gtk_widget_get_window(beval->target), &x, &y); + x += beval->x; + y += beval->y; - // Get out of the way of the mouse pointer - if (x + x_offset + requisition.width > screen_x + screen_w) - y_offset += 15; - if (y + y_offset + requisition.height > screen_y + screen_h) - y_offset = -requisition.height - EVAL_OFFSET_Y; + // Get out of the way of the mouse pointer + if (x + x_offset + requisition.width > screen_x + screen_w) + y_offset += 15; + if (y + y_offset + requisition.height > screen_y + screen_h) + y_offset = -requisition.height - EVAL_OFFSET_Y; - // Sanitize values - x = CLAMP(x + x_offset, 0, - MAX(0, screen_x + screen_w - requisition.width)); - y = CLAMP(y + y_offset, 0, - MAX(0, screen_y + screen_h - requisition.height)); + // Sanitize values + x = CLAMP(x + x_offset, 0, + MAX(0, screen_x + screen_w - requisition.width)); + y = CLAMP(y + y_offset, 0, + MAX(0, screen_y + screen_h - requisition.height)); - // Show the balloon + // Show the balloon # if GTK_CHECK_VERSION(3,0,0) - gtk_window_move(GTK_WINDOW(beval->balloonShell), x, y); + gtk_window_move(GTK_WINDOW(beval->balloonShell), x, y); # else - gtk_widget_set_uposition(beval->balloonShell, x, y); + gtk_widget_set_uposition(beval->balloonShell, x, y); # endif - gtk_widget_show(beval->balloonShell); + gtk_widget_show(beval->balloonShell); - beval->showState = ShS_SHOWING; - gui_mch_update(); - } + beval->showState = ShS_SHOWING; + gui_mch_update(); } /* @@ -1060,65 +1060,65 @@ drawBalloon(BalloonEval *beval) Position tx; Position ty; - if (beval->msg != NULL) - { - XmString s; - // Show the Balloon + if (beval->msg == NULL) + return; - // Calculate the label's width and height + XmString s; + // Show the Balloon - // For the callback function we parse NL characters to create a - // multi-line label. This doesn't work for all languages, but - // XmStringCreateLocalized() doesn't do multi-line labels... - if (beval->msgCB != NULL) - s = XmStringCreateLtoR((char *)beval->msg, XmFONTLIST_DEFAULT_TAG); - else - s = XmStringCreateLocalized((char *)beval->msg); - { - XmFontList fl; + // Calculate the label's width and height - fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); - if (fl == NULL) - { - XmStringFree(s); - return; - } - XmStringExtent(fl, s, &w, &h); - XmFontListFree(fl); - } - w += gui.border_offset << 1; - h += gui.border_offset << 1; - XtVaSetValues(beval->balloonLabel, XmNlabelString, s, NULL); - XmStringFree(s); - - // Compute position of the balloon area - tx = beval->x_root + EVAL_OFFSET_X; - ty = beval->y_root + EVAL_OFFSET_Y; - if ((tx + w) > beval->screen_width) - tx = beval->screen_width - w; - if ((ty + h) > beval->screen_height) - ty = beval->screen_height - h; - XtVaSetValues(beval->balloonShell, - XmNx, tx, - XmNy, ty, - NULL); - // Set tooltip colors - { - Arg args[2]; + // For the callback function we parse NL characters to create a + // multi-line label. This doesn't work for all languages, but + // XmStringCreateLocalized() doesn't do multi-line labels... + if (beval->msgCB != NULL) + s = XmStringCreateLtoR((char *)beval->msg, XmFONTLIST_DEFAULT_TAG); + else + s = XmStringCreateLocalized((char *)beval->msg); + { + XmFontList fl; - args[0].name = XmNbackground; - args[0].value = gui.tooltip_bg_pixel; - args[1].name = XmNforeground; - args[1].value = gui.tooltip_fg_pixel; - XtSetValues(beval->balloonLabel, &args[0], XtNumber(args)); + fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); + if (fl == NULL) + { + XmStringFree(s); + return; } + XmStringExtent(fl, s, &w, &h); + XmFontListFree(fl); + } + w += gui.border_offset << 1; + h += gui.border_offset << 1; + XtVaSetValues(beval->balloonLabel, XmNlabelString, s, NULL); + XmStringFree(s); + + // Compute position of the balloon area + tx = beval->x_root + EVAL_OFFSET_X; + ty = beval->y_root + EVAL_OFFSET_Y; + if ((tx + w) > beval->screen_width) + tx = beval->screen_width - w; + if ((ty + h) > beval->screen_height) + ty = beval->screen_height - h; + XtVaSetValues(beval->balloonShell, + XmNx, tx, + XmNy, ty, + NULL); + // Set tooltip colors + { + Arg args[2]; - XtPopup(beval->balloonShell, XtGrabNone); + args[0].name = XmNbackground; + args[0].value = gui.tooltip_bg_pixel; + args[1].name = XmNforeground; + args[1].value = gui.tooltip_fg_pixel; + XtSetValues(beval->balloonLabel, &args[0], XtNumber(args)); + } - beval->showState = ShS_SHOWING; + XtPopup(beval->balloonShell, XtGrabNone); - current_beval = beval; - } + beval->showState = ShS_SHOWING; + + current_beval = beval; } /* @@ -1161,18 +1161,16 @@ createBalloonEvalWindow(BalloonEval *beval) beval->balloonShell = XtAppCreateShell("balloonEval", "BalloonEval", overrideShellWidgetClass, gui.dpy, args, n); - { - XmFontList fl; + XmFontList fl; - n = 0; - fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); - XtSetArg(args[n], XmNforeground, gui.tooltip_fg_pixel); n++; - XtSetArg(args[n], XmNbackground, gui.tooltip_bg_pixel); n++; - XtSetArg(args[n], XmNfontList, fl); n++; - XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++; - beval->balloonLabel = XtCreateManagedWidget("balloonLabel", - xmLabelWidgetClass, beval->balloonShell, args, n); - } + n = 0; + fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); + XtSetArg(args[n], XmNforeground, gui.tooltip_fg_pixel); n++; + XtSetArg(args[n], XmNbackground, gui.tooltip_bg_pixel); n++; + XtSetArg(args[n], XmNfontList, fl); n++; + XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++; + beval->balloonLabel = XtCreateManagedWidget("balloonLabel", + xmLabelWidgetClass, beval->balloonShell, args, n); } #endif // !FEAT_GUI_GTK |