static void gtkDialogGetWindowDecor(Ihandle* ih, int *win_border, int *win_caption) { int x, y, frame_x, frame_y; gdk_window_get_origin(iupgtkGetWindow(ih->handle), &x, &y); gdk_window_get_root_origin(iupgtkGetWindow(ih->handle), &frame_x, &frame_y); *win_border = x-frame_x; *win_caption = y-frame_y-*win_border; }
void iupdrvSetFocus(Ihandle *ih) { Ihandle* dialog = IupGetDialog(ih); if (!gtk_window_is_active((GtkWindow*)dialog->handle)) gdk_window_focus(iupgtkGetWindow(dialog->handle), gtk_get_current_event_time()); gtk_widget_grab_focus(ih->handle); }
char* iupgtkGetNativeWindowHandle(Ihandle* ih) { GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) return (char*)window; else return NULL; }
char* iupgtkGetNativeWindowHandle(Ihandle* ih) { GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) return (char*)GDK_WINDOW_HWND(window); else return NULL; }
static void gdkDrawFocusRect(Ihandle* ih, int x, int y, int w, int h) { GdkWindow* window = iupgtkGetWindow(ih->handle); GtkStyle *style = gtk_widget_get_style(ih->handle); #if GTK_CHECK_VERSION(2, 18, 0) GtkStateType state = gtk_widget_get_state(ih->handle); #else GtkStateType state = GTK_WIDGET_STATE(ih->handle); #endif gtk_paint_focus(style, window, state, NULL, ih->handle, NULL, x, y, w, h); }
static void gtkDragBegin(GtkWidget *widget, GdkDragContext *drag_context, Ihandle *ih) { IFnii cbDragBegin = (IFnii)IupGetCallback(ih, "DRAGBEGIN_CB"); if(cbDragBegin) { int x, y; gdk_window_get_pointer(iupgtkGetWindow(widget), &x, &y, NULL); if (cbDragBegin(ih, x, y) == IUP_IGNORE) gdk_drag_abort(drag_context, 0); } }
static void gtkCanvasLayoutUpdateMethod(Ihandle *ih) { iupdrvBaseLayoutUpdateMethod(ih); /* Force GdkWindow size update when not visible, so when mapped before show GDK returns the correct value. */ if (!iupdrvIsVisible(ih)) { GdkWindow* window = iupgtkGetWindow(ih->handle); gdk_window_resize(window, ih->currentwidth, ih->currentheight); } gtkCanvasUpdateChildLayout(ih); }
static char* gtkCanvasGetDrawSizeAttrib(Ihandle *ih) { char* str = iupStrGetMemory(20); int w, h; GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) gdk_drawable_get_size(window, &w, &h); else return NULL; sprintf(str, "%dx%d", w, h); return str; }
IdrawCanvas* iupDrawCreateCanvas(Ihandle* ih) { IdrawCanvas* dc = calloc(1, sizeof(IdrawCanvas)); dc->ih = ih; dc->wnd = iupgtkGetWindow(ih->handle); dc->gc = gdk_gc_new(dc->wnd); gdk_drawable_get_size(dc->wnd, &dc->w, &dc->h); dc->pixmap = gdk_pixmap_new(dc->wnd, dc->w, dc->h, gdk_drawable_get_depth(dc->wnd)); dc->pixmap_gc = gdk_gc_new(dc->pixmap); return dc; }
static int gtkDialogSetOpacityImageAttrib(Ihandle *ih, const char *value) { GdkPixbuf* pixbuf = iupImageGetImage(value, ih, 0); if (pixbuf) { #if GTK_CHECK_VERSION(3, 0, 0) GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) { cairo_region_t *shape; #if GTK_CHECK_VERSION(3, 10, 0) cairo_surface_t* surface = gdk_cairo_surface_create_from_pixbuf(pixbuf, 0, window); #else int width = gdk_pixbuf_get_width(pixbuf); int height = gdk_pixbuf_get_height(pixbuf); cairo_surface_t* surface = gdk_window_create_similar_surface(window, CAIRO_CONTENT_COLOR_ALPHA, width, height); cairo_t* cr = cairo_create(surface); gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); cairo_destroy(cr); #endif shape = gdk_cairo_region_create_from_surface(surface); cairo_surface_destroy(surface); gtk_widget_shape_combine_region(ih->handle, shape); cairo_region_destroy(shape); } #else GdkBitmap* mask = NULL; gdk_pixbuf_render_pixmap_and_mask(pixbuf, NULL, &mask, 255); if (mask) { gtk_widget_shape_combine_mask(ih->handle, mask, 0, 0); g_object_unref(mask); } #endif return 1; } return 0; }
static char* gtkCanvasGetDrawSizeAttrib(Ihandle *ih) { char* str = iupStrGetMemory(20); int w, h; GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) { #if GTK_CHECK_VERSION(2, 24, 0) w = gdk_window_get_width(window); h = gdk_window_get_height(window); #else gdk_drawable_get_size(window, &w, &h); #endif } else return NULL; sprintf(str, "%dx%d", w, h); return str; }
static int gtkCanvasSetBgColorAttrib(Ihandle* ih, const char* value) { GtkScrolledWindow* scrolled_window = gtkCanvasGetScrolledWindow(ih); unsigned char r, g, b; /* ignore given value, must use only from parent for the scrollbars */ char* parent_value = iupBaseNativeParentGetBgColor(ih); if (iupStrToRGB(parent_value, &r, &g, &b)) { GtkWidget* sb; iupgtkBaseSetBgColor((GtkWidget*)scrolled_window, r, g, b); #if GTK_CHECK_VERSION(2, 8, 0) sb = gtk_scrolled_window_get_hscrollbar(scrolled_window); if (sb) iupgtkBaseSetBgColor(sb, r, g, b); sb = gtk_scrolled_window_get_vscrollbar(scrolled_window); if (sb) iupgtkBaseSetBgColor(sb, r, g, b); #endif } if (!IupGetCallback(ih, "ACTION")) { /* enable automatic double buffering */ gtk_widget_set_double_buffered(ih->handle, TRUE); gtk_widget_set_double_buffered((GtkWidget*)scrolled_window, TRUE); return iupdrvBaseSetBgColorAttrib(ih, value); } else { /* disable automatic double buffering */ gtk_widget_set_double_buffered(ih->handle, FALSE); gtk_widget_set_double_buffered((GtkWidget*)scrolled_window, FALSE); gdk_window_set_back_pixmap(iupgtkGetWindow(ih->handle), NULL, FALSE); iupAttribSetStr(ih, "_IUPGTK_NO_BGCOLOR", "1"); return 1; } }
IdrawCanvas* iupDrawCreateCanvas(Ihandle* ih) { IdrawCanvas* dc = calloc(1, sizeof(IdrawCanvas)); cairo_surface_t* surface; dc->ih = ih; dc->window = iupgtkGetWindow(ih->handle); dc->cr = gdk_cairo_create(dc->window); #if GTK_CHECK_VERSION(2, 24, 0) dc->w = gdk_window_get_width(dc->window); dc->h = gdk_window_get_height(dc->window); #else gdk_drawable_get_size(dc->window, &dc->w, &dc->h); #endif surface = cairo_surface_create_similar(cairo_get_target(dc->cr), CAIRO_CONTENT_COLOR_ALPHA, dc->w, dc->h); dc->image_cr = cairo_create(surface); cairo_surface_destroy(surface); return dc; }
static int gtkCanvasSetBgColorAttrib(Ihandle* ih, const char* value) { GtkWidget* sb_win = (GtkWidget*)iupAttribGet(ih, "_IUP_EXTRAPARENT"); unsigned char r, g, b; /* ignore given value, must use only from parent for the scrollbars */ char* parent_value = iupBaseNativeParentGetBgColor(ih); if (iupStrToRGB(parent_value, &r, &g, &b)) { GtkWidget* sb; iupgtkSetBgColor(sb_win, r, g, b); sb = (GtkWidget*)iupAttribGet(ih, "_IUPGTK_SBHORIZ"); if (sb) iupgtkSetBgColor(sb, r, g, b); sb = (GtkWidget*)iupAttribGet(ih, "_IUPGTK_SBVERT"); if (sb) iupgtkSetBgColor(sb, r, g, b); } if (!IupGetCallback(ih, "ACTION")) { /* enable automatic double buffering */ gtk_widget_set_double_buffered(ih->handle, TRUE); gtk_widget_set_double_buffered(sb_win, TRUE); return iupdrvBaseSetBgColorAttrib(ih, value); } else { /* disable automatic double buffering */ gtk_widget_set_double_buffered(ih->handle, FALSE); gtk_widget_set_double_buffered(sb_win, FALSE); #if !GTK_CHECK_VERSION(3, 0, 0) gdk_window_set_back_pixmap(iupgtkGetWindow(ih->handle), NULL, FALSE); #endif iupAttribSetStr(ih, "_IUPGTK_NO_BGCOLOR", "1"); return 1; } }
static void gtkCanvasLayoutUpdateMethod(Ihandle *ih) { GdkWindow* window = iupgtkGetWindow(ih->handle); iupdrvBaseLayoutUpdateMethod(ih); /* Force GdkWindow size update when not visible, so when mapped before show the function gdk_drawable_get_size returns the correct value. */ if (!iupdrvIsVisible(ih)) gdk_window_resize(window, ih->currentwidth, ih->currentheight); if (iupAttribGetStr(ih, "_IUP_GTK_FIRST_RESIZE")) { /* GTK is nor calling gtkCanvasConfigureEvent on the first resize */ IFnii cb = (IFnii)IupGetCallback(ih,"RESIZE_CB"); iupAttribSetStr(ih, "_IUP_GTK_FIRST_RESIZE", NULL); if (cb) { int sb_w = 0, sb_h = 0; if (ih->data->sb) { int sb_size = iupdrvGetScrollbarSize(); if (ih->data->sb & IUP_SB_HORIZ) sb_h += sb_size; /* sb horizontal affects vertical size */ if (ih->data->sb & IUP_SB_VERT) sb_w += sb_size; /* sb vertical affects horizontal size */ } if (iupAttribGetBoolean(ih, "BORDER")) { sb_w += 4; sb_h += 4; } cb(ih, ih->currentwidth-sb_w, ih->currentheight-sb_h); } } }
static gboolean gtkCanvasBorderExposeEvent(GtkWidget *widget, GdkEventExpose *evt, void* user) #endif { #if GTK_CHECK_VERSION(3, 0, 0) GtkStyleContext* context = gtk_widget_get_style_context (widget); GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); gtk_style_context_save (context); gtk_style_context_add_class(context, GTK_STYLE_CLASS_FRAME); gtk_render_frame (context, cr, 0, 0, allocation.width, allocation.height); gtk_style_context_restore (context); #else GdkWindow* window = iupgtkGetWindow(widget); GtkStyle *style = gtk_widget_get_style(widget); GtkAllocation allocation; gtk_widget_get_allocation(widget, &allocation); gtk_paint_shadow(style, window, GTK_STATE_NORMAL, GTK_SHADOW_IN, &evt->area, widget, "scrolled_window", allocation.x, allocation.y, allocation.width, allocation.height); #endif (void)user; return FALSE; }
static gboolean gtkDragMotion(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, guint time, Ihandle* ih) { GdkAtom targetAtom; /* The third argument must be NULL. Internally, GTK will use the list returned by the call gtk_drag_dest_get_target_list(widget), which is the list of targets that be destination widget can accept (defined in the gtkSetDropTargetAttrib IUP) */ targetAtom = gtk_drag_dest_find_target(widget, drag_context, NULL); if(targetAtom != GDK_NONE) { IFniis cbDropMotion = (IFniis)IupGetCallback(ih, "DROPMOTION_CB"); if(cbDropMotion) { char status[IUPKEY_STATUS_SIZE] = IUPKEY_STATUS_INIT; GdkModifierType mask; gdk_window_get_pointer(iupgtkGetWindow(widget), NULL, NULL, &mask); iupgtkButtonKeySetStatus(mask, 0, status, 0); cbDropMotion(ih, x, y, status); } #if GTK_CHECK_VERSION(2, 22, 0) gdk_drag_status(drag_context, gdk_drag_context_get_suggested_action(drag_context), time); #else gdk_drag_status(drag_context, drag_context->suggested_action, time); #endif return TRUE; } (void)ih; (void)x; (void)y; gdk_drag_status(drag_context, 0, time); return FALSE; }
static char* gtkCanvasGetDrawableAttrib(Ihandle* ih) { return (char*)iupgtkGetWindow(ih->handle); }
void* iupgtkGetNativeGraphicsContext(GtkWidget* widget) { GdkDisplay* display = gdk_display_get_default(); return (void*)XCreateGC(GDK_DISPLAY_XDISPLAY(display), GDK_WINDOW_XID(iupgtkGetWindow(widget)), 0, NULL); }
void* iupgtkGetNativeGraphicsContext(GtkWidget* widget) { return (void*)gdk_gc_new((GdkDrawable*)iupgtkGetWindow(widget)); }
static int gtkDialogMapMethod(Ihandle* ih) { int decorations = 0; int functions = 0; InativeHandle* parent; GtkWidget* fixed; int has_titlebar = 0; #ifdef HILDON if (iupAttribGetBoolean(ih, "HILDONWINDOW")) { HildonProgram *program = HILDON_PROGRAM(hildon_program_get_instance()); ih->handle = hildon_window_new(); if (ih->handle) hildon_program_add_window(program, HILDON_WINDOW(ih->handle)); } else { iupAttribSetStr(ih, "DIALOGHINT", "YES"); /* otherwise not displayed correctly */ ih->handle = gtk_window_new(GTK_WINDOW_TOPLEVEL); } #else ih->handle = gtk_window_new(GTK_WINDOW_TOPLEVEL); #endif if (!ih->handle) return IUP_ERROR; parent = iupDialogGetNativeParent(ih); if (parent) { gtk_window_set_transient_for((GtkWindow*)ih->handle, (GtkWindow*)parent); /* manually remove child windows when parent is destroyed */ g_signal_connect(G_OBJECT(parent), "destroy", G_CALLBACK(gtkDialogChildDestroyEvent), ih); } g_signal_connect(G_OBJECT(ih->handle), "focus-in-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "focus-out-event", G_CALLBACK(iupgtkFocusInOutEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "enter-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "leave-notify-event", G_CALLBACK(iupgtkEnterLeaveEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "show-help", G_CALLBACK(iupgtkShowHelp), ih); /* The iupgtkKeyPressEvent of the control with the focus will propagate the key up to the dialog. */ /* Inside iupgtkKeyPressEvent we test this to avoid duplicate calls. */ g_signal_connect(G_OBJECT(ih->handle), "key-press-event", G_CALLBACK(iupgtkKeyPressEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "configure-event", G_CALLBACK(gtkDialogConfigureEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "window-state-event", G_CALLBACK(gtkDialogWindowStateEvent), ih); g_signal_connect(G_OBJECT(ih->handle), "delete-event", G_CALLBACK(iupgtkDialogDeleteEvent), ih); gtk_window_set_default_size((GtkWindow*)ih->handle, 100, 100); /* set this to avoid size calculation problems */ if (iupAttribGetBoolean(ih, "DIALOGHINT")) gtk_window_set_type_hint(GTK_WINDOW(ih->handle), GDK_WINDOW_TYPE_HINT_DIALOG); /* the container that will receive the child element. */ fixed = gtk_fixed_new(); gtk_container_add((GtkContainer*)ih->handle, fixed); gtk_widget_show(fixed); /* initialize the widget */ gtk_widget_realize(ih->handle); if (iupAttribGet(ih, "TITLE")) has_titlebar = 1; if (iupAttribGetBoolean(ih, "RESIZE")) { functions |= GDK_FUNC_RESIZE; decorations |= GDK_DECOR_RESIZEH; decorations |= GDK_DECOR_BORDER; /* has_border */ } else iupAttribSetStr(ih, "MAXBOX", "NO"); if (iupAttribGetBoolean(ih, "MENUBOX")) { functions |= GDK_FUNC_CLOSE; decorations |= GDK_DECOR_MENU; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "MAXBOX")) { functions |= GDK_FUNC_MAXIMIZE; decorations |= GDK_DECOR_MAXIMIZE; has_titlebar = 1; } if (iupAttribGetBoolean(ih, "MINBOX")) { functions |= GDK_FUNC_MINIMIZE; decorations |= GDK_DECOR_MINIMIZE; has_titlebar = 1; } if (has_titlebar) { functions |= GDK_FUNC_MOVE; decorations |= GDK_DECOR_TITLE; gtk_window_set_title((GtkWindow*)ih->handle, ""); } if (iupAttribGetBoolean(ih, "BORDER") || has_titlebar) decorations |= GDK_DECOR_BORDER; /* has_border */ if (decorations == 0) gtk_window_set_decorated((GtkWindow*)ih->handle, FALSE); else { GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) { gdk_window_set_decorations(window, (GdkWMDecoration)decorations); gdk_window_set_functions(window, (GdkWMFunction)functions); } } /* configure for DRAG&DROP */ if (IupGetCallback(ih, "DROPFILES_CB")) iupAttribSetStr(ih, "DROPFILESTARGET", "YES"); { /* Reset the DLGBGCOLOR global attribute if it is the first time a dialog is created. The value returned by gtk_style_new is not accurate. */ GtkStyle* style = gtk_widget_get_style(ih->handle); if (style && IupGetGlobal("_IUP_RESET_GLOBALCOLORS")) { iupgtkUpdateGlobalColors(style); IupSetGlobal("_IUP_RESET_GLOBALCOLORS", NULL); } } /* configure the size range */ gtkDialogSetMinMax(ih, 1, 1, 65535, 65535); /* MINSIZE and MAXSIZE default values */ /* Ignore VISIBLE before mapping */ iupAttribSetStr(ih, "VISIBLE", NULL); if (iupStrBoolean(IupGetGlobal("INPUTCALLBACKS"))) gtk_widget_add_events(ih->handle, GDK_POINTER_MOTION_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|GDK_BUTTON_MOTION_MASK); return IUP_NOERROR; }
void* iupgtkGetNativeGraphicsContext(GtkWidget* widget) { return GetDC(GDK_WINDOW_HWND(iupgtkGetWindow(widget))); }
static int gtkDialogSetBackgroundAttrib(Ihandle* ih, const char* value) { if (iupdrvBaseSetBgColorAttrib(ih, value)) { #if GTK_CHECK_VERSION(3, 0, 0) GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) gdk_window_set_background_pattern(window, NULL); #else GtkStyle *style = gtk_widget_get_style(ih->handle); if (style->bg_pixmap[GTK_STATE_NORMAL]) { style = gtk_style_copy(style); style->bg_pixmap[GTK_STATE_NORMAL] = NULL; gtk_widget_set_style(ih->handle, style); } #endif return 1; } else { GdkPixbuf* pixbuf = iupImageGetImage(value, ih, 0); if (pixbuf) { #if GTK_CHECK_VERSION(3, 0, 0) GdkWindow* window = iupgtkGetWindow(ih->handle); if (window) { /* TODO: this is NOT working!!!! */ cairo_pattern_t* pattern; int width = gdk_pixbuf_get_width(pixbuf); int height = gdk_pixbuf_get_height(pixbuf); cairo_surface_t* surface = gdk_window_create_similar_surface(window, CAIRO_CONTENT_COLOR_ALPHA, width, height); cairo_t* cr = cairo_create(surface); gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); cairo_destroy(cr); pattern = cairo_pattern_create_for_surface(surface); cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); gdk_window_set_background_pattern(window, pattern); cairo_pattern_destroy (pattern); cairo_surface_destroy(surface); } #else GdkPixmap* pixmap; GtkStyle *style = gtk_style_copy(gtk_widget_get_style(ih->handle)); gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, NULL, 255); style->bg_pixmap[GTK_STATE_NORMAL] = pixmap; gtk_widget_set_style(ih->handle, style); #endif return 1; } } return 0; }
void iupgtkReleaseNativeGraphicsContext(GtkWidget* widget, void* gc) { ReleaseDC(GDK_WINDOW_HWND(iupgtkGetWindow(widget)), (HDC)gc); }