From 276f2f2a5b3cd75361976e6bd1618d90d3870651 Mon Sep 17 00:00:00 2001 From: cxl Date: Tue, 7 Jan 2014 12:36:19 +0000 Subject: [PATCH] CtrlCore: GTK backend now compiles in Debian 6.0 git-svn-id: svn://ultimatepp.org/upp/trunk@6727 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlCore/Gtk.h | 11 +- uppsrc/CtrlCore/GtkCtrl.cpp | 22 ++-- uppsrc/CtrlCore/GtkDnD.cpp | 6 ++ uppsrc/CtrlCore/GtkDrawOp.cpp | 10 ++ uppsrc/CtrlCore/GtkEvent.cpp | 60 +++++------ uppsrc/CtrlCore/GtkKeys.h | 186 +++++++++++++++++----------------- uppsrc/CtrlCore/GtkWnd.cpp | 5 + 7 files changed, 164 insertions(+), 136 deletions(-) diff --git a/uppsrc/CtrlCore/Gtk.h b/uppsrc/CtrlCore/Gtk.h index db1686234..e24b83d84 100644 --- a/uppsrc/CtrlCore/Gtk.h +++ b/uppsrc/CtrlCore/Gtk.h @@ -2,6 +2,12 @@ #define PLATFORM_X11 // To keep legacy code happy +#ifdef GDK_KEY_Delete +#define GDKEY(x) GDK_KEY_##x +#else +#define GDKEY(x) GDK_##x +#endif + #include #include @@ -46,7 +52,8 @@ private: Vector offset; Vector clip; - cairo_t *cr; + cairo_t *cr; + GdkDrawable *drawable; SystemDraw() {} @@ -64,7 +71,7 @@ public: bool CanSetSurface() { return true; } static void Flush() {} // TODO? - SystemDraw(cairo_t *cr) : cr(cr) {} + SystemDraw(cairo_t *cr, GdkDrawable *dw = NULL) : cr(cr), drawable(dw) {} }; class ImageDraw : public SystemDraw { diff --git a/uppsrc/CtrlCore/GtkCtrl.cpp b/uppsrc/CtrlCore/GtkCtrl.cpp index 352760038..50677d1f5 100644 --- a/uppsrc/CtrlCore/GtkCtrl.cpp +++ b/uppsrc/CtrlCore/GtkCtrl.cpp @@ -31,17 +31,17 @@ bool Ctrl::GuiPlatformSetFullRefreshSpecial() String GuiPlatformGetKeyDesc(dword key) { static Tuple2 nkey[] = { - { K_DELTA|GDK_KEY_grave, "[`]" }, - { K_DELTA|GDK_KEY_minus, "[-]" }, - { K_DELTA|GDK_KEY_equal, "[=]" }, - { K_DELTA|GDK_KEY_backslash, "[\\]" }, - { K_DELTA|GDK_KEY_bracketleft, "[[]" }, - { K_DELTA|GDK_KEY_bracketright, "[]]" }, - { K_DELTA|GDK_KEY_semicolon, "[;]" }, - { K_DELTA|GDK_KEY_apostrophe, "[']" }, - { K_DELTA|GDK_KEY_comma, "[,]" }, - { K_DELTA|GDK_KEY_period, "[.]" }, - { K_DELTA|GDK_KEY_underscore, "[/]" }, + { K_DELTA|GDKEY(grave), "[`]" }, + { K_DELTA|GDKEY(minus), "[-]" }, + { K_DELTA|GDKEY(equal), "[=]" }, + { K_DELTA|GDKEY(backslash), "[\\]" }, + { K_DELTA|GDKEY(bracketleft), "[[]" }, + { K_DELTA|GDKEY(bracketright), "[]]" }, + { K_DELTA|GDKEY(semicolon), "[;]" }, + { K_DELTA|GDKEY(apostrophe), "[']" }, + { K_DELTA|GDKEY(comma), "[,]" }, + { K_DELTA|GDKEY(period), "[.]" }, + { K_DELTA|GDKEY(underscore), "[/]" }, { 0, NULL } }; const Tuple2 *x = FindTuple(nkey, __countof(nkey), key); diff --git a/uppsrc/CtrlCore/GtkDnD.cpp b/uppsrc/CtrlCore/GtkDnD.cpp index 4ab9721b0..e7d479a68 100644 --- a/uppsrc/CtrlCore/GtkDnD.cpp +++ b/uppsrc/CtrlCore/GtkDnD.cpp @@ -54,8 +54,12 @@ void Ctrl::GtkDragEnd(GtkWidget *widget, GdkDragContext *context, gpointer user_ { LLOG("GtkDragEnd"); dnd_result = DND_NONE; +#if GTK_CHECK_VERSION(2,22,0) // No drag&drop support before 2.22, sorry... GdkDragAction a = gdk_drag_context_get_selected_action(context); dnd_result = a == GDK_ACTION_MOVE ? DND_MOVE : a == GDK_ACTION_COPY ? DND_COPY : DND_NONE; +#else + dnd_result = DND_NONE; +#endif dnd_source = NULL; } @@ -176,6 +180,7 @@ void Ctrl::DndTargets(GdkDragContext *context) } dnd_targets.Clear(); dnd_text_target.Clear(); +#if GTK_CHECK_VERSION(2,22,0) // No drag&drop support before 2.22, sorry... for(GList *list = gdk_drag_context_list_targets(context); list; list = g_list_next (list)) { String g = gdk_atom_name((GdkAtom)list->data); if(text_targets.Find(g) >= 0) { @@ -198,6 +203,7 @@ void Ctrl::DndTargets(GdkDragContext *context) else dnd_targets.Add(g); } +#endif } void Ctrl::GtkDragDataReceived(GtkWidget *widget, GdkDragContext *context, diff --git a/uppsrc/CtrlCore/GtkDrawOp.cpp b/uppsrc/CtrlCore/GtkDrawOp.cpp index 958505c22..5afeaabbd 100644 --- a/uppsrc/CtrlCore/GtkDrawOp.cpp +++ b/uppsrc/CtrlCore/GtkDrawOp.cpp @@ -117,10 +117,20 @@ void SystemDraw::DrawRectOp(int x, int y, int cx, int cy, Color color) return; cairo_rectangle(cr, x, y, cx, cy); if(color == InvertColor()) { +#if GTK_CHECK_VERSION(2,24,0) SetColor(White()); cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE); cairo_fill(cr); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); +#else + if(drawable) { + GdkGC *gc = gdk_gc_new(drawable); + gdk_gc_set_function(gc, GDK_INVERT); + gdk_draw_drawable(drawable, gc, drawable, x, y, x, y, cx, cy); + gdk_gc_set_function(gc, GDK_COPY); + gdk_gc_destroy(drawable); + } +#endif } else { SetColor(color); diff --git a/uppsrc/CtrlCore/GtkEvent.cpp b/uppsrc/CtrlCore/GtkEvent.cpp index 68783e78c..2ffc7ebd2 100644 --- a/uppsrc/CtrlCore/GtkEvent.cpp +++ b/uppsrc/CtrlCore/GtkEvent.cpp @@ -408,37 +408,37 @@ void Ctrl::Proc() if(kv >= 'a' && kv <= 'z') kv = kv - 'a' + 'A'; static Tuple2 cv[] = { - { GDK_KEY_BackSpace, K_BACKSPACE }, - { GDK_KEY_Tab, K_TAB }, - { GDK_KEY_ISO_Left_Tab, K_TAB }, - { GDK_KEY_Return, K_ENTER }, - { GDK_KEY_Escape, K_ESCAPE }, - { GDK_KEY_space, K_SPACE }, - { GDK_KEY_Control_L, K_CTRL_KEY }, - { GDK_KEY_Control_R, K_CTRL_KEY }, - { GDK_KEY_Shift_L, K_SHIFT_KEY }, - { GDK_KEY_Shift_R, K_SHIFT_KEY }, - { GDK_KEY_Alt_L, K_ALT_KEY }, - { GDK_KEY_Alt_R, K_ALT_KEY }, + { GDKEY(BackSpace), K_BACKSPACE }, + { GDKEY(Tab), K_TAB }, + { GDKEY(ISO_Left_Tab), K_TAB }, + { GDKEY(Return), K_ENTER }, + { GDKEY(Escape), K_ESCAPE }, + { GDKEY(space), K_SPACE }, + { GDKEY(Control_L), K_CTRL_KEY }, + { GDKEY(Control_R), K_CTRL_KEY }, + { GDKEY(Shift_L), K_SHIFT_KEY }, + { GDKEY(Shift_R), K_SHIFT_KEY }, + { GDKEY(Alt_L), K_ALT_KEY }, + { GDKEY(Alt_R), K_ALT_KEY }, - { GDK_KEY_KP_Space, K_SPACE }, - { GDK_KEY_KP_Tab, K_TAB }, - { GDK_KEY_KP_Enter, K_ENTER }, - { GDK_KEY_KP_F1, K_F1 }, - { GDK_KEY_KP_F2, K_F2 }, - { GDK_KEY_KP_F3, K_F3 }, - { GDK_KEY_KP_F4, K_F4 }, - { GDK_KEY_KP_Home, K_HOME }, - { GDK_KEY_KP_Left, K_LEFT }, - { GDK_KEY_KP_Up, K_UP }, - { GDK_KEY_KP_Right, K_RIGHT }, - { GDK_KEY_KP_Down, K_DOWN }, - { GDK_KEY_KP_Page_Up, K_PAGEUP }, - { GDK_KEY_KP_Page_Down, K_PAGEDOWN }, - { GDK_KEY_KP_End, K_END }, - { GDK_KEY_KP_Begin, K_HOME }, - { GDK_KEY_KP_Insert, K_INSERT }, - { GDK_KEY_KP_Delete, K_DELETE }, + { GDKEY(KP_Space), K_SPACE }, + { GDKEY(KP_Tab), K_TAB }, + { GDKEY(KP_Enter), K_ENTER }, + { GDKEY(KP_F1), K_F1 }, + { GDKEY(KP_F2), K_F2 }, + { GDKEY(KP_F3), K_F3 }, + { GDKEY(KP_F4), K_F4 }, + { GDKEY(KP_Home), K_HOME }, + { GDKEY(KP_Left), K_LEFT }, + { GDKEY(KP_Up), K_UP }, + { GDKEY(KP_Right), K_RIGHT }, + { GDKEY(KP_Down), K_DOWN }, + { GDKEY(KP_Page_Up), K_PAGEUP }, + { GDKEY(KP_Page_Down), K_PAGEDOWN }, + { GDKEY(KP_End), K_END }, + { GDKEY(KP_Begin), K_HOME }, + { GDKEY(KP_Insert), K_INSERT }, + { GDKEY(KP_Delete), K_DELETE }, }; Tuple2 *x = FindTuple(cv, __countof(cv), kv); if(x) diff --git a/uppsrc/CtrlCore/GtkKeys.h b/uppsrc/CtrlCore/GtkKeys.h index bad9ef3eb..0138cf3d1 100644 --- a/uppsrc/CtrlCore/GtkKeys.h +++ b/uppsrc/CtrlCore/GtkKeys.h @@ -9,103 +9,103 @@ K_ESCAPE = 27, K_SPACE = 32, -K_DELETE = GDK_KEY_Delete|K_DELTA, +K_DELETE = GDKEY(Delete)|K_DELTA, -K_SHIFT_KEY = GDK_KEY_Shift_L|K_DELTA, -K_CTRL_KEY = GDK_KEY_Control_L|K_DELTA, -K_ALT_KEY = GDK_KEY_Alt_L|K_DELTA, -K_CAPSLOCK = GDK_KEY_Caps_Lock|K_DELTA, -K_PRIOR = GDK_KEY_Page_Up|K_DELTA, -K_PAGEUP = GDK_KEY_Page_Up|K_DELTA, -K_NEXT = GDK_KEY_Page_Down|K_DELTA, -K_PAGEDOWN = GDK_KEY_Page_Down|K_DELTA, -K_END = GDK_KEY_End|K_DELTA, -K_HOME = GDK_KEY_Home|K_DELTA, -K_LEFT = GDK_KEY_Left|K_DELTA, -K_UP = GDK_KEY_Up|K_DELTA, -K_RIGHT = GDK_KEY_Right|K_DELTA, -K_DOWN = GDK_KEY_Down|K_DELTA, -K_INSERT = GDK_KEY_Insert|K_DELTA, +K_SHIFT_KEY = GDKEY(Shift_L)|K_DELTA, +K_CTRL_KEY = GDKEY(Control_L)|K_DELTA, +K_ALT_KEY = GDKEY(Alt_L)|K_DELTA, +K_CAPSLOCK = GDKEY(Caps_Lock)|K_DELTA, +K_PRIOR = GDKEY(Page_Up)|K_DELTA, +K_PAGEUP = GDKEY(Page_Up)|K_DELTA, +K_NEXT = GDKEY(Page_Down)|K_DELTA, +K_PAGEDOWN = GDKEY(Page_Down)|K_DELTA, +K_END = GDKEY(End)|K_DELTA, +K_HOME = GDKEY(Home)|K_DELTA, +K_LEFT = GDKEY(Left)|K_DELTA, +K_UP = GDKEY(Up)|K_DELTA, +K_RIGHT = GDKEY(Right)|K_DELTA, +K_DOWN = GDKEY(Down)|K_DELTA, +K_INSERT = GDKEY(Insert)|K_DELTA, -K_NUMPAD0 = GDK_KEY_KP_0|K_DELTA, -K_NUMPAD1 = GDK_KEY_KP_1|K_DELTA, -K_NUMPAD2 = GDK_KEY_KP_2|K_DELTA, -K_NUMPAD3 = GDK_KEY_KP_3|K_DELTA, -K_NUMPAD4 = GDK_KEY_KP_4|K_DELTA, -K_NUMPAD5 = GDK_KEY_KP_5|K_DELTA, -K_NUMPAD6 = GDK_KEY_KP_6|K_DELTA, -K_NUMPAD7 = GDK_KEY_KP_7|K_DELTA, -K_NUMPAD8 = GDK_KEY_KP_8|K_DELTA, -K_NUMPAD9 = GDK_KEY_KP_9|K_DELTA, -K_MULTIPLY = GDK_KEY_KP_Multiply|K_DELTA, -K_ADD = GDK_KEY_KP_Add|K_DELTA, -K_SEPARATOR = GDK_KEY_KP_Separator|K_DELTA, -K_SUBTRACT = GDK_KEY_KP_Subtract|K_DELTA, -K_DECIMAL = GDK_KEY_KP_Decimal|K_DELTA, -K_DIVIDE = GDK_KEY_KP_Divide|K_DELTA, +K_NUMPAD0 = GDKEY(KP_0)|K_DELTA, +K_NUMPAD1 = GDKEY(KP_1)|K_DELTA, +K_NUMPAD2 = GDKEY(KP_2)|K_DELTA, +K_NUMPAD3 = GDKEY(KP_3)|K_DELTA, +K_NUMPAD4 = GDKEY(KP_4)|K_DELTA, +K_NUMPAD5 = GDKEY(KP_5)|K_DELTA, +K_NUMPAD6 = GDKEY(KP_6)|K_DELTA, +K_NUMPAD7 = GDKEY(KP_7)|K_DELTA, +K_NUMPAD8 = GDKEY(KP_8)|K_DELTA, +K_NUMPAD9 = GDKEY(KP_9)|K_DELTA, +K_MULTIPLY = GDKEY(KP_Multiply)|K_DELTA, +K_ADD = GDKEY(KP_Add)|K_DELTA, +K_SEPARATOR = GDKEY(KP_Separator)|K_DELTA, +K_SUBTRACT = GDKEY(KP_Subtract)|K_DELTA, +K_DECIMAL = GDKEY(KP_Decimal)|K_DELTA, +K_DIVIDE = GDKEY(KP_Divide)|K_DELTA, -K_SCROLL = GDK_KEY_Scroll_Lock|K_DELTA, +K_SCROLL = GDKEY(Scroll_Lock)|K_DELTA, -K_F1 = GDK_KEY_F1|K_DELTA, -K_F2 = GDK_KEY_F2|K_DELTA, -K_F3 = GDK_KEY_F3|K_DELTA, -K_F4 = GDK_KEY_F4|K_DELTA, -K_F5 = GDK_KEY_F5|K_DELTA, -K_F6 = GDK_KEY_F6|K_DELTA, -K_F7 = GDK_KEY_F7|K_DELTA, -K_F8 = GDK_KEY_F8|K_DELTA, -K_F9 = GDK_KEY_F9|K_DELTA, -K_F10 = GDK_KEY_F10|K_DELTA, -K_F11 = GDK_KEY_F11|K_DELTA, -K_F12 = GDK_KEY_F12|K_DELTA, +K_F1 = GDKEY(F1)|K_DELTA, +K_F2 = GDKEY(F2)|K_DELTA, +K_F3 = GDKEY(F3)|K_DELTA, +K_F4 = GDKEY(F4)|K_DELTA, +K_F5 = GDKEY(F5)|K_DELTA, +K_F6 = GDKEY(F6)|K_DELTA, +K_F7 = GDKEY(F7)|K_DELTA, +K_F8 = GDKEY(F8)|K_DELTA, +K_F9 = GDKEY(F9)|K_DELTA, +K_F10 = GDKEY(F10)|K_DELTA, +K_F11 = GDKEY(F11)|K_DELTA, +K_F12 = GDKEY(F12)|K_DELTA, -K_A = GDK_KEY_A|K_DELTA, -K_B = GDK_KEY_B|K_DELTA, -K_C = GDK_KEY_C|K_DELTA, -K_D = GDK_KEY_D|K_DELTA, -K_E = GDK_KEY_E|K_DELTA, -K_F = GDK_KEY_F|K_DELTA, -K_G = GDK_KEY_G|K_DELTA, -K_H = GDK_KEY_H|K_DELTA, -K_I = GDK_KEY_I|K_DELTA, -K_J = GDK_KEY_J|K_DELTA, -K_K = GDK_KEY_K|K_DELTA, -K_L = GDK_KEY_L|K_DELTA, -K_M = GDK_KEY_M|K_DELTA, -K_N = GDK_KEY_N|K_DELTA, -K_O = GDK_KEY_O|K_DELTA, -K_P = GDK_KEY_P|K_DELTA, -K_Q = GDK_KEY_Q|K_DELTA, -K_R = GDK_KEY_R|K_DELTA, -K_S = GDK_KEY_S|K_DELTA, -K_T = GDK_KEY_T|K_DELTA, -K_U = GDK_KEY_U|K_DELTA, -K_V = GDK_KEY_V|K_DELTA, -K_W = GDK_KEY_W|K_DELTA, -K_X = GDK_KEY_X|K_DELTA, -K_Y = GDK_KEY_Y|K_DELTA, -K_Z = GDK_KEY_Z|K_DELTA, -K_0 = GDK_KEY_0|K_DELTA, -K_1 = GDK_KEY_1|K_DELTA, -K_2 = GDK_KEY_2|K_DELTA, -K_3 = GDK_KEY_3|K_DELTA, -K_4 = GDK_KEY_4|K_DELTA, -K_5 = GDK_KEY_5|K_DELTA, -K_6 = GDK_KEY_6|K_DELTA, -K_7 = GDK_KEY_7|K_DELTA, -K_8 = GDK_KEY_8|K_DELTA, -K_9 = GDK_KEY_9|K_DELTA, +K_A = GDKEY(A)|K_DELTA, +K_B = GDKEY(B)|K_DELTA, +K_C = GDKEY(C)|K_DELTA, +K_D = GDKEY(D)|K_DELTA, +K_E = GDKEY(E)|K_DELTA, +K_F = GDKEY(F)|K_DELTA, +K_G = GDKEY(G)|K_DELTA, +K_H = GDKEY(H)|K_DELTA, +K_I = GDKEY(I)|K_DELTA, +K_J = GDKEY(J)|K_DELTA, +K_K = GDKEY(K)|K_DELTA, +K_L = GDKEY(L)|K_DELTA, +K_M = GDKEY(M)|K_DELTA, +K_N = GDKEY(N)|K_DELTA, +K_O = GDKEY(O)|K_DELTA, +K_P = GDKEY(P)|K_DELTA, +K_Q = GDKEY(Q)|K_DELTA, +K_R = GDKEY(R)|K_DELTA, +K_S = GDKEY(S)|K_DELTA, +K_T = GDKEY(T)|K_DELTA, +K_U = GDKEY(U)|K_DELTA, +K_V = GDKEY(V)|K_DELTA, +K_W = GDKEY(W)|K_DELTA, +K_X = GDKEY(X)|K_DELTA, +K_Y = GDKEY(Y)|K_DELTA, +K_Z = GDKEY(Z)|K_DELTA, +K_0 = GDKEY(0)|K_DELTA, +K_1 = GDKEY(1)|K_DELTA, +K_2 = GDKEY(2)|K_DELTA, +K_3 = GDKEY(3)|K_DELTA, +K_4 = GDKEY(4)|K_DELTA, +K_5 = GDKEY(5)|K_DELTA, +K_6 = GDKEY(6)|K_DELTA, +K_7 = GDKEY(7)|K_DELTA, +K_8 = GDKEY(8)|K_DELTA, +K_9 = GDKEY(9)|K_DELTA, -K_CTRL_LBRACKET = K_CTRL|GDK_KEY_bracketleft|K_DELTA, -K_CTRL_RBRACKET = K_CTRL|GDK_KEY_bracketright|K_DELTA, -K_CTRL_MINUS = K_CTRL|GDK_KEY_minus|K_DELTA, -K_CTRL_GRAVE = K_CTRL|GDK_KEY_grave|K_DELTA, -K_CTRL_SLASH = K_CTRL|GDK_KEY_slash|K_DELTA, -K_CTRL_BACKSLASH = K_CTRL|GDK_KEY_backslash|K_DELTA, -K_CTRL_COMMA = K_CTRL|GDK_KEY_comma|K_DELTA, -K_CTRL_PERIOD = K_CTRL|GDK_KEY_period|K_DELTA, -K_CTRL_SEMICOLON = K_CTRL|GDK_KEY_semicolon|K_DELTA, -K_CTRL_EQUAL = K_CTRL|GDK_KEY_equal|K_DELTA, -K_CTRL_APOSTROPHE= K_CTRL|GDK_KEY_apostrophe|K_DELTA, +K_CTRL_LBRACKET = K_CTRL|GDKEY(bracketleft)|K_DELTA, +K_CTRL_RBRACKET = K_CTRL|GDKEY(bracketright)|K_DELTA, +K_CTRL_MINUS = K_CTRL|GDKEY(minus)|K_DELTA, +K_CTRL_GRAVE = K_CTRL|GDKEY(grave)|K_DELTA, +K_CTRL_SLASH = K_CTRL|GDKEY(slash)|K_DELTA, +K_CTRL_BACKSLASH = K_CTRL|GDKEY(backslash)|K_DELTA, +K_CTRL_COMMA = K_CTRL|GDKEY(comma)|K_DELTA, +K_CTRL_PERIOD = K_CTRL|GDKEY(period)|K_DELTA, +K_CTRL_SEMICOLON = K_CTRL|GDKEY(semicolon)|K_DELTA, +K_CTRL_EQUAL = K_CTRL|GDKEY(equal)|K_DELTA, +K_CTRL_APOSTROPHE= K_CTRL|GDKEY(apostrophe)|K_DELTA, -K_BREAK = GDK_KEY_Break|K_DELTA, +K_BREAK = GDKEY(Break)|K_DELTA, diff --git a/uppsrc/CtrlCore/GtkWnd.cpp b/uppsrc/CtrlCore/GtkWnd.cpp index bc3b37e8b..ce6e498fc 100644 --- a/uppsrc/CtrlCore/GtkWnd.cpp +++ b/uppsrc/CtrlCore/GtkWnd.cpp @@ -187,8 +187,13 @@ Rect Ctrl::GetWndScreenRect() const if(top) { gint x, y; gdk_window_get_position(gdk(), &x, &y); + #if GTK_CHECK_VERSION(2, 24, 0) gint width = gdk_window_get_width(gdk()); gint height = gdk_window_get_height(gdk()); + #else + gint width, height; + gdk_drawable_get_size(gdk(), &width, &height); + #endif return RectC(x, y, width, height); } return Null;